[{"data":1,"prerenderedAt":16000},["ShallowReactive",2],{"post-python-if-branches":3,"sidebar-posts":284,"post-related-source":9191},{"id":4,"title":5,"body":6,"category":270,"cover":271,"description":12,"extension":272,"meta":273,"navigation":88,"path":274,"pinned":275,"publishedAt":276,"seo":277,"slug":278,"stem":279,"summary":280,"tags":281,"updatedAt":276,"visible":88,"__hash__":283},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":8,"toc":257},"minimark",[9,13,17,20,23,30,44,47,60,63,66,137,140,148,151,154,173,177,180,186,194,197,200,206,212,215,233,236,244,247,250,253],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,31,32,36,37,36,40,43],{},[33,34,35],"code",{},"if","、",[33,38,39],{},"elif",[33,41,42],{},"else"," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,45,46],{"id":46},"核心概念",[48,49,50,54,57],"ul",{},[51,52,53],"li",{},"冒号表示接下来开始一个代码块。",[51,55,56],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[51,58,59],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,61,62],{"id":62},"跟着示例运行",[10,64,65],{},"把下面代码保存到本课脚本并运行：",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-python shiki shiki-themes github-dark","score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n","python","",[33,74,75,83,90,96,102,108,114,120,126,131],{"__ignoreMap":72},[76,77,80],"span",{"class":78,"line":79},"line",1,[76,81,82],{},"score = int(input(\"请输入分数：\"))\n",[76,84,86],{"class":78,"line":85},2,[76,87,89],{"emptyLinePlaceholder":88},true,"\n",[76,91,93],{"class":78,"line":92},3,[76,94,95],{},"if score >= 90:\n",[76,97,99],{"class":78,"line":98},4,[76,100,101],{},"    level = \"优秀\"\n",[76,103,105],{"class":78,"line":104},5,[76,106,107],{},"elif score >= 60:\n",[76,109,111],{"class":78,"line":110},6,[76,112,113],{},"    level = \"合格\"\n",[76,115,117],{"class":78,"line":116},7,[76,118,119],{},"else:\n",[76,121,123],{"class":78,"line":122},8,[76,124,125],{},"    level = \"需要继续学习\"\n",[76,127,129],{"class":78,"line":128},9,[76,130,89],{"emptyLinePlaceholder":88},[76,132,134],{"class":78,"line":133},10,[76,135,136],{},"print(level)\n",[10,138,139],{},"预期结果：",[67,141,146],{"className":142,"code":144,"language":145,"meta":72},[143],"language-text","输入 85 时输出：合格\n","text",[33,147,144],{"__ignoreMap":72},[10,149,150],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,152,153],{"id":153},"按执行顺序拆开看",[155,156,157,164],"ol",{},[51,158,159,160,163],{},"输入先转换为整数，程序从 ",[33,161,162],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[51,165,166,169,170,172],{},[33,167,168],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,171,42],{}," 被跳过；最终三个分支只会选择一个。",[174,175,176],"h3",{"id":176},"再看一个具体细节",[10,178,179],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,181,182],{},[26,183],{"alt":184,"src":185},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,187,188,190,191,193],{},[33,189,162],{}," 必须放在 ",[33,192,168],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[174,195,176],{"id":196},"再看一个具体细节-1",[10,198,199],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,201,202],{},[26,203],{"alt":204,"src":205},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,207,208,209,211],{},"同一缩进层级属于同一个代码块；回到 ",[33,210,35],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,213,214],{"id":214},"初学者容易混淆的地方",[48,216,217,223],{},[51,218,219,220,222],{},"先写 ",[33,221,168],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[51,224,225,226,228,229,232],{},"混用多个独立 ",[33,227,35],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,230,231],{},"if\u002Felif\u002Felse"," 链。",[14,234,235],{"id":235},"练习",[155,237,238,241],{},[51,239,240],{},"根据温度输出“冷、适中、热”三个等级。",[51,242,243],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,245,246],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,248,249],{"id":249},"本篇边界",[10,251,252],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,255,256],"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":72,"searchDepth":85,"depth":85,"links":258},[259,260,261,262,263,267,268,269],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":264},[265,266],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",false,"2026-08-17",{"title":5,"description":12},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[270,35,282],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",[285,1098,1432,1566,1718,1897,2085,2250,2433,2614,2806,3037,3221,3398,3555,3726,3891,4105,4281,4463,4627,4816,5004,5159,5319,5516,5713,5927,6094,6338,6519,6724,6919,7103,7304,7594,7786,8015,8210,8430,8670,8874],{"id":286,"title":287,"body":288,"category":270,"cover":271,"description":72,"extension":272,"meta":1087,"navigation":88,"path":1088,"pinned":275,"publishedAt":1089,"seo":1090,"slug":1091,"stem":1092,"summary":1093,"tags":1094,"updatedAt":1089,"visible":88,"__hash__":1097},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":289,"toc":1063},[290,293,296,299,306,309,312,351,367,371,375,386,391,397,415,421,426,432,436,482,485,491,497,500,531,576,593,607,617,621,632,648,651,657,662,665,683,693,714,718,722,725,737,744,748,763,770,774,777,798,804,808,811,815,818,838,841,845,848,882,885,904,907,928,933,937,940,960,963,966,970,977,991,994,998,1001,1011,1022,1026,1029,1044,1060],[14,291,292],{"id":292},"引言",[10,294,295],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,297,298],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,300,301,302,305],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,303,304],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,307,308],{"id":308},"扫盲",[10,310,311],{},"那么这里有几个概念：",[313,314,315,318],"blockquote",{},[10,316,317],{},"为什么需要安装python解释器？",[313,319,320,331,334,342,345],{},[10,321,322,323,326,327,330],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,324,325],{},"0","和",[33,328,329],{},"1","组成的机器指令。",[10,332,333],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,335,336,337,341],{},"这样，我们就能用",[338,339,340],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,343,344],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,346,347],{},[26,348],{"alt":349,"src":350},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[313,352,353,356],{},[10,354,355],{},"pip又是什么？",[313,357,358,361],{},[10,359,360],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,362,363],{},[26,364],{"alt":365,"src":366},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,368,370],{"id":369},"windows-安装","Windows 安装",[174,372,374],{"id":373},"_1-下载官方安装程序","1. 下载官方安装程序",[10,376,377,378,385],{},"打开 ",[379,380,384],"a",{"href":381,"rel":382},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[383],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[313,387,388],{},[10,389,390],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,392,393],{},[26,394],{"alt":395,"src":396},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[48,398,399,406,412],{},[51,400,401,402,405],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[338,403,404],{},"Windows installer (64-bit)","。",[51,407,408,409,405],{},"搭载 ARM 处理器的 Windows 设备选择 ",[338,410,411],{},"Windows installer (ARM64)",[51,413,414],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,416,417],{},[26,418],{"alt":419,"src":420},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[313,422,423],{},[10,424,425],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,427,428],{},[26,429],{"alt":430,"src":431},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[174,433,435],{"id":434},"_2-安装并加入-path","2. 安装并加入 PATH",[313,437,438,443,450,475],{},[313,439,440],{},[10,441,442],{},"PATH 环境变量",[10,444,445,446,449],{},"Windows 有一个特殊的变量叫 ",[338,447,448],{},"PATH","，它里面存了一串文件夹路径，比如：",[67,451,453],{"className":69,"code":452,"language":71,"meta":72,"style":72},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,454,455,460,465,470],{"__ignoreMap":72},[76,456,457],{"class":78,"line":79},[76,458,459],{},"D:\\Python313\\\n",[76,461,462],{"class":78,"line":85},[76,463,464],{},"D:\\Python313\\Scripts\\\n",[76,466,467],{"class":78,"line":92},[76,468,469],{},"C:\\Windows\\System32\\\n",[76,471,472],{"class":78,"line":98},[76,473,474],{},"...\n",[10,476,477,478,481],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[338,479,480],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,483,484],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,486,487,488,490],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,489,71],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,492,493],{},[26,494],{"alt":495,"src":496},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,498,499],{},"对安装界面最底部的两个勾选项分别解释 :",[313,501,502,505,510],{},[10,503,504],{},"Add python.exe to PATH",[10,506,507],{},[338,508,509],{},"把 Python 添加到系统环境变量",[313,511,512,518,524],{},[10,513,514,515,517],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,516,71],{}," 就能运行",[10,519,520,521,523],{},"不勾选的话，命令行输入 ",[33,522,71],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,525,526,527,530],{},"必须",[338,528,529],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[313,532,533,536,541],{},[10,534,535],{},"Use admin privileges when installing py.exe",[10,537,538],{},[338,539,540],{},"使用管理员权限安装 py.exe（Python 启动器）",[313,542,543,553,567,570],{},[10,544,545,548,549,552],{},[33,546,547],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,550,551],{},"py"," 来启动 Python。",[10,554,555,556,558,559,562,563,566],{},"勾选后，",[33,557,547],{}," 会安装到",[338,560,561],{},"系统级目录","，电脑上",[338,564,565],{},"所有用户账户","都能用",[10,568,569],{},"不勾选，只有当前用户能用",[10,571,572,575],{},[338,573,574],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[313,577,578,581],{},[10,579,580],{},"操作建议",[313,582,583,590],{},[10,584,585,586,589],{},"两个都勾上之后，再点 ",[338,587,588],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,591,592],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[313,594,595,601],{},[10,596,597,598],{},"Python 安装的",[338,599,600],{},"可选功能页",[10,602,603],{},[26,604],{"alt":605,"src":606},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[313,608,609,612],{},[10,610,611],{},"高级选项页",[10,613,614],{},[26,615],{"alt":605,"src":616},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[174,618,620],{"id":619},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,622,623,624,627,628,631],{},"按 ",[33,625,626],{},"Win + R","，输入 ",[33,629,630],{},"cmd"," 并回车，然后执行：",[67,633,637],{"className":634,"code":635,"language":636,"meta":72,"style":72},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,638,639],{"__ignoreMap":72},[76,640,641,644],{"class":78,"line":79},[76,642,71],{"class":643},"svObZ",[76,645,647],{"class":646},"sDLfK"," --version\n",[10,649,650],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[67,652,655],{"className":653,"code":654,"language":145,"meta":72},[143],"Python 3.x.x\n",[33,656,654],{"__ignoreMap":72},[10,658,659],{},[26,660],{"alt":605,"src":661},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,663,664],{},"继续检查 pip：",[67,666,668],{"className":634,"code":667,"language":636,"meta":72,"style":72},"python -m pip --version\n",[33,669,670],{"__ignoreMap":72},[76,671,672,674,677,681],{"class":78,"line":79},[76,673,71],{"class":643},[76,675,676],{"class":646}," -m",[76,678,680],{"class":679},"sU2Wk"," pip",[76,682,647],{"class":646},[10,684,685,686,688,689,692],{},"如果 ",[33,687,71],{}," 无法识别，但 ",[33,690,691],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[67,694,696],{"className":634,"code":695,"language":636,"meta":72,"style":72},"py --version\npy -m pip --version\n",[33,697,698,704],{"__ignoreMap":72},[76,699,700,702],{"class":78,"line":79},[76,701,551],{"class":643},[76,703,647],{"class":646},[76,705,706,708,710,712],{"class":78,"line":85},[76,707,551],{"class":643},[76,709,676],{"class":646},[76,711,680],{"class":679},[76,713,647],{"class":646},[14,715,717],{"id":716},"macos-安装","macOS 安装",[174,719,721],{"id":720},"_1-先检查现有环境","1. 先检查现有环境",[10,723,724],{},"打开“终端”应用，执行：",[67,726,728],{"className":634,"code":727,"language":636,"meta":72,"style":72},"python3 --version\n",[33,729,730],{"__ignoreMap":72},[76,731,732,735],{"class":78,"line":79},[76,733,734],{"class":643},"python3",[76,736,647],{"class":646},[10,738,739,740,743],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,741,742],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[174,745,747],{"id":746},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,749,377,750,755,756,405,759,762],{},[379,751,754],{"href":752,"rel":753},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[383],"Python macOS 下载页","，下载当前稳定版的 ",[338,757,758],{},"macOS 64-bit universal2 installer",[33,760,761],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,764,765,766,769],{},"下载完成后打开 ",[33,767,768],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[174,771,773],{"id":772},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,775,776],{},"安装完成后重新打开终端，执行：",[67,778,780],{"className":634,"code":779,"language":636,"meta":72,"style":72},"python3 --version\npython3 -m pip --version\n",[33,781,782,788],{"__ignoreMap":72},[76,783,784,786],{"class":78,"line":79},[76,785,734],{"class":643},[76,787,647],{"class":646},[76,789,790,792,794,796],{"class":78,"line":85},[76,791,734],{"class":643},[76,793,676],{"class":646},[76,795,680],{"class":679},[76,797,647],{"class":646},[10,799,800,801,803],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,802,734],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,805,807],{"id":806},"linux-安装","Linux 安装",[10,809,810],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[174,812,814],{"id":813},"_1-检查是否已经安装","1. 检查是否已经安装",[10,816,817],{},"打开终端，执行：",[67,819,820],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,821,822,828],{"__ignoreMap":72},[76,823,824,826],{"class":78,"line":79},[76,825,734],{"class":643},[76,827,647],{"class":646},[76,829,830,832,834,836],{"class":78,"line":85},[76,831,734],{"class":643},[76,833,676],{"class":646},[76,835,680],{"class":679},[76,837,647],{"class":646},[10,839,840],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[174,842,844],{"id":843},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,846,847],{},"Ubuntu 或 Debian：",[67,849,851],{"className":634,"code":850,"language":636,"meta":72,"style":72},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,852,853,864],{"__ignoreMap":72},[76,854,855,858,861],{"class":78,"line":79},[76,856,857],{"class":643},"sudo",[76,859,860],{"class":679}," apt",[76,862,863],{"class":679}," update\n",[76,865,866,868,870,873,876,879],{"class":78,"line":85},[76,867,857],{"class":643},[76,869,860],{"class":679},[76,871,872],{"class":679}," install",[76,874,875],{"class":679}," python3",[76,877,878],{"class":679}," python3-pip",[76,880,881],{"class":679}," python3-venv\n",[10,883,884],{},"Fedora：",[67,886,888],{"className":634,"code":887,"language":636,"meta":72,"style":72},"sudo dnf install python3 python3-pip\n",[33,889,890],{"__ignoreMap":72},[76,891,892,894,897,899,901],{"class":78,"line":79},[76,893,857],{"class":643},[76,895,896],{"class":679}," dnf",[76,898,872],{"class":679},[76,900,875],{"class":679},[76,902,903],{"class":679}," python3-pip\n",[10,905,906],{},"Arch Linux：",[67,908,910],{"className":634,"code":909,"language":636,"meta":72,"style":72},"sudo pacman -S python python-pip\n",[33,911,912],{"__ignoreMap":72},[76,913,914,916,919,922,925],{"class":78,"line":79},[76,915,857],{"class":643},[76,917,918],{"class":679}," pacman",[76,920,921],{"class":646}," -S",[76,923,924],{"class":679}," python",[76,926,927],{"class":679}," python-pip\n",[10,929,930,932],{},[33,931,857],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[174,934,936],{"id":935},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,938,939],{},"安装结束后执行：",[67,941,942],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,943,944,950],{"__ignoreMap":72},[76,945,946,948],{"class":78,"line":79},[76,947,734],{"class":643},[76,949,647],{"class":646},[76,951,952,954,956,958],{"class":78,"line":85},[76,953,734],{"class":643},[76,955,676],{"class":646},[76,957,680],{"class":679},[76,959,647],{"class":646},[10,961,962],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,964,965],{"id":965},"常见问题",[174,967,969],{"id":968},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,971,972,973,976],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,974,975],{},"python --version","。如果仍然失败，按下面的顺序检查：",[155,978,979,985,988],{},[51,980,981,982,984],{},"执行 ",[33,983,691],{},"，确认 Python Launcher 是否可用。",[51,986,987],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[51,989,990],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,992,993],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[174,995,997],{"id":996},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,999,1000],{},"先尝试：",[67,1002,1003],{"className":634,"code":727,"language":636,"meta":72,"style":72},[33,1004,1005],{"__ignoreMap":72},[76,1006,1007,1009],{"class":78,"line":79},[76,1008,734],{"class":643},[76,1010,647],{"class":646},[10,1012,1013,1014,1016,1017,1019,1020,405],{},"在这两个系统中，只有 ",[33,1015,734],{}," 命令而没有 ",[33,1018,71],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,1021,734],{},[174,1023,1025],{"id":1024},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1027,1028],{},"先使用模块方式检查：",[67,1030,1032],{"className":634,"code":1031,"language":636,"meta":72,"style":72},"python3 -m pip --version\n",[33,1033,1034],{"__ignoreMap":72},[76,1035,1036,1038,1040,1042],{"class":78,"line":79},[76,1037,734],{"class":643},[76,1039,676],{"class":646},[76,1041,680],{"class":679},[76,1043,647],{"class":646},[10,1045,1046,1047,1049,1050,1052,1053,1055,1056,1059],{},"Windows 用户将命令中的 ",[33,1048,734],{}," 换成 ",[33,1051,71],{}," 或 ",[33,1054,551],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1057,1058],{},"python3-pip","；不要直接使用其他系统的安装命令。",[254,1061,1062],{},"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":72,"searchDepth":85,"depth":85,"links":1064},[1065,1066,1067,1072,1077,1082],{"id":292,"depth":85,"text":292},{"id":308,"depth":85,"text":308},{"id":369,"depth":85,"text":370,"children":1068},[1069,1070,1071],{"id":373,"depth":92,"text":374},{"id":434,"depth":92,"text":435},{"id":619,"depth":92,"text":620},{"id":716,"depth":85,"text":717,"children":1073},[1074,1075,1076],{"id":720,"depth":92,"text":721},{"id":746,"depth":92,"text":747},{"id":772,"depth":92,"text":773},{"id":806,"depth":85,"text":807,"children":1078},[1079,1080,1081],{"id":813,"depth":92,"text":814},{"id":843,"depth":92,"text":844},{"id":935,"depth":92,"text":936},{"id":965,"depth":85,"text":965,"children":1083},[1084,1085,1086],{"id":968,"depth":92,"text":969},{"id":996,"depth":92,"text":997},{"id":1024,"depth":92,"text":1025},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":287,"description":72},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[270,1095,1096],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1099,"title":1100,"body":1101,"category":270,"cover":1108,"description":72,"extension":272,"meta":1421,"navigation":88,"path":1422,"pinned":275,"publishedAt":1423,"seo":1424,"slug":1425,"stem":1426,"summary":1427,"tags":1428,"updatedAt":1423,"visible":88,"__hash__":1431},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1102,"toc":1406},[1103,1109,1112,1115,1119,1122,1146,1149,1155,1158,1161,1194,1202,1206,1213,1216,1241,1244,1256,1259,1263,1266,1269,1272,1275,1278,1281,1284,1308,1311,1314,1320,1323,1326,1329,1333,1339,1342,1368,1371,1375,1378,1381,1385,1388,1391,1394,1397,1400,1403],[10,1104,1105],{},[26,1106],{"alt":1107,"src":1108},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1110,1111],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1113,1114],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1116,1118],{"id":1117},"python-代码是什么样的","Python 代码是什么样的",[10,1120,1121],{},"下面是一段简单的 Python 代码：",[67,1123,1125],{"className":69,"code":1124,"language":71,"meta":72,"style":72},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1126,1127,1132,1137,1141],{"__ignoreMap":72},[76,1128,1129],{"class":78,"line":79},[76,1130,1131],{},"name = \"Python\"\n",[76,1133,1134],{"class":78,"line":85},[76,1135,1136],{},"year = 2026\n",[76,1138,1139],{"class":78,"line":92},[76,1140,89],{"emptyLinePlaceholder":88},[76,1142,1143],{"class":78,"line":98},[76,1144,1145],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1147,1148],{},"运行结果：",[67,1150,1153],{"className":1151,"code":1152,"language":145,"meta":72},[143],"正在学习 Python，当前年份是 2026\n",[33,1154,1152],{"__ignoreMap":72},[10,1156,1157],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1159,1160],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[67,1162,1164],{"className":69,"code":1163,"language":71,"meta":72,"style":72},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1165,1166,1171,1175,1180,1185,1189],{"__ignoreMap":72},[76,1167,1168],{"class":78,"line":79},[76,1169,1170],{},"score = 85\n",[76,1172,1173],{"class":78,"line":85},[76,1174,89],{"emptyLinePlaceholder":88},[76,1176,1177],{"class":78,"line":92},[76,1178,1179],{},"if score >= 60:\n",[76,1181,1182],{"class":78,"line":98},[76,1183,1184],{},"    print(\"成绩合格\")\n",[76,1186,1187],{"class":78,"line":104},[76,1188,119],{},[76,1190,1191],{"class":78,"line":110},[76,1192,1193],{},"    print(\"需要继续学习\")\n",[10,1195,1196,1198,1199,1201],{},[33,1197,35],{}," 和 ",[33,1200,42],{}," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1203,1205],{"id":1204},"python-如何运行代码","Python 如何运行代码",[10,1207,1208,1209,1212],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1210,1211],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1214,1215],{},"交互式环境适合快速验证一个表达式：",[67,1217,1219],{"className":69,"code":1218,"language":71,"meta":72,"style":72},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1220,1221,1226,1231,1236],{"__ignoreMap":72},[76,1222,1223],{"class":78,"line":79},[76,1224,1225],{},">>> 10 + 20\n",[76,1227,1228],{"class":78,"line":85},[76,1229,1230],{},"30\n",[76,1232,1233],{"class":78,"line":92},[76,1234,1235],{},">>> \"Python\".lower()\n",[76,1237,1238],{"class":78,"line":98},[76,1239,1240],{},"'python'\n",[10,1242,1243],{},"需要保存和重复运行的程序，则可以写入文件：",[67,1245,1247],{"className":634,"code":1246,"language":636,"meta":72,"style":72},"python3 hello.py\n",[33,1248,1249],{"__ignoreMap":72},[76,1250,1251,1253],{"class":78,"line":79},[76,1252,734],{"class":643},[76,1254,1255],{"class":679}," hello.py\n",[10,1257,1258],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1260,1262],{"id":1261},"python-的特点","Python 的特点",[174,1264,1265],{"id":1265},"语法相对简洁",[10,1267,1268],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[174,1270,1271],{"id":1271},"支持多种编程方式",[10,1273,1274],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[174,1276,1277],{"id":1277},"标准库比较完整",[10,1279,1280],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1282,1283],{},"例如，获取当前时间：",[67,1285,1287],{"className":69,"code":1286,"language":71,"meta":72,"style":72},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1288,1289,1294,1298,1303],{"__ignoreMap":72},[76,1290,1291],{"class":78,"line":79},[76,1292,1293],{},"from datetime import datetime\n",[76,1295,1296],{"class":78,"line":85},[76,1297,89],{"emptyLinePlaceholder":88},[76,1299,1300],{"class":78,"line":92},[76,1301,1302],{},"now = datetime.now()\n",[76,1304,1305],{"class":78,"line":98},[76,1306,1307],{},"print(now)\n",[10,1309,1310],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[174,1312,1313],{"id":1313},"第三方工具丰富",[10,1315,1316,1317,1319],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1318,304],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1321,1322],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[174,1324,1325],{"id":1325},"支持多个操作系统",[10,1327,1328],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1330,1332],{"id":1331},"python-可以做什么","Python 可以做什么",[10,1334,1335],{},[26,1336],{"alt":1337,"src":1338},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1340,1341],{},"Python 的应用范围比较广，常见方向包括：",[48,1343,1344,1347,1350,1353,1356,1359,1362,1365],{},[51,1345,1346],{},"编写自动化脚本，批量处理文件和重复任务；",[51,1348,1349],{},"开发网站后端和 API 服务；",[51,1351,1352],{},"进行数据清洗、统计分析和图表展示；",[51,1354,1355],{},"编写网络爬虫和信息采集工具；",[51,1357,1358],{},"开发自动化测试程序；",[51,1360,1361],{},"进行机器学习和人工智能开发；",[51,1363,1364],{},"编写运维、监控和辅助开发工具；",[51,1366,1367],{},"开发部分桌面应用和插件。",[10,1369,1370],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1372,1374],{"id":1373},"python-的发展","Python 的发展",[10,1376,1377],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1379,1380],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1382,1384],{"id":1383},"python-也有局限","Python 也有局限",[10,1386,1387],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1389,1390],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1392,1393],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1395,1396],{"id":1396},"写在最后",[10,1398,1399],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1401,1402],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[254,1404,1405],{},"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":72,"searchDepth":85,"depth":85,"links":1407},[1408,1409,1410,1417,1418,1419,1420],{"id":1117,"depth":85,"text":1118},{"id":1204,"depth":85,"text":1205},{"id":1261,"depth":85,"text":1262,"children":1411},[1412,1413,1414,1415,1416],{"id":1265,"depth":92,"text":1265},{"id":1271,"depth":92,"text":1271},{"id":1277,"depth":92,"text":1277},{"id":1313,"depth":92,"text":1313},{"id":1325,"depth":92,"text":1325},{"id":1331,"depth":85,"text":1332},{"id":1373,"depth":85,"text":1374},{"id":1383,"depth":85,"text":1384},{"id":1396,"depth":85,"text":1396},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1100,"description":72},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[270,1429,1430],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1433,"title":1434,"body":1435,"category":270,"cover":271,"description":1439,"extension":272,"meta":1557,"navigation":88,"path":1558,"pinned":275,"publishedAt":276,"seo":1559,"slug":1560,"stem":1561,"summary":1562,"tags":1563,"updatedAt":276,"visible":88,"__hash__":1565},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1436,"toc":1547},[1437,1440,1442,1445,1447,1453,1458,1460,1474,1476,1478,1487,1489,1495,1497,1499,1515,1517,1528,1530,1538,1540,1542,1545],[10,1438,1439],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1441,16],{"id":16},[10,1443,1444],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1446,22],{"id":22},[10,1448,1449],{},[26,1450],{"alt":1451,"src":1452},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1454,1455,1457],{},[33,1456,1211],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1459,46],{"id":46},[48,1461,1462,1468,1471],{},[51,1463,1464,1465,1467],{},"源代码是人编写的文本，通常保存在 ",[33,1466,1211],{}," 文件中。",[51,1469,1470],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[51,1472,1473],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1475,62],{"id":62},[10,1477,65],{},[67,1479,1481],{"className":69,"code":1480,"language":71,"meta":72,"style":72},"print(\"你好，Python\")\n",[33,1482,1483],{"__ignoreMap":72},[76,1484,1485],{"class":78,"line":79},[76,1486,1480],{},[10,1488,139],{},[67,1490,1493],{"className":1491,"code":1492,"language":145,"meta":72},[143],"你好，Python\n",[33,1494,1492],{"__ignoreMap":72},[10,1496,150],{},[14,1498,153],{"id":153},[155,1500,1501,1508],{},[51,1502,1503,1504,1507],{},"终端启动解释器后，解释器读取 ",[33,1505,1506],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[51,1509,1510,1511,1514],{},"字符串对象先准备好，再交给 ",[33,1512,1513],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1516,214],{"id":214},[48,1518,1519,1522],{},[51,1520,1521],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[51,1523,1524,1525,1527],{},"认为 ",[33,1526,1211],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1529,235],{"id":235},[155,1531,1532,1535],{},[51,1533,1534],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[51,1536,1537],{},"把示例文字改成自己的学习目标并重新运行。",[10,1539,246],{},[14,1541,249],{"id":249},[10,1543,1544],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,1546,256],{},{"title":72,"searchDepth":85,"depth":85,"links":1548},[1549,1550,1551,1552,1553,1554,1555,1556],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1434,"description":1439},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[270,1429,1564],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1567,"title":1568,"body":1569,"category":270,"cover":271,"description":1573,"extension":272,"meta":1709,"navigation":88,"path":1710,"pinned":275,"publishedAt":276,"seo":1711,"slug":1712,"stem":1713,"summary":1714,"tags":1715,"updatedAt":276,"visible":88,"__hash__":1717},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1570,"toc":1699},[1571,1574,1576,1579,1581,1587,1593,1595,1610,1612,1615,1635,1637,1643,1645,1647,1660,1662,1676,1678,1689,1691,1693,1696],[10,1572,1573],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1575,16],{"id":16},[10,1577,1578],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1580,22],{"id":22},[10,1582,1583],{},[26,1584],{"alt":1585,"src":1586},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1588,1589,1590,1592],{},"终端收到 ",[33,1591,734],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1594,46],{"id":46},[48,1596,1597,1600,1603],{},[51,1598,1599],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[51,1601,1602],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[51,1604,1605,1606,1609],{},"检查 pip 时使用 ",[33,1607,1608],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1611,62],{"id":62},[10,1613,1614],{},"在 macOS 终端执行：",[67,1616,1617],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,1618,1619,1625],{"__ignoreMap":72},[76,1620,1621,1623],{"class":78,"line":79},[76,1622,734],{"class":643},[76,1624,647],{"class":646},[76,1626,1627,1629,1631,1633],{"class":78,"line":85},[76,1628,734],{"class":643},[76,1630,676],{"class":646},[76,1632,680],{"class":679},[76,1634,647],{"class":646},[10,1636,139],{},[67,1638,1641],{"className":1639,"code":1640,"language":145,"meta":72},[143],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1642,1640],{"__ignoreMap":72},[10,1644,150],{},[14,1646,153],{"id":153},[155,1648,1649,1655],{},[51,1650,1651,1654],{},[33,1652,1653],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[51,1656,1657,1659],{},[33,1658,742],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1661,214],{"id":214},[48,1663,1664,1670],{},[51,1665,1666,1667,1669],{},"看到系统已有 ",[33,1668,734],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[51,1671,1672,1673,1675],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1674,734],{},"，不修改系统自带工具。",[14,1677,235],{"id":235},[155,1679,1680,1686],{},[51,1681,981,1682,1685],{},[33,1683,1684],{},"which python3","，记录当前解释器路径。",[51,1687,1688],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1690,246],{},[14,1692,249],{"id":249},[10,1694,1695],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,1697,1698],{},"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":72,"searchDepth":85,"depth":85,"links":1700},[1701,1702,1703,1704,1705,1706,1707,1708],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1568,"description":1573},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[270,1716,1095],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1719,"title":1720,"body":1721,"category":270,"cover":271,"description":1886,"extension":272,"meta":1887,"navigation":88,"path":1888,"pinned":275,"publishedAt":276,"seo":1889,"slug":1890,"stem":1891,"summary":1892,"tags":1893,"updatedAt":276,"visible":88,"__hash__":1896},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1722,"toc":1876},[1723,1729,1731,1734,1736,1742,1745,1747,1771,1773,1775,1802,1804,1810,1812,1814,1832,1834,1848,1850,1864,1866,1868,1874],[10,1724,1725,1726,1728],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1727,1211],{}," 脚本。",[14,1730,16],{"id":16},[10,1732,1733],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1735,22],{"id":22},[10,1737,1738],{},[26,1739],{"alt":1740,"src":1741},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1743,1744],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1746,46],{"id":46},[48,1748,1749,1758,1765],{},[51,1750,1751,1752,1754,1755,405],{},"在终端输入 ",[33,1753,734],{}," 进入 REPL，提示符通常是 ",[33,1756,1757],{},">>>",[51,1759,1760,1761,1764],{},"输入 ",[33,1762,1763],{},"exit()"," 或按 Control-D 退出 REPL。",[51,1766,1767,1768,1770],{},"需要保存、复查或多次运行的代码应写入 ",[33,1769,1211],{}," 文件。",[14,1772,62],{"id":62},[10,1774,65],{},[67,1776,1780],{"className":1777,"code":1778,"language":1779,"meta":72,"style":72},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1781,1782,1787,1792,1797],{"__ignoreMap":72},[76,1783,1784],{"class":78,"line":79},[76,1785,1786],{},">>> 2 + 3\n",[76,1788,1789],{"class":78,"line":85},[76,1790,1791],{},"5\n",[76,1793,1794],{"class":78,"line":92},[76,1795,1796],{},">>> \"python\".upper()\n",[76,1798,1799],{"class":78,"line":98},[76,1800,1801],{},"'PYTHON'\n",[10,1803,139],{},[67,1805,1808],{"className":1806,"code":1807,"language":145,"meta":72},[143],"REPL 会直接显示表达式结果\n",[33,1809,1807],{"__ignoreMap":72},[10,1811,150],{},[14,1813,153],{"id":153},[155,1815,1816,1826],{},[51,1817,1818,1819,1822,1823,405],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1820,1821],{},"2 + 3"," 能直接看到 ",[33,1824,1825],{},"5",[51,1827,1828,1829,1831],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1830,1513],{}," 才会写到标准输出。",[14,1833,214],{"id":214},[48,1835,1836,1845],{},[51,1837,1838,1839,1841,1842,1844],{},"把提示符 ",[33,1840,1757],{}," 复制进 ",[33,1843,1211],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[51,1846,1847],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1849,235],{"id":235},[155,1851,1852,1858],{},[51,1853,1854,1855,405],{},"在 REPL 计算 ",[33,1856,1857],{},"12 * 8",[51,1859,1860,1861,1863],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1862,1513],{}," 时是否显示结果。",[10,1865,246],{},[14,1867,249],{"id":249},[10,1869,1870,1871,1873],{},"本篇目标是根据任务选择 REPL 或 ",[33,1872,1211],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,1875,256],{},{"title":72,"searchDepth":85,"depth":85,"links":1877},[1878,1879,1880,1881,1882,1883,1884,1885],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1720,"description":1886},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[270,1894,1895],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1898,"title":1899,"body":1900,"category":270,"cover":271,"description":1904,"extension":272,"meta":2075,"navigation":88,"path":2076,"pinned":275,"publishedAt":276,"seo":2077,"slug":2078,"stem":2079,"summary":2080,"tags":2081,"updatedAt":276,"visible":88,"__hash__":2084},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1901,"toc":2065},[1902,1905,1907,1910,1912,1918,1924,1926,1944,1946,1948,1993,1995,2001,2003,2005,2027,2029,2041,2043,2055,2057,2059,2062],[10,1903,1904],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1906,16],{"id":16},[10,1908,1909],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1911,22],{"id":22},[10,1913,1914],{},[26,1915],{"alt":1916,"src":1917},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1919,1920,1923],{},[33,1921,1922],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1925,46],{"id":46},[48,1927,1928,1931,1941],{},[51,1929,1930],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[51,1932,1933,1936,1937,1940],{},[33,1934,1935],{},"pwd"," 显示当前目录，",[33,1938,1939],{},"ls"," 显示目录里的文件。",[51,1942,1943],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1945,62],{"id":62},[10,1947,1614],{},[67,1949,1951],{"className":634,"code":1950,"language":636,"meta":72,"style":72},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1952,1953,1961,1968,1973,1987],{"__ignoreMap":72},[76,1954,1955,1958],{"class":78,"line":79},[76,1956,1957],{"class":643},"mkdir",[76,1959,1960],{"class":679}," python-study\n",[76,1962,1963,1966],{"class":78,"line":85},[76,1964,1965],{"class":646},"cd",[76,1967,1960],{"class":679},[76,1969,1970],{"class":78,"line":92},[76,1971,1972],{"class":646},"pwd\n",[76,1974,1975,1978,1981,1985],{"class":78,"line":98},[76,1976,1977],{"class":646},"printf",[76,1979,1980],{"class":679}," 'print(\"项目已经运行\")\\n'",[76,1982,1984],{"class":1983},"snl16"," >",[76,1986,1255],{"class":679},[76,1988,1989,1991],{"class":78,"line":104},[76,1990,734],{"class":643},[76,1992,1255],{"class":679},[10,1994,139],{},[67,1996,1999],{"className":1997,"code":1998,"language":145,"meta":72},[143],"项目已经运行\n",[33,2000,1998],{"__ignoreMap":72},[10,2002,150],{},[14,2004,153],{"id":153},[155,2006,2007,2018],{},[51,2008,2009,2011,2012,2014,2015,2017],{},[33,2010,1957],{}," 创建目录，",[33,2013,1965],{}," 改变终端当前目录，",[33,2016,1935],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[51,2019,2020,2022,2023,2026],{},[33,2021,1922],{}," 会在当前目录寻找 ",[33,2024,2025],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2028,214],{"id":214},[48,2030,2031,2038],{},[51,2032,2033,2034,1198,2036,405],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,2035,1935],{},[33,2037,1939],{},[51,2039,2040],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2042,235],{"id":235},[155,2044,2045,2052],{},[51,2046,2047,2048,2051],{},"新建 ",[33,2049,2050],{},"lesson01.py"," 并输出课程编号。",[51,2053,2054],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2056,246],{},[14,2058,249],{"id":249},[10,2060,2061],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,2063,2064],{},"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":72,"searchDepth":85,"depth":85,"links":2066},[2067,2068,2069,2070,2071,2072,2073,2074],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1899,"description":1904},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[270,2082,2083],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2086,"title":2087,"body":2088,"category":270,"cover":271,"description":2092,"extension":272,"meta":2240,"navigation":88,"path":2241,"pinned":275,"publishedAt":276,"seo":2242,"slug":2243,"stem":2244,"summary":2245,"tags":2246,"updatedAt":276,"visible":88,"__hash__":2249},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2089,"toc":2230},[2090,2093,2095,2098,2100,2106,2117,2119,2139,2141,2143,2163,2165,2171,2173,2175,2194,2196,2204,2206,2221,2223,2225,2228],[10,2091,2092],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2094,16],{"id":16},[10,2096,2097],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2099,22],{"id":22},[10,2101,2102],{},[26,2103],{"alt":2104,"src":2105},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2107,2108,2109,405,2111,2114,2115,405],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2110,1513],{},[33,2112,2113],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2116,1821],{},[14,2118,46],{"id":46},[48,2120,2121,2127,2136],{},[51,2122,2123,2126],{},[33,2124,2125],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[51,2128,2129,2132,2133,405],{},[33,2130,2131],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2134,2135],{},"12",[51,2137,2138],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2140,62],{"id":62},[10,2142,65],{},[67,2144,2146],{"className":69,"code":2145,"language":71,"meta":72,"style":72},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2147,2148,2153,2158],{"__ignoreMap":72},[76,2149,2150],{"class":78,"line":79},[76,2151,2152],{},"print(42)\n",[76,2154,2155],{"class":78,"line":85},[76,2156,2157],{},"print(7 + 5)\n",[76,2159,2160],{"class":78,"line":92},[76,2161,2162],{},"print(\"Python 基础课\")\n",[10,2164,139],{},[67,2166,2169],{"className":2167,"code":2168,"language":145,"meta":72},[143],"42\n12\nPython 基础课\n",[33,2170,2168],{"__ignoreMap":72},[10,2172,150],{},[14,2174,153],{"id":153},[155,2176,2177,2185],{},[51,2178,2179,2182,2183,405],{},[33,2180,2181],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2184,2135],{},[51,2186,2187,2189,2190,2193],{},[33,2188,1513],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2191,2192],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2195,214],{"id":214},[48,2197,2198,2201],{},[51,2199,2200],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[51,2202,2203],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2205,235],{"id":235},[155,2207,2208,2211],{},[51,2209,2210],{},"分别输出一个整数、一个小数和一段文本。",[51,2212,2213,2214,2216,2217,2220],{},"比较 ",[33,2215,2113],{}," 与 ",[33,2218,2219],{},"print(\"2 + 3\")"," 的结果。",[10,2222,246],{},[14,2224,249],{"id":249},[10,2226,2227],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,2229,256],{},{"title":72,"searchDepth":85,"depth":85,"links":2231},[2232,2233,2234,2235,2236,2237,2238,2239],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2087,"description":2092},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[270,2247,2248],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2251,"title":2252,"body":2253,"category":270,"cover":271,"description":2257,"extension":272,"meta":2423,"navigation":88,"path":2424,"pinned":275,"publishedAt":276,"seo":2425,"slug":2426,"stem":2427,"summary":2428,"tags":2429,"updatedAt":276,"visible":88,"__hash__":2432},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2254,"toc":2413},[2255,2258,2260,2263,2265,2271,2274,2276,2301,2303,2305,2333,2335,2341,2343,2345,2369,2371,2387,2389,2404,2406,2408,2411],[10,2256,2257],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2259,16],{"id":16},[10,2261,2262],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2264,22],{"id":22},[10,2266,2267],{},[26,2268],{"alt":2269,"src":2270},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2272,2273],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2275,46],{"id":46},[48,2277,2278,2281,2291],{},[51,2279,2280],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[51,2282,2283,2284,2216,2287,2290],{},"变量名区分大小写，",[33,2285,2286],{},"score",[33,2288,2289],{},"Score"," 是两个名字。",[51,2292,2293,2294,36,2297,2300],{},"使用能表达含义的名称；不要用 ",[33,2295,2296],{},"list",[33,2298,2299],{},"str"," 等内置名称作为普通变量名。",[14,2302,62],{"id":62},[10,2304,65],{},[67,2306,2308],{"className":69,"code":2307,"language":71,"meta":72,"style":72},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2309,2310,2315,2320,2324,2329],{"__ignoreMap":72},[76,2311,2312],{"class":78,"line":79},[76,2313,2314],{},"score = 90\n",[76,2316,2317],{"class":78,"line":85},[76,2318,2319],{},"print(score)\n",[76,2321,2322],{"class":78,"line":92},[76,2323,89],{"emptyLinePlaceholder":88},[76,2325,2326],{"class":78,"line":98},[76,2327,2328],{},"score = 95\n",[76,2330,2331],{"class":78,"line":104},[76,2332,2319],{},[10,2334,139],{},[67,2336,2339],{"className":2337,"code":2338,"language":145,"meta":72},[143],"90\n95\n",[33,2340,2338],{"__ignoreMap":72},[10,2342,150],{},[14,2344,153],{"id":153},[155,2346,2347,2356],{},[51,2348,981,2349,2352,2353,2355],{},[33,2350,2351],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2354,2286],{}," 再绑定到它。",[51,2357,981,2358,2361,2362,2365,2366,405],{},[33,2359,2360],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2363,2364],{},"90"," 没有被改造成 ",[33,2367,2368],{},"95",[14,2370,214],{"id":214},[48,2372,2373,2376],{},[51,2374,2375],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[51,2377,2378,2379,36,2381,36,2383,2386],{},"使用 ",[33,2380,2296],{},[33,2382,2299],{},[33,2384,2385],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2388,235],{"id":235},[155,2390,2391,2401],{},[51,2392,2393,2394,1198,2397,2400],{},"创建 ",[33,2395,2396],{},"course_name",[33,2398,2399],{},"lesson_count"," 两个变量并输出。",[51,2402,2403],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2405,246],{},[14,2407,249],{"id":249},[10,2409,2410],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,2412,256],{},{"title":72,"searchDepth":85,"depth":85,"links":2414},[2415,2416,2417,2418,2419,2420,2421,2422],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2252,"description":2257},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[270,2430,2431],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2434,"title":2435,"body":2436,"category":270,"cover":271,"description":2440,"extension":272,"meta":2604,"navigation":88,"path":2605,"pinned":275,"publishedAt":276,"seo":2606,"slug":2607,"stem":2608,"summary":2609,"tags":2610,"updatedAt":276,"visible":88,"__hash__":2613},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2437,"toc":2594},[2438,2441,2443,2446,2448,2454,2457,2459,2488,2490,2492,2536,2538,2544,2546,2548,2562,2564,2575,2577,2585,2587,2589,2592],[10,2439,2440],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2442,16],{"id":16},[10,2444,2445],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2447,22],{"id":22},[10,2449,2450],{},[26,2451],{"alt":2452,"src":2453},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2455,2456],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2458,46],{"id":46},[48,2460,2461,2471,2485],{},[51,2462,2463,2466,2467,2470],{},[33,2464,2465],{},"int"," 表示整数，",[33,2468,2469],{},"float"," 表示浮点数。",[51,2472,2473,2476,2477,2480,2481,2484],{},[33,2474,2475],{},"\u002F"," 总是进行真除法；",[33,2478,2479],{},"\u002F\u002F"," 是向下取整除法，",[33,2482,2483],{},"%"," 得到余数。",[51,2486,2487],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2489,62],{"id":62},[10,2491,65],{},[67,2493,2495],{"className":69,"code":2494,"language":71,"meta":72,"style":72},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2496,2497,2502,2507,2512,2516,2521,2526,2531],{"__ignoreMap":72},[76,2498,2499],{"class":78,"line":79},[76,2500,2501],{},"price = 25\n",[76,2503,2504],{"class":78,"line":85},[76,2505,2506],{},"count = 4\n",[76,2508,2509],{"class":78,"line":92},[76,2510,2511],{},"discount = 0.9\n",[76,2513,2514],{"class":78,"line":98},[76,2515,89],{"emptyLinePlaceholder":88},[76,2517,2518],{"class":78,"line":104},[76,2519,2520],{},"total = price * count * discount\n",[76,2522,2523],{"class":78,"line":110},[76,2524,2525],{},"average = total \u002F count\n",[76,2527,2528],{"class":78,"line":116},[76,2529,2530],{},"print(total)\n",[76,2532,2533],{"class":78,"line":122},[76,2534,2535],{},"print(average)\n",[10,2537,139],{},[67,2539,2542],{"className":2540,"code":2541,"language":145,"meta":72},[143],"90.0\n22.5\n",[33,2543,2541],{"__ignoreMap":72},[10,2545,150],{},[14,2547,153],{"id":153},[155,2549,2550,2556],{},[51,2551,2552,2555],{},[33,2553,2554],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[51,2557,2558,2561],{},[33,2559,2560],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2563,214],{"id":214},[48,2565,2566,2572],{},[51,2567,2568,2569,405],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2570,2571],{},"decimal.Decimal",[51,2573,2574],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2576,235],{"id":235},[155,2578,2579,2582],{},[51,2580,2581],{},"计算 137 除以 10 的商和余数。",[51,2583,2584],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2586,246],{},[14,2588,249],{"id":249},[10,2590,2591],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,2593,256],{},{"title":72,"searchDepth":85,"depth":85,"links":2595},[2596,2597,2598,2599,2600,2601,2602,2603],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2435,"description":2440},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[270,2611,2612],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2615,"title":2616,"body":2617,"category":270,"cover":271,"description":2621,"extension":272,"meta":2796,"navigation":88,"path":2797,"pinned":275,"publishedAt":276,"seo":2798,"slug":2799,"stem":2800,"summary":2801,"tags":2802,"updatedAt":276,"visible":88,"__hash__":2805},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2618,"toc":2784},[2619,2622,2624,2627,2629,2635,2645,2647,2658,2660,2662,2692,2694,2700,2702,2704,2734,2736,2739,2745,2748,2750,2758,2760,2775,2777,2779,2782],[10,2620,2621],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2623,16],{"id":16},[10,2625,2626],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2628,22],{"id":22},[10,2630,2631],{},[26,2632],{"alt":2633,"src":2634},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2636,2637,2638,2641,2642,405],{},"切片 ",[33,2639,2640],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2643,2644],{},"stop - start",[14,2646,46],{"id":46},[48,2648,2649,2652,2655],{},[51,2650,2651],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[51,2653,2654],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[51,2656,2657],{},"切片会创建新的字符串，不会修改原字符串。",[14,2659,62],{"id":62},[10,2661,65],{},[67,2663,2665],{"className":69,"code":2664,"language":71,"meta":72,"style":72},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2666,2667,2672,2677,2682,2687],{"__ignoreMap":72},[76,2668,2669],{"class":78,"line":79},[76,2670,2671],{},"language = \"Python\"\n",[76,2673,2674],{"class":78,"line":85},[76,2675,2676],{},"print(language[0])\n",[76,2678,2679],{"class":78,"line":92},[76,2680,2681],{},"print(language[-1])\n",[76,2683,2684],{"class":78,"line":98},[76,2685,2686],{},"print(language[0:3])\n",[76,2688,2689],{"class":78,"line":104},[76,2690,2691],{},"print(language + \" 3.14\")\n",[10,2693,139],{},[67,2695,2698],{"className":2696,"code":2697,"language":145,"meta":72},[143],"P\nn\nPyt\nPython 3.14\n",[33,2699,2697],{"__ignoreMap":72},[10,2701,150],{},[14,2703,153],{"id":153},[155,2705,2706,2720],{},[51,2707,2708,2709,2711,2712,2715,2716,2719],{},"字符串 ",[33,2710,270],{}," 的正索引从 ",[33,2713,2714],{},"P"," 的 0 开始，负索引从末尾 ",[33,2717,2718],{},"n"," 的 -1 开始。",[51,2721,2722,2725,2726,2729,2730,2733],{},[33,2723,2724],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2727,2728],{},"Pyt","；索引 3 的 ",[33,2731,2732],{},"h"," 不在结果中。",[174,2735,176],{"id":176},[10,2737,2738],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2740,2741],{},[26,2742],{"alt":2743,"src":2744},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2746,2747],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2749,214],{"id":214},[48,2751,2752,2755],{},[51,2753,2754],{},"把第一个字符写成索引 1，造成整体偏移一位。",[51,2756,2757],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2759,235],{"id":235},[155,2761,2762,2772],{},[51,2763,2764,2765,2768,2769,405],{},"从 ",[33,2766,2767],{},"\"programming\""," 中切出 ",[33,2770,2771],{},"\"gram\"",[51,2773,2774],{},"使用负索引取得字符串倒数第二个字符。",[10,2776,246],{},[14,2778,249],{"id":249},[10,2780,2781],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,2783,256],{},{"title":72,"searchDepth":85,"depth":85,"links":2785},[2786,2787,2788,2789,2790,2793,2794,2795],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":2791},[2792],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2616,"description":2621},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[270,2803,2804],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2807,"title":2808,"body":2809,"category":270,"cover":271,"description":2813,"extension":272,"meta":3027,"navigation":88,"path":3028,"pinned":275,"publishedAt":276,"seo":3029,"slug":3030,"stem":3031,"summary":3032,"tags":3033,"updatedAt":276,"visible":88,"__hash__":3036},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2810,"toc":3015},[2811,2814,2816,2819,2821,2827,2837,2839,2872,2874,2876,2920,2922,2928,2930,2932,2953,2955,2958,2964,2972,2974,2988,2990,3006,3008,3010,3013],[10,2812,2813],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2815,16],{"id":16},[10,2817,2818],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2820,22],{"id":22},[10,2822,2823],{},[26,2824],{"alt":2825,"src":2826},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2828,2829,2830,1052,2833,2836],{},"比较表达式先产生 ",[33,2831,2832],{},"True",[33,2834,2835],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2838,46],{"id":46},[48,2840,2841,2855,2869],{},[51,2842,2843,2846,2847,2850,2851,2854],{},[33,2844,2845],{},"=="," 判断是否相等，",[33,2848,2849],{},"!="," 判断是否不等；单个 ",[33,2852,2853],{},"="," 是赋值。",[51,2856,2857,2860,2861,2864,2865,2868],{},[33,2858,2859],{},"and"," 要求两侧都为真，",[33,2862,2863],{},"or"," 只需一侧为真，",[33,2866,2867],{},"not"," 取反。",[51,2870,2871],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2873,62],{"id":62},[10,2875,65],{},[67,2877,2879],{"className":69,"code":2878,"language":71,"meta":72,"style":72},"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,2880,2881,2886,2891,2895,2900,2905,2910,2915],{"__ignoreMap":72},[76,2882,2883],{"class":78,"line":79},[76,2884,2885],{},"age = 20\n",[76,2887,2888],{"class":78,"line":85},[76,2889,2890],{},"has_ticket = True\n",[76,2892,2893],{"class":78,"line":92},[76,2894,89],{"emptyLinePlaceholder":88},[76,2896,2897],{"class":78,"line":98},[76,2898,2899],{},"is_adult = age >= 18\n",[76,2901,2902],{"class":78,"line":104},[76,2903,2904],{},"can_enter = is_adult and has_ticket\n",[76,2906,2907],{"class":78,"line":110},[76,2908,2909],{},"print(is_adult)\n",[76,2911,2912],{"class":78,"line":116},[76,2913,2914],{},"print(can_enter)\n",[76,2916,2917],{"class":78,"line":122},[76,2918,2919],{},"print(not has_ticket)\n",[10,2921,139],{},[67,2923,2926],{"className":2924,"code":2925,"language":145,"meta":72},[143],"True\nTrue\nFalse\n",[33,2927,2925],{"__ignoreMap":72},[10,2929,150],{},[14,2931,153],{"id":153},[155,2933,2934,2944],{},[51,2935,2936,2939,2940,2943],{},[33,2937,2938],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2941,2942],{},"is_adult","，这一步没有任何分支跳转。",[51,2945,2946,2949,2950,2952],{},[33,2947,2948],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2951,2867],{}," 只对紧随其后的值取反。",[174,2954,176],{"id":176},[10,2956,2957],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2959,2960],{},[26,2961],{"alt":2962,"src":2963},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2965,2966,2968,2969,2971],{},[33,2967,2859],{}," 只有“真、真”得到真；",[33,2970,2863],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2973,214],{"id":214},[48,2975,2976,2985],{},[51,2977,2978,2979,2981,2982,2984],{},"用单个等号判断相等。",[33,2980,2853],{}," 是赋值，",[33,2983,2845],{}," 才是相等比较。",[51,2986,2987],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2989,235],{"id":235},[155,2991,2992,2999],{},[51,2993,2994,2995,2998],{},"判断数字 ",[33,2996,2997],{},"15"," 是否同时大于 10 且小于 20。",[51,3000,3001,3002,3005],{},"分别修改年龄和票据状态，记录 ",[33,3003,3004],{},"can_enter"," 的四种组合结果。",[10,3007,246],{},[14,3009,249],{"id":249},[10,3011,3012],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3014,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3016},[3017,3018,3019,3020,3021,3024,3025,3026],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":3022},[3023],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2808,"description":2813},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[270,3034,3035],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3038,"title":3039,"body":3040,"category":270,"cover":271,"description":3044,"extension":272,"meta":3212,"navigation":88,"path":3213,"pinned":275,"publishedAt":276,"seo":3214,"slug":3215,"stem":3216,"summary":3217,"tags":3218,"updatedAt":276,"visible":88,"__hash__":3220},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3041,"toc":3202},[3042,3045,3047,3050,3052,3058,3076,3078,3091,3093,3095,3129,3131,3137,3139,3141,3163,3165,3177,3179,3193,3195,3197,3200],[10,3043,3044],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3046,16],{"id":16},[10,3048,3049],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3051,22],{"id":22},[10,3053,3054],{},[26,3055],{"alt":3056,"src":3057},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3059,3060,3063,3064,3067,3068,3071,3072,3075],{},[33,3061,3062],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3065,3066],{},"18","，程序首先得到的也是 ",[33,3069,3070],{},"\"18\"","，需要 ",[33,3073,3074],{},"int()"," 后才能按整数参与计算。",[14,3077,46],{"id":46},[48,3079,3080,3083,3088],{},[51,3081,3082],{},"提示文字应告诉用户需要输入什么。",[51,3084,3085,3087],{},[33,3086,3074],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[51,3089,3090],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3092,62],{"id":62},[10,3094,65],{},[67,3096,3098],{"className":69,"code":3097,"language":71,"meta":72,"style":72},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3099,3100,3105,3110,3115,3119,3124],{"__ignoreMap":72},[76,3101,3102],{"class":78,"line":79},[76,3103,3104],{},"name = input(\"请输入姓名：\")\n",[76,3106,3107],{"class":78,"line":85},[76,3108,3109],{},"age_text = input(\"请输入年龄：\")\n",[76,3111,3112],{"class":78,"line":92},[76,3113,3114],{},"age = int(age_text)\n",[76,3116,3117],{"class":78,"line":98},[76,3118,89],{"emptyLinePlaceholder":88},[76,3120,3121],{"class":78,"line":104},[76,3122,3123],{},"print(\"你好，\" + name)\n",[76,3125,3126],{"class":78,"line":110},[76,3127,3128],{},"print(age + 1)\n",[10,3130,139],{},[67,3132,3135],{"className":3133,"code":3134,"language":145,"meta":72},[143],"根据输入显示姓名，并输出下一年的年龄\n",[33,3136,3134],{"__ignoreMap":72},[10,3138,150],{},[14,3140,153],{"id":153},[155,3142,3143,3153],{},[51,3144,3145,3146,3148,3149,3152],{},"两次 ",[33,3147,3062],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3150,3151],{},"age_text"," 用来提醒这仍是文本。",[51,3154,3155,3158,3159,3162],{},[33,3156,3157],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3160,3161],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3164,214],{"id":214},[48,3166,3167,3174],{},[51,3168,3169,3170,3173],{},"直接计算 ",[33,3171,3172],{},"input(...) + 1","，忽略输入结果是字符串。",[51,3175,3176],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3178,235],{"id":235},[155,3180,3181,3184],{},[51,3182,3183],{},"接收两个整数并输出它们的和。",[51,3185,1760,3186,3189,3190,3192],{},[33,3187,3188],{},"18.5"," 给 ",[33,3191,3074],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3194,246],{},[14,3196,249],{"id":249},[10,3198,3199],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3201,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3203},[3204,3205,3206,3207,3208,3209,3210,3211],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3039,"description":3044},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[270,2385,3219],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3222,"title":3223,"body":3224,"category":270,"cover":271,"description":3228,"extension":272,"meta":3388,"navigation":88,"path":3389,"pinned":275,"publishedAt":276,"seo":3390,"slug":3391,"stem":3392,"summary":3393,"tags":3394,"updatedAt":276,"visible":88,"__hash__":3397},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3225,"toc":3378},[3226,3229,3231,3234,3236,3242,3249,3251,3265,3267,3269,3308,3310,3316,3318,3320,3339,3341,3356,3358,3369,3371,3373,3376],[10,3227,3228],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3230,16],{"id":16},[10,3232,3233],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3235,22],{"id":22},[10,3237,3238],{},[26,3239],{"alt":3240,"src":3241},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3243,3244,3245,3248],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3246,3247],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3250,46],{"id":46},[48,3252,3253,3256,3259],{},[51,3254,3255],{},"列表使用方括号，元素之间用逗号分隔。",[51,3257,3258],{},"列表可变，可以替换、追加和删除元素。",[51,3260,3261,3262,405],{},"访问不存在的索引会产生 ",[33,3263,3264],{},"IndexError",[14,3266,62],{"id":62},[10,3268,65],{},[67,3270,3272],{"className":69,"code":3271,"language":71,"meta":72,"style":72},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3273,3274,3279,3284,3288,3293,3298,3303],{"__ignoreMap":72},[76,3275,3276],{"class":78,"line":79},[76,3277,3278],{},"scores = [82, 90, 76]\n",[76,3280,3281],{"class":78,"line":85},[76,3282,3283],{},"print(scores[0])\n",[76,3285,3286],{"class":78,"line":92},[76,3287,89],{"emptyLinePlaceholder":88},[76,3289,3290],{"class":78,"line":98},[76,3291,3292],{},"scores[1] = 95\n",[76,3294,3295],{"class":78,"line":104},[76,3296,3297],{},"scores.append(88)\n",[76,3299,3300],{"class":78,"line":110},[76,3301,3302],{},"print(scores)\n",[76,3304,3305],{"class":78,"line":116},[76,3306,3307],{},"print(len(scores))\n",[10,3309,139],{},[67,3311,3314],{"className":3312,"code":3313,"language":145,"meta":72},[143],"82\n[82, 95, 76, 88]\n4\n",[33,3315,3313],{"__ignoreMap":72},[10,3317,150],{},[14,3319,153],{"id":153},[155,3321,3322,3325],{},[51,3323,3324],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[51,3326,3327,3330,3331,3334,3335,3338],{},[33,3328,3329],{},"scores[1] = 95"," 替换第二个位置，",[33,3332,3333],{},"append(88)"," 在末尾增加新位置，",[33,3336,3337],{},"len()"," 因而从 3 变为 4。",[14,3340,214],{"id":214},[48,3342,3343,3353],{},[51,3344,3345,3346,3349,3350,405],{},"访问 ",[33,3347,3348],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3351,3352],{},"len(scores) - 1",[51,3354,3355],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3357,235],{"id":235},[155,3359,3360,3363],{},[51,3361,3362],{},"建立三项学习任务列表，再追加第四项。",[51,3364,3365,3366,3368],{},"修改第二项，并用 ",[33,3367,3337],{}," 检查元素数量。",[10,3370,246],{},[14,3372,249],{"id":249},[10,3374,3375],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3377,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3379},[3380,3381,3382,3383,3384,3385,3386,3387],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3223,"description":3228},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[270,3395,3396],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3399,"title":3400,"body":3401,"category":270,"cover":271,"description":3405,"extension":272,"meta":3546,"navigation":88,"path":3547,"pinned":275,"publishedAt":276,"seo":3548,"slug":3549,"stem":3550,"summary":3551,"tags":3552,"updatedAt":276,"visible":88,"__hash__":3554},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3402,"toc":3536},[3403,3406,3408,3411,3413,3419,3422,3424,3435,3437,3439,3473,3475,3481,3483,3485,3499,3501,3513,3515,3527,3529,3531,3534],[10,3404,3405],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3407,16],{"id":16},[10,3409,3410],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3412,22],{"id":22},[10,3414,3415],{},[26,3416],{"alt":3417,"src":3418},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3420,3421],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3423,46],{"id":46},[48,3425,3426,3429,3432],{},[51,3427,3428],{},"元组常用来表达固定数量、固定含义的一组值。",[51,3430,3431],{},"只有一个元素的元组必须保留尾随逗号。",[51,3433,3434],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3436,62],{"id":62},[10,3438,65],{},[67,3440,3442],{"className":69,"code":3441,"language":71,"meta":72,"style":72},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3443,3444,3449,3454,3459,3463,3468],{"__ignoreMap":72},[76,3445,3446],{"class":78,"line":79},[76,3447,3448],{},"point = (120, 80)\n",[76,3450,3451],{"class":78,"line":85},[76,3452,3453],{},"print(point[0])\n",[76,3455,3456],{"class":78,"line":92},[76,3457,3458],{},"print(point[1])\n",[76,3460,3461],{"class":78,"line":98},[76,3462,89],{"emptyLinePlaceholder":88},[76,3464,3465],{"class":78,"line":104},[76,3466,3467],{},"single = (5,)\n",[76,3469,3470],{"class":78,"line":110},[76,3471,3472],{},"print(single)\n",[10,3474,139],{},[67,3476,3479],{"className":3477,"code":3478,"language":145,"meta":72},[143],"120\n80\n(5,)\n",[33,3480,3478],{"__ignoreMap":72},[10,3482,150],{},[14,3484,153],{"id":153},[155,3486,3487,3493],{},[51,3488,3489,3492],{},[33,3490,3491],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[51,3494,3495,3498],{},[33,3496,3497],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3500,214],{"id":214},[48,3502,3503,3510],{},[51,3504,3505,3506,3509],{},"把 ",[33,3507,3508],{},"(5)"," 当作元组，实际它仍是整数。",[51,3511,3512],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3514,235],{"id":235},[155,3516,3517,3520],{},[51,3518,3519],{},"用元组表示宽度和高度。",[51,3521,2213,3522,2216,3524,3526],{},[33,3523,3508],{},[33,3525,3497],{}," 的类型。",[10,3528,246],{},[14,3530,249],{"id":249},[10,3532,3533],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3535,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3537},[3538,3539,3540,3541,3542,3543,3544,3545],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3400,"description":3405},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[270,3553,3396],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3556,"title":3557,"body":3558,"category":270,"cover":271,"description":3562,"extension":272,"meta":3717,"navigation":88,"path":3718,"pinned":275,"publishedAt":276,"seo":3719,"slug":3720,"stem":3721,"summary":3722,"tags":3723,"updatedAt":276,"visible":88,"__hash__":3725},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3559,"toc":3707},[3560,3563,3565,3568,3570,3576,3586,3588,3602,3604,3606,3640,3642,3648,3650,3652,3667,3669,3688,3690,3698,3700,3702,3705],[10,3561,3562],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3564,16],{"id":16},[10,3566,3567],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3569,22],{"id":22},[10,3571,3572],{},[26,3573],{"alt":3574,"src":3575},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3577,3578,3579,3582,3583,3585],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3580,3581],{},"student[\"score\"]"," 读取的是键 ",[33,3584,2286],{}," 对应的值，而不是“第几个元素”。",[14,3587,46],{"id":46},[48,3589,3590,3593,3599],{},[51,3591,3592],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[51,3594,2378,3595,3598],{},[33,3596,3597],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[51,3600,3601],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3603,62],{"id":62},[10,3605,65],{},[67,3607,3609],{"className":69,"code":3608,"language":71,"meta":72,"style":72},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3610,3611,3616,3621,3625,3630,3635],{"__ignoreMap":72},[76,3612,3613],{"class":78,"line":79},[76,3614,3615],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[76,3617,3618],{"class":78,"line":85},[76,3619,3620],{},"print(student[\"name\"])\n",[76,3622,3623],{"class":78,"line":92},[76,3624,89],{"emptyLinePlaceholder":88},[76,3626,3627],{"class":78,"line":98},[76,3628,3629],{},"student[\"score\"] = 95\n",[76,3631,3632],{"class":78,"line":104},[76,3633,3634],{},"student[\"city\"] = \"郑州\"\n",[76,3636,3637],{"class":78,"line":110},[76,3638,3639],{},"print(student)\n",[10,3641,139],{},[67,3643,3646],{"className":3644,"code":3645,"language":145,"meta":72},[143],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3647,3645],{"__ignoreMap":72},[10,3649,150],{},[14,3651,153],{"id":153},[155,3653,3654,3657],{},[51,3655,3656],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[51,3658,3659,3660,3662,3663,3666],{},"给已有键 ",[33,3661,2286],{}," 赋值会更新映射，给新键 ",[33,3664,3665],{},"city"," 赋值会增加映射。",[14,3668,214],{"id":214},[48,3670,3671,3678],{},[51,3672,3673,3674,3677],{},"按位置理解字典并尝试 ",[33,3675,3676],{},"student[0]","，而实际键是字符串。",[51,3679,3680,3681,3684,3685,405],{},"直接读取不确定存在的键并忽略 ",[33,3682,3683],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3686,3687],{},"get()",[14,3689,235],{"id":235},[155,3691,3692,3695],{},[51,3693,3694],{},"建立一本书的标题、作者和页数字典。",[51,3696,3697],{},"添加分类键，再修改页数。",[10,3699,246],{},[14,3701,249],{"id":249},[10,3703,3704],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3706,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3708},[3709,3710,3711,3712,3713,3714,3715,3716],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3557,"description":3562},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[270,3724,3396],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3727,"title":3728,"body":3729,"category":270,"cover":271,"description":3733,"extension":272,"meta":3882,"navigation":88,"path":3883,"pinned":275,"publishedAt":276,"seo":3884,"slug":3885,"stem":3886,"summary":3887,"tags":3888,"updatedAt":276,"visible":88,"__hash__":3890},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3730,"toc":3872},[3731,3734,3736,3739,3741,3747,3750,3752,3771,3773,3775,3809,3811,3817,3819,3821,3836,3838,3850,3852,3863,3865,3867,3870],[10,3732,3733],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3735,16],{"id":16},[10,3737,3738],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3740,22],{"id":22},[10,3742,3743],{},[26,3744],{"alt":3745,"src":3746},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3748,3749],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3751,46],{"id":46},[48,3753,3754,3757,3760],{},[51,3755,3756],{},"集合中的元素不重复。",[51,3758,3759],{},"集合是无序容器，不要依赖打印顺序或索引。",[51,3761,3762,3763,3766,3767,3770],{},"创建空集合必须写 ",[33,3764,3765],{},"set()","；",[33,3768,3769],{},"{}"," 创建的是空字典。",[14,3772,62],{"id":62},[10,3774,65],{},[67,3776,3778],{"className":69,"code":3777,"language":71,"meta":72,"style":72},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3779,3780,3785,3790,3794,3799,3804],{"__ignoreMap":72},[76,3781,3782],{"class":78,"line":79},[76,3783,3784],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[76,3786,3787],{"class":78,"line":85},[76,3788,3789],{},"right = {\"Python\", \"Docker\"}\n",[76,3791,3792],{"class":78,"line":92},[76,3793,89],{"emptyLinePlaceholder":88},[76,3795,3796],{"class":78,"line":98},[76,3797,3798],{},"print(left & right)\n",[76,3800,3801],{"class":78,"line":104},[76,3802,3803],{},"print(left | right)\n",[76,3805,3806],{"class":78,"line":110},[76,3807,3808],{},"print(\"Git\" in left)\n",[10,3810,139],{},[67,3812,3815],{"className":3813,"code":3814,"language":145,"meta":72},[143],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3816,3814],{"__ignoreMap":72},[10,3818,150],{},[14,3820,153],{"id":153},[155,3822,3823,3826],{},[51,3824,3825],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[51,3827,3828,3831,3832,3835],{},[33,3829,3830],{},"&"," 计算交集，",[33,3833,3834],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3837,214],{"id":214},[48,3839,3840,3847],{},[51,3841,2378,3842,3844,3845,405],{},[33,3843,3769],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3846,3765],{},[51,3848,3849],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3851,235],{"id":235},[155,3853,3854,3860],{},[51,3855,3856,3857,3859],{},"把包含重复标签的列表交给 ",[33,3858,3765],{}," 去重。",[51,3861,3862],{},"计算两组课程标签的交集和差集。",[10,3864,246],{},[14,3866,249],{"id":249},[10,3868,3869],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,3871,256],{},{"title":72,"searchDepth":85,"depth":85,"links":3873},[3874,3875,3876,3877,3878,3879,3880,3881],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3728,"description":3733},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[270,3889,3396],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3892,"title":3893,"body":3894,"category":270,"cover":271,"description":3898,"extension":272,"meta":4095,"navigation":88,"path":4096,"pinned":275,"publishedAt":276,"seo":4097,"slug":4098,"stem":4099,"summary":4100,"tags":4101,"updatedAt":276,"visible":88,"__hash__":4104},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3895,"toc":4083},[3896,3899,3901,3904,3906,3912,3922,3924,3941,3943,3945,3994,3996,4002,4004,4006,4028,4030,4033,4039,4042,4044,4057,4059,4074,4076,4078,4081],[10,3897,3898],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3900,16],{"id":16},[10,3902,3903],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3905,22],{"id":22},[10,3907,3908],{},[26,3909],{"alt":3910,"src":3911},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3913,3914,3917,3918,3921],{},[33,3915,3916],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3919,3920],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3923,46],{"id":46},[48,3925,3926,3935,3938],{},[51,3927,3928,3930,3931,3934],{},[33,3929,2845],{}," 比较内容是否相等，",[33,3932,3933],{},"is"," 比较是否为同一个对象。",[51,3936,3937],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[51,3939,3940],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3942,62],{"id":62},[10,3944,65],{},[67,3946,3948],{"className":69,"code":3947,"language":71,"meta":72,"style":72},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3949,3950,3955,3960,3965,3969,3974,3979,3984,3989],{"__ignoreMap":72},[76,3951,3952],{"class":78,"line":79},[76,3953,3954],{},"tasks = [\"变量\", \"字符串\"]\n",[76,3956,3957],{"class":78,"line":85},[76,3958,3959],{},"shared = tasks\n",[76,3961,3962],{"class":78,"line":92},[76,3963,3964],{},"backup = tasks.copy()\n",[76,3966,3967],{"class":78,"line":98},[76,3968,89],{"emptyLinePlaceholder":88},[76,3970,3971],{"class":78,"line":104},[76,3972,3973],{},"tasks.append(\"列表\")\n",[76,3975,3976],{"class":78,"line":110},[76,3977,3978],{},"print(shared)\n",[76,3980,3981],{"class":78,"line":116},[76,3982,3983],{},"print(backup)\n",[76,3985,3986],{"class":78,"line":122},[76,3987,3988],{},"print(tasks is shared)\n",[76,3990,3991],{"class":78,"line":128},[76,3992,3993],{},"print(tasks is backup)\n",[10,3995,139],{},[67,3997,4000],{"className":3998,"code":3999,"language":145,"meta":72},[143],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,4001,3999],{"__ignoreMap":72},[10,4003,150],{},[14,4005,153],{"id":153},[155,4007,4008,4014],{},[51,4009,4010,4013],{},[33,4011,4012],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[51,4015,4016,4019,4020,4023,4024,4027],{},[33,4017,4018],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,4021,4022],{},"shared"," 能观察到变化，",[33,4025,4026],{},"backup"," 不会。",[174,4029,176],{"id":176},[10,4031,4032],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4034,4035],{},[26,4036],{"alt":4037,"src":4038},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4040,4041],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4043,214],{"id":214},[48,4045,4046,4054],{},[51,4047,4048,4049,4051,4052,405],{},"用 ",[33,4050,2845],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,4053,3933],{},[51,4055,4056],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4058,235],{"id":235},[155,4060,4061,4064],{},[51,4062,4063],{},"让两个变量引用同一个字典并修改其中一个。",[51,4065,2378,4066,4069,4070,1198,4072,405],{},[33,4067,4068],{},"copy()"," 创建外层副本，再比较 ",[33,4071,3933],{},[33,4073,2845],{},[10,4075,246],{},[14,4077,249],{"id":249},[10,4079,4080],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,4082,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4084},[4085,4086,4087,4088,4089,4092,4093,4094],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":4090},[4091],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3893,"description":3898},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[270,4102,4103],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4,"title":5,"body":4106,"category":270,"cover":271,"description":12,"extension":272,"meta":4278,"navigation":88,"path":274,"pinned":275,"publishedAt":276,"seo":4279,"slug":278,"stem":279,"summary":280,"tags":4280,"updatedAt":276,"visible":88,"__hash__":283},{"type":7,"value":4107,"toc":4265},[4108,4110,4112,4114,4116,4120,4128,4130,4138,4140,4142,4186,4188,4193,4195,4197,4209,4211,4213,4217,4223,4225,4227,4231,4235,4237,4249,4251,4257,4259,4261,4263],[10,4109,12],{},[14,4111,16],{"id":16},[10,4113,19],{},[14,4115,22],{"id":22},[10,4117,4118],{},[26,4119],{"alt":28,"src":29},[10,4121,4122,36,4124,36,4126,43],{},[33,4123,35],{},[33,4125,39],{},[33,4127,42],{},[14,4129,46],{"id":46},[48,4131,4132,4134,4136],{},[51,4133,53],{},[51,4135,56],{},[51,4137,59],{},[14,4139,62],{"id":62},[10,4141,65],{},[67,4143,4144],{"className":69,"code":70,"language":71,"meta":72,"style":72},[33,4145,4146,4150,4154,4158,4162,4166,4170,4174,4178,4182],{"__ignoreMap":72},[76,4147,4148],{"class":78,"line":79},[76,4149,82],{},[76,4151,4152],{"class":78,"line":85},[76,4153,89],{"emptyLinePlaceholder":88},[76,4155,4156],{"class":78,"line":92},[76,4157,95],{},[76,4159,4160],{"class":78,"line":98},[76,4161,101],{},[76,4163,4164],{"class":78,"line":104},[76,4165,107],{},[76,4167,4168],{"class":78,"line":110},[76,4169,113],{},[76,4171,4172],{"class":78,"line":116},[76,4173,119],{},[76,4175,4176],{"class":78,"line":122},[76,4177,125],{},[76,4179,4180],{"class":78,"line":128},[76,4181,89],{"emptyLinePlaceholder":88},[76,4183,4184],{"class":78,"line":133},[76,4185,136],{},[10,4187,139],{},[67,4189,4191],{"className":4190,"code":144,"language":145,"meta":72},[143],[33,4192,144],{"__ignoreMap":72},[10,4194,150],{},[14,4196,153],{"id":153},[155,4198,4199,4203],{},[51,4200,159,4201,163],{},[33,4202,162],{},[51,4204,4205,169,4207,172],{},[33,4206,168],{},[33,4208,42],{},[174,4210,176],{"id":176},[10,4212,179],{},[10,4214,4215],{},[26,4216],{"alt":184,"src":185},[10,4218,4219,190,4221,193],{},[33,4220,162],{},[33,4222,168],{},[174,4224,176],{"id":196},[10,4226,199],{},[10,4228,4229],{},[26,4230],{"alt":204,"src":205},[10,4232,208,4233,211],{},[33,4234,35],{},[14,4236,214],{"id":214},[48,4238,4239,4243],{},[51,4240,219,4241,222],{},[33,4242,168],{},[51,4244,225,4245,228,4247,232],{},[33,4246,35],{},[33,4248,231],{},[14,4250,235],{"id":235},[155,4252,4253,4255],{},[51,4254,240],{},[51,4256,243],{},[10,4258,246],{},[14,4260,249],{"id":249},[10,4262,252],{},[254,4264,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4266},[4267,4268,4269,4270,4271,4275,4276,4277],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":4272},[4273,4274],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5,"description":12},[270,35,282],{"id":4282,"title":4283,"body":4284,"category":270,"cover":271,"description":4288,"extension":272,"meta":4454,"navigation":88,"path":4455,"pinned":275,"publishedAt":276,"seo":4456,"slug":4457,"stem":4458,"summary":4459,"tags":4460,"updatedAt":276,"visible":88,"__hash__":4462},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4285,"toc":4442},[4286,4289,4291,4294,4296,4302,4308,4310,4325,4327,4329,4367,4369,4375,4377,4379,4394,4396,4399,4405,4411,4413,4421,4423,4433,4435,4437,4440],[10,4287,4288],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4290,16],{"id":16},[10,4292,4293],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4295,22],{"id":22},[10,4297,4298],{},[26,4299],{"alt":4300,"src":4301},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4303,4304,4307],{},[33,4305,4306],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4309,46],{"id":46},[48,4311,4312,4315,4318],{},[51,4313,4314],{},"进入循环前先准备参与条件判断的状态。",[51,4316,4317],{},"循环体中必须有机会让条件变为假。",[51,4319,4320,4321,4324],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4322,4323],{},"for"," 通常更直接。",[14,4326,62],{"id":62},[10,4328,65],{},[67,4330,4332],{"className":69,"code":4331,"language":71,"meta":72,"style":72},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4333,4334,4339,4343,4348,4353,4358,4362],{"__ignoreMap":72},[76,4335,4336],{"class":78,"line":79},[76,4337,4338],{},"count = 1\n",[76,4340,4341],{"class":78,"line":85},[76,4342,89],{"emptyLinePlaceholder":88},[76,4344,4345],{"class":78,"line":92},[76,4346,4347],{},"while count \u003C= 3:\n",[76,4349,4350],{"class":78,"line":98},[76,4351,4352],{},"    print(\"第\", count, \"次练习\")\n",[76,4354,4355],{"class":78,"line":104},[76,4356,4357],{},"    count = count + 1\n",[76,4359,4360],{"class":78,"line":110},[76,4361,89],{"emptyLinePlaceholder":88},[76,4363,4364],{"class":78,"line":116},[76,4365,4366],{},"print(\"练习结束\")\n",[10,4368,139],{},[67,4370,4373],{"className":4371,"code":4372,"language":145,"meta":72},[143],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4374,4372],{"__ignoreMap":72},[10,4376,150],{},[14,4378,153],{"id":153},[155,4380,4381,4388],{},[51,4382,4383,4384,4387],{},"进入循环前 ",[33,4385,4386],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[51,4389,4390,4391,4393],{},"循环体末尾把 ",[33,4392,4386],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[174,4395,176],{"id":176},[10,4397,4398],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4400,4401],{},[26,4402],{"alt":4403,"src":4404},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4406,4407,4408,4410],{},"第4次检查时 ",[33,4409,4386],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4412,214],{"id":214},[48,4414,4415,4418],{},[51,4416,4417],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[51,4419,4420],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4422,235],{"id":235},[155,4424,4425,4430],{},[51,4426,2378,4427,4429],{},[33,4428,4306],{}," 输出 1 到 5。",[51,4431,4432],{},"计算 1 到 10 的累加和。",[10,4434,246],{},[14,4436,249],{"id":249},[10,4438,4439],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,4441,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4443},[4444,4445,4446,4447,4448,4451,4452,4453],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":4449},[4450],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4283,"description":4288},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[270,4306,4461],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4464,"title":4465,"body":4466,"category":270,"cover":271,"description":4470,"extension":272,"meta":4618,"navigation":88,"path":4619,"pinned":275,"publishedAt":276,"seo":4620,"slug":4621,"stem":4622,"summary":4623,"tags":4624,"updatedAt":276,"visible":88,"__hash__":4626},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4467,"toc":4608},[4468,4471,4473,4476,4478,4484,4489,4491,4505,4507,4509,4547,4549,4555,4557,4559,4576,4578,4586,4588,4599,4601,4603,4606],[10,4469,4470],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4472,16],{"id":16},[10,4474,4475],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4477,22],{"id":22},[10,4479,4480],{},[26,4481],{"alt":4482,"src":4483},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4485,4486,4488],{},[33,4487,4323],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4490,46],{"id":46},[48,4492,4493,4499,4502],{},[51,4494,4495,4498],{},[33,4496,4497],{},"range(1, 4)"," 包含 1，不包含 4。",[51,4500,4501],{},"只需要元素时直接遍历元素，不必手工维护索引。",[51,4503,4504],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4506,62],{"id":62},[10,4508,65],{},[67,4510,4512],{"className":69,"code":4511,"language":71,"meta":72,"style":72},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4513,4514,4519,4523,4528,4533,4537,4542],{"__ignoreMap":72},[76,4515,4516],{"class":78,"line":79},[76,4517,4518],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[76,4520,4521],{"class":78,"line":85},[76,4522,89],{"emptyLinePlaceholder":88},[76,4524,4525],{"class":78,"line":92},[76,4526,4527],{},"for course in courses:\n",[76,4529,4530],{"class":78,"line":98},[76,4531,4532],{},"    print(course)\n",[76,4534,4535],{"class":78,"line":104},[76,4536,89],{"emptyLinePlaceholder":88},[76,4538,4539],{"class":78,"line":110},[76,4540,4541],{},"for number in range(1, 4):\n",[76,4543,4544],{"class":78,"line":116},[76,4545,4546],{},"    print(number)\n",[10,4548,139],{},[67,4550,4553],{"className":4551,"code":4552,"language":145,"meta":72},[143],"变量\n字符串\n列表\n1\n2\n3\n",[33,4554,4552],{"__ignoreMap":72},[10,4556,150],{},[14,4558,153],{"id":153},[155,4560,4561,4571],{},[51,4562,4563,4564,4566,4567,4570],{},"第一个 ",[33,4565,4323],{}," 依次从列表取得字符串，循环变量 ",[33,4568,4569],{},"course"," 每轮重新绑定。",[51,4572,4573,4575],{},[33,4574,4497],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4577,214],{"id":214},[48,4579,4580,4583],{},[51,4581,4582],{},"只需要元素却手工维护索引，增加越界风险。",[51,4584,4585],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4587,235],{"id":235},[155,4589,4590,4593],{},[51,4591,4592],{},"逐项输出一个字符串中的字符。",[51,4594,2378,4595,4598],{},[33,4596,4597],{},"range()"," 输出 2、4、6、8。",[10,4600,246],{},[14,4602,249],{"id":249},[10,4604,4605],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,4607,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4609},[4610,4611,4612,4613,4614,4615,4616,4617],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4465,"description":4470},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[270,4323,4625],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4628,"title":4629,"body":4630,"category":270,"cover":271,"description":4634,"extension":272,"meta":4808,"navigation":88,"path":4809,"pinned":275,"publishedAt":276,"seo":4810,"slug":4811,"stem":4812,"summary":4813,"tags":4814,"updatedAt":276,"visible":88,"__hash__":4815},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4631,"toc":4798},[4632,4635,4637,4640,4642,4648,4658,4660,4679,4681,4683,4735,4737,4743,4745,4747,4761,4763,4779,4781,4789,4791,4793,4796],[10,4633,4634],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4636,16],{"id":16},[10,4638,4639],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4641,22],{"id":22},[10,4643,4644],{},[26,4645],{"alt":4646,"src":4647},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4649,4650,4653,4654,4657],{},[33,4651,4652],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4655,4656],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4659,46],{"id":46},[48,4661,4662,4665,4673],{},[51,4663,4664],{},"先写普通循环，再在确有需要时加入流程控制语句。",[51,4666,4667,4669,4670,4672],{},[33,4668,4652],{}," 前要确认不会跳过 ",[33,4671,4306],{}," 循环中的状态更新。",[51,4674,4675,4676,4678],{},"多层嵌套中 ",[33,4677,4656],{}," 只结束它所在的最内层循环。",[14,4680,62],{"id":62},[10,4682,65],{},[67,4684,4686],{"className":69,"code":4685,"language":71,"meta":72,"style":72},"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,4687,4688,4693,4697,4702,4707,4712,4717,4722,4726,4730],{"__ignoreMap":72},[76,4689,4690],{"class":78,"line":79},[76,4691,4692],{},"numbers = [3, -1, 0, 8, 12]\n",[76,4694,4695],{"class":78,"line":85},[76,4696,89],{"emptyLinePlaceholder":88},[76,4698,4699],{"class":78,"line":92},[76,4700,4701],{},"for number in numbers:\n",[76,4703,4704],{"class":78,"line":98},[76,4705,4706],{},"    if number \u003C 0:\n",[76,4708,4709],{"class":78,"line":104},[76,4710,4711],{},"        continue\n",[76,4713,4714],{"class":78,"line":110},[76,4715,4716],{},"    if number == 0:\n",[76,4718,4719],{"class":78,"line":116},[76,4720,4721],{},"        break\n",[76,4723,4724],{"class":78,"line":122},[76,4725,4546],{},[76,4727,4728],{"class":78,"line":128},[76,4729,89],{"emptyLinePlaceholder":88},[76,4731,4732],{"class":78,"line":133},[76,4733,4734],{},"print(\"循环结束\")\n",[10,4736,139],{},[67,4738,4741],{"className":4739,"code":4740,"language":145,"meta":72},[143],"3\n循环结束\n",[33,4742,4740],{"__ignoreMap":72},[10,4744,150],{},[14,4746,153],{"id":153},[155,4748,4749,4755],{},[51,4750,4751,4752,4754],{},"遇到 -1 时 ",[33,4753,4652],{}," 立即结束本轮，后面的判断和输出都不执行。",[51,4756,4757,4758,4760],{},"遇到 0 时 ",[33,4759,4656],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4762,214],{"id":214},[48,4764,4765,4770],{},[51,4766,3505,4767,4769],{},[33,4768,4652],{}," 当作结束循环，实际它只跳到下一轮。",[51,4771,4772,4773,4775,4776,4778],{},"在 ",[33,4774,4306],{}," 中把状态更新放在可能被 ",[33,4777,4652],{}," 跳过的位置，造成无限循环。",[14,4780,235],{"id":235},[155,4782,4783,4786],{},[51,4784,4785],{},"跳过列表中的空字符串并输出其他内容。",[51,4787,4788],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4790,246],{},[14,4792,249],{"id":249},[10,4794,4795],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,4797,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4799},[4800,4801,4802,4803,4804,4805,4806,4807],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4629,"description":4634},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[270,4656,4652],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4817,"title":4818,"body":4819,"category":270,"cover":271,"description":4823,"extension":272,"meta":4994,"navigation":88,"path":4995,"pinned":275,"publishedAt":276,"seo":4996,"slug":4997,"stem":4998,"summary":4999,"tags":5000,"updatedAt":276,"visible":88,"__hash__":5003},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4820,"toc":4982},[4821,4824,4826,4829,4831,4837,4840,4842,4866,4868,4870,4904,4906,4912,4914,4916,4933,4935,4938,4944,4947,4949,4963,4965,4973,4975,4977,4980],[10,4822,4823],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4825,16],{"id":16},[10,4827,4828],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4830,22],{"id":22},[10,4832,4833],{},[26,4834],{"alt":4835,"src":4836},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4838,4839],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4841,46],{"id":46},[48,4843,4844,4847,4850],{},[51,4845,4846],{},"每增加一层嵌套，阅读成本都会上升。",[51,4848,4849],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[51,4851,4852,4853,36,4856,4859,4860,36,4863,405],{},"变量名使用 ",[33,4854,4855],{},"row",[33,4857,4858],{},"cell"," 等层级含义，避免全部写成 ",[33,4861,4862],{},"i",[33,4864,4865],{},"j",[14,4867,62],{"id":62},[10,4869,65],{},[67,4871,4873],{"className":69,"code":4872,"language":71,"meta":72,"style":72},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4874,4875,4880,4884,4889,4894,4899],{"__ignoreMap":72},[76,4876,4877],{"class":78,"line":79},[76,4878,4879],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[76,4881,4882],{"class":78,"line":85},[76,4883,89],{"emptyLinePlaceholder":88},[76,4885,4886],{"class":78,"line":92},[76,4887,4888],{},"for row in table:\n",[76,4890,4891],{"class":78,"line":98},[76,4892,4893],{},"    for cell in row:\n",[76,4895,4896],{"class":78,"line":104},[76,4897,4898],{},"        print(cell)\n",[76,4900,4901],{"class":78,"line":110},[76,4902,4903],{},"    print(\"一行结束\")\n",[10,4905,139],{},[67,4907,4910],{"className":4908,"code":4909,"language":145,"meta":72},[143],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4911,4909],{"__ignoreMap":72},[10,4913,150],{},[14,4915,153],{"id":153},[155,4917,4918,4930],{},[51,4919,4920,4921,4923,4924,1198,4927,405],{},"外层变量 ",[33,4922,4855],{}," 先引用第一行列表，内层才依次处理 ",[33,4925,4926],{},"A1",[33,4928,4929],{},"A2",[51,4931,4932],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[174,4934,176],{"id":176},[10,4936,4937],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4939,4940],{},[26,4941],{"alt":4942,"src":4943},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4945,4946],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4948,214],{"id":214},[48,4950,4951,4960],{},[51,4952,4953,4954,1052,4957,4959],{},"把两层循环变量都叫 ",[33,4955,4956],{},"item",[33,4958,4862],{},"，难以确认当前层级。",[51,4961,4962],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4964,235],{"id":235},[155,4966,4967,4970],{},[51,4968,4969],{},"打印一个 2×3 数字表。",[51,4971,4972],{},"在内层增加条件，只输出大于 3 的元素。",[10,4974,246],{},[14,4976,249],{"id":249},[10,4978,4979],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,4981,256],{},{"title":72,"searchDepth":85,"depth":85,"links":4983},[4984,4985,4986,4987,4988,4991,4992,4993],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":4989},[4990],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4818,"description":4823},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[270,5001,5002],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5005,"title":5006,"body":5007,"category":270,"cover":271,"description":5011,"extension":272,"meta":5149,"navigation":88,"path":5150,"pinned":275,"publishedAt":276,"seo":5151,"slug":5152,"stem":5153,"summary":5154,"tags":5155,"updatedAt":276,"visible":88,"__hash__":5158},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5008,"toc":5139},[5009,5012,5014,5017,5019,5025,5028,5030,5041,5043,5045,5083,5085,5091,5093,5095,5107,5109,5120,5122,5130,5132,5134,5137],[10,5010,5011],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5013,16],{"id":16},[10,5015,5016],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5018,22],{"id":22},[10,5020,5021],{},[26,5022],{"alt":5023,"src":5024},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5026,5027],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5029,46],{"id":46},[48,5031,5032,5035,5038],{},[51,5033,5034],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[51,5036,5037],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[51,5039,5040],{},"推导式创建新列表，不修改输入列表。",[14,5042,62],{"id":62},[10,5044,65],{},[67,5046,5048],{"className":69,"code":5047,"language":71,"meta":72,"style":72},"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,5049,5050,5055,5059,5064,5069,5073,5078],{"__ignoreMap":72},[76,5051,5052],{"class":78,"line":79},[76,5053,5054],{},"numbers = [1, 2, 3, 4, 5]\n",[76,5056,5057],{"class":78,"line":85},[76,5058,89],{"emptyLinePlaceholder":88},[76,5060,5061],{"class":78,"line":92},[76,5062,5063],{},"squares = [number * number for number in numbers]\n",[76,5065,5066],{"class":78,"line":98},[76,5067,5068],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[76,5070,5071],{"class":78,"line":104},[76,5072,89],{"emptyLinePlaceholder":88},[76,5074,5075],{"class":78,"line":110},[76,5076,5077],{},"print(squares)\n",[76,5079,5080],{"class":78,"line":116},[76,5081,5082],{},"print(even_squares)\n",[10,5084,139],{},[67,5086,5089],{"className":5087,"code":5088,"language":145,"meta":72},[143],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5090,5088],{"__ignoreMap":72},[10,5092,150],{},[14,5094,153],{"id":153},[155,5096,5097,5100],{},[51,5098,5099],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[51,5101,5102,5103,5106],{},"第二条先用 ",[33,5104,5105],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5108,214],{"id":214},[48,5110,5111,5117],{},[51,5112,5113,5114,5116],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5115,4323],{}," 开始找输入。",[51,5118,5119],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5121,235],{"id":235},[155,5123,5124,5127],{},[51,5125,5126],{},"把字符串列表转换为长度列表。",[51,5128,5129],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5131,246],{},[14,5133,249],{"id":249},[10,5135,5136],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,5138,256],{},{"title":72,"searchDepth":85,"depth":85,"links":5140},[5141,5142,5143,5144,5145,5146,5147,5148],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5006,"description":5011},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[270,5156,5157],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5160,"title":5161,"body":5162,"category":270,"cover":271,"description":5166,"extension":272,"meta":5309,"navigation":88,"path":5310,"pinned":275,"publishedAt":276,"seo":5311,"slug":5312,"stem":5313,"summary":5314,"tags":5315,"updatedAt":276,"visible":88,"__hash__":5318},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5163,"toc":5299},[5164,5167,5169,5172,5174,5180,5183,5185,5196,5198,5200,5239,5241,5247,5249,5251,5266,5268,5276,5278,5290,5292,5294,5297],[10,5165,5166],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5168,16],{"id":16},[10,5170,5171],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5173,22],{"id":22},[10,5175,5176],{},[26,5177],{"alt":5178,"src":5179},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5181,5182],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5184,46],{"id":46},[48,5186,5187,5190,5193],{},[51,5188,5189],{},"函数名描述动作，使用小写字母和下划线。",[51,5191,5192],{},"函数定义要先执行，之后才能调用。",[51,5194,5195],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5197,62],{"id":62},[10,5199,65],{},[67,5201,5203],{"className":69,"code":5202,"language":71,"meta":72,"style":72},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5204,5205,5210,5215,5220,5224,5229,5234],{"__ignoreMap":72},[76,5206,5207],{"class":78,"line":79},[76,5208,5209],{},"def show_progress():\n",[76,5211,5212],{"class":78,"line":85},[76,5213,5214],{},"    print(\"正在学习函数\")\n",[76,5216,5217],{"class":78,"line":92},[76,5218,5219],{},"    print(\"本节完成 50%\")\n",[76,5221,5222],{"class":78,"line":98},[76,5223,89],{"emptyLinePlaceholder":88},[76,5225,5226],{"class":78,"line":104},[76,5227,5228],{},"print(\"调用前\")\n",[76,5230,5231],{"class":78,"line":110},[76,5232,5233],{},"show_progress()\n",[76,5235,5236],{"class":78,"line":116},[76,5237,5238],{},"print(\"调用后\")\n",[10,5240,139],{},[67,5242,5245],{"className":5243,"code":5244,"language":145,"meta":72},[143],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5246,5244],{"__ignoreMap":72},[10,5248,150],{},[14,5250,153],{"id":153},[155,5252,5253,5259],{},[51,5254,981,5255,5258],{},[33,5256,5257],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[51,5260,5261,5262,5265],{},"运行到 ",[33,5263,5264],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5267,214],{"id":214},[48,5269,5270,5273],{},[51,5271,5272],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[51,5274,5275],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5277,235],{"id":235},[155,5279,5280,5287],{},[51,5281,5282,5283,5286],{},"定义 ",[33,5284,5285],{},"show_plan()"," 输出两行学习计划。",[51,5288,5289],{},"连续调用同一个函数两次，观察执行顺序。",[10,5291,246],{},[14,5293,249],{"id":249},[10,5295,5296],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,5298,256],{},{"title":72,"searchDepth":85,"depth":85,"links":5300},[5301,5302,5303,5304,5305,5306,5307,5308],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5161,"description":5166},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[270,5316,5317],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5320,"title":5321,"body":5322,"category":270,"cover":271,"description":5326,"extension":272,"meta":5506,"navigation":88,"path":5507,"pinned":275,"publishedAt":276,"seo":5508,"slug":5509,"stem":5510,"summary":5511,"tags":5512,"updatedAt":276,"visible":88,"__hash__":5515},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5323,"toc":5494},[5324,5327,5329,5332,5334,5340,5347,5349,5366,5368,5370,5404,5406,5412,5414,5416,5437,5439,5442,5448,5458,5460,5475,5477,5485,5487,5489,5492],[10,5325,5326],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5328,16],{"id":16},[10,5330,5331],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5333,22],{"id":22},[10,5335,5336],{},[26,5337],{"alt":5338,"src":5339},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5341,5342,5343,5346],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5344,5345],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5348,46],{"id":46},[48,5350,5351,5354,5357],{},[51,5352,5353],{},"形参出现在函数定义中，实参出现在函数调用中。",[51,5355,5356],{},"局部变量默认只在函数内部可见。",[51,5358,5359,5360,5362,5363,405],{},"没有显式 ",[33,5361,5345],{}," 的函数会返回 ",[33,5364,5365],{},"None",[14,5367,62],{"id":62},[10,5369,65],{},[67,5371,5373],{"className":69,"code":5372,"language":71,"meta":72,"style":72},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5374,5375,5380,5385,5390,5394,5399],{"__ignoreMap":72},[76,5376,5377],{"class":78,"line":79},[76,5378,5379],{},"def calculate_total(price, count):\n",[76,5381,5382],{"class":78,"line":85},[76,5383,5384],{},"    total = price * count\n",[76,5386,5387],{"class":78,"line":92},[76,5388,5389],{},"    return total\n",[76,5391,5392],{"class":78,"line":98},[76,5393,89],{"emptyLinePlaceholder":88},[76,5395,5396],{"class":78,"line":104},[76,5397,5398],{},"result = calculate_total(25, 4)\n",[76,5400,5401],{"class":78,"line":110},[76,5402,5403],{},"print(result)\n",[10,5405,139],{},[67,5407,5410],{"className":5408,"code":5409,"language":145,"meta":72},[143],"100\n",[33,5411,5409],{"__ignoreMap":72},[10,5413,150],{},[14,5415,153],{"id":153},[155,5417,5418,5427],{},[51,5419,5420,5421,36,5424,5426],{},"调用时 25 和 4 分别绑定到 ",[33,5422,5423],{},"price",[33,5425,4386],{},"，它们只在本次函数调用的局部范围中使用。",[51,5428,5429,5432,5433,5436],{},[33,5430,5431],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5434,5435],{},"result"," 并输出。",[174,5438,176],{"id":176},[10,5440,5441],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5443,5444],{},[26,5445],{"alt":5446,"src":5447},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5449,5450,36,5452,1198,5454,5457],{},[33,5451,5423],{},[33,5453,4386],{},[33,5455,5456],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5459,214],{"id":214},[48,5461,5462,5469],{},[51,5463,5464,5465,5468],{},"在函数内部只 ",[33,5466,5467],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[51,5470,5471,5472,5474],{},"试图在函数外直接访问局部变量 ",[33,5473,5456],{},"，它的名字只在调用期间的局部作用域存在。",[14,5476,235],{"id":235},[155,5478,5479,5482],{},[51,5480,5481],{},"编写计算长方形面积的函数。",[51,5483,5484],{},"让函数返回结果后在调用方加上单位再输出。",[10,5486,246],{},[14,5488,249],{"id":249},[10,5490,5491],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,5493,256],{},{"title":72,"searchDepth":85,"depth":85,"links":5495},[5496,5497,5498,5499,5500,5503,5504,5505],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":5501},[5502],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5321,"description":5326},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[270,5513,5514],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5517,"title":5518,"body":5519,"category":270,"cover":271,"description":5523,"extension":272,"meta":5703,"navigation":88,"path":5704,"pinned":275,"publishedAt":276,"seo":5705,"slug":5706,"stem":5707,"summary":5708,"tags":5709,"updatedAt":276,"visible":88,"__hash__":5712},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5520,"toc":5691},[5521,5524,5526,5529,5531,5537,5540,5542,5559,5561,5563,5615,5617,5623,5625,5627,5645,5647,5650,5656,5659,5661,5672,5674,5682,5684,5686,5689],[10,5522,5523],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5525,16],{"id":16},[10,5527,5528],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5530,22],{"id":22},[10,5532,5533],{},[26,5534],{"alt":5535,"src":5536},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5538,5539],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5541,46],{"id":46},[48,5543,5544,5547,5553],{},[51,5545,5546],{},"必需参数应放在有默认值的参数之前。",[51,5548,5549,5552],{},[33,5550,5551],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[51,5554,5555,5558],{},[33,5556,5557],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5560,62],{"id":62},[10,5562,65],{},[67,5564,5566],{"className":69,"code":5565,"language":71,"meta":72,"style":72},"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,5567,5568,5573,5578,5582,5587,5592,5596,5601,5606,5610],{"__ignoreMap":72},[76,5569,5570],{"class":78,"line":79},[76,5571,5572],{},"def build_title(name, level=\"基础\"):\n",[76,5574,5575],{"class":78,"line":85},[76,5576,5577],{},"    return name + \"｜\" + level\n",[76,5579,5580],{"class":78,"line":92},[76,5581,89],{"emptyLinePlaceholder":88},[76,5583,5584],{"class":78,"line":98},[76,5585,5586],{},"print(build_title(\"Python\"))\n",[76,5588,5589],{"class":78,"line":104},[76,5590,5591],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[76,5593,5594],{"class":78,"line":110},[76,5595,89],{"emptyLinePlaceholder":88},[76,5597,5598],{"class":78,"line":116},[76,5599,5600],{},"def total(*numbers):\n",[76,5602,5603],{"class":78,"line":122},[76,5604,5605],{},"    return sum(numbers)\n",[76,5607,5608],{"class":78,"line":128},[76,5609,89],{"emptyLinePlaceholder":88},[76,5611,5612],{"class":78,"line":133},[76,5613,5614],{},"print(total(10, 20, 30))\n",[10,5616,139],{},[67,5618,5621],{"className":5619,"code":5620,"language":145,"meta":72},[143],"Python｜基础\n异常处理｜进阶\n60\n",[33,5622,5620],{"__ignoreMap":72},[10,5624,150],{},[14,5626,153],{"id":153},[155,5628,5629,5636],{},[51,5630,5631,5632,5635],{},"第一次调用只提供必需参数，",[33,5633,5634],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[51,5637,5638,5641,5642,405],{},[33,5639,5640],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5643,5644],{},"sum()",[174,5646,176],{"id":176},[10,5648,5649],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5651,5652],{},[26,5653],{"alt":5654,"src":5655},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5657,5658],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5660,214],{"id":214},[48,5662,5663,5669],{},[51,5664,5665,5666,5668],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5667,5365],{}," 再在函数内创建。",[51,5670,5671],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5673,235],{"id":235},[155,5675,5676,5679],{},[51,5677,5678],{},"给问候函数增加默认称呼。",[51,5680,5681],{},"编写接收任意数量分数并返回总分的函数。",[10,5683,246],{},[14,5685,249],{"id":249},[10,5687,5688],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,5690,256],{},{"title":72,"searchDepth":85,"depth":85,"links":5692},[5693,5694,5695,5696,5697,5700,5701,5702],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":5698},[5699],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5518,"description":5523},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[270,5710,5711],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5714,"title":5715,"body":5716,"category":270,"cover":271,"description":5720,"extension":272,"meta":5917,"navigation":88,"path":5918,"pinned":275,"publishedAt":276,"seo":5919,"slug":5920,"stem":5921,"summary":5922,"tags":5923,"updatedAt":276,"visible":88,"__hash__":5926},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5717,"toc":5905},[5718,5721,5723,5726,5728,5734,5737,5739,5756,5758,5760,5823,5825,5831,5833,5835,5862,5864,5867,5873,5876,5878,5886,5888,5896,5898,5900,5903],[10,5719,5720],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5722,16],{"id":16},[10,5724,5725],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5727,22],{"id":22},[10,5729,5730],{},[26,5731],{"alt":5732,"src":5733},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5735,5736],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5738,46],{"id":46},[48,5740,5741,5744,5747],{},[51,5742,5743],{},"函数内部赋值默认创建局部变量。",[51,5745,5746],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[51,5748,5749,2216,5752,5755],{},[33,5750,5751],{},"global",[33,5753,5754],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5757,62],{"id":62},[10,5759,65],{},[67,5761,5763],{"className":69,"code":5762,"language":71,"meta":72,"style":72},"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,5764,5765,5770,5774,5779,5784,5788,5793,5798,5803,5807,5812,5817],{"__ignoreMap":72},[76,5766,5767],{"class":78,"line":79},[76,5768,5769],{},"course = \"Python\"\n",[76,5771,5772],{"class":78,"line":85},[76,5773,89],{"emptyLinePlaceholder":88},[76,5775,5776],{"class":78,"line":92},[76,5777,5778],{},"def outer():\n",[76,5780,5781],{"class":78,"line":98},[76,5782,5783],{},"    level = \"基础\"\n",[76,5785,5786],{"class":78,"line":104},[76,5787,89],{"emptyLinePlaceholder":88},[76,5789,5790],{"class":78,"line":110},[76,5791,5792],{},"    def show():\n",[76,5794,5795],{"class":78,"line":116},[76,5796,5797],{},"        lesson = \"作用域\"\n",[76,5799,5800],{"class":78,"line":122},[76,5801,5802],{},"        print(course, level, lesson)\n",[76,5804,5805],{"class":78,"line":128},[76,5806,89],{"emptyLinePlaceholder":88},[76,5808,5809],{"class":78,"line":133},[76,5810,5811],{},"    show()\n",[76,5813,5815],{"class":78,"line":5814},11,[76,5816,89],{"emptyLinePlaceholder":88},[76,5818,5820],{"class":78,"line":5819},12,[76,5821,5822],{},"outer()\n",[10,5824,139],{},[67,5826,5829],{"className":5827,"code":5828,"language":145,"meta":72},[143],"Python 基础 作用域\n",[33,5830,5828],{"__ignoreMap":72},[10,5832,150],{},[14,5834,153],{"id":153},[155,5836,5837,5854],{},[51,5838,5839,5842,5843,5846,5847,5849,5850,5853],{},[33,5840,5841],{},"show()"," 中查找 ",[33,5844,5845],{},"lesson"," 时先在局部找到，查找 ",[33,5848,5634],{}," 时到外层 ",[33,5851,5852],{},"outer()"," 找到。",[51,5855,5856,5858,5859,5861],{},[33,5857,4569],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5860,2248],{}," 最后在内置作用域找到。",[174,5863,176],{"id":176},[10,5865,5866],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5868,5869],{},[26,5870],{"alt":5871,"src":5872},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5874,5875],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5877,214],{"id":214},[48,5879,5880,5883],{},[51,5881,5882],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[51,5884,5885],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5887,235],{"id":235},[155,5889,5890,5893],{},[51,5891,5892],{},"在内外层定义同名变量，观察最近作用域优先。",[51,5894,5895],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5897,246],{},[14,5899,249],{"id":249},[10,5901,5902],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,5904,256],{},{"title":72,"searchDepth":85,"depth":85,"links":5906},[5907,5908,5909,5910,5911,5914,5915,5916],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":5912},[5913],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5715,"description":5720},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[270,5924,5925],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5928,"title":5929,"body":5930,"category":270,"cover":271,"description":5934,"extension":272,"meta":6084,"navigation":88,"path":6085,"pinned":275,"publishedAt":276,"seo":6086,"slug":6087,"stem":6088,"summary":6089,"tags":6090,"updatedAt":276,"visible":88,"__hash__":6093},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5931,"toc":6074},[5932,5935,5937,5940,5942,5948,5951,5953,5972,5974,5976,6010,6012,6018,6020,6022,6037,6039,6051,6053,6065,6067,6069,6072],[10,5933,5934],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5936,16],{"id":16},[10,5938,5939],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5941,22],{"id":22},[10,5943,5944],{},[26,5945],{"alt":5946,"src":5947},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5949,5950],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5952,46],{"id":46},[48,5954,5955,5958,5961],{},[51,5956,5957],{},"文档字符串紧跟在函数定义后的第一条语句。",[51,5959,5960],{},"注解表达接口意图，不代替输入校验和测试。",[51,5962,5963,5964,36,5966,36,5968,5971],{},"基础注解优先使用 ",[33,5965,2299],{},[33,5967,2465],{},[33,5969,5970],{},"list[str]"," 等直接写法。",[14,5973,62],{"id":62},[10,5975,65],{},[67,5977,5979],{"className":69,"code":5978,"language":71,"meta":72,"style":72},"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,5980,5981,5986,5991,5996,6000,6005],{"__ignoreMap":72},[76,5982,5983],{"class":78,"line":79},[76,5984,5985],{},"def format_score(name: str, score: int) -> str:\n",[76,5987,5988],{"class":78,"line":85},[76,5989,5990],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[76,5992,5993],{"class":78,"line":92},[76,5994,5995],{},"    return name + \"：\" + str(score)\n",[76,5997,5998],{"class":78,"line":98},[76,5999,89],{"emptyLinePlaceholder":88},[76,6001,6002],{"class":78,"line":104},[76,6003,6004],{},"print(format_score(\"小郑\", 95))\n",[76,6006,6007],{"class":78,"line":110},[76,6008,6009],{},"print(format_score.__doc__)\n",[10,6011,139],{},[67,6013,6016],{"className":6014,"code":6015,"language":145,"meta":72},[143],"小郑：95\n返回带姓名的分数文本。\n",[33,6017,6015],{"__ignoreMap":72},[10,6019,150],{},[14,6021,153],{"id":153},[155,6023,6024,6034],{},[51,6025,6026,6027,6030,6031,6033],{},"函数签名说明 ",[33,6028,6029],{},"name"," 预期为字符串、",[33,6032,2286],{}," 预期为整数，返回值预期为字符串。",[51,6035,6036],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6038,214],{"id":214},[48,6040,6041,6048],{},[51,6042,6043,6044,6047],{},"认为加了 ",[33,6045,6046],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[51,6049,6050],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6052,235],{"id":235},[155,6054,6055,6058],{},[51,6056,6057],{},"为面积函数补充参数和返回值注解。",[51,6059,6060,6061,6064],{},"通过 ",[33,6062,6063],{},"函数名.__doc__"," 查看文档字符串。",[10,6066,246],{},[14,6068,249],{"id":249},[10,6070,6071],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,6073,256],{},{"title":72,"searchDepth":85,"depth":85,"links":6075},[6076,6077,6078,6079,6080,6081,6082,6083],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5929,"description":5934},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[270,6091,6092],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6095,"title":6096,"body":6097,"category":270,"cover":271,"description":6101,"extension":272,"meta":6328,"navigation":88,"path":6329,"pinned":275,"publishedAt":276,"seo":6330,"slug":6331,"stem":6332,"summary":6333,"tags":6334,"updatedAt":276,"visible":88,"__hash__":6337},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6098,"toc":6316},[6099,6102,6104,6110,6112,6118,6129,6131,6149,6151,6158,6187,6194,6213,6222,6224,6230,6232,6234,6257,6259,6262,6268,6274,6276,6292,6294,6307,6309,6311,6314],[10,6100,6101],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6103,16],{"id":16},[10,6105,6106,6107,6109],{},"本篇只处理“模块、import 与 ",[338,6108,6029],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6111,22],{"id":22},[10,6113,6114],{},[26,6115],{"alt":6116,"src":6117},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6119,6120,6121,6124,6125,6128],{},"同一个文件直接运行时 ",[33,6122,6123],{},"__name__"," 等于 ",[33,6126,6127],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6130,46],{"id":46},[48,6132,6133,6139,6142],{},[51,6134,6135,6136,6138],{},"一个 ",[33,6137,1211],{}," 文件就是一个模块。",[51,6140,6141],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[51,6143,6144,6145,6148],{},"避免使用 ",[33,6146,6147],{},"from module import *","，它会让名字来源不清楚。",[14,6150,62],{"id":62},[10,6152,6153,6154,6157],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6155,6156],{},"calculator.py","：",[67,6159,6161],{"className":69,"code":6160,"language":71,"meta":72,"style":72},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6162,6163,6168,6173,6177,6182],{"__ignoreMap":72},[76,6164,6165],{"class":78,"line":79},[76,6166,6167],{},"def add(left, right):\n",[76,6169,6170],{"class":78,"line":85},[76,6171,6172],{},"    return left + right\n",[76,6174,6175],{"class":78,"line":92},[76,6176,89],{"emptyLinePlaceholder":88},[76,6178,6179],{"class":78,"line":98},[76,6180,6181],{},"if __name__ == \"__main__\":\n",[76,6183,6184],{"class":78,"line":104},[76,6185,6186],{},"    print(add(2, 3))\n",[10,6188,6189,6190,6193],{},"再创建 ",[33,6191,6192],{},"app.py","，从模块中导入函数：",[67,6195,6197],{"className":69,"code":6196,"language":71,"meta":72,"style":72},"from calculator import add\n\nprint(add(10, 20))\n",[33,6198,6199,6204,6208],{"__ignoreMap":72},[76,6200,6201],{"class":78,"line":79},[76,6202,6203],{},"from calculator import add\n",[76,6205,6206],{"class":78,"line":85},[76,6207,89],{"emptyLinePlaceholder":88},[76,6209,6210],{"class":78,"line":92},[76,6211,6212],{},"print(add(10, 20))\n",[10,6214,6215,6216,1198,6219,405],{},"分别执行 ",[33,6217,6218],{},"python3 calculator.py",[33,6220,6221],{},"python3 app.py",[10,6223,139],{},[67,6225,6228],{"className":6226,"code":6227,"language":145,"meta":72},[143],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6229,6227],{"__ignoreMap":72},[10,6231,150],{},[14,6233,153],{"id":153},[155,6235,6236,6246],{},[51,6237,6238,6239,6241,6242,6245],{},"直接运行 ",[33,6240,6156],{}," 时，模块名是 ",[33,6243,6244],{},"__main__","，入口代码输出 5。",[51,6247,6248,6250,6251,6253,6254,6256],{},[33,6249,6192],{}," 导入模块时，",[33,6252,6156],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6255,6192],{}," 调用函数输出 30。",[174,6258,176],{"id":176},[10,6260,6261],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6263,6264],{},[26,6265],{"alt":6266,"src":6267},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6269,6270,6271,6273],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6272,6244],{}," 保护下的演示代码。",[14,6275,214],{"id":214},[48,6277,6278,6285],{},[51,6279,6280,6281,1198,6283,405],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6282,6156],{},[33,6284,6192],{},[51,6286,6287,6288,6291],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6289,6290],{},"json.py","，导致导入目标被遮蔽。",[14,6293,235],{"id":235},[155,6295,6296,6302],{},[51,6297,2393,6298,6301],{},[33,6299,6300],{},"text_tools.py"," 并导出一个格式化函数。",[51,6303,6304,6305,405],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6306,6123],{},[10,6308,246],{},[14,6310,249],{"id":249},[10,6312,6313],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,6315,256],{},{"title":72,"searchDepth":85,"depth":85,"links":6317},[6318,6319,6320,6321,6322,6325,6326,6327],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":6323},[6324],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6096,"description":6101},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[270,6335,6336],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6339,"title":6340,"body":6341,"category":270,"cover":271,"description":6345,"extension":272,"meta":6510,"navigation":88,"path":6511,"pinned":275,"publishedAt":276,"seo":6512,"slug":6513,"stem":6514,"summary":6515,"tags":6516,"updatedAt":276,"visible":88,"__hash__":6518},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6342,"toc":6500},[6343,6346,6348,6351,6353,6359,6362,6364,6378,6380,6382,6428,6430,6436,6438,6440,6466,6468,6478,6480,6491,6493,6495,6498],[10,6344,6345],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6347,16],{"id":16},[10,6349,6350],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6352,22],{"id":22},[10,6354,6355],{},[26,6356],{"alt":6357,"src":6358},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6360,6361],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6363,46],{"id":46},[48,6365,6366,6372,6375],{},[51,6367,6368,6371],{},[33,6369,6370],{},".venv"," 是常见目录名，不应提交到 Git。",[51,6373,6374],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[51,6376,6377],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6379,62],{"id":62},[10,6381,1614],{},[67,6383,6385],{"className":634,"code":6384,"language":636,"meta":72,"style":72},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6386,6387,6399,6407,6413,6423],{"__ignoreMap":72},[76,6388,6389,6391,6393,6396],{"class":78,"line":79},[76,6390,734],{"class":643},[76,6392,676],{"class":646},[76,6394,6395],{"class":679}," venv",[76,6397,6398],{"class":679}," .venv\n",[76,6400,6401,6404],{"class":78,"line":85},[76,6402,6403],{"class":646},"source",[76,6405,6406],{"class":679}," .venv\u002Fbin\u002Factivate\n",[76,6408,6409,6411],{"class":78,"line":92},[76,6410,71],{"class":643},[76,6412,647],{"class":646},[76,6414,6415,6417,6419,6421],{"class":78,"line":98},[76,6416,71],{"class":643},[76,6418,676],{"class":646},[76,6420,680],{"class":679},[76,6422,647],{"class":646},[76,6424,6425],{"class":78,"line":104},[76,6426,6427],{"class":643},"deactivate\n",[10,6429,139],{},[67,6431,6434],{"className":6432,"code":6433,"language":145,"meta":72},[143],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6435,6433],{"__ignoreMap":72},[10,6437,150],{},[14,6439,153],{"id":153},[155,6441,6442,6451],{},[51,6443,6444,6447,6448,6450],{},[33,6445,6446],{},"venv"," 根据当前 ",[33,6449,734],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[51,6452,6453,6454,2216,6456,6459,6460,3766,6462,6465],{},"激活后 ",[33,6455,71],{},[33,6457,6458],{},"python -m pip"," 优先指向 ",[33,6461,6370],{},[33,6463,6464],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6467,214],{"id":214},[48,6469,6470,6473],{},[51,6471,6472],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[51,6474,3505,6475,6477],{},[33,6476,6370],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6479,235],{"id":235},[155,6481,6482,6488],{},[51,6483,6484,6485,405],{},"创建虚拟环境并记录激活前后的 ",[33,6486,6487],{},"which python",[51,6489,6490],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6492,246],{},[14,6494,249],{"id":249},[10,6496,6497],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,6499,1698],{},{"title":72,"searchDepth":85,"depth":85,"links":6501},[6502,6503,6504,6505,6506,6507,6508,6509],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6340,"description":6345},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[270,6517,304],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6520,"title":6521,"body":6522,"category":270,"cover":271,"description":6526,"extension":272,"meta":6714,"navigation":88,"path":6715,"pinned":275,"publishedAt":276,"seo":6716,"slug":6717,"stem":6718,"summary":6719,"tags":6720,"updatedAt":276,"visible":88,"__hash__":6723},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6523,"toc":6704},[6524,6527,6529,6532,6534,6540,6549,6551,6575,6577,6579,6632,6634,6640,6642,6644,6660,6662,6681,6683,6695,6697,6699,6702],[10,6525,6526],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6528,16],{"id":16},[10,6530,6531],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6533,22],{"id":22},[10,6535,6536],{},[26,6537],{"alt":6538,"src":6539},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6541,6542,6545,6546,6548],{},[33,6543,6544],{},"Path"," 使用 ",[33,6547,2475],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6550,46],{"id":46},[48,6552,6553,6556,6568],{},[51,6554,6555],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[51,6557,6558,36,6561,36,6564,6567],{},[33,6559,6560],{},"exists()",[33,6562,6563],{},"is_file()",[33,6565,6566],{},"is_dir()"," 检查真实文件系统状态。",[51,6569,6570,6571,6574],{},"创建目录前明确目标；",[33,6572,6573],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6576,62],{"id":62},[10,6578,65],{},[67,6580,6582],{"className":69,"code":6581,"language":71,"meta":72,"style":72},"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,6583,6584,6589,6593,6598,6603,6608,6612,6617,6622,6627],{"__ignoreMap":72},[76,6585,6586],{"class":78,"line":79},[76,6587,6588],{},"from pathlib import Path\n",[76,6590,6591],{"class":78,"line":85},[76,6592,89],{"emptyLinePlaceholder":88},[76,6594,6595],{"class":78,"line":92},[76,6596,6597],{},"project = Path.cwd()\n",[76,6599,6600],{"class":78,"line":98},[76,6601,6602],{},"data_dir = project \u002F \"data\"\n",[76,6604,6605],{"class":78,"line":104},[76,6606,6607],{},"file_path = data_dir \u002F \"records.json\"\n",[76,6609,6610],{"class":78,"line":110},[76,6611,89],{"emptyLinePlaceholder":88},[76,6613,6614],{"class":78,"line":116},[76,6615,6616],{},"print(project)\n",[76,6618,6619],{"class":78,"line":122},[76,6620,6621],{},"print(file_path.name)\n",[76,6623,6624],{"class":78,"line":128},[76,6625,6626],{},"print(file_path.suffix)\n",[76,6628,6629],{"class":78,"line":133},[76,6630,6631],{},"print(file_path.exists())\n",[10,6633,139],{},[67,6635,6638],{"className":6636,"code":6637,"language":145,"meta":72},[143],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6639,6637],{"__ignoreMap":72},[10,6641,150],{},[14,6643,153],{"id":153},[155,6645,6646,6652],{},[51,6647,6648,6651],{},[33,6649,6650],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[51,6653,2378,6654,6656,6657,6659],{},[33,6655,2475],{}," 组合路径片段只创建新的 ",[33,6658,6544],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6661,214],{"id":214},[48,6663,6664,6672],{},[51,6665,3505,6666,6668,6669,6671],{},[33,6667,6544],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6670,6560],{}," 等方法确认。",[51,6673,6674,6675,1052,6677,6680],{},"手工拼接 ",[33,6676,2475],{},[33,6678,6679],{},"\\"," 分隔符，降低跨平台可读性。",[14,6682,235],{"id":235},[155,6684,6685,6692],{},[51,6686,6687,6688,6691],{},"组合 ",[33,6689,6690],{},"output\u002Freport.txt"," 路径但先不创建文件。",[51,6693,6694],{},"输出路径的父目录、文件名和扩展名。",[10,6696,246],{},[14,6698,249],{"id":249},[10,6700,6701],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,6703,256],{},{"title":72,"searchDepth":85,"depth":85,"links":6705},[6706,6707,6708,6709,6710,6711,6712,6713],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6521,"description":6526},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[270,6721,6722],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6725,"title":6726,"body":6727,"category":270,"cover":271,"description":6731,"extension":272,"meta":6909,"navigation":88,"path":6910,"pinned":275,"publishedAt":276,"seo":6911,"slug":6912,"stem":6913,"summary":6914,"tags":6915,"updatedAt":276,"visible":88,"__hash__":6918},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6728,"toc":6899},[6729,6732,6734,6737,6739,6745,6748,6750,6778,6780,6782,6839,6841,6847,6849,6851,6862,6864,6877,6879,6890,6892,6894,6897],[10,6730,6731],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6733,16],{"id":16},[10,6735,6736],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6738,22],{"id":22},[10,6740,6741],{},[26,6742],{"alt":6743,"src":6744},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6746,6747],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6749,46],{"id":46},[48,6751,6752,6758,6767],{},[51,6753,6754,6757],{},[33,6755,6756],{},"w"," 模式会截断原文件，写入前必须确认目标。",[51,6759,6760,6763,6764,405],{},[33,6761,6762],{},"r"," 模式读取不存在文件会产生 ",[33,6765,6766],{},"FileNotFoundError",[51,6768,6769,6770,6773,6774,6777],{},"本篇显式调用 ",[33,6771,6772],{},"close()","；第 34 篇会用 ",[33,6775,6776],{},"with"," 更可靠地管理关闭动作。",[14,6779,62],{"id":62},[10,6781,65],{},[67,6783,6785],{"className":69,"code":6784,"language":71,"meta":72,"style":72},"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,6786,6787,6791,6795,6800,6805,6810,6815,6819,6824,6829,6834],{"__ignoreMap":72},[76,6788,6789],{"class":78,"line":79},[76,6790,6588],{},[76,6792,6793],{"class":78,"line":85},[76,6794,89],{"emptyLinePlaceholder":88},[76,6796,6797],{"class":78,"line":92},[76,6798,6799],{},"file_path = Path(\"notes.txt\")\n",[76,6801,6802],{"class":78,"line":98},[76,6803,6804],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[76,6806,6807],{"class":78,"line":104},[76,6808,6809],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[76,6811,6812],{"class":78,"line":110},[76,6813,6814],{},"writer.close()\n",[76,6816,6817],{"class":78,"line":116},[76,6818,89],{"emptyLinePlaceholder":88},[76,6820,6821],{"class":78,"line":122},[76,6822,6823],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[76,6825,6826],{"class":78,"line":128},[76,6827,6828],{},"content = reader.read()\n",[76,6830,6831],{"class":78,"line":133},[76,6832,6833],{},"reader.close()\n",[76,6835,6836],{"class":78,"line":5814},[76,6837,6838],{},"print(content)\n",[10,6840,139],{},[67,6842,6845],{"className":6843,"code":6844,"language":145,"meta":72},[143],"变量\n循环\n函数\n",[33,6846,6844],{"__ignoreMap":72},[10,6848,150],{},[14,6850,153],{"id":153},[155,6852,6853,6859],{},[51,6854,6855,6856,6858],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6857,6772],{}," 确保缓冲内容交给文件系统。",[51,6860,6861],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6863,214],{"id":214},[48,6865,6866,6871],{},[51,6867,2378,6868,6870],{},[33,6869,6756],{}," 模式打开重要文件却未确认覆盖风险。",[51,6872,6873,6874,405],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6875,6876],{},"encoding=\"utf-8\"",[14,6878,235],{"id":235},[155,6880,6881,6884],{},[51,6882,6883],{},"写入三行学习记录并读取。",[51,6885,6886,6887,6889],{},"改用 ",[33,6888,379],{}," 模式追加一行，确认原内容仍保留。",[10,6891,246],{},[14,6893,249],{"id":249},[10,6895,6896],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,6898,256],{},{"title":72,"searchDepth":85,"depth":85,"links":6900},[6901,6902,6903,6904,6905,6906,6907,6908],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6726,"description":6731},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[270,6916,6917],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6920,"title":6921,"body":6922,"category":270,"cover":271,"description":6926,"extension":272,"meta":7093,"navigation":88,"path":7094,"pinned":275,"publishedAt":276,"seo":7095,"slug":7096,"stem":7097,"summary":7098,"tags":7099,"updatedAt":276,"visible":88,"__hash__":7102},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6923,"toc":7083},[6924,6927,6929,6932,6934,6940,6950,6952,6966,6968,6970,7030,7032,7038,7040,7042,7054,7056,7064,7066,7074,7076,7078,7081],[10,6925,6926],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6928,16],{"id":16},[10,6930,6931],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6933,22],{"id":22},[10,6935,6936],{},[26,6937],{"alt":6938,"src":6939},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6941,6942,6945,6946,6949],{},[33,6943,6944],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6947,6948],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6951,46],{"id":46},[48,6953,6954,6957,6963],{},[51,6955,6956],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[51,6958,6959,6962],{},[33,6960,6961],{},"ensure_ascii=False"," 让中文以可读字符写入。",[51,6964,6965],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6967,62],{"id":62},[10,6969,65],{},[67,6971,6973],{"className":69,"code":6972,"language":71,"meta":72,"style":72},"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,6974,6975,6980,6984,6989,6993,6998,7003,7007,7011,7016,7021,7025],{"__ignoreMap":72},[76,6976,6977],{"class":78,"line":79},[76,6978,6979],{},"import json\n",[76,6981,6982],{"class":78,"line":85},[76,6983,89],{"emptyLinePlaceholder":88},[76,6985,6986],{"class":78,"line":92},[76,6987,6988],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[76,6990,6991],{"class":78,"line":98},[76,6992,89],{"emptyLinePlaceholder":88},[76,6994,6995],{"class":78,"line":104},[76,6996,6997],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[76,6999,7000],{"class":78,"line":110},[76,7001,7002],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[76,7004,7005],{"class":78,"line":116},[76,7006,6814],{},[76,7008,7009],{"class":78,"line":122},[76,7010,89],{"emptyLinePlaceholder":88},[76,7012,7013],{"class":78,"line":128},[76,7014,7015],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[76,7017,7018],{"class":78,"line":133},[76,7019,7020],{},"loaded = json.load(reader)\n",[76,7022,7023],{"class":78,"line":5814},[76,7024,6833],{},[76,7026,7027],{"class":78,"line":5819},[76,7028,7029],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7031,139],{},[67,7033,7036],{"className":7034,"code":7035,"language":145,"meta":72},[143],"Python 60\n",[33,7037,7035],{"__ignoreMap":72},[10,7039,150],{},[14,7041,153],{"id":153},[155,7043,7044,7049],{},[51,7045,7046,7048],{},[33,7047,6944],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[51,7050,7051,7053],{},[33,7052,6948],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7055,214],{"id":214},[48,7057,7058,7061],{},[51,7059,7060],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[51,7062,7063],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7065,235],{"id":235},[155,7067,7068,7071],{},[51,7069,7070],{},"保存包含两条学习记录的列表。",[51,7072,7073],{},"读取后修改进度，再重新写回文件。",[10,7075,246],{},[14,7077,249],{"id":249},[10,7079,7080],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,7082,256],{},{"title":72,"searchDepth":85,"depth":85,"links":7084},[7085,7086,7087,7088,7089,7090,7091,7092],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6921,"description":6926},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[270,7100,7101],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7104,"title":7105,"body":7106,"category":270,"cover":271,"description":7110,"extension":272,"meta":7294,"navigation":88,"path":7295,"pinned":275,"publishedAt":276,"seo":7296,"slug":7297,"stem":7298,"summary":7299,"tags":7300,"updatedAt":276,"visible":88,"__hash__":7303},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7107,"toc":7284},[7108,7111,7113,7116,7118,7124,7130,7132,7154,7156,7158,7221,7223,7229,7231,7233,7249,7251,7265,7267,7275,7277,7279,7282],[10,7109,7110],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7112,16],{"id":16},[10,7114,7115],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7117,22],{"id":22},[10,7119,7120],{},[26,7121],{"alt":7122,"src":7123},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7125,7126,7129],{},[33,7127,7128],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7131,46],{"id":46},[48,7133,7134,7144,7151],{},[51,7135,2378,7136,7139,7140,7143],{},[33,7137,7138],{},"newline=\"\""," 让 ",[33,7141,7142],{},"csv"," 模块正确处理换行。",[51,7145,7146,7147,7150],{},"字段顺序由 ",[33,7148,7149],{},"fieldnames"," 决定，字典键需要与字段名一致。",[51,7152,7153],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7155,62],{"id":62},[10,7157,65],{},[67,7159,7161],{"className":69,"code":7160,"language":71,"meta":72,"style":72},"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,7162,7163,7168,7172,7177,7182,7187,7192,7197,7201,7206,7211,7216],{"__ignoreMap":72},[76,7164,7165],{"class":78,"line":79},[76,7166,7167],{},"import csv\n",[76,7169,7170],{"class":78,"line":85},[76,7171,89],{"emptyLinePlaceholder":88},[76,7173,7174],{"class":78,"line":92},[76,7175,7176],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[76,7178,7179],{"class":78,"line":98},[76,7180,7181],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[76,7183,7184],{"class":78,"line":104},[76,7185,7186],{},"writer.writeheader()\n",[76,7188,7189],{"class":78,"line":110},[76,7190,7191],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[76,7193,7194],{"class":78,"line":116},[76,7195,7196],{},"writer_file.close()\n",[76,7198,7199],{"class":78,"line":122},[76,7200,89],{"emptyLinePlaceholder":88},[76,7202,7203],{"class":78,"line":128},[76,7204,7205],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[76,7207,7208],{"class":78,"line":133},[76,7209,7210],{},"for row in csv.DictReader(reader_file):\n",[76,7212,7213],{"class":78,"line":5814},[76,7214,7215],{},"    print(row[\"name\"], row[\"score\"])\n",[76,7217,7218],{"class":78,"line":5819},[76,7219,7220],{},"reader_file.close()\n",[10,7222,139],{},[67,7224,7227],{"className":7225,"code":7226,"language":145,"meta":72},[143],"小郑 95\n",[33,7228,7226],{"__ignoreMap":72},[10,7230,150],{},[14,7232,153],{"id":153},[155,7234,7235,7244],{},[51,7236,7237,7240,7241,7243],{},[33,7238,7239],{},"DictWriter"," 按 ",[33,7242,7149],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[51,7245,7246,7248],{},[33,7247,7128],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7250,214],{"id":214},[48,7252,7253,7256],{},[51,7254,7255],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[51,7257,7258,7259,7261,7262,7264],{},"在 macOS 以外环境忽略 ",[33,7260,7138],{}," 可能出现额外空行；统一交给 ",[33,7263,7142],{}," 模块管理换行。",[14,7266,235],{"id":235},[155,7268,7269,7272],{},[51,7270,7271],{},"写入三名学习者的课程和分数。",[51,7273,7274],{},"读取 CSV 后把分数字符串转换为整数。",[10,7276,246],{},[14,7278,249],{"id":249},[10,7280,7281],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,7283,256],{},{"title":72,"searchDepth":85,"depth":85,"links":7285},[7286,7287,7288,7289,7290,7291,7292,7293],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7105,"description":7110},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[270,7301,7302],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7305,"title":7306,"body":7307,"category":270,"cover":271,"description":7311,"extension":272,"meta":7584,"navigation":88,"path":7585,"pinned":275,"publishedAt":276,"seo":7586,"slug":7587,"stem":7588,"summary":7589,"tags":7590,"updatedAt":276,"visible":88,"__hash__":7593},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7308,"toc":7571},[7309,7312,7314,7317,7319,7325,7336,7338,7355,7357,7359,7434,7436,7442,7444,7446,7471,7473,7482,7488,7499,7501,7507,7513,7522,7524,7539,7541,7562,7564,7566,7569],[10,7310,7311],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7313,16],{"id":16},[10,7315,7316],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7318,22],{"id":22},[10,7320,7321],{},[26,7322],{"alt":7323,"src":7324},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7326,7327,7328,7331,7332,7335],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7329,7330],{},"except","；无论是否异常，",[33,7333,7334],{},"finally"," 都会在离开结构前执行。",[14,7337,46],{"id":46},[48,7339,7340,7346,7352],{},[51,7341,7342,7343,7345],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7344,7330],{}," 吞掉全部错误。",[51,7347,7348,7351],{},[33,7349,7350],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[51,7353,7354],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7356,62],{"id":62},[10,7358,65],{},[67,7360,7362],{"className":69,"code":7361,"language":71,"meta":72,"style":72},"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,7363,7364,7369,7374,7379,7384,7389,7393,7398,7403,7408,7413,7417,7422,7428],{"__ignoreMap":72},[76,7365,7366],{"class":78,"line":79},[76,7367,7368],{},"def parse_age(text):\n",[76,7370,7371],{"class":78,"line":85},[76,7372,7373],{},"    age = int(text)\n",[76,7375,7376],{"class":78,"line":92},[76,7377,7378],{},"    if age \u003C 0:\n",[76,7380,7381],{"class":78,"line":98},[76,7382,7383],{},"        raise ValueError(\"年龄不能为负数\")\n",[76,7385,7386],{"class":78,"line":104},[76,7387,7388],{},"    return age\n",[76,7390,7391],{"class":78,"line":110},[76,7392,89],{"emptyLinePlaceholder":88},[76,7394,7395],{"class":78,"line":116},[76,7396,7397],{},"try:\n",[76,7399,7400],{"class":78,"line":122},[76,7401,7402],{},"    age = parse_age(\"18\")\n",[76,7404,7405],{"class":78,"line":128},[76,7406,7407],{},"except ValueError as error:\n",[76,7409,7410],{"class":78,"line":133},[76,7411,7412],{},"    print(\"输入错误：\", error)\n",[76,7414,7415],{"class":78,"line":5814},[76,7416,119],{},[76,7418,7419],{"class":78,"line":5819},[76,7420,7421],{},"    print(\"年龄：\", age)\n",[76,7423,7425],{"class":78,"line":7424},13,[76,7426,7427],{},"finally:\n",[76,7429,7431],{"class":78,"line":7430},14,[76,7432,7433],{},"    print(\"处理结束\")\n",[10,7435,139],{},[67,7437,7440],{"className":7438,"code":7439,"language":145,"meta":72},[143],"年龄： 18\n处理结束\n",[33,7441,7439],{"__ignoreMap":72},[10,7443,150],{},[14,7445,153],{"id":153},[155,7447,7448,7460],{},[51,7449,7450,7452,7453,7455,7456,7459],{},[33,7451,3074],{}," 或主动 ",[33,7454,7350],{}," 都可能产生 ",[33,7457,7458],{},"ValueError","，控制流立即离开当前正常路径。",[51,7461,7462,7463,7465,7466,7468,7469,405],{},"有异常时进入匹配的 ",[33,7464,7330],{},"；没有异常时执行 ",[33,7467,42],{},"；两种情况最后都会执行 ",[33,7470,7334],{},[174,7472,176],{"id":176},[10,7474,7475,36,7477,1198,7479,7481],{},[33,7476,7330],{},[33,7478,42],{},[33,7480,7334],{}," 的职责不同，不能只看它们出现的顺序。",[10,7483,7484],{},[26,7485],{"alt":7486,"src":7487},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7489,7490,7492,7493,7495,7496,7498],{},[33,7491,7330],{}," 处理匹配异常，",[33,7494,42],{}," 只在无异常时运行，",[33,7497,7334],{}," 负责两条路径都需要的清理动作。",[174,7500,176],{"id":196},[10,7502,7503,7506],{},[33,7504,7505],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7508,7509],{},[26,7510],{"alt":7511,"src":7512},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7514,7515,7516,7518,7519,7521],{},"只把可能产生预期异常的操作放进 ",[33,7517,7505],{},"，后续正常业务放进 ",[33,7520,42],{},"，错误边界会更清楚。",[14,7523,214],{"id":214},[48,7525,7526,7533],{},[51,7527,7528,7529,7532],{},"使用裸 ",[33,7530,7531],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[51,7534,7535,7536,7538],{},"把整个程序包在一个巨大 ",[33,7537,7505],{}," 中，无法判断究竟哪一步允许失败。",[14,7540,235],{"id":235},[155,7542,7543,7556],{},[51,7544,7545,7546,7549,7550,1198,7553,405],{},"让 ",[33,7547,7548],{},"parse_age"," 分别处理 ",[33,7551,7552],{},"\"abc\"",[33,7554,7555],{},"\"-1\"",[51,7557,7558,7559,7561],{},"为文件读取捕获 ",[33,7560,6766],{}," 并给出清晰提示。",[10,7563,246],{},[14,7565,249],{"id":249},[10,7567,7568],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,7570,256],{},{"title":72,"searchDepth":85,"depth":85,"links":7572},[7573,7574,7575,7576,7577,7581,7582,7583],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":7578},[7579,7580],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7306,"description":7311},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[270,7591,7592],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7595,"title":7596,"body":7597,"category":270,"cover":271,"description":7601,"extension":272,"meta":7777,"navigation":88,"path":7778,"pinned":275,"publishedAt":276,"seo":7779,"slug":7780,"stem":7781,"summary":7782,"tags":7783,"updatedAt":276,"visible":88,"__hash__":7785},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7598,"toc":7767},[7599,7602,7604,7607,7609,7615,7621,7623,7639,7641,7643,7697,7699,7705,7707,7709,7722,7724,7737,7739,7758,7760,7762,7765],[10,7600,7601],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7603,16],{"id":16},[10,7605,7606],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7608,22],{"id":22},[10,7610,7611],{},[26,7612],{"alt":7613,"src":7614},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7616,7617,7618,7620],{},"进入 ",[33,7619,6776],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7622,46],{"id":46},[48,7624,7625,7630,7636],{},[51,7626,7627,7629],{},[33,7628,6776],{}," 把资源获取和释放配成一个清晰边界。",[51,7631,7632,7635],{},[33,7633,7634],{},"as file"," 得到的是上下文返回的资源对象。",[51,7637,7638],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7640,62],{"id":62},[10,7642,65],{},[67,7644,7646],{"className":69,"code":7645,"language":71,"meta":72,"style":72},"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,7647,7648,7652,7656,7660,7664,7669,7674,7678,7683,7688,7692],{"__ignoreMap":72},[76,7649,7650],{"class":78,"line":79},[76,7651,6588],{},[76,7653,7654],{"class":78,"line":85},[76,7655,89],{"emptyLinePlaceholder":88},[76,7657,7658],{"class":78,"line":92},[76,7659,6799],{},[76,7661,7662],{"class":78,"line":98},[76,7663,89],{"emptyLinePlaceholder":88},[76,7665,7666],{"class":78,"line":104},[76,7667,7668],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[76,7670,7671],{"class":78,"line":110},[76,7672,7673],{},"    file.write(\"上下文管理器\\n\")\n",[76,7675,7676],{"class":78,"line":116},[76,7677,89],{"emptyLinePlaceholder":88},[76,7679,7680],{"class":78,"line":122},[76,7681,7682],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[76,7684,7685],{"class":78,"line":128},[76,7686,7687],{},"    print(file.read())\n",[76,7689,7690],{"class":78,"line":133},[76,7691,89],{"emptyLinePlaceholder":88},[76,7693,7694],{"class":78,"line":5814},[76,7695,7696],{},"print(file.closed)\n",[10,7698,139],{},[67,7700,7703],{"className":7701,"code":7702,"language":145,"meta":72},[143],"上下文管理器\n\nTrue\n",[33,7704,7702],{"__ignoreMap":72},[10,7706,150],{},[14,7708,153],{"id":153},[155,7710,7711,7719],{},[51,7712,7617,7713,7715,7716,405],{},[33,7714,6776],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7717,7718],{},"file",[51,7720,7721],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7723,214],{"id":214},[48,7725,7726,7731],{},[51,7727,4772,7728,7730],{},[33,7729,6776],{}," 代码块外继续读写已经关闭的文件对象。",[51,7732,7733,7734,7736],{},"误以为 ",[33,7735,6776],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7738,235],{"id":235},[155,7740,7741,7750],{},[51,7742,7743,7744,7747,7748,405],{},"把第 30 篇的手动 ",[33,7745,7746],{},"open\u002Fclose"," 改写为 ",[33,7749,6776],{},[51,7751,4772,7752,7754,7755,405],{},[33,7753,6776],{}," 块后检查 ",[33,7756,7757],{},"file.closed",[10,7759,246],{},[14,7761,249],{"id":249},[10,7763,7764],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,7766,256],{},{"title":72,"searchDepth":85,"depth":85,"links":7768},[7769,7770,7771,7772,7773,7774,7775,7776],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7596,"description":7601},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[270,6776,7784],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7787,"title":7788,"body":7789,"category":270,"cover":271,"description":7793,"extension":272,"meta":8005,"navigation":88,"path":8006,"pinned":275,"publishedAt":276,"seo":8007,"slug":8008,"stem":8009,"summary":8010,"tags":8011,"updatedAt":276,"visible":88,"__hash__":8014},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7790,"toc":7993},[7791,7794,7796,7799,7801,7807,7810,7812,7829,7831,7833,7901,7903,7909,7911,7913,7938,7940,7943,7949,7958,7960,7971,7973,7984,7986,7988,7991],[10,7792,7793],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7795,16],{"id":16},[10,7797,7798],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7800,22],{"id":22},[10,7802,7803],{},[26,7804],{"alt":7805,"src":7806},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7808,7809],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7811,46],{"id":46},[48,7813,7814,7820,7826],{},[51,7815,7816,7819],{},[33,7817,7818],{},"self"," 表示当前实例，由方法调用自动传入。",[51,7821,7822,7825],{},[33,7823,7824],{},"__init__"," 在实例创建过程中初始化属性。",[51,7827,7828],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7830,62],{"id":62},[10,7832,65],{},[67,7834,7836],{"className":69,"code":7835,"language":71,"meta":72,"style":72},"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,7837,7838,7843,7848,7853,7858,7862,7867,7872,7877,7882,7886,7891,7896],{"__ignoreMap":72},[76,7839,7840],{"class":78,"line":79},[76,7841,7842],{},"class LearningRecord:\n",[76,7844,7845],{"class":78,"line":85},[76,7846,7847],{},"    def __init__(self, course, progress=0):\n",[76,7849,7850],{"class":78,"line":92},[76,7851,7852],{},"        self.course = course\n",[76,7854,7855],{"class":78,"line":98},[76,7856,7857],{},"        self.progress = progress\n",[76,7859,7860],{"class":78,"line":104},[76,7861,89],{"emptyLinePlaceholder":88},[76,7863,7864],{"class":78,"line":110},[76,7865,7866],{},"    def advance(self, amount):\n",[76,7868,7869],{"class":78,"line":116},[76,7870,7871],{},"        self.progress = self.progress + amount\n",[76,7873,7874],{"class":78,"line":122},[76,7875,7876],{},"        if self.progress > 100:\n",[76,7878,7879],{"class":78,"line":128},[76,7880,7881],{},"            self.progress = 100\n",[76,7883,7884],{"class":78,"line":133},[76,7885,89],{"emptyLinePlaceholder":88},[76,7887,7888],{"class":78,"line":5814},[76,7889,7890],{},"record = LearningRecord(\"Python\", 40)\n",[76,7892,7893],{"class":78,"line":5819},[76,7894,7895],{},"record.advance(15)\n",[76,7897,7898],{"class":78,"line":7424},[76,7899,7900],{},"print(record.course, record.progress)\n",[10,7902,139],{},[67,7904,7907],{"className":7905,"code":7906,"language":145,"meta":72},[143],"Python 55\n",[33,7908,7906],{"__ignoreMap":72},[10,7910,150],{},[14,7912,153],{"id":153},[155,7914,7915,7925],{},[51,7916,7917,7918,7921,7922,7924],{},"调用 ",[33,7919,7920],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7923,7824],{}," 把课程和进度保存在该实例属性中。",[51,7926,7927,7930,7931,7934,7935,7937],{},[33,7928,7929],{},"record.advance(15)"," 自动把 ",[33,7932,7933],{},"record"," 作为 ",[33,7936,7818],{},"，方法更新同一实例的进度并限制上限。",[174,7939,176],{"id":176},[10,7941,7942],{},"类是共同定义，实例则各自保存状态。",[10,7944,7945],{},[26,7946],{"alt":7947,"src":7948},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7950,7951,7952,1198,7954,7957],{},"两个实例共享同一套方法定义，但 ",[33,7953,4569],{},[33,7955,7956],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7959,214],{"id":214},[48,7961,7962,7968],{},[51,7963,7964,7965,7967],{},"调用实例方法时手工再传一次 ",[33,7966,7818],{},"。通过实例调用时 Python 会自动绑定。",[51,7969,7970],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7972,235],{"id":235},[155,7974,7975,7981],{},[51,7976,5282,7977,7980],{},[33,7978,7979],{},"Book"," 类，保存标题和阅读页数。",[51,7982,7983],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7985,246],{},[14,7987,249],{"id":249},[10,7989,7990],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,7992,256],{},{"title":72,"searchDepth":85,"depth":85,"links":7994},[7995,7996,7997,7998,7999,8002,8003,8004],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":8000},[8001],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7788,"description":7793},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[270,8012,8013],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":8016,"title":8017,"body":8018,"category":270,"cover":271,"description":8022,"extension":272,"meta":8200,"navigation":88,"path":8201,"pinned":275,"publishedAt":276,"seo":8202,"slug":8203,"stem":8204,"summary":8205,"tags":8206,"updatedAt":276,"visible":88,"__hash__":8209},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8019,"toc":8190},[8020,8023,8025,8028,8030,8036,8039,8041,8052,8054,8056,8123,8125,8131,8133,8135,8154,8156,8164,8166,8181,8183,8185,8188],[10,8021,8022],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8024,16],{"id":16},[10,8026,8027],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8029,22],{"id":22},[10,8031,8032],{},[26,8033],{"alt":8034,"src":8035},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8037,8038],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8040,46],{"id":46},[48,8042,8043,8046,8049],{},[51,8044,8045],{},"封装让对象通过方法维护自己的有效状态。",[51,8047,8048],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[51,8050,8051],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8053,62],{"id":62},[10,8055,65],{},[67,8057,8059],{"className":69,"code":8058,"language":71,"meta":72,"style":72},"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,8060,8061,8066,8071,8076,8080,8085,8090,8095,8099,8104,8109,8113,8118],{"__ignoreMap":72},[76,8062,8063],{"class":78,"line":79},[76,8064,8065],{},"class Storage:\n",[76,8067,8068],{"class":78,"line":85},[76,8069,8070],{},"    def save(self, text):\n",[76,8072,8073],{"class":78,"line":92},[76,8074,8075],{},"        print(\"保存：\", text)\n",[76,8077,8078],{"class":78,"line":98},[76,8079,89],{"emptyLinePlaceholder":88},[76,8081,8082],{"class":78,"line":104},[76,8083,8084],{},"class LearningService:\n",[76,8086,8087],{"class":78,"line":110},[76,8088,8089],{},"    def __init__(self, storage):\n",[76,8091,8092],{"class":78,"line":116},[76,8093,8094],{},"        self.storage = storage\n",[76,8096,8097],{"class":78,"line":122},[76,8098,89],{"emptyLinePlaceholder":88},[76,8100,8101],{"class":78,"line":128},[76,8102,8103],{},"    def finish_lesson(self, title):\n",[76,8105,8106],{"class":78,"line":133},[76,8107,8108],{},"        self.storage.save(title)\n",[76,8110,8111],{"class":78,"line":5814},[76,8112,89],{"emptyLinePlaceholder":88},[76,8114,8115],{"class":78,"line":5819},[76,8116,8117],{},"service = LearningService(Storage())\n",[76,8119,8120],{"class":78,"line":7424},[76,8121,8122],{},"service.finish_lesson(\"异常处理\")\n",[10,8124,139],{},[67,8126,8129],{"className":8127,"code":8128,"language":145,"meta":72},[143],"保存： 异常处理\n",[33,8130,8128],{"__ignoreMap":72},[10,8132,150],{},[14,8134,153],{"id":153},[155,8136,8137,8147],{},[51,8138,8139,8142,8143,8146],{},[33,8140,8141],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8144,8145],{},"save()"," 的协作对象。",[51,8148,8149,8150,8153],{},"调用业务方法时，服务把保存动作委托给 ",[33,8151,8152],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8155,214],{"id":214},[48,8157,8158,8161],{},[51,8159,8160],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[51,8162,8163],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8165,235],{"id":235},[155,8167,8168,8178],{},[51,8169,8170,8171,8174,8175,405],{},"用组合让 ",[33,8172,8173],{},"OrderService"," 使用一个 ",[33,8176,8177],{},"Notifier",[51,8179,8180],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8182,246],{},[14,8184,249],{"id":249},[10,8186,8187],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,8189,256],{},{"title":72,"searchDepth":85,"depth":85,"links":8191},[8192,8193,8194,8195,8196,8197,8198,8199],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":8017,"description":8022},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[270,8207,8208],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8211,"title":8212,"body":8213,"category":270,"cover":271,"description":8217,"extension":272,"meta":8420,"navigation":88,"path":8421,"pinned":275,"publishedAt":276,"seo":8422,"slug":8423,"stem":8424,"summary":8425,"tags":8426,"updatedAt":276,"visible":88,"__hash__":8429},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8214,"toc":8408},[8215,8218,8220,8223,8225,8231,8238,8240,8265,8267,8269,8321,8323,8329,8331,8333,8354,8356,8362,8368,8374,8376,8384,8386,8399,8401,8403,8406],[10,8216,8217],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8219,16],{"id":16},[10,8221,8222],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8224,22],{"id":22},[10,8226,8227],{},[26,8228],{"alt":8229,"src":8230},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8232,8233,8234,8237],{},"生成器运行到 ",[33,8235,8236],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8239,46],{"id":46},[48,8241,8242,8252,8262],{},[51,8243,8244,8247,8248,8251],{},[33,8245,8246],{},"iter()"," 从可迭代对象取得迭代器，",[33,8249,8250],{},"next()"," 请求下一个值。",[51,8253,8254,8255,8258,8259,8261],{},"没有更多值时迭代器抛出 ",[33,8256,8257],{},"StopIteration","，",[33,8260,4323],{}," 会自动处理。",[51,8263,8264],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8266,62],{"id":62},[10,8268,65],{},[67,8270,8272],{"className":69,"code":8271,"language":71,"meta":72,"style":72},"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,8273,8274,8279,8284,8289,8294,8299,8303,8308,8313,8317],{"__ignoreMap":72},[76,8275,8276],{"class":78,"line":79},[76,8277,8278],{},"def countdown(start):\n",[76,8280,8281],{"class":78,"line":85},[76,8282,8283],{},"    current = start\n",[76,8285,8286],{"class":78,"line":92},[76,8287,8288],{},"    while current > 0:\n",[76,8290,8291],{"class":78,"line":98},[76,8292,8293],{},"        yield current\n",[76,8295,8296],{"class":78,"line":104},[76,8297,8298],{},"        current = current - 1\n",[76,8300,8301],{"class":78,"line":110},[76,8302,89],{"emptyLinePlaceholder":88},[76,8304,8305],{"class":78,"line":116},[76,8306,8307],{},"iterator = countdown(3)\n",[76,8309,8310],{"class":78,"line":122},[76,8311,8312],{},"print(next(iterator))\n",[76,8314,8315],{"class":78,"line":128},[76,8316,8312],{},[76,8318,8319],{"class":78,"line":133},[76,8320,8312],{},[10,8322,139],{},[67,8324,8327],{"className":8325,"code":8326,"language":145,"meta":72},[143],"3\n2\n1\n",[33,8328,8326],{"__ignoreMap":72},[10,8330,150],{},[14,8332,153],{"id":153},[155,8334,8335,8341],{},[51,8336,7917,8337,8340],{},[33,8338,8339],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[51,8342,8343,8344,8346,8347,8349,8350,8353],{},"每次 ",[33,8345,8250],{}," 运行到下一个 ",[33,8348,8236],{}," 并暂停，局部变量 ",[33,8351,8352],{},"current"," 和执行位置被保留。",[174,8355,176],{"id":176},[10,8357,8358,8359,8361],{},"生成器的暂停位置可以展开成多次 ",[33,8360,8250],{}," 的时间线。",[10,8363,8364],{},[26,8365],{"alt":8366,"src":8367},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8369,8370,8371,8373],{},"每次请求只推进到下一个 ",[33,8372,8236],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8375,214],{"id":214},[48,8377,8378,8381],{},[51,8379,8380],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[51,8382,8383],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8385,235],{"id":235},[155,8387,8388,8391],{},[51,8389,8390],{},"编写产生 1 到指定上限偶数的生成器。",[51,8392,4048,8393,8395,8396,8398],{},[33,8394,4323],{}," 遍历生成器，比较手动 ",[33,8397,8250],{}," 的差异。",[10,8400,246],{},[14,8402,249],{"id":249},[10,8404,8405],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,8407,256],{},{"title":72,"searchDepth":85,"depth":85,"links":8409},[8410,8411,8412,8413,8414,8417,8418,8419],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":8415},[8416],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8212,"description":8217},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[270,8427,8428],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8431,"title":8432,"body":8433,"category":270,"cover":271,"description":8437,"extension":272,"meta":8661,"navigation":88,"path":8662,"pinned":275,"publishedAt":276,"seo":8663,"slug":8664,"stem":8665,"summary":8666,"tags":8667,"updatedAt":276,"visible":88,"__hash__":8669},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8434,"toc":8649},[8435,8438,8440,8443,8445,8451,8454,8456,8476,8478,8480,8562,8564,8570,8572,8574,8596,8598,8601,8607,8614,8616,8626,8628,8640,8642,8644,8647],[10,8436,8437],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8439,16],{"id":16},[10,8441,8442],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8444,22],{"id":22},[10,8446,8447],{},[26,8448],{"alt":8449,"src":8450},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8452,8453],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8455,46],{"id":46},[48,8457,8458,8467,8470],{},[51,8459,8460,8463,8464,405],{},[33,8461,8462],{},"@trace"," 等价于 ",[33,8465,8466],{},"add = trace(add)",[51,8468,8469],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[51,8471,8472,8475],{},[33,8473,8474],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8477,62],{"id":62},[10,8479,65],{},[67,8481,8483],{"className":69,"code":8482,"language":71,"meta":72,"style":72},"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,8484,8485,8490,8494,8499,8504,8509,8514,8519,8524,8529,8534,8538,8543,8547,8551,8556],{"__ignoreMap":72},[76,8486,8487],{"class":78,"line":79},[76,8488,8489],{},"from functools import wraps\n",[76,8491,8492],{"class":78,"line":85},[76,8493,89],{"emptyLinePlaceholder":88},[76,8495,8496],{"class":78,"line":92},[76,8497,8498],{},"def trace(function):\n",[76,8500,8501],{"class":78,"line":98},[76,8502,8503],{},"    @wraps(function)\n",[76,8505,8506],{"class":78,"line":104},[76,8507,8508],{},"    def wrapper(*args, **kwargs):\n",[76,8510,8511],{"class":78,"line":110},[76,8512,8513],{},"        print(\"开始：\", function.__name__)\n",[76,8515,8516],{"class":78,"line":116},[76,8517,8518],{},"        result = function(*args, **kwargs)\n",[76,8520,8521],{"class":78,"line":122},[76,8522,8523],{},"        print(\"结束：\", function.__name__)\n",[76,8525,8526],{"class":78,"line":128},[76,8527,8528],{},"        return result\n",[76,8530,8531],{"class":78,"line":133},[76,8532,8533],{},"    return wrapper\n",[76,8535,8536],{"class":78,"line":5814},[76,8537,89],{"emptyLinePlaceholder":88},[76,8539,8540],{"class":78,"line":5819},[76,8541,8542],{},"@trace\n",[76,8544,8545],{"class":78,"line":7424},[76,8546,6167],{},[76,8548,8549],{"class":78,"line":7430},[76,8550,6172],{},[76,8552,8554],{"class":78,"line":8553},15,[76,8555,89],{"emptyLinePlaceholder":88},[76,8557,8559],{"class":78,"line":8558},16,[76,8560,8561],{},"print(add(2, 3))\n",[10,8563,139],{},[67,8565,8568],{"className":8566,"code":8567,"language":145,"meta":72},[143],"开始： add\n结束： add\n5\n",[33,8569,8567],{"__ignoreMap":72},[10,8571,150],{},[14,8573,153],{"id":153},[155,8575,8576,8593],{},[51,8577,8578,8579,8582,8583,8586,8587,8590,8591,405],{},"解释器执行定义时，把原 ",[33,8580,8581],{},"add"," 函数交给 ",[33,8584,8585],{},"trace","，返回的 ",[33,8588,8589],{},"wrapper"," 重新绑定到名字 ",[33,8592,8581],{},[51,8594,8595],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[174,8597,176],{"id":176},[10,8599,8600],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8602,8603],{},[26,8604],{"alt":8605,"src":8606},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8608,8609,8611,8612,405],{},[33,8610,8462],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8613,8466],{},[14,8615,214],{"id":214},[48,8617,8618,8623],{},[51,8619,8620,8621,405],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8622,5365],{},[51,8624,8625],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8627,235],{"id":235},[155,8629,8630,8633],{},[51,8631,8632],{},"编写只记录调用次数的简单装饰器。",[51,8634,8635,8636,8639],{},"删除包装函数的 ",[33,8637,8638],{},"return result","，观察调用方得到什么。",[10,8641,246],{},[14,8643,249],{"id":249},[10,8645,8646],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,8648,256],{},{"title":72,"searchDepth":85,"depth":85,"links":8650},[8651,8652,8653,8654,8655,8658,8659,8660],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":8656},[8657],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8432,"description":8437},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[270,8668,5316],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8671,"title":8672,"body":8673,"category":270,"cover":271,"description":8677,"extension":272,"meta":8864,"navigation":88,"path":8865,"pinned":275,"publishedAt":276,"seo":8866,"slug":8867,"stem":8868,"summary":8869,"tags":8870,"updatedAt":276,"visible":88,"__hash__":8873},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8674,"toc":8852},[8675,8678,8680,8683,8685,8691,8694,8696,8707,8709,8711,8786,8788,8794,8796,8798,8809,8811,8814,8820,8823,8825,8833,8835,8843,8845,8847,8850],[10,8676,8677],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8679,16],{"id":16},[10,8681,8682],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8684,22],{"id":22},[10,8686,8687],{},[26,8688],{"alt":8689,"src":8690},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8692,8693],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8695,46],{"id":46},[48,8697,8698,8701,8704],{},[51,8699,8700],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[51,8702,8703],{},"日志记录运行状态，测试判断结果是否符合约定。",[51,8705,8706],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8708,62],{"id":62},[10,8710,65],{},[67,8712,8714],{"className":69,"code":8713,"language":71,"meta":72,"style":72},"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,8715,8716,8721,8726,8730,8735,8739,8744,8749,8754,8758,8763,8768,8773,8777,8781],{"__ignoreMap":72},[76,8717,8718],{"class":78,"line":79},[76,8719,8720],{},"import logging\n",[76,8722,8723],{"class":78,"line":85},[76,8724,8725],{},"import unittest\n",[76,8727,8728],{"class":78,"line":92},[76,8729,89],{"emptyLinePlaceholder":88},[76,8731,8732],{"class":78,"line":98},[76,8733,8734],{},"logging.basicConfig(level=logging.INFO)\n",[76,8736,8737],{"class":78,"line":104},[76,8738,89],{"emptyLinePlaceholder":88},[76,8740,8741],{"class":78,"line":110},[76,8742,8743],{},"def clamp_progress(value):\n",[76,8745,8746],{"class":78,"line":116},[76,8747,8748],{},"    logging.info(\"检查进度：%s\", value)\n",[76,8750,8751],{"class":78,"line":122},[76,8752,8753],{},"    return max(0, min(100, value))\n",[76,8755,8756],{"class":78,"line":128},[76,8757,89],{"emptyLinePlaceholder":88},[76,8759,8760],{"class":78,"line":133},[76,8761,8762],{},"class ProgressTest(unittest.TestCase):\n",[76,8764,8765],{"class":78,"line":5814},[76,8766,8767],{},"    def test_upper_limit(self):\n",[76,8769,8770],{"class":78,"line":5819},[76,8771,8772],{},"        self.assertEqual(clamp_progress(120), 100)\n",[76,8774,8775],{"class":78,"line":7424},[76,8776,89],{"emptyLinePlaceholder":88},[76,8778,8779],{"class":78,"line":7430},[76,8780,6181],{},[76,8782,8783],{"class":78,"line":8553},[76,8784,8785],{},"    unittest.main()\n",[10,8787,139],{},[67,8789,8792],{"className":8790,"code":8791,"language":145,"meta":72},[143],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8793,8791],{"__ignoreMap":72},[10,8795,150],{},[14,8797,153],{"id":153},[155,8799,8800,8806],{},[51,8801,8802,8805],{},[33,8803,8804],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[51,8807,8808],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[174,8810,176],{"id":176},[10,8812,8813],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8815,8816],{},[26,8817],{"alt":8818,"src":8819},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8821,8822],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8824,214],{"id":214},[48,8826,8827,8830],{},[51,8828,8829],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[51,8831,8832],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8834,235],{"id":235},[155,8836,8837,8840],{},[51,8838,8839],{},"为负数进度增加测试。",[51,8841,8842],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8844,246],{},[14,8846,249],{"id":249},[10,8848,8849],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,8851,256],{},{"title":72,"searchDepth":85,"depth":85,"links":8853},[8854,8855,8856,8857,8858,8861,8862,8863],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":8859},[8860],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8672,"description":8677},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[270,8871,8872],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8875,"title":8876,"body":8877,"category":270,"cover":271,"description":8881,"extension":272,"meta":9181,"navigation":88,"path":9182,"pinned":275,"publishedAt":276,"seo":9183,"slug":9184,"stem":9185,"summary":9186,"tags":9187,"updatedAt":276,"visible":88,"__hash__":9190},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8878,"toc":9168},[8879,8882,8884,8887,8889,8895,8898,8900,8915,8917,8919,9066,9068,9074,9076,9078,9091,9093,9096,9102,9105,9107,9110,9116,9123,9125,9136,9138,9159,9161,9163,9166],[10,8880,8881],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8883,16],{"id":16},[10,8885,8886],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8888,22],{"id":22},[10,8890,8891],{},[26,8892],{"alt":8893,"src":8894},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8896,8897],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8899,46],{"id":46},[48,8901,8902,8905,8908],{},[51,8903,8904],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[51,8906,8907],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[51,8909,8910,8911,8914],{},"实际扩展前先为 ",[33,8912,8913],{},"add()"," 和存储边界补充测试。",[14,8916,62],{"id":62},[10,8918,65],{},[67,8920,8922],{"className":69,"code":8921,"language":71,"meta":72,"style":72},"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,8923,8924,8928,8932,8936,8941,8946,8951,8956,8960,8965,8970,8975,8980,8985,8989,8994,8999,9005,9010,9016,9021,9026,9032,9038,9044,9049,9055,9060],{"__ignoreMap":72},[76,8925,8926],{"class":78,"line":79},[76,8927,6979],{},[76,8929,8930],{"class":78,"line":85},[76,8931,6588],{},[76,8933,8934],{"class":78,"line":92},[76,8935,89],{"emptyLinePlaceholder":88},[76,8937,8938],{"class":78,"line":98},[76,8939,8940],{},"class LearningRecords:\n",[76,8942,8943],{"class":78,"line":104},[76,8944,8945],{},"    def __init__(self, file_path):\n",[76,8947,8948],{"class":78,"line":110},[76,8949,8950],{},"        self.file_path = Path(file_path)\n",[76,8952,8953],{"class":78,"line":116},[76,8954,8955],{},"        self.items = []\n",[76,8957,8958],{"class":78,"line":122},[76,8959,89],{"emptyLinePlaceholder":88},[76,8961,8962],{"class":78,"line":128},[76,8963,8964],{},"    def add(self, title):\n",[76,8966,8967],{"class":78,"line":133},[76,8968,8969],{},"        title = title.strip()\n",[76,8971,8972],{"class":78,"line":5814},[76,8973,8974],{},"        if not title:\n",[76,8976,8977],{"class":78,"line":5819},[76,8978,8979],{},"            raise ValueError(\"课程名称不能为空\")\n",[76,8981,8982],{"class":78,"line":7424},[76,8983,8984],{},"        self.items.append({\"title\": title, \"done\": False})\n",[76,8986,8987],{"class":78,"line":7430},[76,8988,89],{"emptyLinePlaceholder":88},[76,8990,8991],{"class":78,"line":8553},[76,8992,8993],{},"    def save(self):\n",[76,8995,8996],{"class":78,"line":8558},[76,8997,8998],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[76,9000,9002],{"class":78,"line":9001},17,[76,9003,9004],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[76,9006,9008],{"class":78,"line":9007},18,[76,9009,89],{"emptyLinePlaceholder":88},[76,9011,9013],{"class":78,"line":9012},19,[76,9014,9015],{},"records = LearningRecords(\"learning-records.json\")\n",[76,9017,9019],{"class":78,"line":9018},20,[76,9020,89],{"emptyLinePlaceholder":88},[76,9022,9024],{"class":78,"line":9023},21,[76,9025,7397],{},[76,9027,9029],{"class":78,"line":9028},22,[76,9030,9031],{},"    title = input(\"输入已学习课程：\")\n",[76,9033,9035],{"class":78,"line":9034},23,[76,9036,9037],{},"    records.add(title)\n",[76,9039,9041],{"class":78,"line":9040},24,[76,9042,9043],{},"    records.save()\n",[76,9045,9047],{"class":78,"line":9046},25,[76,9048,7407],{},[76,9050,9052],{"class":78,"line":9051},26,[76,9053,9054],{},"    print(\"无法保存：\", error)\n",[76,9056,9058],{"class":78,"line":9057},27,[76,9059,119],{},[76,9061,9063],{"class":78,"line":9062},28,[76,9064,9065],{},"    print(\"已保存 1 条学习记录\")\n",[10,9067,139],{},[67,9069,9072],{"className":9070,"code":9071,"language":145,"meta":72},[143],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9073,9071],{"__ignoreMap":72},[10,9075,150],{},[14,9077,153],{"id":153},[155,9079,9080,9086],{},[51,9081,9082,9083,9085],{},"输入层取得课程名后，",[33,9084,8913],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[51,9087,9088,9090],{},[33,9089,8145],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[174,9092,176],{"id":176},[10,9094,9095],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9097,9098],{},[26,9099],{"alt":9100,"src":9101},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9103,9104],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[174,9106,176],{"id":196},[10,9108,9109],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9111,9112],{},[26,9113],{"alt":9114,"src":9115},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9117,9118,9119,9122],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9120,9121],{},"load()"," 把文件状态恢复到内存。",[14,9124,214],{"id":214},[48,9126,9127,9130],{},[51,9128,9129],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[51,9131,9132,9133,9135],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9134,9121],{}," 是下一项必要扩展。",[14,9137,235],{"id":235},[155,9139,9140,9146,9149],{},[51,9141,9142,9143,9145],{},"增加 ",[33,9144,9121],{},"，文件不存在时从空列表开始。",[51,9147,9148],{},"增加按序号标记完成的功能，并校验序号范围。",[51,9150,9151,9152,9155,9156,9158],{},"把输入循环放进 ",[33,9153,9154],{},"main()","，通过 ",[33,9157,6123],{}," 控制程序入口。",[10,9160,246],{},[14,9162,249],{"id":249},[10,9164,9165],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[254,9167,256],{},{"title":72,"searchDepth":85,"depth":85,"links":9169},[9170,9171,9172,9173,9174,9178,9179,9180],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":9175},[9176,9177],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8876,"description":8881},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[270,9188,9189],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9192,9295,9414,9545,9688,9813,9950,10087,10228,10397,10534,10667,10790,10919,11046,11209,11385,11526,11655,11804,11947,12068,12191,12340,12493,12658,12785,12966,13109,13266,13417,13564,13719,13937,14092,14267,14418,14585,14772,14935,15177,15417],{"id":1433,"title":1434,"body":9193,"category":270,"cover":271,"description":1439,"extension":272,"meta":9292,"navigation":88,"path":1558,"pinned":275,"publishedAt":276,"seo":9293,"slug":1560,"stem":1561,"summary":1562,"tags":9294,"updatedAt":276,"visible":88,"__hash__":1565},{"type":7,"value":9194,"toc":9282},[9195,9197,9199,9201,9203,9207,9211,9213,9223,9225,9227,9235,9237,9242,9244,9246,9256,9258,9266,9268,9274,9276,9278,9280],[10,9196,1439],{},[14,9198,16],{"id":16},[10,9200,1444],{},[14,9202,22],{"id":22},[10,9204,9205],{},[26,9206],{"alt":1451,"src":1452},[10,9208,9209,1457],{},[33,9210,1211],{},[14,9212,46],{"id":46},[48,9214,9215,9219,9221],{},[51,9216,1464,9217,1467],{},[33,9218,1211],{},[51,9220,1470],{},[51,9222,1473],{},[14,9224,62],{"id":62},[10,9226,65],{},[67,9228,9229],{"className":69,"code":1480,"language":71,"meta":72,"style":72},[33,9230,9231],{"__ignoreMap":72},[76,9232,9233],{"class":78,"line":79},[76,9234,1480],{},[10,9236,139],{},[67,9238,9240],{"className":9239,"code":1492,"language":145,"meta":72},[143],[33,9241,1492],{"__ignoreMap":72},[10,9243,150],{},[14,9245,153],{"id":153},[155,9247,9248,9252],{},[51,9249,1503,9250,1507],{},[33,9251,1506],{},[51,9253,1510,9254,1514],{},[33,9255,1513],{},[14,9257,214],{"id":214},[48,9259,9260,9262],{},[51,9261,1521],{},[51,9263,1524,9264,1527],{},[33,9265,1211],{},[14,9267,235],{"id":235},[155,9269,9270,9272],{},[51,9271,1534],{},[51,9273,1537],{},[10,9275,246],{},[14,9277,249],{"id":249},[10,9279,1544],{},[254,9281,256],{},{"title":72,"searchDepth":85,"depth":85,"links":9283},[9284,9285,9286,9287,9288,9289,9290,9291],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":1434,"description":1439},[270,1429,1564],{"id":1567,"title":1568,"body":9296,"category":270,"cover":271,"description":1573,"extension":272,"meta":9411,"navigation":88,"path":1710,"pinned":275,"publishedAt":276,"seo":9412,"slug":1712,"stem":1713,"summary":1714,"tags":9413,"updatedAt":276,"visible":88,"__hash__":1717},{"type":7,"value":9297,"toc":9401},[9298,9300,9302,9304,9306,9310,9314,9316,9326,9328,9330,9350,9352,9357,9359,9361,9371,9373,9383,9385,9393,9395,9397,9399],[10,9299,1573],{},[14,9301,16],{"id":16},[10,9303,1578],{},[14,9305,22],{"id":22},[10,9307,9308],{},[26,9309],{"alt":1585,"src":1586},[10,9311,1589,9312,1592],{},[33,9313,734],{},[14,9315,46],{"id":46},[48,9317,9318,9320,9322],{},[51,9319,1599],{},[51,9321,1602],{},[51,9323,1605,9324,1609],{},[33,9325,1608],{},[14,9327,62],{"id":62},[10,9329,1614],{},[67,9331,9332],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,9333,9334,9340],{"__ignoreMap":72},[76,9335,9336,9338],{"class":78,"line":79},[76,9337,734],{"class":643},[76,9339,647],{"class":646},[76,9341,9342,9344,9346,9348],{"class":78,"line":85},[76,9343,734],{"class":643},[76,9345,676],{"class":646},[76,9347,680],{"class":679},[76,9349,647],{"class":646},[10,9351,139],{},[67,9353,9355],{"className":9354,"code":1640,"language":145,"meta":72},[143],[33,9356,1640],{"__ignoreMap":72},[10,9358,150],{},[14,9360,153],{"id":153},[155,9362,9363,9367],{},[51,9364,9365,1654],{},[33,9366,1653],{},[51,9368,9369,1659],{},[33,9370,742],{},[14,9372,214],{"id":214},[48,9374,9375,9379],{},[51,9376,1666,9377,1669],{},[33,9378,734],{},[51,9380,1672,9381,1675],{},[33,9382,734],{},[14,9384,235],{"id":235},[155,9386,9387,9391],{},[51,9388,981,9389,1685],{},[33,9390,1684],{},[51,9392,1688],{},[10,9394,246],{},[14,9396,249],{"id":249},[10,9398,1695],{},[254,9400,1698],{},{"title":72,"searchDepth":85,"depth":85,"links":9402},[9403,9404,9405,9406,9407,9408,9409,9410],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":1568,"description":1573},[270,1716,1095],{"id":1719,"title":1720,"body":9415,"category":270,"cover":271,"description":1886,"extension":272,"meta":9542,"navigation":88,"path":1888,"pinned":275,"publishedAt":276,"seo":9543,"slug":1890,"stem":1891,"summary":1892,"tags":9544,"updatedAt":276,"visible":88,"__hash__":1896},{"type":7,"value":9416,"toc":9532},[9417,9421,9423,9425,9427,9431,9433,9435,9451,9453,9455,9475,9477,9482,9484,9486,9498,9500,9510,9512,9522,9524,9526,9530],[10,9418,1725,9419,1728],{},[33,9420,1211],{},[14,9422,16],{"id":16},[10,9424,1733],{},[14,9426,22],{"id":22},[10,9428,9429],{},[26,9430],{"alt":1740,"src":1741},[10,9432,1744],{},[14,9434,46],{"id":46},[48,9436,9437,9443,9447],{},[51,9438,1751,9439,1754,9441,405],{},[33,9440,734],{},[33,9442,1757],{},[51,9444,1760,9445,1764],{},[33,9446,1763],{},[51,9448,1767,9449,1770],{},[33,9450,1211],{},[14,9452,62],{"id":62},[10,9454,65],{},[67,9456,9457],{"className":1777,"code":1778,"language":1779,"meta":72,"style":72},[33,9458,9459,9463,9467,9471],{"__ignoreMap":72},[76,9460,9461],{"class":78,"line":79},[76,9462,1786],{},[76,9464,9465],{"class":78,"line":85},[76,9466,1791],{},[76,9468,9469],{"class":78,"line":92},[76,9470,1796],{},[76,9472,9473],{"class":78,"line":98},[76,9474,1801],{},[10,9476,139],{},[67,9478,9480],{"className":9479,"code":1807,"language":145,"meta":72},[143],[33,9481,1807],{"__ignoreMap":72},[10,9483,150],{},[14,9485,153],{"id":153},[155,9487,9488,9494],{},[51,9489,1818,9490,1822,9492,405],{},[33,9491,1821],{},[33,9493,1825],{},[51,9495,1828,9496,1831],{},[33,9497,1513],{},[14,9499,214],{"id":214},[48,9501,9502,9508],{},[51,9503,1838,9504,1841,9506,1844],{},[33,9505,1757],{},[33,9507,1211],{},[51,9509,1847],{},[14,9511,235],{"id":235},[155,9513,9514,9518],{},[51,9515,1854,9516,405],{},[33,9517,1857],{},[51,9519,1860,9520,1863],{},[33,9521,1513],{},[10,9523,246],{},[14,9525,249],{"id":249},[10,9527,1870,9528,1873],{},[33,9529,1211],{},[254,9531,256],{},{"title":72,"searchDepth":85,"depth":85,"links":9533},[9534,9535,9536,9537,9538,9539,9540,9541],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":1720,"description":1886},[270,1894,1895],{"id":1898,"title":1899,"body":9546,"category":270,"cover":271,"description":1904,"extension":272,"meta":9685,"navigation":88,"path":2076,"pinned":275,"publishedAt":276,"seo":9686,"slug":2078,"stem":2079,"summary":2080,"tags":9687,"updatedAt":276,"visible":88,"__hash__":2084},{"type":7,"value":9547,"toc":9675},[9548,9550,9552,9554,9556,9560,9564,9566,9578,9580,9582,9618,9620,9625,9627,9629,9645,9647,9657,9659,9667,9669,9671,9673],[10,9549,1904],{},[14,9551,16],{"id":16},[10,9553,1909],{},[14,9555,22],{"id":22},[10,9557,9558],{},[26,9559],{"alt":1916,"src":1917},[10,9561,9562,1923],{},[33,9563,1922],{},[14,9565,46],{"id":46},[48,9567,9568,9570,9576],{},[51,9569,1930],{},[51,9571,9572,1936,9574,1940],{},[33,9573,1935],{},[33,9575,1939],{},[51,9577,1943],{},[14,9579,62],{"id":62},[10,9581,1614],{},[67,9583,9584],{"className":634,"code":1950,"language":636,"meta":72,"style":72},[33,9585,9586,9592,9598,9602,9612],{"__ignoreMap":72},[76,9587,9588,9590],{"class":78,"line":79},[76,9589,1957],{"class":643},[76,9591,1960],{"class":679},[76,9593,9594,9596],{"class":78,"line":85},[76,9595,1965],{"class":646},[76,9597,1960],{"class":679},[76,9599,9600],{"class":78,"line":92},[76,9601,1972],{"class":646},[76,9603,9604,9606,9608,9610],{"class":78,"line":98},[76,9605,1977],{"class":646},[76,9607,1980],{"class":679},[76,9609,1984],{"class":1983},[76,9611,1255],{"class":679},[76,9613,9614,9616],{"class":78,"line":104},[76,9615,734],{"class":643},[76,9617,1255],{"class":679},[10,9619,139],{},[67,9621,9623],{"className":9622,"code":1998,"language":145,"meta":72},[143],[33,9624,1998],{"__ignoreMap":72},[10,9626,150],{},[14,9628,153],{"id":153},[155,9630,9631,9639],{},[51,9632,9633,2011,9635,2014,9637,2017],{},[33,9634,1957],{},[33,9636,1965],{},[33,9638,1935],{},[51,9640,9641,2022,9643,2026],{},[33,9642,1922],{},[33,9644,2025],{},[14,9646,214],{"id":214},[48,9648,9649,9655],{},[51,9650,2033,9651,1198,9653,405],{},[33,9652,1935],{},[33,9654,1939],{},[51,9656,2040],{},[14,9658,235],{"id":235},[155,9660,9661,9665],{},[51,9662,2047,9663,2051],{},[33,9664,2050],{},[51,9666,2054],{},[10,9668,246],{},[14,9670,249],{"id":249},[10,9672,2061],{},[254,9674,2064],{},{"title":72,"searchDepth":85,"depth":85,"links":9676},[9677,9678,9679,9680,9681,9682,9683,9684],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":1899,"description":1904},[270,2082,2083],{"id":2086,"title":2087,"body":9689,"category":270,"cover":271,"description":2092,"extension":272,"meta":9810,"navigation":88,"path":2241,"pinned":275,"publishedAt":276,"seo":9811,"slug":2243,"stem":2244,"summary":2245,"tags":9812,"updatedAt":276,"visible":88,"__hash__":2249},{"type":7,"value":9690,"toc":9800},[9691,9693,9695,9697,9699,9703,9711,9713,9727,9729,9731,9747,9749,9754,9756,9758,9772,9774,9780,9782,9792,9794,9796,9798],[10,9692,2092],{},[14,9694,16],{"id":16},[10,9696,2097],{},[14,9698,22],{"id":22},[10,9700,9701],{},[26,9702],{"alt":2104,"src":2105},[10,9704,2108,9705,405,9707,2114,9709,405],{},[33,9706,1513],{},[33,9708,2113],{},[33,9710,1821],{},[14,9712,46],{"id":46},[48,9714,9715,9719,9725],{},[51,9716,9717,2126],{},[33,9718,2125],{},[51,9720,9721,2132,9723,405],{},[33,9722,2131],{},[33,9724,2135],{},[51,9726,2138],{},[14,9728,62],{"id":62},[10,9730,65],{},[67,9732,9733],{"className":69,"code":2145,"language":71,"meta":72,"style":72},[33,9734,9735,9739,9743],{"__ignoreMap":72},[76,9736,9737],{"class":78,"line":79},[76,9738,2152],{},[76,9740,9741],{"class":78,"line":85},[76,9742,2157],{},[76,9744,9745],{"class":78,"line":92},[76,9746,2162],{},[10,9748,139],{},[67,9750,9752],{"className":9751,"code":2168,"language":145,"meta":72},[143],[33,9753,2168],{"__ignoreMap":72},[10,9755,150],{},[14,9757,153],{"id":153},[155,9759,9760,9766],{},[51,9761,9762,2182,9764,405],{},[33,9763,2181],{},[33,9765,2135],{},[51,9767,9768,2189,9770,2193],{},[33,9769,1513],{},[33,9771,2192],{},[14,9773,214],{"id":214},[48,9775,9776,9778],{},[51,9777,2200],{},[51,9779,2203],{},[14,9781,235],{"id":235},[155,9783,9784,9786],{},[51,9785,2210],{},[51,9787,2213,9788,2216,9790,2220],{},[33,9789,2113],{},[33,9791,2219],{},[10,9793,246],{},[14,9795,249],{"id":249},[10,9797,2227],{},[254,9799,256],{},{"title":72,"searchDepth":85,"depth":85,"links":9801},[9802,9803,9804,9805,9806,9807,9808,9809],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":2087,"description":2092},[270,2247,2248],{"id":2251,"title":2252,"body":9814,"category":270,"cover":271,"description":2257,"extension":272,"meta":9947,"navigation":88,"path":2424,"pinned":275,"publishedAt":276,"seo":9948,"slug":2426,"stem":2427,"summary":2428,"tags":9949,"updatedAt":276,"visible":88,"__hash__":2432},{"type":7,"value":9815,"toc":9937},[9816,9818,9820,9822,9824,9828,9830,9832,9848,9850,9852,9876,9878,9883,9885,9887,9903,9905,9917,9919,9929,9931,9933,9935],[10,9817,2257],{},[14,9819,16],{"id":16},[10,9821,2262],{},[14,9823,22],{"id":22},[10,9825,9826],{},[26,9827],{"alt":2269,"src":2270},[10,9829,2273],{},[14,9831,46],{"id":46},[48,9833,9834,9836,9842],{},[51,9835,2280],{},[51,9837,2283,9838,2216,9840,2290],{},[33,9839,2286],{},[33,9841,2289],{},[51,9843,2293,9844,36,9846,2300],{},[33,9845,2296],{},[33,9847,2299],{},[14,9849,62],{"id":62},[10,9851,65],{},[67,9853,9854],{"className":69,"code":2307,"language":71,"meta":72,"style":72},[33,9855,9856,9860,9864,9868,9872],{"__ignoreMap":72},[76,9857,9858],{"class":78,"line":79},[76,9859,2314],{},[76,9861,9862],{"class":78,"line":85},[76,9863,2319],{},[76,9865,9866],{"class":78,"line":92},[76,9867,89],{"emptyLinePlaceholder":88},[76,9869,9870],{"class":78,"line":98},[76,9871,2328],{},[76,9873,9874],{"class":78,"line":104},[76,9875,2319],{},[10,9877,139],{},[67,9879,9881],{"className":9880,"code":2338,"language":145,"meta":72},[143],[33,9882,2338],{"__ignoreMap":72},[10,9884,150],{},[14,9886,153],{"id":153},[155,9888,9889,9895],{},[51,9890,981,9891,2352,9893,2355],{},[33,9892,2351],{},[33,9894,2286],{},[51,9896,981,9897,2361,9899,2365,9901,405],{},[33,9898,2360],{},[33,9900,2364],{},[33,9902,2368],{},[14,9904,214],{"id":214},[48,9906,9907,9909],{},[51,9908,2375],{},[51,9910,2378,9911,36,9913,36,9915,2386],{},[33,9912,2296],{},[33,9914,2299],{},[33,9916,2385],{},[14,9918,235],{"id":235},[155,9920,9921,9927],{},[51,9922,2393,9923,1198,9925,2400],{},[33,9924,2396],{},[33,9926,2399],{},[51,9928,2403],{},[10,9930,246],{},[14,9932,249],{"id":249},[10,9934,2410],{},[254,9936,256],{},{"title":72,"searchDepth":85,"depth":85,"links":9938},[9939,9940,9941,9942,9943,9944,9945,9946],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":2252,"description":2257},[270,2430,2431],{"id":2434,"title":2435,"body":9951,"category":270,"cover":271,"description":2440,"extension":272,"meta":10084,"navigation":88,"path":2605,"pinned":275,"publishedAt":276,"seo":10085,"slug":2607,"stem":2608,"summary":2609,"tags":10086,"updatedAt":276,"visible":88,"__hash__":2613},{"type":7,"value":9952,"toc":10074},[9953,9955,9957,9959,9961,9965,9967,9969,9987,9989,9991,10027,10029,10034,10036,10038,10048,10050,10058,10060,10066,10068,10070,10072],[10,9954,2440],{},[14,9956,16],{"id":16},[10,9958,2445],{},[14,9960,22],{"id":22},[10,9962,9963],{},[26,9964],{"alt":2452,"src":2453},[10,9966,2456],{},[14,9968,46],{"id":46},[48,9970,9971,9977,9985],{},[51,9972,9973,2466,9975,2470],{},[33,9974,2465],{},[33,9976,2469],{},[51,9978,9979,2476,9981,2480,9983,2484],{},[33,9980,2475],{},[33,9982,2479],{},[33,9984,2483],{},[51,9986,2487],{},[14,9988,62],{"id":62},[10,9990,65],{},[67,9992,9993],{"className":69,"code":2494,"language":71,"meta":72,"style":72},[33,9994,9995,9999,10003,10007,10011,10015,10019,10023],{"__ignoreMap":72},[76,9996,9997],{"class":78,"line":79},[76,9998,2501],{},[76,10000,10001],{"class":78,"line":85},[76,10002,2506],{},[76,10004,10005],{"class":78,"line":92},[76,10006,2511],{},[76,10008,10009],{"class":78,"line":98},[76,10010,89],{"emptyLinePlaceholder":88},[76,10012,10013],{"class":78,"line":104},[76,10014,2520],{},[76,10016,10017],{"class":78,"line":110},[76,10018,2525],{},[76,10020,10021],{"class":78,"line":116},[76,10022,2530],{},[76,10024,10025],{"class":78,"line":122},[76,10026,2535],{},[10,10028,139],{},[67,10030,10032],{"className":10031,"code":2541,"language":145,"meta":72},[143],[33,10033,2541],{"__ignoreMap":72},[10,10035,150],{},[14,10037,153],{"id":153},[155,10039,10040,10044],{},[51,10041,10042,2555],{},[33,10043,2554],{},[51,10045,10046,2561],{},[33,10047,2560],{},[14,10049,214],{"id":214},[48,10051,10052,10056],{},[51,10053,2568,10054,405],{},[33,10055,2571],{},[51,10057,2574],{},[14,10059,235],{"id":235},[155,10061,10062,10064],{},[51,10063,2581],{},[51,10065,2584],{},[10,10067,246],{},[14,10069,249],{"id":249},[10,10071,2591],{},[254,10073,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10075},[10076,10077,10078,10079,10080,10081,10082,10083],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":2435,"description":2440},[270,2611,2612],{"id":2615,"title":2616,"body":10088,"category":270,"cover":271,"description":2621,"extension":272,"meta":10225,"navigation":88,"path":2797,"pinned":275,"publishedAt":276,"seo":10226,"slug":2799,"stem":2800,"summary":2801,"tags":10227,"updatedAt":276,"visible":88,"__hash__":2805},{"type":7,"value":10089,"toc":10213},[10090,10092,10094,10096,10098,10102,10108,10110,10118,10120,10122,10146,10148,10153,10155,10157,10175,10177,10179,10183,10185,10187,10193,10195,10205,10207,10209,10211],[10,10091,2621],{},[14,10093,16],{"id":16},[10,10095,2626],{},[14,10097,22],{"id":22},[10,10099,10100],{},[26,10101],{"alt":2633,"src":2634},[10,10103,2637,10104,2641,10106,405],{},[33,10105,2640],{},[33,10107,2644],{},[14,10109,46],{"id":46},[48,10111,10112,10114,10116],{},[51,10113,2651],{},[51,10115,2654],{},[51,10117,2657],{},[14,10119,62],{"id":62},[10,10121,65],{},[67,10123,10124],{"className":69,"code":2664,"language":71,"meta":72,"style":72},[33,10125,10126,10130,10134,10138,10142],{"__ignoreMap":72},[76,10127,10128],{"class":78,"line":79},[76,10129,2671],{},[76,10131,10132],{"class":78,"line":85},[76,10133,2676],{},[76,10135,10136],{"class":78,"line":92},[76,10137,2681],{},[76,10139,10140],{"class":78,"line":98},[76,10141,2686],{},[76,10143,10144],{"class":78,"line":104},[76,10145,2691],{},[10,10147,139],{},[67,10149,10151],{"className":10150,"code":2697,"language":145,"meta":72},[143],[33,10152,2697],{"__ignoreMap":72},[10,10154,150],{},[14,10156,153],{"id":153},[155,10158,10159,10167],{},[51,10160,2708,10161,2711,10163,2715,10165,2719],{},[33,10162,270],{},[33,10164,2714],{},[33,10166,2718],{},[51,10168,10169,2725,10171,2729,10173,2733],{},[33,10170,2724],{},[33,10172,2728],{},[33,10174,2732],{},[174,10176,176],{"id":176},[10,10178,2738],{},[10,10180,10181],{},[26,10182],{"alt":2743,"src":2744},[10,10184,2747],{},[14,10186,214],{"id":214},[48,10188,10189,10191],{},[51,10190,2754],{},[51,10192,2757],{},[14,10194,235],{"id":235},[155,10196,10197,10203],{},[51,10198,2764,10199,2768,10201,405],{},[33,10200,2767],{},[33,10202,2771],{},[51,10204,2774],{},[10,10206,246],{},[14,10208,249],{"id":249},[10,10210,2781],{},[254,10212,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10214},[10215,10216,10217,10218,10219,10222,10223,10224],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":10220},[10221],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":2616,"description":2621},[270,2803,2804],{"id":2807,"title":2808,"body":10229,"category":270,"cover":271,"description":2813,"extension":272,"meta":10394,"navigation":88,"path":3028,"pinned":275,"publishedAt":276,"seo":10395,"slug":3030,"stem":3031,"summary":3032,"tags":10396,"updatedAt":276,"visible":88,"__hash__":3036},{"type":7,"value":10230,"toc":10382},[10231,10233,10235,10237,10239,10243,10249,10251,10271,10273,10275,10311,10313,10318,10320,10322,10336,10338,10340,10344,10350,10352,10362,10364,10374,10376,10378,10380],[10,10232,2813],{},[14,10234,16],{"id":16},[10,10236,2818],{},[14,10238,22],{"id":22},[10,10240,10241],{},[26,10242],{"alt":2825,"src":2826},[10,10244,2829,10245,1052,10247,2836],{},[33,10246,2832],{},[33,10248,2835],{},[14,10250,46],{"id":46},[48,10252,10253,10261,10269],{},[51,10254,10255,2846,10257,2850,10259,2854],{},[33,10256,2845],{},[33,10258,2849],{},[33,10260,2853],{},[51,10262,10263,2860,10265,2864,10267,2868],{},[33,10264,2859],{},[33,10266,2863],{},[33,10268,2867],{},[51,10270,2871],{},[14,10272,62],{"id":62},[10,10274,65],{},[67,10276,10277],{"className":69,"code":2878,"language":71,"meta":72,"style":72},[33,10278,10279,10283,10287,10291,10295,10299,10303,10307],{"__ignoreMap":72},[76,10280,10281],{"class":78,"line":79},[76,10282,2885],{},[76,10284,10285],{"class":78,"line":85},[76,10286,2890],{},[76,10288,10289],{"class":78,"line":92},[76,10290,89],{"emptyLinePlaceholder":88},[76,10292,10293],{"class":78,"line":98},[76,10294,2899],{},[76,10296,10297],{"class":78,"line":104},[76,10298,2904],{},[76,10300,10301],{"class":78,"line":110},[76,10302,2909],{},[76,10304,10305],{"class":78,"line":116},[76,10306,2914],{},[76,10308,10309],{"class":78,"line":122},[76,10310,2919],{},[10,10312,139],{},[67,10314,10316],{"className":10315,"code":2925,"language":145,"meta":72},[143],[33,10317,2925],{"__ignoreMap":72},[10,10319,150],{},[14,10321,153],{"id":153},[155,10323,10324,10330],{},[51,10325,10326,2939,10328,2943],{},[33,10327,2938],{},[33,10329,2942],{},[51,10331,10332,2949,10334,2952],{},[33,10333,2948],{},[33,10335,2867],{},[174,10337,176],{"id":176},[10,10339,2957],{},[10,10341,10342],{},[26,10343],{"alt":2962,"src":2963},[10,10345,10346,2968,10348,2971],{},[33,10347,2859],{},[33,10349,2863],{},[14,10351,214],{"id":214},[48,10353,10354,10360],{},[51,10355,2978,10356,2981,10358,2984],{},[33,10357,2853],{},[33,10359,2845],{},[51,10361,2987],{},[14,10363,235],{"id":235},[155,10365,10366,10370],{},[51,10367,2994,10368,2998],{},[33,10369,2997],{},[51,10371,3001,10372,3005],{},[33,10373,3004],{},[10,10375,246],{},[14,10377,249],{"id":249},[10,10379,3012],{},[254,10381,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10383},[10384,10385,10386,10387,10388,10391,10392,10393],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":10389},[10390],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":2808,"description":2813},[270,3034,3035],{"id":3038,"title":3039,"body":10398,"category":270,"cover":271,"description":3044,"extension":272,"meta":10531,"navigation":88,"path":3213,"pinned":275,"publishedAt":276,"seo":10532,"slug":3215,"stem":3216,"summary":3217,"tags":10533,"updatedAt":276,"visible":88,"__hash__":3220},{"type":7,"value":10399,"toc":10521},[10400,10402,10404,10406,10408,10412,10422,10424,10434,10436,10438,10466,10468,10473,10475,10477,10491,10493,10501,10503,10513,10515,10517,10519],[10,10401,3044],{},[14,10403,16],{"id":16},[10,10405,3049],{},[14,10407,22],{"id":22},[10,10409,10410],{},[26,10411],{"alt":3056,"src":3057},[10,10413,10414,3063,10416,3067,10418,3071,10420,3075],{},[33,10415,3062],{},[33,10417,3066],{},[33,10419,3070],{},[33,10421,3074],{},[14,10423,46],{"id":46},[48,10425,10426,10428,10432],{},[51,10427,3082],{},[51,10429,10430,3087],{},[33,10431,3074],{},[51,10433,3090],{},[14,10435,62],{"id":62},[10,10437,65],{},[67,10439,10440],{"className":69,"code":3097,"language":71,"meta":72,"style":72},[33,10441,10442,10446,10450,10454,10458,10462],{"__ignoreMap":72},[76,10443,10444],{"class":78,"line":79},[76,10445,3104],{},[76,10447,10448],{"class":78,"line":85},[76,10449,3109],{},[76,10451,10452],{"class":78,"line":92},[76,10453,3114],{},[76,10455,10456],{"class":78,"line":98},[76,10457,89],{"emptyLinePlaceholder":88},[76,10459,10460],{"class":78,"line":104},[76,10461,3123],{},[76,10463,10464],{"class":78,"line":110},[76,10465,3128],{},[10,10467,139],{},[67,10469,10471],{"className":10470,"code":3134,"language":145,"meta":72},[143],[33,10472,3134],{"__ignoreMap":72},[10,10474,150],{},[14,10476,153],{"id":153},[155,10478,10479,10485],{},[51,10480,3145,10481,3148,10483,3152],{},[33,10482,3062],{},[33,10484,3151],{},[51,10486,10487,3158,10489,3162],{},[33,10488,3157],{},[33,10490,3161],{},[14,10492,214],{"id":214},[48,10494,10495,10499],{},[51,10496,3169,10497,3173],{},[33,10498,3172],{},[51,10500,3176],{},[14,10502,235],{"id":235},[155,10504,10505,10507],{},[51,10506,3183],{},[51,10508,1760,10509,3189,10511,3192],{},[33,10510,3188],{},[33,10512,3074],{},[10,10514,246],{},[14,10516,249],{"id":249},[10,10518,3199],{},[254,10520,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10522},[10523,10524,10525,10526,10527,10528,10529,10530],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3039,"description":3044},[270,2385,3219],{"id":3222,"title":3223,"body":10535,"category":270,"cover":271,"description":3228,"extension":272,"meta":10664,"navigation":88,"path":3389,"pinned":275,"publishedAt":276,"seo":10665,"slug":3391,"stem":3392,"summary":3393,"tags":10666,"updatedAt":276,"visible":88,"__hash__":3397},{"type":7,"value":10536,"toc":10654},[10537,10539,10541,10543,10545,10549,10553,10555,10565,10567,10569,10601,10603,10608,10610,10612,10624,10626,10636,10638,10646,10648,10650,10652],[10,10538,3228],{},[14,10540,16],{"id":16},[10,10542,3233],{},[14,10544,22],{"id":22},[10,10546,10547],{},[26,10548],{"alt":3240,"src":3241},[10,10550,3244,10551,3248],{},[33,10552,3247],{},[14,10554,46],{"id":46},[48,10556,10557,10559,10561],{},[51,10558,3255],{},[51,10560,3258],{},[51,10562,3261,10563,405],{},[33,10564,3264],{},[14,10566,62],{"id":62},[10,10568,65],{},[67,10570,10571],{"className":69,"code":3271,"language":71,"meta":72,"style":72},[33,10572,10573,10577,10581,10585,10589,10593,10597],{"__ignoreMap":72},[76,10574,10575],{"class":78,"line":79},[76,10576,3278],{},[76,10578,10579],{"class":78,"line":85},[76,10580,3283],{},[76,10582,10583],{"class":78,"line":92},[76,10584,89],{"emptyLinePlaceholder":88},[76,10586,10587],{"class":78,"line":98},[76,10588,3292],{},[76,10590,10591],{"class":78,"line":104},[76,10592,3297],{},[76,10594,10595],{"class":78,"line":110},[76,10596,3302],{},[76,10598,10599],{"class":78,"line":116},[76,10600,3307],{},[10,10602,139],{},[67,10604,10606],{"className":10605,"code":3313,"language":145,"meta":72},[143],[33,10607,3313],{"__ignoreMap":72},[10,10609,150],{},[14,10611,153],{"id":153},[155,10613,10614,10616],{},[51,10615,3324],{},[51,10617,10618,3330,10620,3334,10622,3338],{},[33,10619,3329],{},[33,10621,3333],{},[33,10623,3337],{},[14,10625,214],{"id":214},[48,10627,10628,10634],{},[51,10629,3345,10630,3349,10632,405],{},[33,10631,3348],{},[33,10633,3352],{},[51,10635,3355],{},[14,10637,235],{"id":235},[155,10639,10640,10642],{},[51,10641,3362],{},[51,10643,3365,10644,3368],{},[33,10645,3337],{},[10,10647,246],{},[14,10649,249],{"id":249},[10,10651,3375],{},[254,10653,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10655},[10656,10657,10658,10659,10660,10661,10662,10663],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3223,"description":3228},[270,3395,3396],{"id":3399,"title":3400,"body":10668,"category":270,"cover":271,"description":3405,"extension":272,"meta":10787,"navigation":88,"path":3547,"pinned":275,"publishedAt":276,"seo":10788,"slug":3549,"stem":3550,"summary":3551,"tags":10789,"updatedAt":276,"visible":88,"__hash__":3554},{"type":7,"value":10669,"toc":10777},[10670,10672,10674,10676,10678,10682,10684,10686,10694,10696,10698,10726,10728,10733,10735,10737,10747,10749,10757,10759,10769,10771,10773,10775],[10,10671,3405],{},[14,10673,16],{"id":16},[10,10675,3410],{},[14,10677,22],{"id":22},[10,10679,10680],{},[26,10681],{"alt":3417,"src":3418},[10,10683,3421],{},[14,10685,46],{"id":46},[48,10687,10688,10690,10692],{},[51,10689,3428],{},[51,10691,3431],{},[51,10693,3434],{},[14,10695,62],{"id":62},[10,10697,65],{},[67,10699,10700],{"className":69,"code":3441,"language":71,"meta":72,"style":72},[33,10701,10702,10706,10710,10714,10718,10722],{"__ignoreMap":72},[76,10703,10704],{"class":78,"line":79},[76,10705,3448],{},[76,10707,10708],{"class":78,"line":85},[76,10709,3453],{},[76,10711,10712],{"class":78,"line":92},[76,10713,3458],{},[76,10715,10716],{"class":78,"line":98},[76,10717,89],{"emptyLinePlaceholder":88},[76,10719,10720],{"class":78,"line":104},[76,10721,3467],{},[76,10723,10724],{"class":78,"line":110},[76,10725,3472],{},[10,10727,139],{},[67,10729,10731],{"className":10730,"code":3478,"language":145,"meta":72},[143],[33,10732,3478],{"__ignoreMap":72},[10,10734,150],{},[14,10736,153],{"id":153},[155,10738,10739,10743],{},[51,10740,10741,3492],{},[33,10742,3491],{},[51,10744,10745,3498],{},[33,10746,3497],{},[14,10748,214],{"id":214},[48,10750,10751,10755],{},[51,10752,3505,10753,3509],{},[33,10754,3508],{},[51,10756,3512],{},[14,10758,235],{"id":235},[155,10760,10761,10763],{},[51,10762,3519],{},[51,10764,2213,10765,2216,10767,3526],{},[33,10766,3508],{},[33,10768,3497],{},[10,10770,246],{},[14,10772,249],{"id":249},[10,10774,3533],{},[254,10776,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10778},[10779,10780,10781,10782,10783,10784,10785,10786],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3400,"description":3405},[270,3553,3396],{"id":3556,"title":3557,"body":10791,"category":270,"cover":271,"description":3562,"extension":272,"meta":10916,"navigation":88,"path":3718,"pinned":275,"publishedAt":276,"seo":10917,"slug":3720,"stem":3721,"summary":3722,"tags":10918,"updatedAt":276,"visible":88,"__hash__":3725},{"type":7,"value":10792,"toc":10906},[10793,10795,10797,10799,10801,10805,10811,10813,10823,10825,10827,10855,10857,10862,10864,10866,10876,10878,10890,10892,10898,10900,10902,10904],[10,10794,3562],{},[14,10796,16],{"id":16},[10,10798,3567],{},[14,10800,22],{"id":22},[10,10802,10803],{},[26,10804],{"alt":3574,"src":3575},[10,10806,3578,10807,3582,10809,3585],{},[33,10808,3581],{},[33,10810,2286],{},[14,10812,46],{"id":46},[48,10814,10815,10817,10821],{},[51,10816,3592],{},[51,10818,2378,10819,3598],{},[33,10820,3597],{},[51,10822,3601],{},[14,10824,62],{"id":62},[10,10826,65],{},[67,10828,10829],{"className":69,"code":3608,"language":71,"meta":72,"style":72},[33,10830,10831,10835,10839,10843,10847,10851],{"__ignoreMap":72},[76,10832,10833],{"class":78,"line":79},[76,10834,3615],{},[76,10836,10837],{"class":78,"line":85},[76,10838,3620],{},[76,10840,10841],{"class":78,"line":92},[76,10842,89],{"emptyLinePlaceholder":88},[76,10844,10845],{"class":78,"line":98},[76,10846,3629],{},[76,10848,10849],{"class":78,"line":104},[76,10850,3634],{},[76,10852,10853],{"class":78,"line":110},[76,10854,3639],{},[10,10856,139],{},[67,10858,10860],{"className":10859,"code":3645,"language":145,"meta":72},[143],[33,10861,3645],{"__ignoreMap":72},[10,10863,150],{},[14,10865,153],{"id":153},[155,10867,10868,10870],{},[51,10869,3656],{},[51,10871,3659,10872,3662,10874,3666],{},[33,10873,2286],{},[33,10875,3665],{},[14,10877,214],{"id":214},[48,10879,10880,10884],{},[51,10881,3673,10882,3677],{},[33,10883,3676],{},[51,10885,3680,10886,3684,10888,405],{},[33,10887,3683],{},[33,10889,3687],{},[14,10891,235],{"id":235},[155,10893,10894,10896],{},[51,10895,3694],{},[51,10897,3697],{},[10,10899,246],{},[14,10901,249],{"id":249},[10,10903,3704],{},[254,10905,256],{},{"title":72,"searchDepth":85,"depth":85,"links":10907},[10908,10909,10910,10911,10912,10913,10914,10915],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3557,"description":3562},[270,3724,3396],{"id":3727,"title":3728,"body":10920,"category":270,"cover":271,"description":3733,"extension":272,"meta":11043,"navigation":88,"path":3883,"pinned":275,"publishedAt":276,"seo":11044,"slug":3885,"stem":3886,"summary":3887,"tags":11045,"updatedAt":276,"visible":88,"__hash__":3890},{"type":7,"value":10921,"toc":11033},[10922,10924,10926,10928,10930,10934,10936,10938,10950,10952,10954,10982,10984,10989,10991,10993,11003,11005,11015,11017,11025,11027,11029,11031],[10,10923,3733],{},[14,10925,16],{"id":16},[10,10927,3738],{},[14,10929,22],{"id":22},[10,10931,10932],{},[26,10933],{"alt":3745,"src":3746},[10,10935,3749],{},[14,10937,46],{"id":46},[48,10939,10940,10942,10944],{},[51,10941,3756],{},[51,10943,3759],{},[51,10945,3762,10946,3766,10948,3770],{},[33,10947,3765],{},[33,10949,3769],{},[14,10951,62],{"id":62},[10,10953,65],{},[67,10955,10956],{"className":69,"code":3777,"language":71,"meta":72,"style":72},[33,10957,10958,10962,10966,10970,10974,10978],{"__ignoreMap":72},[76,10959,10960],{"class":78,"line":79},[76,10961,3784],{},[76,10963,10964],{"class":78,"line":85},[76,10965,3789],{},[76,10967,10968],{"class":78,"line":92},[76,10969,89],{"emptyLinePlaceholder":88},[76,10971,10972],{"class":78,"line":98},[76,10973,3798],{},[76,10975,10976],{"class":78,"line":104},[76,10977,3803],{},[76,10979,10980],{"class":78,"line":110},[76,10981,3808],{},[10,10983,139],{},[67,10985,10987],{"className":10986,"code":3814,"language":145,"meta":72},[143],[33,10988,3814],{"__ignoreMap":72},[10,10990,150],{},[14,10992,153],{"id":153},[155,10994,10995,10997],{},[51,10996,3825],{},[51,10998,10999,3831,11001,3835],{},[33,11000,3830],{},[33,11002,3834],{},[14,11004,214],{"id":214},[48,11006,11007,11013],{},[51,11008,2378,11009,3844,11011,405],{},[33,11010,3769],{},[33,11012,3765],{},[51,11014,3849],{},[14,11016,235],{"id":235},[155,11018,11019,11023],{},[51,11020,3856,11021,3859],{},[33,11022,3765],{},[51,11024,3862],{},[10,11026,246],{},[14,11028,249],{"id":249},[10,11030,3869],{},[254,11032,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11034},[11035,11036,11037,11038,11039,11040,11041,11042],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3728,"description":3733},[270,3889,3396],{"id":3892,"title":3893,"body":11047,"category":270,"cover":271,"description":3898,"extension":272,"meta":11206,"navigation":88,"path":4096,"pinned":275,"publishedAt":276,"seo":11207,"slug":4098,"stem":4099,"summary":4100,"tags":11208,"updatedAt":276,"visible":88,"__hash__":4104},{"type":7,"value":11048,"toc":11194},[11049,11051,11053,11055,11057,11061,11067,11069,11081,11083,11085,11125,11127,11132,11134,11136,11150,11152,11154,11158,11160,11162,11172,11174,11186,11188,11190,11192],[10,11050,3898],{},[14,11052,16],{"id":16},[10,11054,3903],{},[14,11056,22],{"id":22},[10,11058,11059],{},[26,11060],{"alt":3910,"src":3911},[10,11062,11063,3917,11065,3921],{},[33,11064,3916],{},[33,11066,3920],{},[14,11068,46],{"id":46},[48,11070,11071,11077,11079],{},[51,11072,11073,3930,11075,3934],{},[33,11074,2845],{},[33,11076,3933],{},[51,11078,3937],{},[51,11080,3940],{},[14,11082,62],{"id":62},[10,11084,65],{},[67,11086,11087],{"className":69,"code":3947,"language":71,"meta":72,"style":72},[33,11088,11089,11093,11097,11101,11105,11109,11113,11117,11121],{"__ignoreMap":72},[76,11090,11091],{"class":78,"line":79},[76,11092,3954],{},[76,11094,11095],{"class":78,"line":85},[76,11096,3959],{},[76,11098,11099],{"class":78,"line":92},[76,11100,3964],{},[76,11102,11103],{"class":78,"line":98},[76,11104,89],{"emptyLinePlaceholder":88},[76,11106,11107],{"class":78,"line":104},[76,11108,3973],{},[76,11110,11111],{"class":78,"line":110},[76,11112,3978],{},[76,11114,11115],{"class":78,"line":116},[76,11116,3983],{},[76,11118,11119],{"class":78,"line":122},[76,11120,3988],{},[76,11122,11123],{"class":78,"line":128},[76,11124,3993],{},[10,11126,139],{},[67,11128,11130],{"className":11129,"code":3999,"language":145,"meta":72},[143],[33,11131,3999],{"__ignoreMap":72},[10,11133,150],{},[14,11135,153],{"id":153},[155,11137,11138,11142],{},[51,11139,11140,4013],{},[33,11141,4012],{},[51,11143,11144,4019,11146,4023,11148,4027],{},[33,11145,4018],{},[33,11147,4022],{},[33,11149,4026],{},[174,11151,176],{"id":176},[10,11153,4032],{},[10,11155,11156],{},[26,11157],{"alt":4037,"src":4038},[10,11159,4041],{},[14,11161,214],{"id":214},[48,11163,11164,11170],{},[51,11165,4048,11166,4051,11168,405],{},[33,11167,2845],{},[33,11169,3933],{},[51,11171,4056],{},[14,11173,235],{"id":235},[155,11175,11176,11178],{},[51,11177,4063],{},[51,11179,2378,11180,4069,11182,1198,11184,405],{},[33,11181,4068],{},[33,11183,3933],{},[33,11185,2845],{},[10,11187,246],{},[14,11189,249],{"id":249},[10,11191,4080],{},[254,11193,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11195},[11196,11197,11198,11199,11200,11203,11204,11205],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":11201},[11202],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":3893,"description":3898},[270,4102,4103],{"id":4,"title":5,"body":11210,"category":270,"cover":271,"description":12,"extension":272,"meta":11382,"navigation":88,"path":274,"pinned":275,"publishedAt":276,"seo":11383,"slug":278,"stem":279,"summary":280,"tags":11384,"updatedAt":276,"visible":88,"__hash__":283},{"type":7,"value":11211,"toc":11369},[11212,11214,11216,11218,11220,11224,11232,11234,11242,11244,11246,11290,11292,11297,11299,11301,11313,11315,11317,11321,11327,11329,11331,11335,11339,11341,11353,11355,11361,11363,11365,11367],[10,11213,12],{},[14,11215,16],{"id":16},[10,11217,19],{},[14,11219,22],{"id":22},[10,11221,11222],{},[26,11223],{"alt":28,"src":29},[10,11225,11226,36,11228,36,11230,43],{},[33,11227,35],{},[33,11229,39],{},[33,11231,42],{},[14,11233,46],{"id":46},[48,11235,11236,11238,11240],{},[51,11237,53],{},[51,11239,56],{},[51,11241,59],{},[14,11243,62],{"id":62},[10,11245,65],{},[67,11247,11248],{"className":69,"code":70,"language":71,"meta":72,"style":72},[33,11249,11250,11254,11258,11262,11266,11270,11274,11278,11282,11286],{"__ignoreMap":72},[76,11251,11252],{"class":78,"line":79},[76,11253,82],{},[76,11255,11256],{"class":78,"line":85},[76,11257,89],{"emptyLinePlaceholder":88},[76,11259,11260],{"class":78,"line":92},[76,11261,95],{},[76,11263,11264],{"class":78,"line":98},[76,11265,101],{},[76,11267,11268],{"class":78,"line":104},[76,11269,107],{},[76,11271,11272],{"class":78,"line":110},[76,11273,113],{},[76,11275,11276],{"class":78,"line":116},[76,11277,119],{},[76,11279,11280],{"class":78,"line":122},[76,11281,125],{},[76,11283,11284],{"class":78,"line":128},[76,11285,89],{"emptyLinePlaceholder":88},[76,11287,11288],{"class":78,"line":133},[76,11289,136],{},[10,11291,139],{},[67,11293,11295],{"className":11294,"code":144,"language":145,"meta":72},[143],[33,11296,144],{"__ignoreMap":72},[10,11298,150],{},[14,11300,153],{"id":153},[155,11302,11303,11307],{},[51,11304,159,11305,163],{},[33,11306,162],{},[51,11308,11309,169,11311,172],{},[33,11310,168],{},[33,11312,42],{},[174,11314,176],{"id":176},[10,11316,179],{},[10,11318,11319],{},[26,11320],{"alt":184,"src":185},[10,11322,11323,190,11325,193],{},[33,11324,162],{},[33,11326,168],{},[174,11328,176],{"id":196},[10,11330,199],{},[10,11332,11333],{},[26,11334],{"alt":204,"src":205},[10,11336,208,11337,211],{},[33,11338,35],{},[14,11340,214],{"id":214},[48,11342,11343,11347],{},[51,11344,219,11345,222],{},[33,11346,168],{},[51,11348,225,11349,228,11351,232],{},[33,11350,35],{},[33,11352,231],{},[14,11354,235],{"id":235},[155,11356,11357,11359],{},[51,11358,240],{},[51,11360,243],{},[10,11362,246],{},[14,11364,249],{"id":249},[10,11366,252],{},[254,11368,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11370},[11371,11372,11373,11374,11375,11379,11380,11381],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":11376},[11377,11378],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5,"description":12},[270,35,282],{"id":4282,"title":4283,"body":11386,"category":270,"cover":271,"description":4288,"extension":272,"meta":11523,"navigation":88,"path":4455,"pinned":275,"publishedAt":276,"seo":11524,"slug":4457,"stem":4458,"summary":4459,"tags":11525,"updatedAt":276,"visible":88,"__hash__":4462},{"type":7,"value":11387,"toc":11511},[11388,11390,11392,11394,11396,11400,11404,11406,11416,11418,11420,11452,11454,11459,11461,11463,11473,11475,11477,11481,11485,11487,11493,11495,11503,11505,11507,11509],[10,11389,4288],{},[14,11391,16],{"id":16},[10,11393,4293],{},[14,11395,22],{"id":22},[10,11397,11398],{},[26,11399],{"alt":4300,"src":4301},[10,11401,11402,4307],{},[33,11403,4306],{},[14,11405,46],{"id":46},[48,11407,11408,11410,11412],{},[51,11409,4314],{},[51,11411,4317],{},[51,11413,4320,11414,4324],{},[33,11415,4323],{},[14,11417,62],{"id":62},[10,11419,65],{},[67,11421,11422],{"className":69,"code":4331,"language":71,"meta":72,"style":72},[33,11423,11424,11428,11432,11436,11440,11444,11448],{"__ignoreMap":72},[76,11425,11426],{"class":78,"line":79},[76,11427,4338],{},[76,11429,11430],{"class":78,"line":85},[76,11431,89],{"emptyLinePlaceholder":88},[76,11433,11434],{"class":78,"line":92},[76,11435,4347],{},[76,11437,11438],{"class":78,"line":98},[76,11439,4352],{},[76,11441,11442],{"class":78,"line":104},[76,11443,4357],{},[76,11445,11446],{"class":78,"line":110},[76,11447,89],{"emptyLinePlaceholder":88},[76,11449,11450],{"class":78,"line":116},[76,11451,4366],{},[10,11453,139],{},[67,11455,11457],{"className":11456,"code":4372,"language":145,"meta":72},[143],[33,11458,4372],{"__ignoreMap":72},[10,11460,150],{},[14,11462,153],{"id":153},[155,11464,11465,11469],{},[51,11466,4383,11467,4387],{},[33,11468,4386],{},[51,11470,4390,11471,4393],{},[33,11472,4386],{},[174,11474,176],{"id":176},[10,11476,4398],{},[10,11478,11479],{},[26,11480],{"alt":4403,"src":4404},[10,11482,4407,11483,4410],{},[33,11484,4386],{},[14,11486,214],{"id":214},[48,11488,11489,11491],{},[51,11490,4417],{},[51,11492,4420],{},[14,11494,235],{"id":235},[155,11496,11497,11501],{},[51,11498,2378,11499,4429],{},[33,11500,4306],{},[51,11502,4432],{},[10,11504,246],{},[14,11506,249],{"id":249},[10,11508,4439],{},[254,11510,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11512},[11513,11514,11515,11516,11517,11520,11521,11522],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":11518},[11519],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":4283,"description":4288},[270,4306,4461],{"id":4464,"title":4465,"body":11527,"category":270,"cover":271,"description":4470,"extension":272,"meta":11652,"navigation":88,"path":4619,"pinned":275,"publishedAt":276,"seo":11653,"slug":4621,"stem":4622,"summary":4623,"tags":11654,"updatedAt":276,"visible":88,"__hash__":4626},{"type":7,"value":11528,"toc":11642},[11529,11531,11533,11535,11537,11541,11545,11547,11557,11559,11561,11593,11595,11600,11602,11604,11616,11618,11624,11626,11634,11636,11638,11640],[10,11530,4470],{},[14,11532,16],{"id":16},[10,11534,4475],{},[14,11536,22],{"id":22},[10,11538,11539],{},[26,11540],{"alt":4482,"src":4483},[10,11542,11543,4488],{},[33,11544,4323],{},[14,11546,46],{"id":46},[48,11548,11549,11553,11555],{},[51,11550,11551,4498],{},[33,11552,4497],{},[51,11554,4501],{},[51,11556,4504],{},[14,11558,62],{"id":62},[10,11560,65],{},[67,11562,11563],{"className":69,"code":4511,"language":71,"meta":72,"style":72},[33,11564,11565,11569,11573,11577,11581,11585,11589],{"__ignoreMap":72},[76,11566,11567],{"class":78,"line":79},[76,11568,4518],{},[76,11570,11571],{"class":78,"line":85},[76,11572,89],{"emptyLinePlaceholder":88},[76,11574,11575],{"class":78,"line":92},[76,11576,4527],{},[76,11578,11579],{"class":78,"line":98},[76,11580,4532],{},[76,11582,11583],{"class":78,"line":104},[76,11584,89],{"emptyLinePlaceholder":88},[76,11586,11587],{"class":78,"line":110},[76,11588,4541],{},[76,11590,11591],{"class":78,"line":116},[76,11592,4546],{},[10,11594,139],{},[67,11596,11598],{"className":11597,"code":4552,"language":145,"meta":72},[143],[33,11599,4552],{"__ignoreMap":72},[10,11601,150],{},[14,11603,153],{"id":153},[155,11605,11606,11612],{},[51,11607,4563,11608,4566,11610,4570],{},[33,11609,4323],{},[33,11611,4569],{},[51,11613,11614,4575],{},[33,11615,4497],{},[14,11617,214],{"id":214},[48,11619,11620,11622],{},[51,11621,4582],{},[51,11623,4585],{},[14,11625,235],{"id":235},[155,11627,11628,11630],{},[51,11629,4592],{},[51,11631,2378,11632,4598],{},[33,11633,4597],{},[10,11635,246],{},[14,11637,249],{"id":249},[10,11639,4605],{},[254,11641,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11643},[11644,11645,11646,11647,11648,11649,11650,11651],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":4465,"description":4470},[270,4323,4625],{"id":4628,"title":4629,"body":11656,"category":270,"cover":271,"description":4634,"extension":272,"meta":11801,"navigation":88,"path":4809,"pinned":275,"publishedAt":276,"seo":11802,"slug":4811,"stem":4812,"summary":4813,"tags":11803,"updatedAt":276,"visible":88,"__hash__":4815},{"type":7,"value":11657,"toc":11791},[11658,11660,11662,11664,11666,11670,11676,11678,11692,11694,11696,11740,11742,11747,11749,11751,11761,11763,11775,11777,11783,11785,11787,11789],[10,11659,4634],{},[14,11661,16],{"id":16},[10,11663,4639],{},[14,11665,22],{"id":22},[10,11667,11668],{},[26,11669],{"alt":4646,"src":4647},[10,11671,11672,4653,11674,4657],{},[33,11673,4652],{},[33,11675,4656],{},[14,11677,46],{"id":46},[48,11679,11680,11682,11688],{},[51,11681,4664],{},[51,11683,11684,4669,11686,4672],{},[33,11685,4652],{},[33,11687,4306],{},[51,11689,4675,11690,4678],{},[33,11691,4656],{},[14,11693,62],{"id":62},[10,11695,65],{},[67,11697,11698],{"className":69,"code":4685,"language":71,"meta":72,"style":72},[33,11699,11700,11704,11708,11712,11716,11720,11724,11728,11732,11736],{"__ignoreMap":72},[76,11701,11702],{"class":78,"line":79},[76,11703,4692],{},[76,11705,11706],{"class":78,"line":85},[76,11707,89],{"emptyLinePlaceholder":88},[76,11709,11710],{"class":78,"line":92},[76,11711,4701],{},[76,11713,11714],{"class":78,"line":98},[76,11715,4706],{},[76,11717,11718],{"class":78,"line":104},[76,11719,4711],{},[76,11721,11722],{"class":78,"line":110},[76,11723,4716],{},[76,11725,11726],{"class":78,"line":116},[76,11727,4721],{},[76,11729,11730],{"class":78,"line":122},[76,11731,4546],{},[76,11733,11734],{"class":78,"line":128},[76,11735,89],{"emptyLinePlaceholder":88},[76,11737,11738],{"class":78,"line":133},[76,11739,4734],{},[10,11741,139],{},[67,11743,11745],{"className":11744,"code":4740,"language":145,"meta":72},[143],[33,11746,4740],{"__ignoreMap":72},[10,11748,150],{},[14,11750,153],{"id":153},[155,11752,11753,11757],{},[51,11754,4751,11755,4754],{},[33,11756,4652],{},[51,11758,4757,11759,4760],{},[33,11760,4656],{},[14,11762,214],{"id":214},[48,11764,11765,11769],{},[51,11766,3505,11767,4769],{},[33,11768,4652],{},[51,11770,4772,11771,4775,11773,4778],{},[33,11772,4306],{},[33,11774,4652],{},[14,11776,235],{"id":235},[155,11778,11779,11781],{},[51,11780,4785],{},[51,11782,4788],{},[10,11784,246],{},[14,11786,249],{"id":249},[10,11788,4795],{},[254,11790,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11792},[11793,11794,11795,11796,11797,11798,11799,11800],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":4629,"description":4634},[270,4656,4652],{"id":4817,"title":4818,"body":11805,"category":270,"cover":271,"description":4823,"extension":272,"meta":11944,"navigation":88,"path":4995,"pinned":275,"publishedAt":276,"seo":11945,"slug":4997,"stem":4998,"summary":4999,"tags":11946,"updatedAt":276,"visible":88,"__hash__":5003},{"type":7,"value":11806,"toc":11932},[11807,11809,11811,11813,11815,11819,11821,11823,11839,11841,11843,11871,11873,11878,11880,11882,11894,11896,11898,11902,11904,11906,11916,11918,11924,11926,11928,11930],[10,11808,4823],{},[14,11810,16],{"id":16},[10,11812,4828],{},[14,11814,22],{"id":22},[10,11816,11817],{},[26,11818],{"alt":4835,"src":4836},[10,11820,4839],{},[14,11822,46],{"id":46},[48,11824,11825,11827,11829],{},[51,11826,4846],{},[51,11828,4849],{},[51,11830,4852,11831,36,11833,4859,11835,36,11837,405],{},[33,11832,4855],{},[33,11834,4858],{},[33,11836,4862],{},[33,11838,4865],{},[14,11840,62],{"id":62},[10,11842,65],{},[67,11844,11845],{"className":69,"code":4872,"language":71,"meta":72,"style":72},[33,11846,11847,11851,11855,11859,11863,11867],{"__ignoreMap":72},[76,11848,11849],{"class":78,"line":79},[76,11850,4879],{},[76,11852,11853],{"class":78,"line":85},[76,11854,89],{"emptyLinePlaceholder":88},[76,11856,11857],{"class":78,"line":92},[76,11858,4888],{},[76,11860,11861],{"class":78,"line":98},[76,11862,4893],{},[76,11864,11865],{"class":78,"line":104},[76,11866,4898],{},[76,11868,11869],{"class":78,"line":110},[76,11870,4903],{},[10,11872,139],{},[67,11874,11876],{"className":11875,"code":4909,"language":145,"meta":72},[143],[33,11877,4909],{"__ignoreMap":72},[10,11879,150],{},[14,11881,153],{"id":153},[155,11883,11884,11892],{},[51,11885,4920,11886,4923,11888,1198,11890,405],{},[33,11887,4855],{},[33,11889,4926],{},[33,11891,4929],{},[51,11893,4932],{},[174,11895,176],{"id":176},[10,11897,4937],{},[10,11899,11900],{},[26,11901],{"alt":4942,"src":4943},[10,11903,4946],{},[14,11905,214],{"id":214},[48,11907,11908,11914],{},[51,11909,4953,11910,1052,11912,4959],{},[33,11911,4956],{},[33,11913,4862],{},[51,11915,4962],{},[14,11917,235],{"id":235},[155,11919,11920,11922],{},[51,11921,4969],{},[51,11923,4972],{},[10,11925,246],{},[14,11927,249],{"id":249},[10,11929,4979],{},[254,11931,256],{},{"title":72,"searchDepth":85,"depth":85,"links":11933},[11934,11935,11936,11937,11938,11941,11942,11943],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":11939},[11940],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":4818,"description":4823},[270,5001,5002],{"id":5005,"title":5006,"body":11948,"category":270,"cover":271,"description":5011,"extension":272,"meta":12065,"navigation":88,"path":5150,"pinned":275,"publishedAt":276,"seo":12066,"slug":5152,"stem":5153,"summary":5154,"tags":12067,"updatedAt":276,"visible":88,"__hash__":5158},{"type":7,"value":11949,"toc":12055},[11950,11952,11954,11956,11958,11962,11964,11966,11974,11976,11978,12010,12012,12017,12019,12021,12029,12031,12039,12041,12047,12049,12051,12053],[10,11951,5011],{},[14,11953,16],{"id":16},[10,11955,5016],{},[14,11957,22],{"id":22},[10,11959,11960],{},[26,11961],{"alt":5023,"src":5024},[10,11963,5027],{},[14,11965,46],{"id":46},[48,11967,11968,11970,11972],{},[51,11969,5034],{},[51,11971,5037],{},[51,11973,5040],{},[14,11975,62],{"id":62},[10,11977,65],{},[67,11979,11980],{"className":69,"code":5047,"language":71,"meta":72,"style":72},[33,11981,11982,11986,11990,11994,11998,12002,12006],{"__ignoreMap":72},[76,11983,11984],{"class":78,"line":79},[76,11985,5054],{},[76,11987,11988],{"class":78,"line":85},[76,11989,89],{"emptyLinePlaceholder":88},[76,11991,11992],{"class":78,"line":92},[76,11993,5063],{},[76,11995,11996],{"class":78,"line":98},[76,11997,5068],{},[76,11999,12000],{"class":78,"line":104},[76,12001,89],{"emptyLinePlaceholder":88},[76,12003,12004],{"class":78,"line":110},[76,12005,5077],{},[76,12007,12008],{"class":78,"line":116},[76,12009,5082],{},[10,12011,139],{},[67,12013,12015],{"className":12014,"code":5088,"language":145,"meta":72},[143],[33,12016,5088],{"__ignoreMap":72},[10,12018,150],{},[14,12020,153],{"id":153},[155,12022,12023,12025],{},[51,12024,5099],{},[51,12026,5102,12027,5106],{},[33,12028,5105],{},[14,12030,214],{"id":214},[48,12032,12033,12037],{},[51,12034,5113,12035,5116],{},[33,12036,4323],{},[51,12038,5119],{},[14,12040,235],{"id":235},[155,12042,12043,12045],{},[51,12044,5126],{},[51,12046,5129],{},[10,12048,246],{},[14,12050,249],{"id":249},[10,12052,5136],{},[254,12054,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12056},[12057,12058,12059,12060,12061,12062,12063,12064],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5006,"description":5011},[270,5156,5157],{"id":5160,"title":5161,"body":12069,"category":270,"cover":271,"description":5166,"extension":272,"meta":12188,"navigation":88,"path":5310,"pinned":275,"publishedAt":276,"seo":12189,"slug":5312,"stem":5313,"summary":5314,"tags":12190,"updatedAt":276,"visible":88,"__hash__":5318},{"type":7,"value":12070,"toc":12178},[12071,12073,12075,12077,12079,12083,12085,12087,12095,12097,12099,12131,12133,12138,12140,12142,12152,12154,12160,12162,12170,12172,12174,12176],[10,12072,5166],{},[14,12074,16],{"id":16},[10,12076,5171],{},[14,12078,22],{"id":22},[10,12080,12081],{},[26,12082],{"alt":5178,"src":5179},[10,12084,5182],{},[14,12086,46],{"id":46},[48,12088,12089,12091,12093],{},[51,12090,5189],{},[51,12092,5192],{},[51,12094,5195],{},[14,12096,62],{"id":62},[10,12098,65],{},[67,12100,12101],{"className":69,"code":5202,"language":71,"meta":72,"style":72},[33,12102,12103,12107,12111,12115,12119,12123,12127],{"__ignoreMap":72},[76,12104,12105],{"class":78,"line":79},[76,12106,5209],{},[76,12108,12109],{"class":78,"line":85},[76,12110,5214],{},[76,12112,12113],{"class":78,"line":92},[76,12114,5219],{},[76,12116,12117],{"class":78,"line":98},[76,12118,89],{"emptyLinePlaceholder":88},[76,12120,12121],{"class":78,"line":104},[76,12122,5228],{},[76,12124,12125],{"class":78,"line":110},[76,12126,5233],{},[76,12128,12129],{"class":78,"line":116},[76,12130,5238],{},[10,12132,139],{},[67,12134,12136],{"className":12135,"code":5244,"language":145,"meta":72},[143],[33,12137,5244],{"__ignoreMap":72},[10,12139,150],{},[14,12141,153],{"id":153},[155,12143,12144,12148],{},[51,12145,981,12146,5258],{},[33,12147,5257],{},[51,12149,5261,12150,5265],{},[33,12151,5264],{},[14,12153,214],{"id":214},[48,12155,12156,12158],{},[51,12157,5272],{},[51,12159,5275],{},[14,12161,235],{"id":235},[155,12163,12164,12168],{},[51,12165,5282,12166,5286],{},[33,12167,5285],{},[51,12169,5289],{},[10,12171,246],{},[14,12173,249],{"id":249},[10,12175,5296],{},[254,12177,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12179},[12180,12181,12182,12183,12184,12185,12186,12187],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5161,"description":5166},[270,5316,5317],{"id":5320,"title":5321,"body":12192,"category":270,"cover":271,"description":5326,"extension":272,"meta":12337,"navigation":88,"path":5507,"pinned":275,"publishedAt":276,"seo":12338,"slug":5509,"stem":5510,"summary":5511,"tags":12339,"updatedAt":276,"visible":88,"__hash__":5515},{"type":7,"value":12193,"toc":12325},[12194,12196,12198,12200,12202,12206,12210,12212,12224,12226,12228,12256,12258,12263,12265,12267,12281,12283,12285,12289,12297,12299,12309,12311,12317,12319,12321,12323],[10,12195,5326],{},[14,12197,16],{"id":16},[10,12199,5331],{},[14,12201,22],{"id":22},[10,12203,12204],{},[26,12205],{"alt":5338,"src":5339},[10,12207,5342,12208,5346],{},[33,12209,5345],{},[14,12211,46],{"id":46},[48,12213,12214,12216,12218],{},[51,12215,5353],{},[51,12217,5356],{},[51,12219,5359,12220,5362,12222,405],{},[33,12221,5345],{},[33,12223,5365],{},[14,12225,62],{"id":62},[10,12227,65],{},[67,12229,12230],{"className":69,"code":5372,"language":71,"meta":72,"style":72},[33,12231,12232,12236,12240,12244,12248,12252],{"__ignoreMap":72},[76,12233,12234],{"class":78,"line":79},[76,12235,5379],{},[76,12237,12238],{"class":78,"line":85},[76,12239,5384],{},[76,12241,12242],{"class":78,"line":92},[76,12243,5389],{},[76,12245,12246],{"class":78,"line":98},[76,12247,89],{"emptyLinePlaceholder":88},[76,12249,12250],{"class":78,"line":104},[76,12251,5398],{},[76,12253,12254],{"class":78,"line":110},[76,12255,5403],{},[10,12257,139],{},[67,12259,12261],{"className":12260,"code":5409,"language":145,"meta":72},[143],[33,12262,5409],{"__ignoreMap":72},[10,12264,150],{},[14,12266,153],{"id":153},[155,12268,12269,12275],{},[51,12270,5420,12271,36,12273,5426],{},[33,12272,5423],{},[33,12274,4386],{},[51,12276,12277,5432,12279,5436],{},[33,12278,5431],{},[33,12280,5435],{},[174,12282,176],{"id":176},[10,12284,5441],{},[10,12286,12287],{},[26,12288],{"alt":5446,"src":5447},[10,12290,12291,36,12293,1198,12295,5457],{},[33,12292,5423],{},[33,12294,4386],{},[33,12296,5456],{},[14,12298,214],{"id":214},[48,12300,12301,12305],{},[51,12302,5464,12303,5468],{},[33,12304,5467],{},[51,12306,5471,12307,5474],{},[33,12308,5456],{},[14,12310,235],{"id":235},[155,12312,12313,12315],{},[51,12314,5481],{},[51,12316,5484],{},[10,12318,246],{},[14,12320,249],{"id":249},[10,12322,5491],{},[254,12324,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12326},[12327,12328,12329,12330,12331,12334,12335,12336],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":12332},[12333],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5321,"description":5326},[270,5513,5514],{"id":5517,"title":5518,"body":12341,"category":270,"cover":271,"description":5523,"extension":272,"meta":12490,"navigation":88,"path":5704,"pinned":275,"publishedAt":276,"seo":12491,"slug":5706,"stem":5707,"summary":5708,"tags":12492,"updatedAt":276,"visible":88,"__hash__":5712},{"type":7,"value":12342,"toc":12478},[12343,12345,12347,12349,12351,12355,12357,12359,12371,12373,12375,12419,12421,12426,12428,12430,12442,12444,12446,12450,12452,12454,12462,12464,12470,12472,12474,12476],[10,12344,5523],{},[14,12346,16],{"id":16},[10,12348,5528],{},[14,12350,22],{"id":22},[10,12352,12353],{},[26,12354],{"alt":5535,"src":5536},[10,12356,5539],{},[14,12358,46],{"id":46},[48,12360,12361,12363,12367],{},[51,12362,5546],{},[51,12364,12365,5552],{},[33,12366,5551],{},[51,12368,12369,5558],{},[33,12370,5557],{},[14,12372,62],{"id":62},[10,12374,65],{},[67,12376,12377],{"className":69,"code":5565,"language":71,"meta":72,"style":72},[33,12378,12379,12383,12387,12391,12395,12399,12403,12407,12411,12415],{"__ignoreMap":72},[76,12380,12381],{"class":78,"line":79},[76,12382,5572],{},[76,12384,12385],{"class":78,"line":85},[76,12386,5577],{},[76,12388,12389],{"class":78,"line":92},[76,12390,89],{"emptyLinePlaceholder":88},[76,12392,12393],{"class":78,"line":98},[76,12394,5586],{},[76,12396,12397],{"class":78,"line":104},[76,12398,5591],{},[76,12400,12401],{"class":78,"line":110},[76,12402,89],{"emptyLinePlaceholder":88},[76,12404,12405],{"class":78,"line":116},[76,12406,5600],{},[76,12408,12409],{"class":78,"line":122},[76,12410,5605],{},[76,12412,12413],{"class":78,"line":128},[76,12414,89],{"emptyLinePlaceholder":88},[76,12416,12417],{"class":78,"line":133},[76,12418,5614],{},[10,12420,139],{},[67,12422,12424],{"className":12423,"code":5620,"language":145,"meta":72},[143],[33,12425,5620],{"__ignoreMap":72},[10,12427,150],{},[14,12429,153],{"id":153},[155,12431,12432,12436],{},[51,12433,5631,12434,5635],{},[33,12435,5634],{},[51,12437,12438,5641,12440,405],{},[33,12439,5640],{},[33,12441,5644],{},[174,12443,176],{"id":176},[10,12445,5649],{},[10,12447,12448],{},[26,12449],{"alt":5654,"src":5655},[10,12451,5658],{},[14,12453,214],{"id":214},[48,12455,12456,12460],{},[51,12457,5665,12458,5668],{},[33,12459,5365],{},[51,12461,5671],{},[14,12463,235],{"id":235},[155,12465,12466,12468],{},[51,12467,5678],{},[51,12469,5681],{},[10,12471,246],{},[14,12473,249],{"id":249},[10,12475,5688],{},[254,12477,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12479},[12480,12481,12482,12483,12484,12487,12488,12489],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":12485},[12486],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5518,"description":5523},[270,5710,5711],{"id":5714,"title":5715,"body":12494,"category":270,"cover":271,"description":5720,"extension":272,"meta":12655,"navigation":88,"path":5918,"pinned":275,"publishedAt":276,"seo":12656,"slug":5920,"stem":5921,"summary":5922,"tags":12657,"updatedAt":276,"visible":88,"__hash__":5926},{"type":7,"value":12495,"toc":12643},[12496,12498,12500,12502,12504,12508,12510,12512,12524,12526,12528,12580,12582,12587,12589,12591,12609,12611,12613,12617,12619,12621,12627,12629,12635,12637,12639,12641],[10,12497,5720],{},[14,12499,16],{"id":16},[10,12501,5725],{},[14,12503,22],{"id":22},[10,12505,12506],{},[26,12507],{"alt":5732,"src":5733},[10,12509,5736],{},[14,12511,46],{"id":46},[48,12513,12514,12516,12518],{},[51,12515,5743],{},[51,12517,5746],{},[51,12519,12520,2216,12522,5755],{},[33,12521,5751],{},[33,12523,5754],{},[14,12525,62],{"id":62},[10,12527,65],{},[67,12529,12530],{"className":69,"code":5762,"language":71,"meta":72,"style":72},[33,12531,12532,12536,12540,12544,12548,12552,12556,12560,12564,12568,12572,12576],{"__ignoreMap":72},[76,12533,12534],{"class":78,"line":79},[76,12535,5769],{},[76,12537,12538],{"class":78,"line":85},[76,12539,89],{"emptyLinePlaceholder":88},[76,12541,12542],{"class":78,"line":92},[76,12543,5778],{},[76,12545,12546],{"class":78,"line":98},[76,12547,5783],{},[76,12549,12550],{"class":78,"line":104},[76,12551,89],{"emptyLinePlaceholder":88},[76,12553,12554],{"class":78,"line":110},[76,12555,5792],{},[76,12557,12558],{"class":78,"line":116},[76,12559,5797],{},[76,12561,12562],{"class":78,"line":122},[76,12563,5802],{},[76,12565,12566],{"class":78,"line":128},[76,12567,89],{"emptyLinePlaceholder":88},[76,12569,12570],{"class":78,"line":133},[76,12571,5811],{},[76,12573,12574],{"class":78,"line":5814},[76,12575,89],{"emptyLinePlaceholder":88},[76,12577,12578],{"class":78,"line":5819},[76,12579,5822],{},[10,12581,139],{},[67,12583,12585],{"className":12584,"code":5828,"language":145,"meta":72},[143],[33,12586,5828],{"__ignoreMap":72},[10,12588,150],{},[14,12590,153],{"id":153},[155,12592,12593,12603],{},[51,12594,12595,5842,12597,5846,12599,5849,12601,5853],{},[33,12596,5841],{},[33,12598,5845],{},[33,12600,5634],{},[33,12602,5852],{},[51,12604,12605,5858,12607,5861],{},[33,12606,4569],{},[33,12608,2248],{},[174,12610,176],{"id":176},[10,12612,5866],{},[10,12614,12615],{},[26,12616],{"alt":5871,"src":5872},[10,12618,5875],{},[14,12620,214],{"id":214},[48,12622,12623,12625],{},[51,12624,5882],{},[51,12626,5885],{},[14,12628,235],{"id":235},[155,12630,12631,12633],{},[51,12632,5892],{},[51,12634,5895],{},[10,12636,246],{},[14,12638,249],{"id":249},[10,12640,5902],{},[254,12642,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12644},[12645,12646,12647,12648,12649,12652,12653,12654],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":12650},[12651],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5715,"description":5720},[270,5924,5925],{"id":5928,"title":5929,"body":12659,"category":270,"cover":271,"description":5934,"extension":272,"meta":12782,"navigation":88,"path":6085,"pinned":275,"publishedAt":276,"seo":12783,"slug":6087,"stem":6088,"summary":6089,"tags":12784,"updatedAt":276,"visible":88,"__hash__":6093},{"type":7,"value":12660,"toc":12772},[12661,12663,12665,12667,12669,12673,12675,12677,12691,12693,12695,12723,12725,12730,12732,12734,12744,12746,12754,12756,12764,12766,12768,12770],[10,12662,5934],{},[14,12664,16],{"id":16},[10,12666,5939],{},[14,12668,22],{"id":22},[10,12670,12671],{},[26,12672],{"alt":5946,"src":5947},[10,12674,5950],{},[14,12676,46],{"id":46},[48,12678,12679,12681,12683],{},[51,12680,5957],{},[51,12682,5960],{},[51,12684,5963,12685,36,12687,36,12689,5971],{},[33,12686,2299],{},[33,12688,2465],{},[33,12690,5970],{},[14,12692,62],{"id":62},[10,12694,65],{},[67,12696,12697],{"className":69,"code":5978,"language":71,"meta":72,"style":72},[33,12698,12699,12703,12707,12711,12715,12719],{"__ignoreMap":72},[76,12700,12701],{"class":78,"line":79},[76,12702,5985],{},[76,12704,12705],{"class":78,"line":85},[76,12706,5990],{},[76,12708,12709],{"class":78,"line":92},[76,12710,5995],{},[76,12712,12713],{"class":78,"line":98},[76,12714,89],{"emptyLinePlaceholder":88},[76,12716,12717],{"class":78,"line":104},[76,12718,6004],{},[76,12720,12721],{"class":78,"line":110},[76,12722,6009],{},[10,12724,139],{},[67,12726,12728],{"className":12727,"code":6015,"language":145,"meta":72},[143],[33,12729,6015],{"__ignoreMap":72},[10,12731,150],{},[14,12733,153],{"id":153},[155,12735,12736,12742],{},[51,12737,6026,12738,6030,12740,6033],{},[33,12739,6029],{},[33,12741,2286],{},[51,12743,6036],{},[14,12745,214],{"id":214},[48,12747,12748,12752],{},[51,12749,6043,12750,6047],{},[33,12751,6046],{},[51,12753,6050],{},[14,12755,235],{"id":235},[155,12757,12758,12760],{},[51,12759,6057],{},[51,12761,6060,12762,6064],{},[33,12763,6063],{},[10,12765,246],{},[14,12767,249],{"id":249},[10,12769,6071],{},[254,12771,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12773},[12774,12775,12776,12777,12778,12779,12780,12781],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":5929,"description":5934},[270,6091,6092],{"id":6095,"title":6096,"body":12786,"category":270,"cover":271,"description":6101,"extension":272,"meta":12963,"navigation":88,"path":6329,"pinned":275,"publishedAt":276,"seo":12964,"slug":6331,"stem":6332,"summary":6333,"tags":12965,"updatedAt":276,"visible":88,"__hash__":6337},{"type":7,"value":12787,"toc":12951},[12788,12790,12792,12796,12798,12802,12808,12810,12822,12824,12828,12852,12856,12872,12878,12880,12885,12887,12889,12905,12907,12909,12913,12917,12919,12931,12933,12943,12945,12947,12949],[10,12789,6101],{},[14,12791,16],{"id":16},[10,12793,6106,12794,6109],{},[338,12795,6029],{},[14,12797,22],{"id":22},[10,12799,12800],{},[26,12801],{"alt":6116,"src":6117},[10,12803,6120,12804,6124,12806,6128],{},[33,12805,6123],{},[33,12807,6127],{},[14,12809,46],{"id":46},[48,12811,12812,12816,12818],{},[51,12813,6135,12814,6138],{},[33,12815,1211],{},[51,12817,6141],{},[51,12819,6144,12820,6148],{},[33,12821,6147],{},[14,12823,62],{"id":62},[10,12825,6153,12826,6157],{},[33,12827,6156],{},[67,12829,12830],{"className":69,"code":6160,"language":71,"meta":72,"style":72},[33,12831,12832,12836,12840,12844,12848],{"__ignoreMap":72},[76,12833,12834],{"class":78,"line":79},[76,12835,6167],{},[76,12837,12838],{"class":78,"line":85},[76,12839,6172],{},[76,12841,12842],{"class":78,"line":92},[76,12843,89],{"emptyLinePlaceholder":88},[76,12845,12846],{"class":78,"line":98},[76,12847,6181],{},[76,12849,12850],{"class":78,"line":104},[76,12851,6186],{},[10,12853,6189,12854,6193],{},[33,12855,6192],{},[67,12857,12858],{"className":69,"code":6196,"language":71,"meta":72,"style":72},[33,12859,12860,12864,12868],{"__ignoreMap":72},[76,12861,12862],{"class":78,"line":79},[76,12863,6203],{},[76,12865,12866],{"class":78,"line":85},[76,12867,89],{"emptyLinePlaceholder":88},[76,12869,12870],{"class":78,"line":92},[76,12871,6212],{},[10,12873,6215,12874,1198,12876,405],{},[33,12875,6218],{},[33,12877,6221],{},[10,12879,139],{},[67,12881,12883],{"className":12882,"code":6227,"language":145,"meta":72},[143],[33,12884,6227],{"__ignoreMap":72},[10,12886,150],{},[14,12888,153],{"id":153},[155,12890,12891,12897],{},[51,12892,6238,12893,6241,12895,6245],{},[33,12894,6156],{},[33,12896,6244],{},[51,12898,12899,6250,12901,6253,12903,6256],{},[33,12900,6192],{},[33,12902,6156],{},[33,12904,6192],{},[174,12906,176],{"id":176},[10,12908,6261],{},[10,12910,12911],{},[26,12912],{"alt":6266,"src":6267},[10,12914,6270,12915,6273],{},[33,12916,6244],{},[14,12918,214],{"id":214},[48,12920,12921,12927],{},[51,12922,6280,12923,1198,12925,405],{},[33,12924,6156],{},[33,12926,6192],{},[51,12928,6287,12929,6291],{},[33,12930,6290],{},[14,12932,235],{"id":235},[155,12934,12935,12939],{},[51,12936,2393,12937,6301],{},[33,12938,6300],{},[51,12940,6304,12941,405],{},[33,12942,6123],{},[10,12944,246],{},[14,12946,249],{"id":249},[10,12948,6313],{},[254,12950,256],{},{"title":72,"searchDepth":85,"depth":85,"links":12952},[12953,12954,12955,12956,12957,12960,12961,12962],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":12958},[12959],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":6096,"description":6101},[270,6335,6336],{"id":6339,"title":6340,"body":12967,"category":270,"cover":271,"description":6345,"extension":272,"meta":13106,"navigation":88,"path":6511,"pinned":275,"publishedAt":276,"seo":13107,"slug":6513,"stem":6514,"summary":6515,"tags":13108,"updatedAt":276,"visible":88,"__hash__":6518},{"type":7,"value":12968,"toc":13096},[12969,12971,12973,12975,12977,12981,12983,12985,12995,12997,12999,13039,13041,13046,13048,13050,13068,13070,13078,13080,13088,13090,13092,13094],[10,12970,6345],{},[14,12972,16],{"id":16},[10,12974,6350],{},[14,12976,22],{"id":22},[10,12978,12979],{},[26,12980],{"alt":6357,"src":6358},[10,12982,6361],{},[14,12984,46],{"id":46},[48,12986,12987,12991,12993],{},[51,12988,12989,6371],{},[33,12990,6370],{},[51,12992,6374],{},[51,12994,6377],{},[14,12996,62],{"id":62},[10,12998,1614],{},[67,13000,13001],{"className":634,"code":6384,"language":636,"meta":72,"style":72},[33,13002,13003,13013,13019,13025,13035],{"__ignoreMap":72},[76,13004,13005,13007,13009,13011],{"class":78,"line":79},[76,13006,734],{"class":643},[76,13008,676],{"class":646},[76,13010,6395],{"class":679},[76,13012,6398],{"class":679},[76,13014,13015,13017],{"class":78,"line":85},[76,13016,6403],{"class":646},[76,13018,6406],{"class":679},[76,13020,13021,13023],{"class":78,"line":92},[76,13022,71],{"class":643},[76,13024,647],{"class":646},[76,13026,13027,13029,13031,13033],{"class":78,"line":98},[76,13028,71],{"class":643},[76,13030,676],{"class":646},[76,13032,680],{"class":679},[76,13034,647],{"class":646},[76,13036,13037],{"class":78,"line":104},[76,13038,6427],{"class":643},[10,13040,139],{},[67,13042,13044],{"className":13043,"code":6433,"language":145,"meta":72},[143],[33,13045,6433],{"__ignoreMap":72},[10,13047,150],{},[14,13049,153],{"id":153},[155,13051,13052,13058],{},[51,13053,13054,6447,13056,6450],{},[33,13055,6446],{},[33,13057,734],{},[51,13059,6453,13060,2216,13062,6459,13064,3766,13066,6465],{},[33,13061,71],{},[33,13063,6458],{},[33,13065,6370],{},[33,13067,6464],{},[14,13069,214],{"id":214},[48,13071,13072,13074],{},[51,13073,6472],{},[51,13075,3505,13076,6477],{},[33,13077,6370],{},[14,13079,235],{"id":235},[155,13081,13082,13086],{},[51,13083,6484,13084,405],{},[33,13085,6487],{},[51,13087,6490],{},[10,13089,246],{},[14,13091,249],{"id":249},[10,13093,6497],{},[254,13095,1698],{},{"title":72,"searchDepth":85,"depth":85,"links":13097},[13098,13099,13100,13101,13102,13103,13104,13105],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":6340,"description":6345},[270,6517,304],{"id":6520,"title":6521,"body":13110,"category":270,"cover":271,"description":6526,"extension":272,"meta":13263,"navigation":88,"path":6715,"pinned":275,"publishedAt":276,"seo":13264,"slug":6717,"stem":6718,"summary":6719,"tags":13265,"updatedAt":276,"visible":88,"__hash__":6723},{"type":7,"value":13111,"toc":13253},[13112,13114,13116,13118,13120,13124,13130,13132,13148,13150,13152,13196,13198,13203,13205,13207,13219,13221,13235,13237,13245,13247,13249,13251],[10,13113,6526],{},[14,13115,16],{"id":16},[10,13117,6531],{},[14,13119,22],{"id":22},[10,13121,13122],{},[26,13123],{"alt":6538,"src":6539},[10,13125,13126,6545,13128,6548],{},[33,13127,6544],{},[33,13129,2475],{},[14,13131,46],{"id":46},[48,13133,13134,13136,13144],{},[51,13135,6555],{},[51,13137,13138,36,13140,36,13142,6567],{},[33,13139,6560],{},[33,13141,6563],{},[33,13143,6566],{},[51,13145,6570,13146,6574],{},[33,13147,6573],{},[14,13149,62],{"id":62},[10,13151,65],{},[67,13153,13154],{"className":69,"code":6581,"language":71,"meta":72,"style":72},[33,13155,13156,13160,13164,13168,13172,13176,13180,13184,13188,13192],{"__ignoreMap":72},[76,13157,13158],{"class":78,"line":79},[76,13159,6588],{},[76,13161,13162],{"class":78,"line":85},[76,13163,89],{"emptyLinePlaceholder":88},[76,13165,13166],{"class":78,"line":92},[76,13167,6597],{},[76,13169,13170],{"class":78,"line":98},[76,13171,6602],{},[76,13173,13174],{"class":78,"line":104},[76,13175,6607],{},[76,13177,13178],{"class":78,"line":110},[76,13179,89],{"emptyLinePlaceholder":88},[76,13181,13182],{"class":78,"line":116},[76,13183,6616],{},[76,13185,13186],{"class":78,"line":122},[76,13187,6621],{},[76,13189,13190],{"class":78,"line":128},[76,13191,6626],{},[76,13193,13194],{"class":78,"line":133},[76,13195,6631],{},[10,13197,139],{},[67,13199,13201],{"className":13200,"code":6637,"language":145,"meta":72},[143],[33,13202,6637],{"__ignoreMap":72},[10,13204,150],{},[14,13206,153],{"id":153},[155,13208,13209,13213],{},[51,13210,13211,6651],{},[33,13212,6650],{},[51,13214,2378,13215,6656,13217,6659],{},[33,13216,2475],{},[33,13218,6544],{},[14,13220,214],{"id":214},[48,13222,13223,13229],{},[51,13224,3505,13225,6668,13227,6671],{},[33,13226,6544],{},[33,13228,6560],{},[51,13230,6674,13231,1052,13233,6680],{},[33,13232,2475],{},[33,13234,6679],{},[14,13236,235],{"id":235},[155,13238,13239,13243],{},[51,13240,6687,13241,6691],{},[33,13242,6690],{},[51,13244,6694],{},[10,13246,246],{},[14,13248,249],{"id":249},[10,13250,6701],{},[254,13252,256],{},{"title":72,"searchDepth":85,"depth":85,"links":13254},[13255,13256,13257,13258,13259,13260,13261,13262],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":6521,"description":6526},[270,6721,6722],{"id":6725,"title":6726,"body":13267,"category":270,"cover":271,"description":6731,"extension":272,"meta":13414,"navigation":88,"path":6910,"pinned":275,"publishedAt":276,"seo":13415,"slug":6912,"stem":6913,"summary":6914,"tags":13416,"updatedAt":276,"visible":88,"__hash__":6918},{"type":7,"value":13268,"toc":13404},[13269,13271,13273,13275,13277,13281,13283,13285,13303,13305,13307,13355,13357,13362,13364,13366,13374,13376,13386,13388,13396,13398,13400,13402],[10,13270,6731],{},[14,13272,16],{"id":16},[10,13274,6736],{},[14,13276,22],{"id":22},[10,13278,13279],{},[26,13280],{"alt":6743,"src":6744},[10,13282,6747],{},[14,13284,46],{"id":46},[48,13286,13287,13291,13297],{},[51,13288,13289,6757],{},[33,13290,6756],{},[51,13292,13293,6763,13295,405],{},[33,13294,6762],{},[33,13296,6766],{},[51,13298,6769,13299,6773,13301,6777],{},[33,13300,6772],{},[33,13302,6776],{},[14,13304,62],{"id":62},[10,13306,65],{},[67,13308,13309],{"className":69,"code":6784,"language":71,"meta":72,"style":72},[33,13310,13311,13315,13319,13323,13327,13331,13335,13339,13343,13347,13351],{"__ignoreMap":72},[76,13312,13313],{"class":78,"line":79},[76,13314,6588],{},[76,13316,13317],{"class":78,"line":85},[76,13318,89],{"emptyLinePlaceholder":88},[76,13320,13321],{"class":78,"line":92},[76,13322,6799],{},[76,13324,13325],{"class":78,"line":98},[76,13326,6804],{},[76,13328,13329],{"class":78,"line":104},[76,13330,6809],{},[76,13332,13333],{"class":78,"line":110},[76,13334,6814],{},[76,13336,13337],{"class":78,"line":116},[76,13338,89],{"emptyLinePlaceholder":88},[76,13340,13341],{"class":78,"line":122},[76,13342,6823],{},[76,13344,13345],{"class":78,"line":128},[76,13346,6828],{},[76,13348,13349],{"class":78,"line":133},[76,13350,6833],{},[76,13352,13353],{"class":78,"line":5814},[76,13354,6838],{},[10,13356,139],{},[67,13358,13360],{"className":13359,"code":6844,"language":145,"meta":72},[143],[33,13361,6844],{"__ignoreMap":72},[10,13363,150],{},[14,13365,153],{"id":153},[155,13367,13368,13372],{},[51,13369,6855,13370,6858],{},[33,13371,6772],{},[51,13373,6861],{},[14,13375,214],{"id":214},[48,13377,13378,13382],{},[51,13379,2378,13380,6870],{},[33,13381,6756],{},[51,13383,6873,13384,405],{},[33,13385,6876],{},[14,13387,235],{"id":235},[155,13389,13390,13392],{},[51,13391,6883],{},[51,13393,6886,13394,6889],{},[33,13395,379],{},[10,13397,246],{},[14,13399,249],{"id":249},[10,13401,6896],{},[254,13403,256],{},{"title":72,"searchDepth":85,"depth":85,"links":13405},[13406,13407,13408,13409,13410,13411,13412,13413],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":6726,"description":6731},[270,6916,6917],{"id":6920,"title":6921,"body":13418,"category":270,"cover":271,"description":6926,"extension":272,"meta":13561,"navigation":88,"path":7094,"pinned":275,"publishedAt":276,"seo":13562,"slug":7096,"stem":7097,"summary":7098,"tags":13563,"updatedAt":276,"visible":88,"__hash__":7102},{"type":7,"value":13419,"toc":13551},[13420,13422,13424,13426,13428,13432,13438,13440,13450,13452,13454,13506,13508,13513,13515,13517,13527,13529,13535,13537,13543,13545,13547,13549],[10,13421,6926],{},[14,13423,16],{"id":16},[10,13425,6931],{},[14,13427,22],{"id":22},[10,13429,13430],{},[26,13431],{"alt":6938,"src":6939},[10,13433,13434,6945,13436,6949],{},[33,13435,6944],{},[33,13437,6948],{},[14,13439,46],{"id":46},[48,13441,13442,13444,13448],{},[51,13443,6956],{},[51,13445,13446,6962],{},[33,13447,6961],{},[51,13449,6965],{},[14,13451,62],{"id":62},[10,13453,65],{},[67,13455,13456],{"className":69,"code":6972,"language":71,"meta":72,"style":72},[33,13457,13458,13462,13466,13470,13474,13478,13482,13486,13490,13494,13498,13502],{"__ignoreMap":72},[76,13459,13460],{"class":78,"line":79},[76,13461,6979],{},[76,13463,13464],{"class":78,"line":85},[76,13465,89],{"emptyLinePlaceholder":88},[76,13467,13468],{"class":78,"line":92},[76,13469,6988],{},[76,13471,13472],{"class":78,"line":98},[76,13473,89],{"emptyLinePlaceholder":88},[76,13475,13476],{"class":78,"line":104},[76,13477,6997],{},[76,13479,13480],{"class":78,"line":110},[76,13481,7002],{},[76,13483,13484],{"class":78,"line":116},[76,13485,6814],{},[76,13487,13488],{"class":78,"line":122},[76,13489,89],{"emptyLinePlaceholder":88},[76,13491,13492],{"class":78,"line":128},[76,13493,7015],{},[76,13495,13496],{"class":78,"line":133},[76,13497,7020],{},[76,13499,13500],{"class":78,"line":5814},[76,13501,6833],{},[76,13503,13504],{"class":78,"line":5819},[76,13505,7029],{},[10,13507,139],{},[67,13509,13511],{"className":13510,"code":7035,"language":145,"meta":72},[143],[33,13512,7035],{"__ignoreMap":72},[10,13514,150],{},[14,13516,153],{"id":153},[155,13518,13519,13523],{},[51,13520,13521,7048],{},[33,13522,6944],{},[51,13524,13525,7053],{},[33,13526,6948],{},[14,13528,214],{"id":214},[48,13530,13531,13533],{},[51,13532,7060],{},[51,13534,7063],{},[14,13536,235],{"id":235},[155,13538,13539,13541],{},[51,13540,7070],{},[51,13542,7073],{},[10,13544,246],{},[14,13546,249],{"id":249},[10,13548,7080],{},[254,13550,256],{},{"title":72,"searchDepth":85,"depth":85,"links":13552},[13553,13554,13555,13556,13557,13558,13559,13560],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":6921,"description":6926},[270,7100,7101],{"id":7104,"title":7105,"body":13565,"category":270,"cover":271,"description":7110,"extension":272,"meta":13716,"navigation":88,"path":7295,"pinned":275,"publishedAt":276,"seo":13717,"slug":7297,"stem":7298,"summary":7299,"tags":13718,"updatedAt":276,"visible":88,"__hash__":7303},{"type":7,"value":13566,"toc":13706},[13567,13569,13571,13573,13575,13579,13583,13585,13599,13601,13603,13655,13657,13662,13664,13666,13678,13680,13690,13692,13698,13700,13702,13704],[10,13568,7110],{},[14,13570,16],{"id":16},[10,13572,7115],{},[14,13574,22],{"id":22},[10,13576,13577],{},[26,13578],{"alt":7122,"src":7123},[10,13580,13581,7129],{},[33,13582,7128],{},[14,13584,46],{"id":46},[48,13586,13587,13593,13597],{},[51,13588,2378,13589,7139,13591,7143],{},[33,13590,7138],{},[33,13592,7142],{},[51,13594,7146,13595,7150],{},[33,13596,7149],{},[51,13598,7153],{},[14,13600,62],{"id":62},[10,13602,65],{},[67,13604,13605],{"className":69,"code":7160,"language":71,"meta":72,"style":72},[33,13606,13607,13611,13615,13619,13623,13627,13631,13635,13639,13643,13647,13651],{"__ignoreMap":72},[76,13608,13609],{"class":78,"line":79},[76,13610,7167],{},[76,13612,13613],{"class":78,"line":85},[76,13614,89],{"emptyLinePlaceholder":88},[76,13616,13617],{"class":78,"line":92},[76,13618,7176],{},[76,13620,13621],{"class":78,"line":98},[76,13622,7181],{},[76,13624,13625],{"class":78,"line":104},[76,13626,7186],{},[76,13628,13629],{"class":78,"line":110},[76,13630,7191],{},[76,13632,13633],{"class":78,"line":116},[76,13634,7196],{},[76,13636,13637],{"class":78,"line":122},[76,13638,89],{"emptyLinePlaceholder":88},[76,13640,13641],{"class":78,"line":128},[76,13642,7205],{},[76,13644,13645],{"class":78,"line":133},[76,13646,7210],{},[76,13648,13649],{"class":78,"line":5814},[76,13650,7215],{},[76,13652,13653],{"class":78,"line":5819},[76,13654,7220],{},[10,13656,139],{},[67,13658,13660],{"className":13659,"code":7226,"language":145,"meta":72},[143],[33,13661,7226],{"__ignoreMap":72},[10,13663,150],{},[14,13665,153],{"id":153},[155,13667,13668,13674],{},[51,13669,13670,7240,13672,7243],{},[33,13671,7239],{},[33,13673,7149],{},[51,13675,13676,7248],{},[33,13677,7128],{},[14,13679,214],{"id":214},[48,13681,13682,13684],{},[51,13683,7255],{},[51,13685,7258,13686,7261,13688,7264],{},[33,13687,7138],{},[33,13689,7142],{},[14,13691,235],{"id":235},[155,13693,13694,13696],{},[51,13695,7271],{},[51,13697,7274],{},[10,13699,246],{},[14,13701,249],{"id":249},[10,13703,7281],{},[254,13705,256],{},{"title":72,"searchDepth":85,"depth":85,"links":13707},[13708,13709,13710,13711,13712,13713,13714,13715],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":7105,"description":7110},[270,7301,7302],{"id":7305,"title":7306,"body":13720,"category":270,"cover":271,"description":7311,"extension":272,"meta":13934,"navigation":88,"path":7585,"pinned":275,"publishedAt":276,"seo":13935,"slug":7587,"stem":7588,"summary":7589,"tags":13936,"updatedAt":276,"visible":88,"__hash__":7593},{"type":7,"value":13721,"toc":13921},[13722,13724,13726,13728,13730,13734,13740,13742,13754,13756,13758,13818,13820,13825,13827,13829,13847,13849,13857,13861,13869,13871,13875,13879,13885,13887,13897,13899,13913,13915,13917,13919],[10,13723,7311],{},[14,13725,16],{"id":16},[10,13727,7316],{},[14,13729,22],{"id":22},[10,13731,13732],{},[26,13733],{"alt":7323,"src":7324},[10,13735,7327,13736,7331,13738,7335],{},[33,13737,7330],{},[33,13739,7334],{},[14,13741,46],{"id":46},[48,13743,13744,13748,13752],{},[51,13745,7342,13746,7345],{},[33,13747,7330],{},[51,13749,13750,7351],{},[33,13751,7350],{},[51,13753,7354],{},[14,13755,62],{"id":62},[10,13757,65],{},[67,13759,13760],{"className":69,"code":7361,"language":71,"meta":72,"style":72},[33,13761,13762,13766,13770,13774,13778,13782,13786,13790,13794,13798,13802,13806,13810,13814],{"__ignoreMap":72},[76,13763,13764],{"class":78,"line":79},[76,13765,7368],{},[76,13767,13768],{"class":78,"line":85},[76,13769,7373],{},[76,13771,13772],{"class":78,"line":92},[76,13773,7378],{},[76,13775,13776],{"class":78,"line":98},[76,13777,7383],{},[76,13779,13780],{"class":78,"line":104},[76,13781,7388],{},[76,13783,13784],{"class":78,"line":110},[76,13785,89],{"emptyLinePlaceholder":88},[76,13787,13788],{"class":78,"line":116},[76,13789,7397],{},[76,13791,13792],{"class":78,"line":122},[76,13793,7402],{},[76,13795,13796],{"class":78,"line":128},[76,13797,7407],{},[76,13799,13800],{"class":78,"line":133},[76,13801,7412],{},[76,13803,13804],{"class":78,"line":5814},[76,13805,119],{},[76,13807,13808],{"class":78,"line":5819},[76,13809,7421],{},[76,13811,13812],{"class":78,"line":7424},[76,13813,7427],{},[76,13815,13816],{"class":78,"line":7430},[76,13817,7433],{},[10,13819,139],{},[67,13821,13823],{"className":13822,"code":7439,"language":145,"meta":72},[143],[33,13824,7439],{"__ignoreMap":72},[10,13826,150],{},[14,13828,153],{"id":153},[155,13830,13831,13839],{},[51,13832,13833,7452,13835,7455,13837,7459],{},[33,13834,3074],{},[33,13836,7350],{},[33,13838,7458],{},[51,13840,7462,13841,7465,13843,7468,13845,405],{},[33,13842,7330],{},[33,13844,42],{},[33,13846,7334],{},[174,13848,176],{"id":176},[10,13850,13851,36,13853,1198,13855,7481],{},[33,13852,7330],{},[33,13854,42],{},[33,13856,7334],{},[10,13858,13859],{},[26,13860],{"alt":7486,"src":7487},[10,13862,13863,7492,13865,7495,13867,7498],{},[33,13864,7330],{},[33,13866,42],{},[33,13868,7334],{},[174,13870,176],{"id":196},[10,13872,13873,7506],{},[33,13874,7505],{},[10,13876,13877],{},[26,13878],{"alt":7511,"src":7512},[10,13880,7515,13881,7518,13883,7521],{},[33,13882,7505],{},[33,13884,42],{},[14,13886,214],{"id":214},[48,13888,13889,13893],{},[51,13890,7528,13891,7532],{},[33,13892,7531],{},[51,13894,7535,13895,7538],{},[33,13896,7505],{},[14,13898,235],{"id":235},[155,13900,13901,13909],{},[51,13902,7545,13903,7549,13905,1198,13907,405],{},[33,13904,7548],{},[33,13906,7552],{},[33,13908,7555],{},[51,13910,7558,13911,7561],{},[33,13912,6766],{},[10,13914,246],{},[14,13916,249],{"id":249},[10,13918,7568],{},[254,13920,256],{},{"title":72,"searchDepth":85,"depth":85,"links":13922},[13923,13924,13925,13926,13927,13931,13932,13933],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":13928},[13929,13930],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":7306,"description":7311},[270,7591,7592],{"id":7595,"title":7596,"body":13938,"category":270,"cover":271,"description":7601,"extension":272,"meta":14089,"navigation":88,"path":7778,"pinned":275,"publishedAt":276,"seo":14090,"slug":7780,"stem":7781,"summary":7782,"tags":14091,"updatedAt":276,"visible":88,"__hash__":7785},{"type":7,"value":13939,"toc":14079},[13940,13942,13944,13946,13948,13952,13956,13958,13970,13972,13974,14022,14024,14029,14031,14033,14043,14045,14055,14057,14071,14073,14075,14077],[10,13941,7601],{},[14,13943,16],{"id":16},[10,13945,7606],{},[14,13947,22],{"id":22},[10,13949,13950],{},[26,13951],{"alt":7613,"src":7614},[10,13953,7617,13954,7620],{},[33,13955,6776],{},[14,13957,46],{"id":46},[48,13959,13960,13964,13968],{},[51,13961,13962,7629],{},[33,13963,6776],{},[51,13965,13966,7635],{},[33,13967,7634],{},[51,13969,7638],{},[14,13971,62],{"id":62},[10,13973,65],{},[67,13975,13976],{"className":69,"code":7645,"language":71,"meta":72,"style":72},[33,13977,13978,13982,13986,13990,13994,13998,14002,14006,14010,14014,14018],{"__ignoreMap":72},[76,13979,13980],{"class":78,"line":79},[76,13981,6588],{},[76,13983,13984],{"class":78,"line":85},[76,13985,89],{"emptyLinePlaceholder":88},[76,13987,13988],{"class":78,"line":92},[76,13989,6799],{},[76,13991,13992],{"class":78,"line":98},[76,13993,89],{"emptyLinePlaceholder":88},[76,13995,13996],{"class":78,"line":104},[76,13997,7668],{},[76,13999,14000],{"class":78,"line":110},[76,14001,7673],{},[76,14003,14004],{"class":78,"line":116},[76,14005,89],{"emptyLinePlaceholder":88},[76,14007,14008],{"class":78,"line":122},[76,14009,7682],{},[76,14011,14012],{"class":78,"line":128},[76,14013,7687],{},[76,14015,14016],{"class":78,"line":133},[76,14017,89],{"emptyLinePlaceholder":88},[76,14019,14020],{"class":78,"line":5814},[76,14021,7696],{},[10,14023,139],{},[67,14025,14027],{"className":14026,"code":7702,"language":145,"meta":72},[143],[33,14028,7702],{"__ignoreMap":72},[10,14030,150],{},[14,14032,153],{"id":153},[155,14034,14035,14041],{},[51,14036,7617,14037,7715,14039,405],{},[33,14038,6776],{},[33,14040,7718],{},[51,14042,7721],{},[14,14044,214],{"id":214},[48,14046,14047,14051],{},[51,14048,4772,14049,7730],{},[33,14050,6776],{},[51,14052,7733,14053,7736],{},[33,14054,6776],{},[14,14056,235],{"id":235},[155,14058,14059,14065],{},[51,14060,7743,14061,7747,14063,405],{},[33,14062,7746],{},[33,14064,6776],{},[51,14066,4772,14067,7754,14069,405],{},[33,14068,6776],{},[33,14070,7757],{},[10,14072,246],{},[14,14074,249],{"id":249},[10,14076,7764],{},[254,14078,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14080},[14081,14082,14083,14084,14085,14086,14087,14088],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":7596,"description":7601},[270,6776,7784],{"id":7787,"title":7788,"body":14093,"category":270,"cover":271,"description":7793,"extension":272,"meta":14264,"navigation":88,"path":8006,"pinned":275,"publishedAt":276,"seo":14265,"slug":8008,"stem":8009,"summary":8010,"tags":14266,"updatedAt":276,"visible":88,"__hash__":8014},{"type":7,"value":14094,"toc":14252},[14095,14097,14099,14101,14103,14107,14109,14111,14123,14125,14127,14183,14185,14190,14192,14194,14210,14212,14214,14218,14224,14226,14234,14236,14244,14246,14248,14250],[10,14096,7793],{},[14,14098,16],{"id":16},[10,14100,7798],{},[14,14102,22],{"id":22},[10,14104,14105],{},[26,14106],{"alt":7805,"src":7806},[10,14108,7809],{},[14,14110,46],{"id":46},[48,14112,14113,14117,14121],{},[51,14114,14115,7819],{},[33,14116,7818],{},[51,14118,14119,7825],{},[33,14120,7824],{},[51,14122,7828],{},[14,14124,62],{"id":62},[10,14126,65],{},[67,14128,14129],{"className":69,"code":7835,"language":71,"meta":72,"style":72},[33,14130,14131,14135,14139,14143,14147,14151,14155,14159,14163,14167,14171,14175,14179],{"__ignoreMap":72},[76,14132,14133],{"class":78,"line":79},[76,14134,7842],{},[76,14136,14137],{"class":78,"line":85},[76,14138,7847],{},[76,14140,14141],{"class":78,"line":92},[76,14142,7852],{},[76,14144,14145],{"class":78,"line":98},[76,14146,7857],{},[76,14148,14149],{"class":78,"line":104},[76,14150,89],{"emptyLinePlaceholder":88},[76,14152,14153],{"class":78,"line":110},[76,14154,7866],{},[76,14156,14157],{"class":78,"line":116},[76,14158,7871],{},[76,14160,14161],{"class":78,"line":122},[76,14162,7876],{},[76,14164,14165],{"class":78,"line":128},[76,14166,7881],{},[76,14168,14169],{"class":78,"line":133},[76,14170,89],{"emptyLinePlaceholder":88},[76,14172,14173],{"class":78,"line":5814},[76,14174,7890],{},[76,14176,14177],{"class":78,"line":5819},[76,14178,7895],{},[76,14180,14181],{"class":78,"line":7424},[76,14182,7900],{},[10,14184,139],{},[67,14186,14188],{"className":14187,"code":7906,"language":145,"meta":72},[143],[33,14189,7906],{"__ignoreMap":72},[10,14191,150],{},[14,14193,153],{"id":153},[155,14195,14196,14202],{},[51,14197,7917,14198,7921,14200,7924],{},[33,14199,7920],{},[33,14201,7824],{},[51,14203,14204,7930,14206,7934,14208,7937],{},[33,14205,7929],{},[33,14207,7933],{},[33,14209,7818],{},[174,14211,176],{"id":176},[10,14213,7942],{},[10,14215,14216],{},[26,14217],{"alt":7947,"src":7948},[10,14219,7951,14220,1198,14222,7957],{},[33,14221,4569],{},[33,14223,7956],{},[14,14225,214],{"id":214},[48,14227,14228,14232],{},[51,14229,7964,14230,7967],{},[33,14231,7818],{},[51,14233,7970],{},[14,14235,235],{"id":235},[155,14237,14238,14242],{},[51,14239,5282,14240,7980],{},[33,14241,7979],{},[51,14243,7983],{},[10,14245,246],{},[14,14247,249],{"id":249},[10,14249,7990],{},[254,14251,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14253},[14254,14255,14256,14257,14258,14261,14262,14263],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":14259},[14260],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":7788,"description":7793},[270,8012,8013],{"id":8016,"title":8017,"body":14268,"category":270,"cover":271,"description":8022,"extension":272,"meta":14415,"navigation":88,"path":8201,"pinned":275,"publishedAt":276,"seo":14416,"slug":8203,"stem":8204,"summary":8205,"tags":14417,"updatedAt":276,"visible":88,"__hash__":8209},{"type":7,"value":14269,"toc":14405},[14270,14272,14274,14276,14278,14282,14284,14286,14294,14296,14298,14354,14356,14361,14363,14365,14377,14379,14385,14387,14397,14399,14401,14403],[10,14271,8022],{},[14,14273,16],{"id":16},[10,14275,8027],{},[14,14277,22],{"id":22},[10,14279,14280],{},[26,14281],{"alt":8034,"src":8035},[10,14283,8038],{},[14,14285,46],{"id":46},[48,14287,14288,14290,14292],{},[51,14289,8045],{},[51,14291,8048],{},[51,14293,8051],{},[14,14295,62],{"id":62},[10,14297,65],{},[67,14299,14300],{"className":69,"code":8058,"language":71,"meta":72,"style":72},[33,14301,14302,14306,14310,14314,14318,14322,14326,14330,14334,14338,14342,14346,14350],{"__ignoreMap":72},[76,14303,14304],{"class":78,"line":79},[76,14305,8065],{},[76,14307,14308],{"class":78,"line":85},[76,14309,8070],{},[76,14311,14312],{"class":78,"line":92},[76,14313,8075],{},[76,14315,14316],{"class":78,"line":98},[76,14317,89],{"emptyLinePlaceholder":88},[76,14319,14320],{"class":78,"line":104},[76,14321,8084],{},[76,14323,14324],{"class":78,"line":110},[76,14325,8089],{},[76,14327,14328],{"class":78,"line":116},[76,14329,8094],{},[76,14331,14332],{"class":78,"line":122},[76,14333,89],{"emptyLinePlaceholder":88},[76,14335,14336],{"class":78,"line":128},[76,14337,8103],{},[76,14339,14340],{"class":78,"line":133},[76,14341,8108],{},[76,14343,14344],{"class":78,"line":5814},[76,14345,89],{"emptyLinePlaceholder":88},[76,14347,14348],{"class":78,"line":5819},[76,14349,8117],{},[76,14351,14352],{"class":78,"line":7424},[76,14353,8122],{},[10,14355,139],{},[67,14357,14359],{"className":14358,"code":8128,"language":145,"meta":72},[143],[33,14360,8128],{"__ignoreMap":72},[10,14362,150],{},[14,14364,153],{"id":153},[155,14366,14367,14373],{},[51,14368,14369,8142,14371,8146],{},[33,14370,8141],{},[33,14372,8145],{},[51,14374,8149,14375,8153],{},[33,14376,8152],{},[14,14378,214],{"id":214},[48,14380,14381,14383],{},[51,14382,8160],{},[51,14384,8163],{},[14,14386,235],{"id":235},[155,14388,14389,14395],{},[51,14390,8170,14391,8174,14393,405],{},[33,14392,8173],{},[33,14394,8177],{},[51,14396,8180],{},[10,14398,246],{},[14,14400,249],{"id":249},[10,14402,8187],{},[254,14404,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14406},[14407,14408,14409,14410,14411,14412,14413,14414],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":8017,"description":8022},[270,8207,8208],{"id":8211,"title":8212,"body":14419,"category":270,"cover":271,"description":8217,"extension":272,"meta":14582,"navigation":88,"path":8421,"pinned":275,"publishedAt":276,"seo":14583,"slug":8423,"stem":8424,"summary":8425,"tags":14584,"updatedAt":276,"visible":88,"__hash__":8429},{"type":7,"value":14420,"toc":14570},[14421,14423,14425,14427,14429,14433,14437,14439,14455,14457,14459,14503,14505,14510,14512,14514,14528,14530,14534,14538,14542,14544,14550,14552,14562,14564,14566,14568],[10,14422,8217],{},[14,14424,16],{"id":16},[10,14426,8222],{},[14,14428,22],{"id":22},[10,14430,14431],{},[26,14432],{"alt":8229,"src":8230},[10,14434,8233,14435,8237],{},[33,14436,8236],{},[14,14438,46],{"id":46},[48,14440,14441,14447,14453],{},[51,14442,14443,8247,14445,8251],{},[33,14444,8246],{},[33,14446,8250],{},[51,14448,8254,14449,8258,14451,8261],{},[33,14450,8257],{},[33,14452,4323],{},[51,14454,8264],{},[14,14456,62],{"id":62},[10,14458,65],{},[67,14460,14461],{"className":69,"code":8271,"language":71,"meta":72,"style":72},[33,14462,14463,14467,14471,14475,14479,14483,14487,14491,14495,14499],{"__ignoreMap":72},[76,14464,14465],{"class":78,"line":79},[76,14466,8278],{},[76,14468,14469],{"class":78,"line":85},[76,14470,8283],{},[76,14472,14473],{"class":78,"line":92},[76,14474,8288],{},[76,14476,14477],{"class":78,"line":98},[76,14478,8293],{},[76,14480,14481],{"class":78,"line":104},[76,14482,8298],{},[76,14484,14485],{"class":78,"line":110},[76,14486,89],{"emptyLinePlaceholder":88},[76,14488,14489],{"class":78,"line":116},[76,14490,8307],{},[76,14492,14493],{"class":78,"line":122},[76,14494,8312],{},[76,14496,14497],{"class":78,"line":128},[76,14498,8312],{},[76,14500,14501],{"class":78,"line":133},[76,14502,8312],{},[10,14504,139],{},[67,14506,14508],{"className":14507,"code":8326,"language":145,"meta":72},[143],[33,14509,8326],{"__ignoreMap":72},[10,14511,150],{},[14,14513,153],{"id":153},[155,14515,14516,14520],{},[51,14517,7917,14518,8340],{},[33,14519,8339],{},[51,14521,8343,14522,8346,14524,8349,14526,8353],{},[33,14523,8250],{},[33,14525,8236],{},[33,14527,8352],{},[174,14529,176],{"id":176},[10,14531,8358,14532,8361],{},[33,14533,8250],{},[10,14535,14536],{},[26,14537],{"alt":8366,"src":8367},[10,14539,8370,14540,8373],{},[33,14541,8236],{},[14,14543,214],{"id":214},[48,14545,14546,14548],{},[51,14547,8380],{},[51,14549,8383],{},[14,14551,235],{"id":235},[155,14553,14554,14556],{},[51,14555,8390],{},[51,14557,4048,14558,8395,14560,8398],{},[33,14559,4323],{},[33,14561,8250],{},[10,14563,246],{},[14,14565,249],{"id":249},[10,14567,8405],{},[254,14569,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14571},[14572,14573,14574,14575,14576,14579,14580,14581],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":14577},[14578],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":8212,"description":8217},[270,8427,8428],{"id":8431,"title":8432,"body":14586,"category":270,"cover":271,"description":8437,"extension":272,"meta":14769,"navigation":88,"path":8662,"pinned":275,"publishedAt":276,"seo":14770,"slug":8664,"stem":8665,"summary":8666,"tags":14771,"updatedAt":276,"visible":88,"__hash__":8669},{"type":7,"value":14587,"toc":14757},[14588,14590,14592,14594,14596,14600,14602,14604,14618,14620,14622,14690,14692,14697,14699,14701,14715,14717,14719,14723,14729,14731,14739,14741,14749,14751,14753,14755],[10,14589,8437],{},[14,14591,16],{"id":16},[10,14593,8442],{},[14,14595,22],{"id":22},[10,14597,14598],{},[26,14599],{"alt":8449,"src":8450},[10,14601,8453],{},[14,14603,46],{"id":46},[48,14605,14606,14612,14614],{},[51,14607,14608,8463,14610,405],{},[33,14609,8462],{},[33,14611,8466],{},[51,14613,8469],{},[51,14615,14616,8475],{},[33,14617,8474],{},[14,14619,62],{"id":62},[10,14621,65],{},[67,14623,14624],{"className":69,"code":8482,"language":71,"meta":72,"style":72},[33,14625,14626,14630,14634,14638,14642,14646,14650,14654,14658,14662,14666,14670,14674,14678,14682,14686],{"__ignoreMap":72},[76,14627,14628],{"class":78,"line":79},[76,14629,8489],{},[76,14631,14632],{"class":78,"line":85},[76,14633,89],{"emptyLinePlaceholder":88},[76,14635,14636],{"class":78,"line":92},[76,14637,8498],{},[76,14639,14640],{"class":78,"line":98},[76,14641,8503],{},[76,14643,14644],{"class":78,"line":104},[76,14645,8508],{},[76,14647,14648],{"class":78,"line":110},[76,14649,8513],{},[76,14651,14652],{"class":78,"line":116},[76,14653,8518],{},[76,14655,14656],{"class":78,"line":122},[76,14657,8523],{},[76,14659,14660],{"class":78,"line":128},[76,14661,8528],{},[76,14663,14664],{"class":78,"line":133},[76,14665,8533],{},[76,14667,14668],{"class":78,"line":5814},[76,14669,89],{"emptyLinePlaceholder":88},[76,14671,14672],{"class":78,"line":5819},[76,14673,8542],{},[76,14675,14676],{"class":78,"line":7424},[76,14677,6167],{},[76,14679,14680],{"class":78,"line":7430},[76,14681,6172],{},[76,14683,14684],{"class":78,"line":8553},[76,14685,89],{"emptyLinePlaceholder":88},[76,14687,14688],{"class":78,"line":8558},[76,14689,8561],{},[10,14691,139],{},[67,14693,14695],{"className":14694,"code":8567,"language":145,"meta":72},[143],[33,14696,8567],{"__ignoreMap":72},[10,14698,150],{},[14,14700,153],{"id":153},[155,14702,14703,14713],{},[51,14704,8578,14705,8582,14707,8586,14709,8590,14711,405],{},[33,14706,8581],{},[33,14708,8585],{},[33,14710,8589],{},[33,14712,8581],{},[51,14714,8595],{},[174,14716,176],{"id":176},[10,14718,8600],{},[10,14720,14721],{},[26,14722],{"alt":8605,"src":8606},[10,14724,14725,8611,14727,405],{},[33,14726,8462],{},[33,14728,8466],{},[14,14730,214],{"id":214},[48,14732,14733,14737],{},[51,14734,8620,14735,405],{},[33,14736,5365],{},[51,14738,8625],{},[14,14740,235],{"id":235},[155,14742,14743,14745],{},[51,14744,8632],{},[51,14746,8635,14747,8639],{},[33,14748,8638],{},[10,14750,246],{},[14,14752,249],{"id":249},[10,14754,8646],{},[254,14756,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14758},[14759,14760,14761,14762,14763,14766,14767,14768],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":14764},[14765],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":8432,"description":8437},[270,8668,5316],{"id":8671,"title":8672,"body":14773,"category":270,"cover":271,"description":8677,"extension":272,"meta":14932,"navigation":88,"path":8865,"pinned":275,"publishedAt":276,"seo":14933,"slug":8867,"stem":8868,"summary":8869,"tags":14934,"updatedAt":276,"visible":88,"__hash__":8873},{"type":7,"value":14774,"toc":14920},[14775,14777,14779,14781,14783,14787,14789,14791,14799,14801,14803,14867,14869,14874,14876,14878,14886,14888,14890,14894,14896,14898,14904,14906,14912,14914,14916,14918],[10,14776,8677],{},[14,14778,16],{"id":16},[10,14780,8682],{},[14,14782,22],{"id":22},[10,14784,14785],{},[26,14786],{"alt":8689,"src":8690},[10,14788,8693],{},[14,14790,46],{"id":46},[48,14792,14793,14795,14797],{},[51,14794,8700],{},[51,14796,8703],{},[51,14798,8706],{},[14,14800,62],{"id":62},[10,14802,65],{},[67,14804,14805],{"className":69,"code":8713,"language":71,"meta":72,"style":72},[33,14806,14807,14811,14815,14819,14823,14827,14831,14835,14839,14843,14847,14851,14855,14859,14863],{"__ignoreMap":72},[76,14808,14809],{"class":78,"line":79},[76,14810,8720],{},[76,14812,14813],{"class":78,"line":85},[76,14814,8725],{},[76,14816,14817],{"class":78,"line":92},[76,14818,89],{"emptyLinePlaceholder":88},[76,14820,14821],{"class":78,"line":98},[76,14822,8734],{},[76,14824,14825],{"class":78,"line":104},[76,14826,89],{"emptyLinePlaceholder":88},[76,14828,14829],{"class":78,"line":110},[76,14830,8743],{},[76,14832,14833],{"class":78,"line":116},[76,14834,8748],{},[76,14836,14837],{"class":78,"line":122},[76,14838,8753],{},[76,14840,14841],{"class":78,"line":128},[76,14842,89],{"emptyLinePlaceholder":88},[76,14844,14845],{"class":78,"line":133},[76,14846,8762],{},[76,14848,14849],{"class":78,"line":5814},[76,14850,8767],{},[76,14852,14853],{"class":78,"line":5819},[76,14854,8772],{},[76,14856,14857],{"class":78,"line":7424},[76,14858,89],{"emptyLinePlaceholder":88},[76,14860,14861],{"class":78,"line":7430},[76,14862,6181],{},[76,14864,14865],{"class":78,"line":8553},[76,14866,8785],{},[10,14868,139],{},[67,14870,14872],{"className":14871,"code":8791,"language":145,"meta":72},[143],[33,14873,8791],{"__ignoreMap":72},[10,14875,150],{},[14,14877,153],{"id":153},[155,14879,14880,14884],{},[51,14881,14882,8805],{},[33,14883,8804],{},[51,14885,8808],{},[174,14887,176],{"id":176},[10,14889,8813],{},[10,14891,14892],{},[26,14893],{"alt":8818,"src":8819},[10,14895,8822],{},[14,14897,214],{"id":214},[48,14899,14900,14902],{},[51,14901,8829],{},[51,14903,8832],{},[14,14905,235],{"id":235},[155,14907,14908,14910],{},[51,14909,8839],{},[51,14911,8842],{},[10,14913,246],{},[14,14915,249],{"id":249},[10,14917,8849],{},[254,14919,256],{},{"title":72,"searchDepth":85,"depth":85,"links":14921},[14922,14923,14924,14925,14926,14929,14930,14931],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":14927},[14928],{"id":176,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":8672,"description":8677},[270,8871,8872],{"id":8875,"title":8876,"body":14936,"category":270,"cover":271,"description":8881,"extension":272,"meta":15174,"navigation":88,"path":9182,"pinned":275,"publishedAt":276,"seo":15175,"slug":9184,"stem":9185,"summary":9186,"tags":15176,"updatedAt":276,"visible":88,"__hash__":9190},{"type":7,"value":14937,"toc":15161},[14938,14940,14942,14944,14946,14950,14952,14954,14964,14966,14968,15084,15086,15091,15093,15095,15105,15107,15109,15113,15115,15117,15119,15123,15127,15129,15137,15139,15153,15155,15157,15159],[10,14939,8881],{},[14,14941,16],{"id":16},[10,14943,8886],{},[14,14945,22],{"id":22},[10,14947,14948],{},[26,14949],{"alt":8893,"src":8894},[10,14951,8897],{},[14,14953,46],{"id":46},[48,14955,14956,14958,14960],{},[51,14957,8904],{},[51,14959,8907],{},[51,14961,8910,14962,8914],{},[33,14963,8913],{},[14,14965,62],{"id":62},[10,14967,65],{},[67,14969,14970],{"className":69,"code":8921,"language":71,"meta":72,"style":72},[33,14971,14972,14976,14980,14984,14988,14992,14996,15000,15004,15008,15012,15016,15020,15024,15028,15032,15036,15040,15044,15048,15052,15056,15060,15064,15068,15072,15076,15080],{"__ignoreMap":72},[76,14973,14974],{"class":78,"line":79},[76,14975,6979],{},[76,14977,14978],{"class":78,"line":85},[76,14979,6588],{},[76,14981,14982],{"class":78,"line":92},[76,14983,89],{"emptyLinePlaceholder":88},[76,14985,14986],{"class":78,"line":98},[76,14987,8940],{},[76,14989,14990],{"class":78,"line":104},[76,14991,8945],{},[76,14993,14994],{"class":78,"line":110},[76,14995,8950],{},[76,14997,14998],{"class":78,"line":116},[76,14999,8955],{},[76,15001,15002],{"class":78,"line":122},[76,15003,89],{"emptyLinePlaceholder":88},[76,15005,15006],{"class":78,"line":128},[76,15007,8964],{},[76,15009,15010],{"class":78,"line":133},[76,15011,8969],{},[76,15013,15014],{"class":78,"line":5814},[76,15015,8974],{},[76,15017,15018],{"class":78,"line":5819},[76,15019,8979],{},[76,15021,15022],{"class":78,"line":7424},[76,15023,8984],{},[76,15025,15026],{"class":78,"line":7430},[76,15027,89],{"emptyLinePlaceholder":88},[76,15029,15030],{"class":78,"line":8553},[76,15031,8993],{},[76,15033,15034],{"class":78,"line":8558},[76,15035,8998],{},[76,15037,15038],{"class":78,"line":9001},[76,15039,9004],{},[76,15041,15042],{"class":78,"line":9007},[76,15043,89],{"emptyLinePlaceholder":88},[76,15045,15046],{"class":78,"line":9012},[76,15047,9015],{},[76,15049,15050],{"class":78,"line":9018},[76,15051,89],{"emptyLinePlaceholder":88},[76,15053,15054],{"class":78,"line":9023},[76,15055,7397],{},[76,15057,15058],{"class":78,"line":9028},[76,15059,9031],{},[76,15061,15062],{"class":78,"line":9034},[76,15063,9037],{},[76,15065,15066],{"class":78,"line":9040},[76,15067,9043],{},[76,15069,15070],{"class":78,"line":9046},[76,15071,7407],{},[76,15073,15074],{"class":78,"line":9051},[76,15075,9054],{},[76,15077,15078],{"class":78,"line":9057},[76,15079,119],{},[76,15081,15082],{"class":78,"line":9062},[76,15083,9065],{},[10,15085,139],{},[67,15087,15089],{"className":15088,"code":9071,"language":145,"meta":72},[143],[33,15090,9071],{"__ignoreMap":72},[10,15092,150],{},[14,15094,153],{"id":153},[155,15096,15097,15101],{},[51,15098,9082,15099,9085],{},[33,15100,8913],{},[51,15102,15103,9090],{},[33,15104,8145],{},[174,15106,176],{"id":176},[10,15108,9095],{},[10,15110,15111],{},[26,15112],{"alt":9100,"src":9101},[10,15114,9104],{},[174,15116,176],{"id":196},[10,15118,9109],{},[10,15120,15121],{},[26,15122],{"alt":9114,"src":9115},[10,15124,9118,15125,9122],{},[33,15126,9121],{},[14,15128,214],{"id":214},[48,15130,15131,15133],{},[51,15132,9129],{},[51,15134,9132,15135,9135],{},[33,15136,9121],{},[14,15138,235],{"id":235},[155,15140,15141,15145,15147],{},[51,15142,9142,15143,9145],{},[33,15144,9121],{},[51,15146,9148],{},[51,15148,9151,15149,9155,15151,9158],{},[33,15150,9154],{},[33,15152,6123],{},[10,15154,246],{},[14,15156,249],{"id":249},[10,15158,9165],{},[254,15160,256],{},{"title":72,"searchDepth":85,"depth":85,"links":15162},[15163,15164,15165,15166,15167,15171,15172,15173],{"id":16,"depth":85,"text":16},{"id":22,"depth":85,"text":22},{"id":46,"depth":85,"text":46},{"id":62,"depth":85,"text":62},{"id":153,"depth":85,"text":153,"children":15168},[15169,15170],{"id":176,"depth":92,"text":176},{"id":196,"depth":92,"text":176},{"id":214,"depth":85,"text":214},{"id":235,"depth":85,"text":235},{"id":249,"depth":85,"text":249},{},{"title":8876,"description":8881},[270,9188,9189],{"id":1099,"title":1100,"body":15178,"category":270,"cover":1108,"description":72,"extension":272,"meta":15414,"navigation":88,"path":1422,"pinned":275,"publishedAt":1423,"seo":15415,"slug":1425,"stem":1426,"summary":1427,"tags":15416,"updatedAt":1423,"visible":88,"__hash__":1431},{"type":7,"value":15179,"toc":15399},[15180,15184,15186,15188,15190,15192,15212,15214,15219,15221,15223,15251,15257,15259,15263,15265,15285,15287,15297,15299,15301,15303,15305,15307,15309,15311,15313,15315,15335,15337,15339,15343,15345,15347,15349,15351,15355,15357,15375,15377,15379,15381,15383,15385,15387,15389,15391,15393,15395,15397],[10,15181,15182],{},[26,15183],{"alt":1107,"src":1108},[10,15185,1111],{},[10,15187,1114],{},[14,15189,1118],{"id":1117},[10,15191,1121],{},[67,15193,15194],{"className":69,"code":1124,"language":71,"meta":72,"style":72},[33,15195,15196,15200,15204,15208],{"__ignoreMap":72},[76,15197,15198],{"class":78,"line":79},[76,15199,1131],{},[76,15201,15202],{"class":78,"line":85},[76,15203,1136],{},[76,15205,15206],{"class":78,"line":92},[76,15207,89],{"emptyLinePlaceholder":88},[76,15209,15210],{"class":78,"line":98},[76,15211,1145],{},[10,15213,1148],{},[67,15215,15217],{"className":15216,"code":1152,"language":145,"meta":72},[143],[33,15218,1152],{"__ignoreMap":72},[10,15220,1157],{},[10,15222,1160],{},[67,15224,15225],{"className":69,"code":1163,"language":71,"meta":72,"style":72},[33,15226,15227,15231,15235,15239,15243,15247],{"__ignoreMap":72},[76,15228,15229],{"class":78,"line":79},[76,15230,1170],{},[76,15232,15233],{"class":78,"line":85},[76,15234,89],{"emptyLinePlaceholder":88},[76,15236,15237],{"class":78,"line":92},[76,15238,1179],{},[76,15240,15241],{"class":78,"line":98},[76,15242,1184],{},[76,15244,15245],{"class":78,"line":104},[76,15246,119],{},[76,15248,15249],{"class":78,"line":110},[76,15250,1193],{},[10,15252,15253,1198,15255,1201],{},[33,15254,35],{},[33,15256,42],{},[14,15258,1205],{"id":1204},[10,15260,1208,15261,1212],{},[33,15262,1211],{},[10,15264,1215],{},[67,15266,15267],{"className":69,"code":1218,"language":71,"meta":72,"style":72},[33,15268,15269,15273,15277,15281],{"__ignoreMap":72},[76,15270,15271],{"class":78,"line":79},[76,15272,1225],{},[76,15274,15275],{"class":78,"line":85},[76,15276,1230],{},[76,15278,15279],{"class":78,"line":92},[76,15280,1235],{},[76,15282,15283],{"class":78,"line":98},[76,15284,1240],{},[10,15286,1243],{},[67,15288,15289],{"className":634,"code":1246,"language":636,"meta":72,"style":72},[33,15290,15291],{"__ignoreMap":72},[76,15292,15293,15295],{"class":78,"line":79},[76,15294,734],{"class":643},[76,15296,1255],{"class":679},[10,15298,1258],{},[14,15300,1262],{"id":1261},[174,15302,1265],{"id":1265},[10,15304,1268],{},[174,15306,1271],{"id":1271},[10,15308,1274],{},[174,15310,1277],{"id":1277},[10,15312,1280],{},[10,15314,1283],{},[67,15316,15317],{"className":69,"code":1286,"language":71,"meta":72,"style":72},[33,15318,15319,15323,15327,15331],{"__ignoreMap":72},[76,15320,15321],{"class":78,"line":79},[76,15322,1293],{},[76,15324,15325],{"class":78,"line":85},[76,15326,89],{"emptyLinePlaceholder":88},[76,15328,15329],{"class":78,"line":92},[76,15330,1302],{},[76,15332,15333],{"class":78,"line":98},[76,15334,1307],{},[10,15336,1310],{},[174,15338,1313],{"id":1313},[10,15340,1316,15341,1319],{},[33,15342,304],{},[10,15344,1322],{},[174,15346,1325],{"id":1325},[10,15348,1328],{},[14,15350,1332],{"id":1331},[10,15352,15353],{},[26,15354],{"alt":1337,"src":1338},[10,15356,1341],{},[48,15358,15359,15361,15363,15365,15367,15369,15371,15373],{},[51,15360,1346],{},[51,15362,1349],{},[51,15364,1352],{},[51,15366,1355],{},[51,15368,1358],{},[51,15370,1361],{},[51,15372,1364],{},[51,15374,1367],{},[10,15376,1370],{},[14,15378,1374],{"id":1373},[10,15380,1377],{},[10,15382,1380],{},[14,15384,1384],{"id":1383},[10,15386,1387],{},[10,15388,1390],{},[10,15390,1393],{},[14,15392,1396],{"id":1396},[10,15394,1399],{},[10,15396,1402],{},[254,15398,1405],{},{"title":72,"searchDepth":85,"depth":85,"links":15400},[15401,15402,15403,15410,15411,15412,15413],{"id":1117,"depth":85,"text":1118},{"id":1204,"depth":85,"text":1205},{"id":1261,"depth":85,"text":1262,"children":15404},[15405,15406,15407,15408,15409],{"id":1265,"depth":92,"text":1265},{"id":1271,"depth":92,"text":1271},{"id":1277,"depth":92,"text":1277},{"id":1313,"depth":92,"text":1313},{"id":1325,"depth":92,"text":1325},{"id":1331,"depth":85,"text":1332},{"id":1373,"depth":85,"text":1374},{"id":1383,"depth":85,"text":1384},{"id":1396,"depth":85,"text":1396},{},{"title":1100,"description":72},[270,1429,1430],{"id":286,"title":287,"body":15418,"category":270,"cover":271,"description":72,"extension":272,"meta":15997,"navigation":88,"path":1088,"pinned":275,"publishedAt":1089,"seo":15998,"slug":1091,"stem":1092,"summary":1093,"tags":15999,"updatedAt":1089,"visible":88,"__hash__":1097},{"type":7,"value":15419,"toc":15973},[15420,15422,15424,15426,15430,15432,15434,15458,15470,15472,15474,15479,15483,15487,15499,15503,15507,15511,15513,15547,15549,15553,15557,15559,15581,15611,15623,15633,15641,15643,15649,15659,15661,15666,15670,15672,15686,15692,15712,15714,15716,15718,15728,15732,15734,15743,15747,15749,15751,15771,15775,15777,15779,15781,15783,15803,15805,15807,15809,15835,15837,15853,15855,15871,15875,15877,15879,15899,15901,15903,15905,15909,15919,15921,15923,15925,15935,15943,15945,15947,15961,15971],[14,15421,292],{"id":292},[10,15423,295],{},[10,15425,298],{},[10,15427,301,15428,305],{},[33,15429,304],{},[14,15431,308],{"id":308},[10,15433,311],{},[313,15435,15436,15438],{},[10,15437,317],{},[313,15439,15440,15446,15448,15452,15454],{},[10,15441,322,15442,326,15444,330],{},[33,15443,325],{},[33,15445,329],{},[10,15447,333],{},[10,15449,336,15450,341],{},[338,15451,340],{},[10,15453,344],{},[10,15455,15456],{},[26,15457],{"alt":349,"src":350},[313,15459,15460,15462],{},[10,15461,355],{},[313,15463,15464,15466],{},[10,15465,360],{},[10,15467,15468],{},[26,15469],{"alt":365,"src":366},[14,15471,370],{"id":369},[174,15473,374],{"id":373},[10,15475,377,15476,385],{},[379,15477,384],{"href":381,"rel":15478},[383],[313,15480,15481],{},[10,15482,390],{},[10,15484,15485],{},[26,15486],{"alt":395,"src":396},[48,15488,15489,15493,15497],{},[51,15490,401,15491,405],{},[338,15492,404],{},[51,15494,408,15495,405],{},[338,15496,411],{},[51,15498,414],{},[10,15500,15501],{},[26,15502],{"alt":419,"src":420},[313,15504,15505],{},[10,15506,425],{},[10,15508,15509],{},[26,15510],{"alt":430,"src":431},[174,15512,435],{"id":434},[313,15514,15515,15519,15523,15543],{},[313,15516,15517],{},[10,15518,442],{},[10,15520,445,15521,449],{},[338,15522,448],{},[67,15524,15525],{"className":69,"code":452,"language":71,"meta":72,"style":72},[33,15526,15527,15531,15535,15539],{"__ignoreMap":72},[76,15528,15529],{"class":78,"line":79},[76,15530,459],{},[76,15532,15533],{"class":78,"line":85},[76,15534,464],{},[76,15536,15537],{"class":78,"line":92},[76,15538,469],{},[76,15540,15541],{"class":78,"line":98},[76,15542,474],{},[10,15544,477,15545,481],{},[338,15546,480],{},[10,15548,484],{},[10,15550,487,15551,490],{},[33,15552,71],{},[10,15554,15555],{},[26,15556],{"alt":495,"src":496},[10,15558,499],{},[313,15560,15561,15563,15567],{},[10,15562,504],{},[10,15564,15565],{},[338,15566,509],{},[313,15568,15569,15573,15577],{},[10,15570,514,15571,517],{},[33,15572,71],{},[10,15574,520,15575,523],{},[33,15576,71],{},[10,15578,526,15579,530],{},[338,15580,529],{},[313,15582,15583,15585,15589],{},[10,15584,535],{},[10,15586,15587],{},[338,15588,540],{},[313,15590,15591,15597,15605,15607],{},[10,15592,15593,548,15595,552],{},[33,15594,547],{},[33,15596,551],{},[10,15598,555,15599,558,15601,562,15603,566],{},[33,15600,547],{},[338,15602,561],{},[338,15604,565],{},[10,15606,569],{},[10,15608,15609,575],{},[338,15610,574],{},[313,15612,15613,15615],{},[10,15614,580],{},[313,15616,15617,15621],{},[10,15618,585,15619,589],{},[338,15620,588],{},[10,15622,592],{},[313,15624,15625,15629],{},[10,15626,597,15627],{},[338,15628,600],{},[10,15630,15631],{},[26,15632],{"alt":605,"src":606},[313,15634,15635,15637],{},[10,15636,611],{},[10,15638,15639],{},[26,15640],{"alt":605,"src":616},[174,15642,620],{"id":619},[10,15644,623,15645,627,15647,631],{},[33,15646,626],{},[33,15648,630],{},[67,15650,15651],{"className":634,"code":635,"language":636,"meta":72,"style":72},[33,15652,15653],{"__ignoreMap":72},[76,15654,15655,15657],{"class":78,"line":79},[76,15656,71],{"class":643},[76,15658,647],{"class":646},[10,15660,650],{},[67,15662,15664],{"className":15663,"code":654,"language":145,"meta":72},[143],[33,15665,654],{"__ignoreMap":72},[10,15667,15668],{},[26,15669],{"alt":605,"src":661},[10,15671,664],{},[67,15673,15674],{"className":634,"code":667,"language":636,"meta":72,"style":72},[33,15675,15676],{"__ignoreMap":72},[76,15677,15678,15680,15682,15684],{"class":78,"line":79},[76,15679,71],{"class":643},[76,15681,676],{"class":646},[76,15683,680],{"class":679},[76,15685,647],{"class":646},[10,15687,685,15688,688,15690,692],{},[33,15689,71],{},[33,15691,691],{},[67,15693,15694],{"className":634,"code":695,"language":636,"meta":72,"style":72},[33,15695,15696,15702],{"__ignoreMap":72},[76,15697,15698,15700],{"class":78,"line":79},[76,15699,551],{"class":643},[76,15701,647],{"class":646},[76,15703,15704,15706,15708,15710],{"class":78,"line":85},[76,15705,551],{"class":643},[76,15707,676],{"class":646},[76,15709,680],{"class":679},[76,15711,647],{"class":646},[14,15713,717],{"id":716},[174,15715,721],{"id":720},[10,15717,724],{},[67,15719,15720],{"className":634,"code":727,"language":636,"meta":72,"style":72},[33,15721,15722],{"__ignoreMap":72},[76,15723,15724,15726],{"class":78,"line":79},[76,15725,734],{"class":643},[76,15727,647],{"class":646},[10,15729,739,15730,743],{},[33,15731,742],{},[174,15733,747],{"id":746},[10,15735,377,15736,755,15739,405,15741,762],{},[379,15737,754],{"href":752,"rel":15738},[383],[338,15740,758],{},[33,15742,761],{},[10,15744,765,15745,769],{},[33,15746,768],{},[174,15748,773],{"id":772},[10,15750,776],{},[67,15752,15753],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,15754,15755,15761],{"__ignoreMap":72},[76,15756,15757,15759],{"class":78,"line":79},[76,15758,734],{"class":643},[76,15760,647],{"class":646},[76,15762,15763,15765,15767,15769],{"class":78,"line":85},[76,15764,734],{"class":643},[76,15766,676],{"class":646},[76,15768,680],{"class":679},[76,15770,647],{"class":646},[10,15772,800,15773,803],{},[33,15774,734],{},[14,15776,807],{"id":806},[10,15778,810],{},[174,15780,814],{"id":813},[10,15782,817],{},[67,15784,15785],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,15786,15787,15793],{"__ignoreMap":72},[76,15788,15789,15791],{"class":78,"line":79},[76,15790,734],{"class":643},[76,15792,647],{"class":646},[76,15794,15795,15797,15799,15801],{"class":78,"line":85},[76,15796,734],{"class":643},[76,15798,676],{"class":646},[76,15800,680],{"class":679},[76,15802,647],{"class":646},[10,15804,840],{},[174,15806,844],{"id":843},[10,15808,847],{},[67,15810,15811],{"className":634,"code":850,"language":636,"meta":72,"style":72},[33,15812,15813,15821],{"__ignoreMap":72},[76,15814,15815,15817,15819],{"class":78,"line":79},[76,15816,857],{"class":643},[76,15818,860],{"class":679},[76,15820,863],{"class":679},[76,15822,15823,15825,15827,15829,15831,15833],{"class":78,"line":85},[76,15824,857],{"class":643},[76,15826,860],{"class":679},[76,15828,872],{"class":679},[76,15830,875],{"class":679},[76,15832,878],{"class":679},[76,15834,881],{"class":679},[10,15836,884],{},[67,15838,15839],{"className":634,"code":887,"language":636,"meta":72,"style":72},[33,15840,15841],{"__ignoreMap":72},[76,15842,15843,15845,15847,15849,15851],{"class":78,"line":79},[76,15844,857],{"class":643},[76,15846,896],{"class":679},[76,15848,872],{"class":679},[76,15850,875],{"class":679},[76,15852,903],{"class":679},[10,15854,906],{},[67,15856,15857],{"className":634,"code":909,"language":636,"meta":72,"style":72},[33,15858,15859],{"__ignoreMap":72},[76,15860,15861,15863,15865,15867,15869],{"class":78,"line":79},[76,15862,857],{"class":643},[76,15864,918],{"class":679},[76,15866,921],{"class":646},[76,15868,924],{"class":679},[76,15870,927],{"class":679},[10,15872,15873,932],{},[33,15874,857],{},[174,15876,936],{"id":935},[10,15878,939],{},[67,15880,15881],{"className":634,"code":779,"language":636,"meta":72,"style":72},[33,15882,15883,15889],{"__ignoreMap":72},[76,15884,15885,15887],{"class":78,"line":79},[76,15886,734],{"class":643},[76,15888,647],{"class":646},[76,15890,15891,15893,15895,15897],{"class":78,"line":85},[76,15892,734],{"class":643},[76,15894,676],{"class":646},[76,15896,680],{"class":679},[76,15898,647],{"class":646},[10,15900,962],{},[14,15902,965],{"id":965},[174,15904,969],{"id":968},[10,15906,972,15907,976],{},[33,15908,975],{},[155,15910,15911,15915,15917],{},[51,15912,981,15913,984],{},[33,15914,691],{},[51,15916,987],{},[51,15918,990],{},[10,15920,993],{},[174,15922,997],{"id":996},[10,15924,1000],{},[67,15926,15927],{"className":634,"code":727,"language":636,"meta":72,"style":72},[33,15928,15929],{"__ignoreMap":72},[76,15930,15931,15933],{"class":78,"line":79},[76,15932,734],{"class":643},[76,15934,647],{"class":646},[10,15936,1013,15937,1016,15939,1019,15941,405],{},[33,15938,734],{},[33,15940,71],{},[33,15942,734],{},[174,15944,1025],{"id":1024},[10,15946,1028],{},[67,15948,15949],{"className":634,"code":1031,"language":636,"meta":72,"style":72},[33,15950,15951],{"__ignoreMap":72},[76,15952,15953,15955,15957,15959],{"class":78,"line":79},[76,15954,734],{"class":643},[76,15956,676],{"class":646},[76,15958,680],{"class":679},[76,15960,647],{"class":646},[10,15962,1046,15963,1049,15965,1052,15967,1055,15969,1059],{},[33,15964,734],{},[33,15966,71],{},[33,15968,551],{},[33,15970,1058],{},[254,15972,1062],{},{"title":72,"searchDepth":85,"depth":85,"links":15974},[15975,15976,15977,15982,15987,15992],{"id":292,"depth":85,"text":292},{"id":308,"depth":85,"text":308},{"id":369,"depth":85,"text":370,"children":15978},[15979,15980,15981],{"id":373,"depth":92,"text":374},{"id":434,"depth":92,"text":435},{"id":619,"depth":92,"text":620},{"id":716,"depth":85,"text":717,"children":15983},[15984,15985,15986],{"id":720,"depth":92,"text":721},{"id":746,"depth":92,"text":747},{"id":772,"depth":92,"text":773},{"id":806,"depth":85,"text":807,"children":15988},[15989,15990,15991],{"id":813,"depth":92,"text":814},{"id":843,"depth":92,"text":844},{"id":935,"depth":92,"text":936},{"id":965,"depth":85,"text":965,"children":15993},[15994,15995,15996],{"id":968,"depth":92,"text":969},{"id":996,"depth":92,"text":997},{"id":1024,"depth":92,"text":1025},{},{"title":287,"description":72},[270,1095,1096],1786973365186]