[{"data":1,"prerenderedAt":15965},["ShallowReactive",2],{"post-python-while-loop":3,"sidebar-posts":232,"post-related-source":9156},{"id":4,"title":5,"body":6,"category":218,"cover":219,"description":12,"extension":220,"meta":221,"navigation":85,"path":222,"pinned":223,"publishedAt":224,"seo":225,"slug":226,"stem":227,"summary":228,"tags":229,"updatedAt":224,"visible":85,"__hash__":231},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":8,"toc":206},"minimark",[9,13,17,20,23,30,37,40,57,60,63,116,119,127,130,133,149,153,156,162,168,171,179,182,193,196,199,202],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,31,32,36],{},[33,34,35],"code",{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,38,39],{"id":39},"核心概念",[41,42,43,47,50],"ul",{},[44,45,46],"li",{},"进入循环前先准备参与条件判断的状态。",[44,48,49],{},"循环体中必须有机会让条件变为假。",[44,51,52,53,56],{},"能够预先确定遍历对象时，后续介绍的 ",[33,54,55],{},"for"," 通常更直接。",[14,58,59],{"id":59},"跟着示例运行",[10,61,62],{},"把下面代码保存到本课脚本并运行：",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-python shiki shiki-themes github-dark","count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n","python","",[33,71,72,80,87,93,99,105,110],{"__ignoreMap":69},[73,74,77],"span",{"class":75,"line":76},"line",1,[73,78,79],{},"count = 1\n",[73,81,83],{"class":75,"line":82},2,[73,84,86],{"emptyLinePlaceholder":85},true,"\n",[73,88,90],{"class":75,"line":89},3,[73,91,92],{},"while count \u003C= 3:\n",[73,94,96],{"class":75,"line":95},4,[73,97,98],{},"    print(\"第\", count, \"次练习\")\n",[73,100,102],{"class":75,"line":101},5,[73,103,104],{},"    count = count + 1\n",[73,106,108],{"class":75,"line":107},6,[73,109,86],{"emptyLinePlaceholder":85},[73,111,113],{"class":75,"line":112},7,[73,114,115],{},"print(\"练习结束\")\n",[10,117,118],{},"预期结果：",[64,120,125],{"className":121,"code":123,"language":124,"meta":69},[122],"language-text","第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n","text",[33,126,123],{"__ignoreMap":69},[10,128,129],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,131,132],{"id":132},"按执行顺序拆开看",[134,135,136,143],"ol",{},[44,137,138,139,142],{},"进入循环前 ",[33,140,141],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[44,144,145,146,148],{},"循环体末尾把 ",[33,147,141],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[150,151,152],"h3",{"id":152},"再看一个具体细节",[10,154,155],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,157,158],{},[26,159],{"alt":160,"src":161},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,163,164,165,167],{},"第4次检查时 ",[33,166,141],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,169,170],{"id":170},"初学者容易混淆的地方",[41,172,173,176],{},[44,174,175],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[44,177,178],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,180,181],{"id":181},"练习",[134,183,184,190],{},[44,185,186,187,189],{},"使用 ",[33,188,35],{}," 输出 1 到 5。",[44,191,192],{},"计算 1 到 10 的累加和。",[10,194,195],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,197,198],{"id":198},"本篇边界",[10,200,201],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,204,205],"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":69,"searchDepth":82,"depth":82,"links":207},[208,209,210,211,212,215,216,217],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":213},[214],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",false,"2026-08-17",{"title":5,"description":12},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[218,35,230],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",[233,1046,1383,1517,1669,1848,2036,2201,2384,2566,2758,2989,3173,3350,3507,3678,3843,4058,4287,4428,4592,4781,4969,5124,5284,5481,5678,5892,6059,6303,6484,6689,6884,7068,7269,7559,7751,7980,8175,8395,8635,8839],{"id":234,"title":235,"body":236,"category":218,"cover":219,"description":69,"extension":220,"meta":1035,"navigation":85,"path":1036,"pinned":223,"publishedAt":1037,"seo":1038,"slug":1039,"stem":1040,"summary":1041,"tags":1042,"updatedAt":1037,"visible":85,"__hash__":1045},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":237,"toc":1011},[238,241,244,247,254,257,260,299,315,319,323,334,339,345,363,369,374,380,384,430,433,439,445,448,479,524,541,555,565,569,580,596,599,605,610,613,631,641,662,666,670,673,685,692,696,711,718,722,725,746,752,756,759,763,766,786,789,793,796,830,833,852,855,876,881,885,888,908,911,914,918,925,939,942,946,949,959,970,974,977,992,1008],[14,239,240],{"id":240},"引言",[10,242,243],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,245,246],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,248,249,250,253],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,251,252],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,255,256],{"id":256},"扫盲",[10,258,259],{},"那么这里有几个概念：",[261,262,263,266],"blockquote",{},[10,264,265],{},"为什么需要安装python解释器？",[261,267,268,279,282,290,293],{},[10,269,270,271,274,275,278],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,272,273],{},"0","和",[33,276,277],{},"1","组成的机器指令。",[10,280,281],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,283,284,285,289],{},"这样，我们就能用",[286,287,288],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,291,292],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,294,295],{},[26,296],{"alt":297,"src":298},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[261,300,301,304],{},[10,302,303],{},"pip又是什么？",[261,305,306,309],{},[10,307,308],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,310,311],{},[26,312],{"alt":313,"src":314},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,316,318],{"id":317},"windows-安装","Windows 安装",[150,320,322],{"id":321},"_1-下载官方安装程序","1. 下载官方安装程序",[10,324,325,326,333],{},"打开 ",[327,328,332],"a",{"href":329,"rel":330},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[331],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[261,335,336],{},[10,337,338],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,340,341],{},[26,342],{"alt":343,"src":344},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[41,346,347,354,360],{},[44,348,349,350,353],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[286,351,352],{},"Windows installer (64-bit)","。",[44,355,356,357,353],{},"搭载 ARM 处理器的 Windows 设备选择 ",[286,358,359],{},"Windows installer (ARM64)",[44,361,362],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,364,365],{},[26,366],{"alt":367,"src":368},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[261,370,371],{},[10,372,373],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,375,376],{},[26,377],{"alt":378,"src":379},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[150,381,383],{"id":382},"_2-安装并加入-path","2. 安装并加入 PATH",[261,385,386,391,398,423],{},[261,387,388],{},[10,389,390],{},"PATH 环境变量",[10,392,393,394,397],{},"Windows 有一个特殊的变量叫 ",[286,395,396],{},"PATH","，它里面存了一串文件夹路径，比如：",[64,399,401],{"className":66,"code":400,"language":68,"meta":69,"style":69},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,402,403,408,413,418],{"__ignoreMap":69},[73,404,405],{"class":75,"line":76},[73,406,407],{},"D:\\Python313\\\n",[73,409,410],{"class":75,"line":82},[73,411,412],{},"D:\\Python313\\Scripts\\\n",[73,414,415],{"class":75,"line":89},[73,416,417],{},"C:\\Windows\\System32\\\n",[73,419,420],{"class":75,"line":95},[73,421,422],{},"...\n",[10,424,425,426,429],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[286,427,428],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,431,432],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,434,435,436,438],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,437,68],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,440,441],{},[26,442],{"alt":443,"src":444},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,446,447],{},"对安装界面最底部的两个勾选项分别解释 :",[261,449,450,453,458],{},[10,451,452],{},"Add python.exe to PATH",[10,454,455],{},[286,456,457],{},"把 Python 添加到系统环境变量",[261,459,460,466,472],{},[10,461,462,463,465],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,464,68],{}," 就能运行",[10,467,468,469,471],{},"不勾选的话，命令行输入 ",[33,470,68],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,473,474,475,478],{},"必须",[286,476,477],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[261,480,481,484,489],{},[10,482,483],{},"Use admin privileges when installing py.exe",[10,485,486],{},[286,487,488],{},"使用管理员权限安装 py.exe（Python 启动器）",[261,490,491,501,515,518],{},[10,492,493,496,497,500],{},[33,494,495],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,498,499],{},"py"," 来启动 Python。",[10,502,503,504,506,507,510,511,514],{},"勾选后，",[33,505,495],{}," 会安装到",[286,508,509],{},"系统级目录","，电脑上",[286,512,513],{},"所有用户账户","都能用",[10,516,517],{},"不勾选，只有当前用户能用",[10,519,520,523],{},[286,521,522],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[261,525,526,529],{},[10,527,528],{},"操作建议",[261,530,531,538],{},[10,532,533,534,537],{},"两个都勾上之后，再点 ",[286,535,536],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,539,540],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[261,542,543,549],{},[10,544,545,546],{},"Python 安装的",[286,547,548],{},"可选功能页",[10,550,551],{},[26,552],{"alt":553,"src":554},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[261,556,557,560],{},[10,558,559],{},"高级选项页",[10,561,562],{},[26,563],{"alt":553,"src":564},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[150,566,568],{"id":567},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,570,571,572,575,576,579],{},"按 ",[33,573,574],{},"Win + R","，输入 ",[33,577,578],{},"cmd"," 并回车，然后执行：",[64,581,585],{"className":582,"code":583,"language":584,"meta":69,"style":69},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,586,587],{"__ignoreMap":69},[73,588,589,592],{"class":75,"line":76},[73,590,68],{"class":591},"svObZ",[73,593,595],{"class":594},"sDLfK"," --version\n",[10,597,598],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[64,600,603],{"className":601,"code":602,"language":124,"meta":69},[122],"Python 3.x.x\n",[33,604,602],{"__ignoreMap":69},[10,606,607],{},[26,608],{"alt":553,"src":609},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,611,612],{},"继续检查 pip：",[64,614,616],{"className":582,"code":615,"language":584,"meta":69,"style":69},"python -m pip --version\n",[33,617,618],{"__ignoreMap":69},[73,619,620,622,625,629],{"class":75,"line":76},[73,621,68],{"class":591},[73,623,624],{"class":594}," -m",[73,626,628],{"class":627},"sU2Wk"," pip",[73,630,595],{"class":594},[10,632,633,634,636,637,640],{},"如果 ",[33,635,68],{}," 无法识别，但 ",[33,638,639],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[64,642,644],{"className":582,"code":643,"language":584,"meta":69,"style":69},"py --version\npy -m pip --version\n",[33,645,646,652],{"__ignoreMap":69},[73,647,648,650],{"class":75,"line":76},[73,649,499],{"class":591},[73,651,595],{"class":594},[73,653,654,656,658,660],{"class":75,"line":82},[73,655,499],{"class":591},[73,657,624],{"class":594},[73,659,628],{"class":627},[73,661,595],{"class":594},[14,663,665],{"id":664},"macos-安装","macOS 安装",[150,667,669],{"id":668},"_1-先检查现有环境","1. 先检查现有环境",[10,671,672],{},"打开“终端”应用，执行：",[64,674,676],{"className":582,"code":675,"language":584,"meta":69,"style":69},"python3 --version\n",[33,677,678],{"__ignoreMap":69},[73,679,680,683],{"class":75,"line":76},[73,681,682],{"class":591},"python3",[73,684,595],{"class":594},[10,686,687,688,691],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,689,690],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[150,693,695],{"id":694},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,697,325,698,703,704,353,707,710],{},[327,699,702],{"href":700,"rel":701},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[331],"Python macOS 下载页","，下载当前稳定版的 ",[286,705,706],{},"macOS 64-bit universal2 installer",[33,708,709],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,712,713,714,717],{},"下载完成后打开 ",[33,715,716],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[150,719,721],{"id":720},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,723,724],{},"安装完成后重新打开终端，执行：",[64,726,728],{"className":582,"code":727,"language":584,"meta":69,"style":69},"python3 --version\npython3 -m pip --version\n",[33,729,730,736],{"__ignoreMap":69},[73,731,732,734],{"class":75,"line":76},[73,733,682],{"class":591},[73,735,595],{"class":594},[73,737,738,740,742,744],{"class":75,"line":82},[73,739,682],{"class":591},[73,741,624],{"class":594},[73,743,628],{"class":627},[73,745,595],{"class":594},[10,747,748,749,751],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,750,682],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,753,755],{"id":754},"linux-安装","Linux 安装",[10,757,758],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[150,760,762],{"id":761},"_1-检查是否已经安装","1. 检查是否已经安装",[10,764,765],{},"打开终端，执行：",[64,767,768],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,769,770,776],{"__ignoreMap":69},[73,771,772,774],{"class":75,"line":76},[73,773,682],{"class":591},[73,775,595],{"class":594},[73,777,778,780,782,784],{"class":75,"line":82},[73,779,682],{"class":591},[73,781,624],{"class":594},[73,783,628],{"class":627},[73,785,595],{"class":594},[10,787,788],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[150,790,792],{"id":791},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,794,795],{},"Ubuntu 或 Debian：",[64,797,799],{"className":582,"code":798,"language":584,"meta":69,"style":69},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,800,801,812],{"__ignoreMap":69},[73,802,803,806,809],{"class":75,"line":76},[73,804,805],{"class":591},"sudo",[73,807,808],{"class":627}," apt",[73,810,811],{"class":627}," update\n",[73,813,814,816,818,821,824,827],{"class":75,"line":82},[73,815,805],{"class":591},[73,817,808],{"class":627},[73,819,820],{"class":627}," install",[73,822,823],{"class":627}," python3",[73,825,826],{"class":627}," python3-pip",[73,828,829],{"class":627}," python3-venv\n",[10,831,832],{},"Fedora：",[64,834,836],{"className":582,"code":835,"language":584,"meta":69,"style":69},"sudo dnf install python3 python3-pip\n",[33,837,838],{"__ignoreMap":69},[73,839,840,842,845,847,849],{"class":75,"line":76},[73,841,805],{"class":591},[73,843,844],{"class":627}," dnf",[73,846,820],{"class":627},[73,848,823],{"class":627},[73,850,851],{"class":627}," python3-pip\n",[10,853,854],{},"Arch Linux：",[64,856,858],{"className":582,"code":857,"language":584,"meta":69,"style":69},"sudo pacman -S python python-pip\n",[33,859,860],{"__ignoreMap":69},[73,861,862,864,867,870,873],{"class":75,"line":76},[73,863,805],{"class":591},[73,865,866],{"class":627}," pacman",[73,868,869],{"class":594}," -S",[73,871,872],{"class":627}," python",[73,874,875],{"class":627}," python-pip\n",[10,877,878,880],{},[33,879,805],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[150,882,884],{"id":883},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,886,887],{},"安装结束后执行：",[64,889,890],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,891,892,898],{"__ignoreMap":69},[73,893,894,896],{"class":75,"line":76},[73,895,682],{"class":591},[73,897,595],{"class":594},[73,899,900,902,904,906],{"class":75,"line":82},[73,901,682],{"class":591},[73,903,624],{"class":594},[73,905,628],{"class":627},[73,907,595],{"class":594},[10,909,910],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,912,913],{"id":913},"常见问题",[150,915,917],{"id":916},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,919,920,921,924],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,922,923],{},"python --version","。如果仍然失败，按下面的顺序检查：",[134,926,927,933,936],{},[44,928,929,930,932],{},"执行 ",[33,931,639],{},"，确认 Python Launcher 是否可用。",[44,934,935],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[44,937,938],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,940,941],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[150,943,945],{"id":944},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,947,948],{},"先尝试：",[64,950,951],{"className":582,"code":675,"language":584,"meta":69,"style":69},[33,952,953],{"__ignoreMap":69},[73,954,955,957],{"class":75,"line":76},[73,956,682],{"class":591},[73,958,595],{"class":594},[10,960,961,962,964,965,967,968,353],{},"在这两个系统中，只有 ",[33,963,682],{}," 命令而没有 ",[33,966,68],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,969,682],{},[150,971,973],{"id":972},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,975,976],{},"先使用模块方式检查：",[64,978,980],{"className":582,"code":979,"language":584,"meta":69,"style":69},"python3 -m pip --version\n",[33,981,982],{"__ignoreMap":69},[73,983,984,986,988,990],{"class":75,"line":76},[73,985,682],{"class":591},[73,987,624],{"class":594},[73,989,628],{"class":627},[73,991,595],{"class":594},[10,993,994,995,997,998,1000,1001,1003,1004,1007],{},"Windows 用户将命令中的 ",[33,996,682],{}," 换成 ",[33,999,68],{}," 或 ",[33,1002,499],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1005,1006],{},"python3-pip","；不要直接使用其他系统的安装命令。",[203,1009,1010],{},"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":69,"searchDepth":82,"depth":82,"links":1012},[1013,1014,1015,1020,1025,1030],{"id":240,"depth":82,"text":240},{"id":256,"depth":82,"text":256},{"id":317,"depth":82,"text":318,"children":1016},[1017,1018,1019],{"id":321,"depth":89,"text":322},{"id":382,"depth":89,"text":383},{"id":567,"depth":89,"text":568},{"id":664,"depth":82,"text":665,"children":1021},[1022,1023,1024],{"id":668,"depth":89,"text":669},{"id":694,"depth":89,"text":695},{"id":720,"depth":89,"text":721},{"id":754,"depth":82,"text":755,"children":1026},[1027,1028,1029],{"id":761,"depth":89,"text":762},{"id":791,"depth":89,"text":792},{"id":883,"depth":89,"text":884},{"id":913,"depth":82,"text":913,"children":1031},[1032,1033,1034],{"id":916,"depth":89,"text":917},{"id":944,"depth":89,"text":945},{"id":972,"depth":89,"text":973},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":235,"description":69},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[218,1043,1044],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1047,"title":1048,"body":1049,"category":218,"cover":1056,"description":69,"extension":220,"meta":1372,"navigation":85,"path":1373,"pinned":223,"publishedAt":1374,"seo":1375,"slug":1376,"stem":1377,"summary":1378,"tags":1379,"updatedAt":1374,"visible":85,"__hash__":1382},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1050,"toc":1357},[1051,1057,1060,1063,1067,1070,1094,1097,1103,1106,1109,1143,1153,1157,1164,1167,1192,1195,1207,1210,1214,1217,1220,1223,1226,1229,1232,1235,1259,1262,1265,1271,1274,1277,1280,1284,1290,1293,1319,1322,1326,1329,1332,1336,1339,1342,1345,1348,1351,1354],[10,1052,1053],{},[26,1054],{"alt":1055,"src":1056},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1058,1059],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1061,1062],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1064,1066],{"id":1065},"python-代码是什么样的","Python 代码是什么样的",[10,1068,1069],{},"下面是一段简单的 Python 代码：",[64,1071,1073],{"className":66,"code":1072,"language":68,"meta":69,"style":69},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1074,1075,1080,1085,1089],{"__ignoreMap":69},[73,1076,1077],{"class":75,"line":76},[73,1078,1079],{},"name = \"Python\"\n",[73,1081,1082],{"class":75,"line":82},[73,1083,1084],{},"year = 2026\n",[73,1086,1087],{"class":75,"line":89},[73,1088,86],{"emptyLinePlaceholder":85},[73,1090,1091],{"class":75,"line":95},[73,1092,1093],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1095,1096],{},"运行结果：",[64,1098,1101],{"className":1099,"code":1100,"language":124,"meta":69},[122],"正在学习 Python，当前年份是 2026\n",[33,1102,1100],{"__ignoreMap":69},[10,1104,1105],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1107,1108],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[64,1110,1112],{"className":66,"code":1111,"language":68,"meta":69,"style":69},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1113,1114,1119,1123,1128,1133,1138],{"__ignoreMap":69},[73,1115,1116],{"class":75,"line":76},[73,1117,1118],{},"score = 85\n",[73,1120,1121],{"class":75,"line":82},[73,1122,86],{"emptyLinePlaceholder":85},[73,1124,1125],{"class":75,"line":89},[73,1126,1127],{},"if score >= 60:\n",[73,1129,1130],{"class":75,"line":95},[73,1131,1132],{},"    print(\"成绩合格\")\n",[73,1134,1135],{"class":75,"line":101},[73,1136,1137],{},"else:\n",[73,1139,1140],{"class":75,"line":107},[73,1141,1142],{},"    print(\"需要继续学习\")\n",[10,1144,1145,1148,1149,1152],{},[33,1146,1147],{},"if"," 和 ",[33,1150,1151],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1154,1156],{"id":1155},"python-如何运行代码","Python 如何运行代码",[10,1158,1159,1160,1163],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1161,1162],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1165,1166],{},"交互式环境适合快速验证一个表达式：",[64,1168,1170],{"className":66,"code":1169,"language":68,"meta":69,"style":69},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1171,1172,1177,1182,1187],{"__ignoreMap":69},[73,1173,1174],{"class":75,"line":76},[73,1175,1176],{},">>> 10 + 20\n",[73,1178,1179],{"class":75,"line":82},[73,1180,1181],{},"30\n",[73,1183,1184],{"class":75,"line":89},[73,1185,1186],{},">>> \"Python\".lower()\n",[73,1188,1189],{"class":75,"line":95},[73,1190,1191],{},"'python'\n",[10,1193,1194],{},"需要保存和重复运行的程序，则可以写入文件：",[64,1196,1198],{"className":582,"code":1197,"language":584,"meta":69,"style":69},"python3 hello.py\n",[33,1199,1200],{"__ignoreMap":69},[73,1201,1202,1204],{"class":75,"line":76},[73,1203,682],{"class":591},[73,1205,1206],{"class":627}," hello.py\n",[10,1208,1209],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1211,1213],{"id":1212},"python-的特点","Python 的特点",[150,1215,1216],{"id":1216},"语法相对简洁",[10,1218,1219],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[150,1221,1222],{"id":1222},"支持多种编程方式",[10,1224,1225],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[150,1227,1228],{"id":1228},"标准库比较完整",[10,1230,1231],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1233,1234],{},"例如，获取当前时间：",[64,1236,1238],{"className":66,"code":1237,"language":68,"meta":69,"style":69},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1239,1240,1245,1249,1254],{"__ignoreMap":69},[73,1241,1242],{"class":75,"line":76},[73,1243,1244],{},"from datetime import datetime\n",[73,1246,1247],{"class":75,"line":82},[73,1248,86],{"emptyLinePlaceholder":85},[73,1250,1251],{"class":75,"line":89},[73,1252,1253],{},"now = datetime.now()\n",[73,1255,1256],{"class":75,"line":95},[73,1257,1258],{},"print(now)\n",[10,1260,1261],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[150,1263,1264],{"id":1264},"第三方工具丰富",[10,1266,1267,1268,1270],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1269,252],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1272,1273],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[150,1275,1276],{"id":1276},"支持多个操作系统",[10,1278,1279],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1281,1283],{"id":1282},"python-可以做什么","Python 可以做什么",[10,1285,1286],{},[26,1287],{"alt":1288,"src":1289},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1291,1292],{},"Python 的应用范围比较广，常见方向包括：",[41,1294,1295,1298,1301,1304,1307,1310,1313,1316],{},[44,1296,1297],{},"编写自动化脚本，批量处理文件和重复任务；",[44,1299,1300],{},"开发网站后端和 API 服务；",[44,1302,1303],{},"进行数据清洗、统计分析和图表展示；",[44,1305,1306],{},"编写网络爬虫和信息采集工具；",[44,1308,1309],{},"开发自动化测试程序；",[44,1311,1312],{},"进行机器学习和人工智能开发；",[44,1314,1315],{},"编写运维、监控和辅助开发工具；",[44,1317,1318],{},"开发部分桌面应用和插件。",[10,1320,1321],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1323,1325],{"id":1324},"python-的发展","Python 的发展",[10,1327,1328],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1330,1331],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1333,1335],{"id":1334},"python-也有局限","Python 也有局限",[10,1337,1338],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1340,1341],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1343,1344],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1346,1347],{"id":1347},"写在最后",[10,1349,1350],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1352,1353],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[203,1355,1356],{},"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":69,"searchDepth":82,"depth":82,"links":1358},[1359,1360,1361,1368,1369,1370,1371],{"id":1065,"depth":82,"text":1066},{"id":1155,"depth":82,"text":1156},{"id":1212,"depth":82,"text":1213,"children":1362},[1363,1364,1365,1366,1367],{"id":1216,"depth":89,"text":1216},{"id":1222,"depth":89,"text":1222},{"id":1228,"depth":89,"text":1228},{"id":1264,"depth":89,"text":1264},{"id":1276,"depth":89,"text":1276},{"id":1282,"depth":82,"text":1283},{"id":1324,"depth":82,"text":1325},{"id":1334,"depth":82,"text":1335},{"id":1347,"depth":82,"text":1347},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1048,"description":69},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[218,1380,1381],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1384,"title":1385,"body":1386,"category":218,"cover":219,"description":1390,"extension":220,"meta":1508,"navigation":85,"path":1509,"pinned":223,"publishedAt":224,"seo":1510,"slug":1511,"stem":1512,"summary":1513,"tags":1514,"updatedAt":224,"visible":85,"__hash__":1516},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1387,"toc":1498},[1388,1391,1393,1396,1398,1404,1409,1411,1425,1427,1429,1438,1440,1446,1448,1450,1466,1468,1479,1481,1489,1491,1493,1496],[10,1389,1390],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1392,16],{"id":16},[10,1394,1395],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1397,22],{"id":22},[10,1399,1400],{},[26,1401],{"alt":1402,"src":1403},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1405,1406,1408],{},[33,1407,1162],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1410,39],{"id":39},[41,1412,1413,1419,1422],{},[44,1414,1415,1416,1418],{},"源代码是人编写的文本，通常保存在 ",[33,1417,1162],{}," 文件中。",[44,1420,1421],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[44,1423,1424],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1426,59],{"id":59},[10,1428,62],{},[64,1430,1432],{"className":66,"code":1431,"language":68,"meta":69,"style":69},"print(\"你好，Python\")\n",[33,1433,1434],{"__ignoreMap":69},[73,1435,1436],{"class":75,"line":76},[73,1437,1431],{},[10,1439,118],{},[64,1441,1444],{"className":1442,"code":1443,"language":124,"meta":69},[122],"你好，Python\n",[33,1445,1443],{"__ignoreMap":69},[10,1447,129],{},[14,1449,132],{"id":132},[134,1451,1452,1459],{},[44,1453,1454,1455,1458],{},"终端启动解释器后，解释器读取 ",[33,1456,1457],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[44,1460,1461,1462,1465],{},"字符串对象先准备好，再交给 ",[33,1463,1464],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1467,170],{"id":170},[41,1469,1470,1473],{},[44,1471,1472],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[44,1474,1475,1476,1478],{},"认为 ",[33,1477,1162],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1480,181],{"id":181},[134,1482,1483,1486],{},[44,1484,1485],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[44,1487,1488],{},"把示例文字改成自己的学习目标并重新运行。",[10,1490,195],{},[14,1492,198],{"id":198},[10,1494,1495],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,1497,205],{},{"title":69,"searchDepth":82,"depth":82,"links":1499},[1500,1501,1502,1503,1504,1505,1506,1507],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1385,"description":1390},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[218,1380,1515],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1518,"title":1519,"body":1520,"category":218,"cover":219,"description":1524,"extension":220,"meta":1660,"navigation":85,"path":1661,"pinned":223,"publishedAt":224,"seo":1662,"slug":1663,"stem":1664,"summary":1665,"tags":1666,"updatedAt":224,"visible":85,"__hash__":1668},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1521,"toc":1650},[1522,1525,1527,1530,1532,1538,1544,1546,1561,1563,1566,1586,1588,1594,1596,1598,1611,1613,1627,1629,1640,1642,1644,1647],[10,1523,1524],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1526,16],{"id":16},[10,1528,1529],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1531,22],{"id":22},[10,1533,1534],{},[26,1535],{"alt":1536,"src":1537},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1539,1540,1541,1543],{},"终端收到 ",[33,1542,682],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1545,39],{"id":39},[41,1547,1548,1551,1554],{},[44,1549,1550],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[44,1552,1553],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[44,1555,1556,1557,1560],{},"检查 pip 时使用 ",[33,1558,1559],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1562,59],{"id":59},[10,1564,1565],{},"在 macOS 终端执行：",[64,1567,1568],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,1569,1570,1576],{"__ignoreMap":69},[73,1571,1572,1574],{"class":75,"line":76},[73,1573,682],{"class":591},[73,1575,595],{"class":594},[73,1577,1578,1580,1582,1584],{"class":75,"line":82},[73,1579,682],{"class":591},[73,1581,624],{"class":594},[73,1583,628],{"class":627},[73,1585,595],{"class":594},[10,1587,118],{},[64,1589,1592],{"className":1590,"code":1591,"language":124,"meta":69},[122],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1593,1591],{"__ignoreMap":69},[10,1595,129],{},[14,1597,132],{"id":132},[134,1599,1600,1606],{},[44,1601,1602,1605],{},[33,1603,1604],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[44,1607,1608,1610],{},[33,1609,690],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1612,170],{"id":170},[41,1614,1615,1621],{},[44,1616,1617,1618,1620],{},"看到系统已有 ",[33,1619,682],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[44,1622,1623,1624,1626],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1625,682],{},"，不修改系统自带工具。",[14,1628,181],{"id":181},[134,1630,1631,1637],{},[44,1632,929,1633,1636],{},[33,1634,1635],{},"which python3","，记录当前解释器路径。",[44,1638,1639],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1641,195],{},[14,1643,198],{"id":198},[10,1645,1646],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,1648,1649],{},"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":69,"searchDepth":82,"depth":82,"links":1651},[1652,1653,1654,1655,1656,1657,1658,1659],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1519,"description":1524},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[218,1667,1043],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1670,"title":1671,"body":1672,"category":218,"cover":219,"description":1837,"extension":220,"meta":1838,"navigation":85,"path":1839,"pinned":223,"publishedAt":224,"seo":1840,"slug":1841,"stem":1842,"summary":1843,"tags":1844,"updatedAt":224,"visible":85,"__hash__":1847},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1673,"toc":1827},[1674,1680,1682,1685,1687,1693,1696,1698,1722,1724,1726,1753,1755,1761,1763,1765,1783,1785,1799,1801,1815,1817,1819,1825],[10,1675,1676,1677,1679],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1678,1162],{}," 脚本。",[14,1681,16],{"id":16},[10,1683,1684],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1686,22],{"id":22},[10,1688,1689],{},[26,1690],{"alt":1691,"src":1692},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1694,1695],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1697,39],{"id":39},[41,1699,1700,1709,1716],{},[44,1701,1702,1703,1705,1706,353],{},"在终端输入 ",[33,1704,682],{}," 进入 REPL，提示符通常是 ",[33,1707,1708],{},">>>",[44,1710,1711,1712,1715],{},"输入 ",[33,1713,1714],{},"exit()"," 或按 Control-D 退出 REPL。",[44,1717,1718,1719,1721],{},"需要保存、复查或多次运行的代码应写入 ",[33,1720,1162],{}," 文件。",[14,1723,59],{"id":59},[10,1725,62],{},[64,1727,1731],{"className":1728,"code":1729,"language":1730,"meta":69,"style":69},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1732,1733,1738,1743,1748],{"__ignoreMap":69},[73,1734,1735],{"class":75,"line":76},[73,1736,1737],{},">>> 2 + 3\n",[73,1739,1740],{"class":75,"line":82},[73,1741,1742],{},"5\n",[73,1744,1745],{"class":75,"line":89},[73,1746,1747],{},">>> \"python\".upper()\n",[73,1749,1750],{"class":75,"line":95},[73,1751,1752],{},"'PYTHON'\n",[10,1754,118],{},[64,1756,1759],{"className":1757,"code":1758,"language":124,"meta":69},[122],"REPL 会直接显示表达式结果\n",[33,1760,1758],{"__ignoreMap":69},[10,1762,129],{},[14,1764,132],{"id":132},[134,1766,1767,1777],{},[44,1768,1769,1770,1773,1774,353],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1771,1772],{},"2 + 3"," 能直接看到 ",[33,1775,1776],{},"5",[44,1778,1779,1780,1782],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1781,1464],{}," 才会写到标准输出。",[14,1784,170],{"id":170},[41,1786,1787,1796],{},[44,1788,1789,1790,1792,1793,1795],{},"把提示符 ",[33,1791,1708],{}," 复制进 ",[33,1794,1162],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[44,1797,1798],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1800,181],{"id":181},[134,1802,1803,1809],{},[44,1804,1805,1806,353],{},"在 REPL 计算 ",[33,1807,1808],{},"12 * 8",[44,1810,1811,1812,1814],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1813,1464],{}," 时是否显示结果。",[10,1816,195],{},[14,1818,198],{"id":198},[10,1820,1821,1822,1824],{},"本篇目标是根据任务选择 REPL 或 ",[33,1823,1162],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,1826,205],{},{"title":69,"searchDepth":82,"depth":82,"links":1828},[1829,1830,1831,1832,1833,1834,1835,1836],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1671,"description":1837},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[218,1845,1846],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1849,"title":1850,"body":1851,"category":218,"cover":219,"description":1855,"extension":220,"meta":2026,"navigation":85,"path":2027,"pinned":223,"publishedAt":224,"seo":2028,"slug":2029,"stem":2030,"summary":2031,"tags":2032,"updatedAt":224,"visible":85,"__hash__":2035},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1852,"toc":2016},[1853,1856,1858,1861,1863,1869,1875,1877,1895,1897,1899,1944,1946,1952,1954,1956,1978,1980,1992,1994,2006,2008,2010,2013],[10,1854,1855],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1857,16],{"id":16},[10,1859,1860],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1862,22],{"id":22},[10,1864,1865],{},[26,1866],{"alt":1867,"src":1868},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1870,1871,1874],{},[33,1872,1873],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1876,39],{"id":39},[41,1878,1879,1882,1892],{},[44,1880,1881],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[44,1883,1884,1887,1888,1891],{},[33,1885,1886],{},"pwd"," 显示当前目录，",[33,1889,1890],{},"ls"," 显示目录里的文件。",[44,1893,1894],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1896,59],{"id":59},[10,1898,1565],{},[64,1900,1902],{"className":582,"code":1901,"language":584,"meta":69,"style":69},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1903,1904,1912,1919,1924,1938],{"__ignoreMap":69},[73,1905,1906,1909],{"class":75,"line":76},[73,1907,1908],{"class":591},"mkdir",[73,1910,1911],{"class":627}," python-study\n",[73,1913,1914,1917],{"class":75,"line":82},[73,1915,1916],{"class":594},"cd",[73,1918,1911],{"class":627},[73,1920,1921],{"class":75,"line":89},[73,1922,1923],{"class":594},"pwd\n",[73,1925,1926,1929,1932,1936],{"class":75,"line":95},[73,1927,1928],{"class":594},"printf",[73,1930,1931],{"class":627}," 'print(\"项目已经运行\")\\n'",[73,1933,1935],{"class":1934},"snl16"," >",[73,1937,1206],{"class":627},[73,1939,1940,1942],{"class":75,"line":101},[73,1941,682],{"class":591},[73,1943,1206],{"class":627},[10,1945,118],{},[64,1947,1950],{"className":1948,"code":1949,"language":124,"meta":69},[122],"项目已经运行\n",[33,1951,1949],{"__ignoreMap":69},[10,1953,129],{},[14,1955,132],{"id":132},[134,1957,1958,1969],{},[44,1959,1960,1962,1963,1965,1966,1968],{},[33,1961,1908],{}," 创建目录，",[33,1964,1916],{}," 改变终端当前目录，",[33,1967,1886],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[44,1970,1971,1973,1974,1977],{},[33,1972,1873],{}," 会在当前目录寻找 ",[33,1975,1976],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1979,170],{"id":170},[41,1981,1982,1989],{},[44,1983,1984,1985,1148,1987,353],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,1986,1886],{},[33,1988,1890],{},[44,1990,1991],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1993,181],{"id":181},[134,1995,1996,2003],{},[44,1997,1998,1999,2002],{},"新建 ",[33,2000,2001],{},"lesson01.py"," 并输出课程编号。",[44,2004,2005],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2007,195],{},[14,2009,198],{"id":198},[10,2011,2012],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2014,2015],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":69,"searchDepth":82,"depth":82,"links":2017},[2018,2019,2020,2021,2022,2023,2024,2025],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1850,"description":1855},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[218,2033,2034],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2037,"title":2038,"body":2039,"category":218,"cover":219,"description":2043,"extension":220,"meta":2191,"navigation":85,"path":2192,"pinned":223,"publishedAt":224,"seo":2193,"slug":2194,"stem":2195,"summary":2196,"tags":2197,"updatedAt":224,"visible":85,"__hash__":2200},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2040,"toc":2181},[2041,2044,2046,2049,2051,2057,2068,2070,2090,2092,2094,2114,2116,2122,2124,2126,2145,2147,2155,2157,2172,2174,2176,2179],[10,2042,2043],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2045,16],{"id":16},[10,2047,2048],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2050,22],{"id":22},[10,2052,2053],{},[26,2054],{"alt":2055,"src":2056},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2058,2059,2060,353,2062,2065,2066,353],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2061,1464],{},[33,2063,2064],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2067,1772],{},[14,2069,39],{"id":39},[41,2071,2072,2078,2087],{},[44,2073,2074,2077],{},[33,2075,2076],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[44,2079,2080,2083,2084,353],{},[33,2081,2082],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2085,2086],{},"12",[44,2088,2089],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2091,59],{"id":59},[10,2093,62],{},[64,2095,2097],{"className":66,"code":2096,"language":68,"meta":69,"style":69},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2098,2099,2104,2109],{"__ignoreMap":69},[73,2100,2101],{"class":75,"line":76},[73,2102,2103],{},"print(42)\n",[73,2105,2106],{"class":75,"line":82},[73,2107,2108],{},"print(7 + 5)\n",[73,2110,2111],{"class":75,"line":89},[73,2112,2113],{},"print(\"Python 基础课\")\n",[10,2115,118],{},[64,2117,2120],{"className":2118,"code":2119,"language":124,"meta":69},[122],"42\n12\nPython 基础课\n",[33,2121,2119],{"__ignoreMap":69},[10,2123,129],{},[14,2125,132],{"id":132},[134,2127,2128,2136],{},[44,2129,2130,2133,2134,353],{},[33,2131,2132],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2135,2086],{},[44,2137,2138,2140,2141,2144],{},[33,2139,1464],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2142,2143],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2146,170],{"id":170},[41,2148,2149,2152],{},[44,2150,2151],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[44,2153,2154],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2156,181],{"id":181},[134,2158,2159,2162],{},[44,2160,2161],{},"分别输出一个整数、一个小数和一段文本。",[44,2163,2164,2165,2167,2168,2171],{},"比较 ",[33,2166,2064],{}," 与 ",[33,2169,2170],{},"print(\"2 + 3\")"," 的结果。",[10,2173,195],{},[14,2175,198],{"id":198},[10,2177,2178],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2180,205],{},{"title":69,"searchDepth":82,"depth":82,"links":2182},[2183,2184,2185,2186,2187,2188,2189,2190],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2038,"description":2043},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[218,2198,2199],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2202,"title":2203,"body":2204,"category":218,"cover":219,"description":2208,"extension":220,"meta":2374,"navigation":85,"path":2375,"pinned":223,"publishedAt":224,"seo":2376,"slug":2377,"stem":2378,"summary":2379,"tags":2380,"updatedAt":224,"visible":85,"__hash__":2383},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2205,"toc":2364},[2206,2209,2211,2214,2216,2222,2225,2227,2253,2255,2257,2285,2287,2293,2295,2297,2321,2323,2338,2340,2355,2357,2359,2362],[10,2207,2208],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2210,16],{"id":16},[10,2212,2213],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2215,22],{"id":22},[10,2217,2218],{},[26,2219],{"alt":2220,"src":2221},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2223,2224],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2226,39],{"id":39},[41,2228,2229,2232,2242],{},[44,2230,2231],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[44,2233,2234,2235,2167,2238,2241],{},"变量名区分大小写，",[33,2236,2237],{},"score",[33,2239,2240],{},"Score"," 是两个名字。",[44,2243,2244,2245,2248,2249,2252],{},"使用能表达含义的名称；不要用 ",[33,2246,2247],{},"list","、",[33,2250,2251],{},"str"," 等内置名称作为普通变量名。",[14,2254,59],{"id":59},[10,2256,62],{},[64,2258,2260],{"className":66,"code":2259,"language":68,"meta":69,"style":69},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2261,2262,2267,2272,2276,2281],{"__ignoreMap":69},[73,2263,2264],{"class":75,"line":76},[73,2265,2266],{},"score = 90\n",[73,2268,2269],{"class":75,"line":82},[73,2270,2271],{},"print(score)\n",[73,2273,2274],{"class":75,"line":89},[73,2275,86],{"emptyLinePlaceholder":85},[73,2277,2278],{"class":75,"line":95},[73,2279,2280],{},"score = 95\n",[73,2282,2283],{"class":75,"line":101},[73,2284,2271],{},[10,2286,118],{},[64,2288,2291],{"className":2289,"code":2290,"language":124,"meta":69},[122],"90\n95\n",[33,2292,2290],{"__ignoreMap":69},[10,2294,129],{},[14,2296,132],{"id":132},[134,2298,2299,2308],{},[44,2300,929,2301,2304,2305,2307],{},[33,2302,2303],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2306,2237],{}," 再绑定到它。",[44,2309,929,2310,2313,2314,2317,2318,353],{},[33,2311,2312],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2315,2316],{},"90"," 没有被改造成 ",[33,2319,2320],{},"95",[14,2322,170],{"id":170},[41,2324,2325,2328],{},[44,2326,2327],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[44,2329,186,2330,2248,2332,2248,2334,2337],{},[33,2331,2247],{},[33,2333,2251],{},[33,2335,2336],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2339,181],{"id":181},[134,2341,2342,2352],{},[44,2343,2344,2345,1148,2348,2351],{},"创建 ",[33,2346,2347],{},"course_name",[33,2349,2350],{},"lesson_count"," 两个变量并输出。",[44,2353,2354],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2356,195],{},[14,2358,198],{"id":198},[10,2360,2361],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2363,205],{},{"title":69,"searchDepth":82,"depth":82,"links":2365},[2366,2367,2368,2369,2370,2371,2372,2373],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2203,"description":2208},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[218,2381,2382],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2385,"title":2386,"body":2387,"category":218,"cover":219,"description":2391,"extension":220,"meta":2556,"navigation":85,"path":2557,"pinned":223,"publishedAt":224,"seo":2558,"slug":2559,"stem":2560,"summary":2561,"tags":2562,"updatedAt":224,"visible":85,"__hash__":2565},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2388,"toc":2546},[2389,2392,2394,2397,2399,2405,2408,2410,2439,2441,2443,2488,2490,2496,2498,2500,2514,2516,2527,2529,2537,2539,2541,2544],[10,2390,2391],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2393,16],{"id":16},[10,2395,2396],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2398,22],{"id":22},[10,2400,2401],{},[26,2402],{"alt":2403,"src":2404},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2406,2407],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2409,39],{"id":39},[41,2411,2412,2422,2436],{},[44,2413,2414,2417,2418,2421],{},[33,2415,2416],{},"int"," 表示整数，",[33,2419,2420],{},"float"," 表示浮点数。",[44,2423,2424,2427,2428,2431,2432,2435],{},[33,2425,2426],{},"\u002F"," 总是进行真除法；",[33,2429,2430],{},"\u002F\u002F"," 是向下取整除法，",[33,2433,2434],{},"%"," 得到余数。",[44,2437,2438],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2440,59],{"id":59},[10,2442,62],{},[64,2444,2446],{"className":66,"code":2445,"language":68,"meta":69,"style":69},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2447,2448,2453,2458,2463,2467,2472,2477,2482],{"__ignoreMap":69},[73,2449,2450],{"class":75,"line":76},[73,2451,2452],{},"price = 25\n",[73,2454,2455],{"class":75,"line":82},[73,2456,2457],{},"count = 4\n",[73,2459,2460],{"class":75,"line":89},[73,2461,2462],{},"discount = 0.9\n",[73,2464,2465],{"class":75,"line":95},[73,2466,86],{"emptyLinePlaceholder":85},[73,2468,2469],{"class":75,"line":101},[73,2470,2471],{},"total = price * count * discount\n",[73,2473,2474],{"class":75,"line":107},[73,2475,2476],{},"average = total \u002F count\n",[73,2478,2479],{"class":75,"line":112},[73,2480,2481],{},"print(total)\n",[73,2483,2485],{"class":75,"line":2484},8,[73,2486,2487],{},"print(average)\n",[10,2489,118],{},[64,2491,2494],{"className":2492,"code":2493,"language":124,"meta":69},[122],"90.0\n22.5\n",[33,2495,2493],{"__ignoreMap":69},[10,2497,129],{},[14,2499,132],{"id":132},[134,2501,2502,2508],{},[44,2503,2504,2507],{},[33,2505,2506],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[44,2509,2510,2513],{},[33,2511,2512],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2515,170],{"id":170},[41,2517,2518,2524],{},[44,2519,2520,2521,353],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2522,2523],{},"decimal.Decimal",[44,2525,2526],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2528,181],{"id":181},[134,2530,2531,2534],{},[44,2532,2533],{},"计算 137 除以 10 的商和余数。",[44,2535,2536],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2538,195],{},[14,2540,198],{"id":198},[10,2542,2543],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2545,205],{},{"title":69,"searchDepth":82,"depth":82,"links":2547},[2548,2549,2550,2551,2552,2553,2554,2555],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2386,"description":2391},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[218,2563,2564],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2567,"title":2568,"body":2569,"category":218,"cover":219,"description":2573,"extension":220,"meta":2748,"navigation":85,"path":2749,"pinned":223,"publishedAt":224,"seo":2750,"slug":2751,"stem":2752,"summary":2753,"tags":2754,"updatedAt":224,"visible":85,"__hash__":2757},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2570,"toc":2736},[2571,2574,2576,2579,2581,2587,2597,2599,2610,2612,2614,2644,2646,2652,2654,2656,2686,2688,2691,2697,2700,2702,2710,2712,2727,2729,2731,2734],[10,2572,2573],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2575,16],{"id":16},[10,2577,2578],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2580,22],{"id":22},[10,2582,2583],{},[26,2584],{"alt":2585,"src":2586},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2588,2589,2590,2593,2594,353],{},"切片 ",[33,2591,2592],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2595,2596],{},"stop - start",[14,2598,39],{"id":39},[41,2600,2601,2604,2607],{},[44,2602,2603],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[44,2605,2606],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[44,2608,2609],{},"切片会创建新的字符串，不会修改原字符串。",[14,2611,59],{"id":59},[10,2613,62],{},[64,2615,2617],{"className":66,"code":2616,"language":68,"meta":69,"style":69},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2618,2619,2624,2629,2634,2639],{"__ignoreMap":69},[73,2620,2621],{"class":75,"line":76},[73,2622,2623],{},"language = \"Python\"\n",[73,2625,2626],{"class":75,"line":82},[73,2627,2628],{},"print(language[0])\n",[73,2630,2631],{"class":75,"line":89},[73,2632,2633],{},"print(language[-1])\n",[73,2635,2636],{"class":75,"line":95},[73,2637,2638],{},"print(language[0:3])\n",[73,2640,2641],{"class":75,"line":101},[73,2642,2643],{},"print(language + \" 3.14\")\n",[10,2645,118],{},[64,2647,2650],{"className":2648,"code":2649,"language":124,"meta":69},[122],"P\nn\nPyt\nPython 3.14\n",[33,2651,2649],{"__ignoreMap":69},[10,2653,129],{},[14,2655,132],{"id":132},[134,2657,2658,2672],{},[44,2659,2660,2661,2663,2664,2667,2668,2671],{},"字符串 ",[33,2662,218],{}," 的正索引从 ",[33,2665,2666],{},"P"," 的 0 开始，负索引从末尾 ",[33,2669,2670],{},"n"," 的 -1 开始。",[44,2673,2674,2677,2678,2681,2682,2685],{},[33,2675,2676],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2679,2680],{},"Pyt","；索引 3 的 ",[33,2683,2684],{},"h"," 不在结果中。",[150,2687,152],{"id":152},[10,2689,2690],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2692,2693],{},[26,2694],{"alt":2695,"src":2696},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2698,2699],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2701,170],{"id":170},[41,2703,2704,2707],{},[44,2705,2706],{},"把第一个字符写成索引 1，造成整体偏移一位。",[44,2708,2709],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2711,181],{"id":181},[134,2713,2714,2724],{},[44,2715,2716,2717,2720,2721,353],{},"从 ",[33,2718,2719],{},"\"programming\""," 中切出 ",[33,2722,2723],{},"\"gram\"",[44,2725,2726],{},"使用负索引取得字符串倒数第二个字符。",[10,2728,195],{},[14,2730,198],{"id":198},[10,2732,2733],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2735,205],{},{"title":69,"searchDepth":82,"depth":82,"links":2737},[2738,2739,2740,2741,2742,2745,2746,2747],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":2743},[2744],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2568,"description":2573},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[218,2755,2756],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2759,"title":2760,"body":2761,"category":218,"cover":219,"description":2765,"extension":220,"meta":2979,"navigation":85,"path":2980,"pinned":223,"publishedAt":224,"seo":2981,"slug":2982,"stem":2983,"summary":2984,"tags":2985,"updatedAt":224,"visible":85,"__hash__":2988},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2762,"toc":2967},[2763,2766,2768,2771,2773,2779,2789,2791,2824,2826,2828,2872,2874,2880,2882,2884,2905,2907,2910,2916,2924,2926,2940,2942,2958,2960,2962,2965],[10,2764,2765],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2767,16],{"id":16},[10,2769,2770],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2772,22],{"id":22},[10,2774,2775],{},[26,2776],{"alt":2777,"src":2778},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2780,2781,2782,1000,2785,2788],{},"比较表达式先产生 ",[33,2783,2784],{},"True",[33,2786,2787],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2790,39],{"id":39},[41,2792,2793,2807,2821],{},[44,2794,2795,2798,2799,2802,2803,2806],{},[33,2796,2797],{},"=="," 判断是否相等，",[33,2800,2801],{},"!="," 判断是否不等；单个 ",[33,2804,2805],{},"="," 是赋值。",[44,2808,2809,2812,2813,2816,2817,2820],{},[33,2810,2811],{},"and"," 要求两侧都为真，",[33,2814,2815],{},"or"," 只需一侧为真，",[33,2818,2819],{},"not"," 取反。",[44,2822,2823],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2825,59],{"id":59},[10,2827,62],{},[64,2829,2831],{"className":66,"code":2830,"language":68,"meta":69,"style":69},"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,2832,2833,2838,2843,2847,2852,2857,2862,2867],{"__ignoreMap":69},[73,2834,2835],{"class":75,"line":76},[73,2836,2837],{},"age = 20\n",[73,2839,2840],{"class":75,"line":82},[73,2841,2842],{},"has_ticket = True\n",[73,2844,2845],{"class":75,"line":89},[73,2846,86],{"emptyLinePlaceholder":85},[73,2848,2849],{"class":75,"line":95},[73,2850,2851],{},"is_adult = age >= 18\n",[73,2853,2854],{"class":75,"line":101},[73,2855,2856],{},"can_enter = is_adult and has_ticket\n",[73,2858,2859],{"class":75,"line":107},[73,2860,2861],{},"print(is_adult)\n",[73,2863,2864],{"class":75,"line":112},[73,2865,2866],{},"print(can_enter)\n",[73,2868,2869],{"class":75,"line":2484},[73,2870,2871],{},"print(not has_ticket)\n",[10,2873,118],{},[64,2875,2878],{"className":2876,"code":2877,"language":124,"meta":69},[122],"True\nTrue\nFalse\n",[33,2879,2877],{"__ignoreMap":69},[10,2881,129],{},[14,2883,132],{"id":132},[134,2885,2886,2896],{},[44,2887,2888,2891,2892,2895],{},[33,2889,2890],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2893,2894],{},"is_adult","，这一步没有任何分支跳转。",[44,2897,2898,2901,2902,2904],{},[33,2899,2900],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2903,2819],{}," 只对紧随其后的值取反。",[150,2906,152],{"id":152},[10,2908,2909],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2911,2912],{},[26,2913],{"alt":2914,"src":2915},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2917,2918,2920,2921,2923],{},[33,2919,2811],{}," 只有“真、真”得到真；",[33,2922,2815],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2925,170],{"id":170},[41,2927,2928,2937],{},[44,2929,2930,2931,2933,2934,2936],{},"用单个等号判断相等。",[33,2932,2805],{}," 是赋值，",[33,2935,2797],{}," 才是相等比较。",[44,2938,2939],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2941,181],{"id":181},[134,2943,2944,2951],{},[44,2945,2946,2947,2950],{},"判断数字 ",[33,2948,2949],{},"15"," 是否同时大于 10 且小于 20。",[44,2952,2953,2954,2957],{},"分别修改年龄和票据状态，记录 ",[33,2955,2956],{},"can_enter"," 的四种组合结果。",[10,2959,195],{},[14,2961,198],{"id":198},[10,2963,2964],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,2966,205],{},{"title":69,"searchDepth":82,"depth":82,"links":2968},[2969,2970,2971,2972,2973,2976,2977,2978],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":2974},[2975],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2760,"description":2765},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[218,2986,2987],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2990,"title":2991,"body":2992,"category":218,"cover":219,"description":2996,"extension":220,"meta":3164,"navigation":85,"path":3165,"pinned":223,"publishedAt":224,"seo":3166,"slug":3167,"stem":3168,"summary":3169,"tags":3170,"updatedAt":224,"visible":85,"__hash__":3172},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2993,"toc":3154},[2994,2997,2999,3002,3004,3010,3028,3030,3043,3045,3047,3081,3083,3089,3091,3093,3115,3117,3129,3131,3145,3147,3149,3152],[10,2995,2996],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2998,16],{"id":16},[10,3000,3001],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3003,22],{"id":22},[10,3005,3006],{},[26,3007],{"alt":3008,"src":3009},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3011,3012,3015,3016,3019,3020,3023,3024,3027],{},[33,3013,3014],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3017,3018],{},"18","，程序首先得到的也是 ",[33,3021,3022],{},"\"18\"","，需要 ",[33,3025,3026],{},"int()"," 后才能按整数参与计算。",[14,3029,39],{"id":39},[41,3031,3032,3035,3040],{},[44,3033,3034],{},"提示文字应告诉用户需要输入什么。",[44,3036,3037,3039],{},[33,3038,3026],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[44,3041,3042],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3044,59],{"id":59},[10,3046,62],{},[64,3048,3050],{"className":66,"code":3049,"language":68,"meta":69,"style":69},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3051,3052,3057,3062,3067,3071,3076],{"__ignoreMap":69},[73,3053,3054],{"class":75,"line":76},[73,3055,3056],{},"name = input(\"请输入姓名：\")\n",[73,3058,3059],{"class":75,"line":82},[73,3060,3061],{},"age_text = input(\"请输入年龄：\")\n",[73,3063,3064],{"class":75,"line":89},[73,3065,3066],{},"age = int(age_text)\n",[73,3068,3069],{"class":75,"line":95},[73,3070,86],{"emptyLinePlaceholder":85},[73,3072,3073],{"class":75,"line":101},[73,3074,3075],{},"print(\"你好，\" + name)\n",[73,3077,3078],{"class":75,"line":107},[73,3079,3080],{},"print(age + 1)\n",[10,3082,118],{},[64,3084,3087],{"className":3085,"code":3086,"language":124,"meta":69},[122],"根据输入显示姓名，并输出下一年的年龄\n",[33,3088,3086],{"__ignoreMap":69},[10,3090,129],{},[14,3092,132],{"id":132},[134,3094,3095,3105],{},[44,3096,3097,3098,3100,3101,3104],{},"两次 ",[33,3099,3014],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3102,3103],{},"age_text"," 用来提醒这仍是文本。",[44,3106,3107,3110,3111,3114],{},[33,3108,3109],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3112,3113],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3116,170],{"id":170},[41,3118,3119,3126],{},[44,3120,3121,3122,3125],{},"直接计算 ",[33,3123,3124],{},"input(...) + 1","，忽略输入结果是字符串。",[44,3127,3128],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3130,181],{"id":181},[134,3132,3133,3136],{},[44,3134,3135],{},"接收两个整数并输出它们的和。",[44,3137,1711,3138,3141,3142,3144],{},[33,3139,3140],{},"18.5"," 给 ",[33,3143,3026],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3146,195],{},[14,3148,198],{"id":198},[10,3150,3151],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,3153,205],{},{"title":69,"searchDepth":82,"depth":82,"links":3155},[3156,3157,3158,3159,3160,3161,3162,3163],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2991,"description":2996},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[218,2336,3171],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3174,"title":3175,"body":3176,"category":218,"cover":219,"description":3180,"extension":220,"meta":3340,"navigation":85,"path":3341,"pinned":223,"publishedAt":224,"seo":3342,"slug":3343,"stem":3344,"summary":3345,"tags":3346,"updatedAt":224,"visible":85,"__hash__":3349},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3177,"toc":3330},[3178,3181,3183,3186,3188,3194,3201,3203,3217,3219,3221,3260,3262,3268,3270,3272,3291,3293,3308,3310,3321,3323,3325,3328],[10,3179,3180],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3182,16],{"id":16},[10,3184,3185],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3187,22],{"id":22},[10,3189,3190],{},[26,3191],{"alt":3192,"src":3193},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3195,3196,3197,3200],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3198,3199],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3202,39],{"id":39},[41,3204,3205,3208,3211],{},[44,3206,3207],{},"列表使用方括号，元素之间用逗号分隔。",[44,3209,3210],{},"列表可变，可以替换、追加和删除元素。",[44,3212,3213,3214,353],{},"访问不存在的索引会产生 ",[33,3215,3216],{},"IndexError",[14,3218,59],{"id":59},[10,3220,62],{},[64,3222,3224],{"className":66,"code":3223,"language":68,"meta":69,"style":69},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3225,3226,3231,3236,3240,3245,3250,3255],{"__ignoreMap":69},[73,3227,3228],{"class":75,"line":76},[73,3229,3230],{},"scores = [82, 90, 76]\n",[73,3232,3233],{"class":75,"line":82},[73,3234,3235],{},"print(scores[0])\n",[73,3237,3238],{"class":75,"line":89},[73,3239,86],{"emptyLinePlaceholder":85},[73,3241,3242],{"class":75,"line":95},[73,3243,3244],{},"scores[1] = 95\n",[73,3246,3247],{"class":75,"line":101},[73,3248,3249],{},"scores.append(88)\n",[73,3251,3252],{"class":75,"line":107},[73,3253,3254],{},"print(scores)\n",[73,3256,3257],{"class":75,"line":112},[73,3258,3259],{},"print(len(scores))\n",[10,3261,118],{},[64,3263,3266],{"className":3264,"code":3265,"language":124,"meta":69},[122],"82\n[82, 95, 76, 88]\n4\n",[33,3267,3265],{"__ignoreMap":69},[10,3269,129],{},[14,3271,132],{"id":132},[134,3273,3274,3277],{},[44,3275,3276],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[44,3278,3279,3282,3283,3286,3287,3290],{},[33,3280,3281],{},"scores[1] = 95"," 替换第二个位置，",[33,3284,3285],{},"append(88)"," 在末尾增加新位置，",[33,3288,3289],{},"len()"," 因而从 3 变为 4。",[14,3292,170],{"id":170},[41,3294,3295,3305],{},[44,3296,3297,3298,3301,3302,353],{},"访问 ",[33,3299,3300],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3303,3304],{},"len(scores) - 1",[44,3306,3307],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3309,181],{"id":181},[134,3311,3312,3315],{},[44,3313,3314],{},"建立三项学习任务列表，再追加第四项。",[44,3316,3317,3318,3320],{},"修改第二项，并用 ",[33,3319,3289],{}," 检查元素数量。",[10,3322,195],{},[14,3324,198],{"id":198},[10,3326,3327],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,3329,205],{},{"title":69,"searchDepth":82,"depth":82,"links":3331},[3332,3333,3334,3335,3336,3337,3338,3339],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3175,"description":3180},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[218,3347,3348],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3351,"title":3352,"body":3353,"category":218,"cover":219,"description":3357,"extension":220,"meta":3498,"navigation":85,"path":3499,"pinned":223,"publishedAt":224,"seo":3500,"slug":3501,"stem":3502,"summary":3503,"tags":3504,"updatedAt":224,"visible":85,"__hash__":3506},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3354,"toc":3488},[3355,3358,3360,3363,3365,3371,3374,3376,3387,3389,3391,3425,3427,3433,3435,3437,3451,3453,3465,3467,3479,3481,3483,3486],[10,3356,3357],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3359,16],{"id":16},[10,3361,3362],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3364,22],{"id":22},[10,3366,3367],{},[26,3368],{"alt":3369,"src":3370},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3372,3373],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3375,39],{"id":39},[41,3377,3378,3381,3384],{},[44,3379,3380],{},"元组常用来表达固定数量、固定含义的一组值。",[44,3382,3383],{},"只有一个元素的元组必须保留尾随逗号。",[44,3385,3386],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3388,59],{"id":59},[10,3390,62],{},[64,3392,3394],{"className":66,"code":3393,"language":68,"meta":69,"style":69},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3395,3396,3401,3406,3411,3415,3420],{"__ignoreMap":69},[73,3397,3398],{"class":75,"line":76},[73,3399,3400],{},"point = (120, 80)\n",[73,3402,3403],{"class":75,"line":82},[73,3404,3405],{},"print(point[0])\n",[73,3407,3408],{"class":75,"line":89},[73,3409,3410],{},"print(point[1])\n",[73,3412,3413],{"class":75,"line":95},[73,3414,86],{"emptyLinePlaceholder":85},[73,3416,3417],{"class":75,"line":101},[73,3418,3419],{},"single = (5,)\n",[73,3421,3422],{"class":75,"line":107},[73,3423,3424],{},"print(single)\n",[10,3426,118],{},[64,3428,3431],{"className":3429,"code":3430,"language":124,"meta":69},[122],"120\n80\n(5,)\n",[33,3432,3430],{"__ignoreMap":69},[10,3434,129],{},[14,3436,132],{"id":132},[134,3438,3439,3445],{},[44,3440,3441,3444],{},[33,3442,3443],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[44,3446,3447,3450],{},[33,3448,3449],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3452,170],{"id":170},[41,3454,3455,3462],{},[44,3456,3457,3458,3461],{},"把 ",[33,3459,3460],{},"(5)"," 当作元组，实际它仍是整数。",[44,3463,3464],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3466,181],{"id":181},[134,3468,3469,3472],{},[44,3470,3471],{},"用元组表示宽度和高度。",[44,3473,2164,3474,2167,3476,3478],{},[33,3475,3460],{},[33,3477,3449],{}," 的类型。",[10,3480,195],{},[14,3482,198],{"id":198},[10,3484,3485],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,3487,205],{},{"title":69,"searchDepth":82,"depth":82,"links":3489},[3490,3491,3492,3493,3494,3495,3496,3497],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3352,"description":3357},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[218,3505,3348],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3508,"title":3509,"body":3510,"category":218,"cover":219,"description":3514,"extension":220,"meta":3669,"navigation":85,"path":3670,"pinned":223,"publishedAt":224,"seo":3671,"slug":3672,"stem":3673,"summary":3674,"tags":3675,"updatedAt":224,"visible":85,"__hash__":3677},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3511,"toc":3659},[3512,3515,3517,3520,3522,3528,3538,3540,3554,3556,3558,3592,3594,3600,3602,3604,3619,3621,3640,3642,3650,3652,3654,3657],[10,3513,3514],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3516,16],{"id":16},[10,3518,3519],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3521,22],{"id":22},[10,3523,3524],{},[26,3525],{"alt":3526,"src":3527},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3529,3530,3531,3534,3535,3537],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3532,3533],{},"student[\"score\"]"," 读取的是键 ",[33,3536,2237],{}," 对应的值，而不是“第几个元素”。",[14,3539,39],{"id":39},[41,3541,3542,3545,3551],{},[44,3543,3544],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[44,3546,186,3547,3550],{},[33,3548,3549],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[44,3552,3553],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3555,59],{"id":59},[10,3557,62],{},[64,3559,3561],{"className":66,"code":3560,"language":68,"meta":69,"style":69},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3562,3563,3568,3573,3577,3582,3587],{"__ignoreMap":69},[73,3564,3565],{"class":75,"line":76},[73,3566,3567],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[73,3569,3570],{"class":75,"line":82},[73,3571,3572],{},"print(student[\"name\"])\n",[73,3574,3575],{"class":75,"line":89},[73,3576,86],{"emptyLinePlaceholder":85},[73,3578,3579],{"class":75,"line":95},[73,3580,3581],{},"student[\"score\"] = 95\n",[73,3583,3584],{"class":75,"line":101},[73,3585,3586],{},"student[\"city\"] = \"郑州\"\n",[73,3588,3589],{"class":75,"line":107},[73,3590,3591],{},"print(student)\n",[10,3593,118],{},[64,3595,3598],{"className":3596,"code":3597,"language":124,"meta":69},[122],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3599,3597],{"__ignoreMap":69},[10,3601,129],{},[14,3603,132],{"id":132},[134,3605,3606,3609],{},[44,3607,3608],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[44,3610,3611,3612,3614,3615,3618],{},"给已有键 ",[33,3613,2237],{}," 赋值会更新映射，给新键 ",[33,3616,3617],{},"city"," 赋值会增加映射。",[14,3620,170],{"id":170},[41,3622,3623,3630],{},[44,3624,3625,3626,3629],{},"按位置理解字典并尝试 ",[33,3627,3628],{},"student[0]","，而实际键是字符串。",[44,3631,3632,3633,3636,3637,353],{},"直接读取不确定存在的键并忽略 ",[33,3634,3635],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3638,3639],{},"get()",[14,3641,181],{"id":181},[134,3643,3644,3647],{},[44,3645,3646],{},"建立一本书的标题、作者和页数字典。",[44,3648,3649],{},"添加分类键，再修改页数。",[10,3651,195],{},[14,3653,198],{"id":198},[10,3655,3656],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,3658,205],{},{"title":69,"searchDepth":82,"depth":82,"links":3660},[3661,3662,3663,3664,3665,3666,3667,3668],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3509,"description":3514},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[218,3676,3348],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3679,"title":3680,"body":3681,"category":218,"cover":219,"description":3685,"extension":220,"meta":3834,"navigation":85,"path":3835,"pinned":223,"publishedAt":224,"seo":3836,"slug":3837,"stem":3838,"summary":3839,"tags":3840,"updatedAt":224,"visible":85,"__hash__":3842},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3682,"toc":3824},[3683,3686,3688,3691,3693,3699,3702,3704,3723,3725,3727,3761,3763,3769,3771,3773,3788,3790,3802,3804,3815,3817,3819,3822],[10,3684,3685],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3687,16],{"id":16},[10,3689,3690],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3692,22],{"id":22},[10,3694,3695],{},[26,3696],{"alt":3697,"src":3698},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3700,3701],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3703,39],{"id":39},[41,3705,3706,3709,3712],{},[44,3707,3708],{},"集合中的元素不重复。",[44,3710,3711],{},"集合是无序容器，不要依赖打印顺序或索引。",[44,3713,3714,3715,3718,3719,3722],{},"创建空集合必须写 ",[33,3716,3717],{},"set()","；",[33,3720,3721],{},"{}"," 创建的是空字典。",[14,3724,59],{"id":59},[10,3726,62],{},[64,3728,3730],{"className":66,"code":3729,"language":68,"meta":69,"style":69},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3731,3732,3737,3742,3746,3751,3756],{"__ignoreMap":69},[73,3733,3734],{"class":75,"line":76},[73,3735,3736],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[73,3738,3739],{"class":75,"line":82},[73,3740,3741],{},"right = {\"Python\", \"Docker\"}\n",[73,3743,3744],{"class":75,"line":89},[73,3745,86],{"emptyLinePlaceholder":85},[73,3747,3748],{"class":75,"line":95},[73,3749,3750],{},"print(left & right)\n",[73,3752,3753],{"class":75,"line":101},[73,3754,3755],{},"print(left | right)\n",[73,3757,3758],{"class":75,"line":107},[73,3759,3760],{},"print(\"Git\" in left)\n",[10,3762,118],{},[64,3764,3767],{"className":3765,"code":3766,"language":124,"meta":69},[122],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3768,3766],{"__ignoreMap":69},[10,3770,129],{},[14,3772,132],{"id":132},[134,3774,3775,3778],{},[44,3776,3777],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[44,3779,3780,3783,3784,3787],{},[33,3781,3782],{},"&"," 计算交集，",[33,3785,3786],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3789,170],{"id":170},[41,3791,3792,3799],{},[44,3793,186,3794,3796,3797,353],{},[33,3795,3721],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3798,3717],{},[44,3800,3801],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3803,181],{"id":181},[134,3805,3806,3812],{},[44,3807,3808,3809,3811],{},"把包含重复标签的列表交给 ",[33,3810,3717],{}," 去重。",[44,3813,3814],{},"计算两组课程标签的交集和差集。",[10,3816,195],{},[14,3818,198],{"id":198},[10,3820,3821],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,3823,205],{},{"title":69,"searchDepth":82,"depth":82,"links":3825},[3826,3827,3828,3829,3830,3831,3832,3833],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3680,"description":3685},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[218,3841,3348],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3844,"title":3845,"body":3846,"category":218,"cover":219,"description":3850,"extension":220,"meta":4048,"navigation":85,"path":4049,"pinned":223,"publishedAt":224,"seo":4050,"slug":4051,"stem":4052,"summary":4053,"tags":4054,"updatedAt":224,"visible":85,"__hash__":4057},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3847,"toc":4036},[3848,3851,3853,3856,3858,3864,3874,3876,3893,3895,3897,3947,3949,3955,3957,3959,3981,3983,3986,3992,3995,3997,4010,4012,4027,4029,4031,4034],[10,3849,3850],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3852,16],{"id":16},[10,3854,3855],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3857,22],{"id":22},[10,3859,3860],{},[26,3861],{"alt":3862,"src":3863},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3865,3866,3869,3870,3873],{},[33,3867,3868],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3871,3872],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3875,39],{"id":39},[41,3877,3878,3887,3890],{},[44,3879,3880,3882,3883,3886],{},[33,3881,2797],{}," 比较内容是否相等，",[33,3884,3885],{},"is"," 比较是否为同一个对象。",[44,3888,3889],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[44,3891,3892],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3894,59],{"id":59},[10,3896,62],{},[64,3898,3900],{"className":66,"code":3899,"language":68,"meta":69,"style":69},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3901,3902,3907,3912,3917,3921,3926,3931,3936,3941],{"__ignoreMap":69},[73,3903,3904],{"class":75,"line":76},[73,3905,3906],{},"tasks = [\"变量\", \"字符串\"]\n",[73,3908,3909],{"class":75,"line":82},[73,3910,3911],{},"shared = tasks\n",[73,3913,3914],{"class":75,"line":89},[73,3915,3916],{},"backup = tasks.copy()\n",[73,3918,3919],{"class":75,"line":95},[73,3920,86],{"emptyLinePlaceholder":85},[73,3922,3923],{"class":75,"line":101},[73,3924,3925],{},"tasks.append(\"列表\")\n",[73,3927,3928],{"class":75,"line":107},[73,3929,3930],{},"print(shared)\n",[73,3932,3933],{"class":75,"line":112},[73,3934,3935],{},"print(backup)\n",[73,3937,3938],{"class":75,"line":2484},[73,3939,3940],{},"print(tasks is shared)\n",[73,3942,3944],{"class":75,"line":3943},9,[73,3945,3946],{},"print(tasks is backup)\n",[10,3948,118],{},[64,3950,3953],{"className":3951,"code":3952,"language":124,"meta":69},[122],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3954,3952],{"__ignoreMap":69},[10,3956,129],{},[14,3958,132],{"id":132},[134,3960,3961,3967],{},[44,3962,3963,3966],{},[33,3964,3965],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[44,3968,3969,3972,3973,3976,3977,3980],{},[33,3970,3971],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3974,3975],{},"shared"," 能观察到变化，",[33,3978,3979],{},"backup"," 不会。",[150,3982,152],{"id":152},[10,3984,3985],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3987,3988],{},[26,3989],{"alt":3990,"src":3991},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3993,3994],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3996,170],{"id":170},[41,3998,3999,4007],{},[44,4000,4001,4002,4004,4005,353],{},"用 ",[33,4003,2797],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,4006,3885],{},[44,4008,4009],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4011,181],{"id":181},[134,4013,4014,4017],{},[44,4015,4016],{},"让两个变量引用同一个字典并修改其中一个。",[44,4018,186,4019,4022,4023,1148,4025,353],{},[33,4020,4021],{},"copy()"," 创建外层副本，再比较 ",[33,4024,3885],{},[33,4026,2797],{},[10,4028,195],{},[14,4030,198],{"id":198},[10,4032,4033],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,4035,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4037},[4038,4039,4040,4041,4042,4045,4046,4047],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":4043},[4044],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3845,"description":3850},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[218,4055,4056],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4059,"title":4060,"body":4061,"category":218,"cover":219,"description":4065,"extension":220,"meta":4278,"navigation":85,"path":4279,"pinned":223,"publishedAt":224,"seo":4280,"slug":4281,"stem":4282,"summary":4283,"tags":4284,"updatedAt":224,"visible":85,"__hash__":4286},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4062,"toc":4265},[4063,4066,4068,4071,4073,4079,4089,4091,4102,4104,4106,4159,4161,4167,4169,4171,4189,4191,4194,4200,4208,4211,4214,4220,4226,4228,4246,4248,4256,4258,4260,4263],[10,4064,4065],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4067,16],{"id":16},[10,4069,4070],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4072,22],{"id":22},[10,4074,4075],{},[26,4076],{"alt":4077,"src":4078},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4080,4081,2248,4083,2248,4086,4088],{},[33,4082,1147],{},[33,4084,4085],{},"elif",[33,4087,1151],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4090,39],{"id":39},[41,4092,4093,4096,4099],{},[44,4094,4095],{},"冒号表示接下来开始一个代码块。",[44,4097,4098],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[44,4100,4101],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4103,59],{"id":59},[10,4105,62],{},[64,4107,4109],{"className":66,"code":4108,"language":68,"meta":69,"style":69},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4110,4111,4116,4120,4125,4130,4135,4140,4144,4149,4153],{"__ignoreMap":69},[73,4112,4113],{"class":75,"line":76},[73,4114,4115],{},"score = int(input(\"请输入分数：\"))\n",[73,4117,4118],{"class":75,"line":82},[73,4119,86],{"emptyLinePlaceholder":85},[73,4121,4122],{"class":75,"line":89},[73,4123,4124],{},"if score >= 90:\n",[73,4126,4127],{"class":75,"line":95},[73,4128,4129],{},"    level = \"优秀\"\n",[73,4131,4132],{"class":75,"line":101},[73,4133,4134],{},"elif score >= 60:\n",[73,4136,4137],{"class":75,"line":107},[73,4138,4139],{},"    level = \"合格\"\n",[73,4141,4142],{"class":75,"line":112},[73,4143,1137],{},[73,4145,4146],{"class":75,"line":2484},[73,4147,4148],{},"    level = \"需要继续学习\"\n",[73,4150,4151],{"class":75,"line":3943},[73,4152,86],{"emptyLinePlaceholder":85},[73,4154,4156],{"class":75,"line":4155},10,[73,4157,4158],{},"print(level)\n",[10,4160,118],{},[64,4162,4165],{"className":4163,"code":4164,"language":124,"meta":69},[122],"输入 85 时输出：合格\n",[33,4166,4164],{"__ignoreMap":69},[10,4168,129],{},[14,4170,132],{"id":132},[134,4172,4173,4180],{},[44,4174,4175,4176,4179],{},"输入先转换为整数，程序从 ",[33,4177,4178],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[44,4181,4182,4185,4186,4188],{},[33,4183,4184],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4187,1151],{}," 被跳过；最终三个分支只会选择一个。",[150,4190,152],{"id":152},[10,4192,4193],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4195,4196],{},[26,4197],{"alt":4198,"src":4199},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4201,4202,4204,4205,4207],{},[33,4203,4178],{}," 必须放在 ",[33,4206,4184],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[150,4209,152],{"id":4210},"再看一个具体细节-1",[10,4212,4213],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4215,4216],{},[26,4217],{"alt":4218,"src":4219},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4221,4222,4223,4225],{},"同一缩进层级属于同一个代码块；回到 ",[33,4224,1147],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4227,170],{"id":170},[41,4229,4230,4236],{},[44,4231,4232,4233,4235],{},"先写 ",[33,4234,4184],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[44,4237,4238,4239,4241,4242,4245],{},"混用多个独立 ",[33,4240,1147],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4243,4244],{},"if\u002Felif\u002Felse"," 链。",[14,4247,181],{"id":181},[134,4249,4250,4253],{},[44,4251,4252],{},"根据温度输出“冷、适中、热”三个等级。",[44,4254,4255],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4257,195],{},[14,4259,198],{"id":198},[10,4261,4262],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,4264,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4266},[4267,4268,4269,4270,4271,4275,4276,4277],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":4272},[4273,4274],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4060,"description":4065},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[218,1147,4285],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4,"title":5,"body":4288,"category":218,"cover":219,"description":12,"extension":220,"meta":4425,"navigation":85,"path":222,"pinned":223,"publishedAt":224,"seo":4426,"slug":226,"stem":227,"summary":228,"tags":4427,"updatedAt":224,"visible":85,"__hash__":231},{"type":7,"value":4289,"toc":4413},[4290,4292,4294,4296,4298,4302,4306,4308,4318,4320,4322,4354,4356,4361,4363,4365,4375,4377,4379,4383,4387,4389,4395,4397,4405,4407,4409,4411],[10,4291,12],{},[14,4293,16],{"id":16},[10,4295,19],{},[14,4297,22],{"id":22},[10,4299,4300],{},[26,4301],{"alt":28,"src":29},[10,4303,4304,36],{},[33,4305,35],{},[14,4307,39],{"id":39},[41,4309,4310,4312,4314],{},[44,4311,46],{},[44,4313,49],{},[44,4315,52,4316,56],{},[33,4317,55],{},[14,4319,59],{"id":59},[10,4321,62],{},[64,4323,4324],{"className":66,"code":67,"language":68,"meta":69,"style":69},[33,4325,4326,4330,4334,4338,4342,4346,4350],{"__ignoreMap":69},[73,4327,4328],{"class":75,"line":76},[73,4329,79],{},[73,4331,4332],{"class":75,"line":82},[73,4333,86],{"emptyLinePlaceholder":85},[73,4335,4336],{"class":75,"line":89},[73,4337,92],{},[73,4339,4340],{"class":75,"line":95},[73,4341,98],{},[73,4343,4344],{"class":75,"line":101},[73,4345,104],{},[73,4347,4348],{"class":75,"line":107},[73,4349,86],{"emptyLinePlaceholder":85},[73,4351,4352],{"class":75,"line":112},[73,4353,115],{},[10,4355,118],{},[64,4357,4359],{"className":4358,"code":123,"language":124,"meta":69},[122],[33,4360,123],{"__ignoreMap":69},[10,4362,129],{},[14,4364,132],{"id":132},[134,4366,4367,4371],{},[44,4368,138,4369,142],{},[33,4370,141],{},[44,4372,145,4373,148],{},[33,4374,141],{},[150,4376,152],{"id":152},[10,4378,155],{},[10,4380,4381],{},[26,4382],{"alt":160,"src":161},[10,4384,164,4385,167],{},[33,4386,141],{},[14,4388,170],{"id":170},[41,4390,4391,4393],{},[44,4392,175],{},[44,4394,178],{},[14,4396,181],{"id":181},[134,4398,4399,4403],{},[44,4400,186,4401,189],{},[33,4402,35],{},[44,4404,192],{},[10,4406,195],{},[14,4408,198],{"id":198},[10,4410,201],{},[203,4412,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4414},[4415,4416,4417,4418,4419,4422,4423,4424],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":4420},[4421],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5,"description":12},[218,35,230],{"id":4429,"title":4430,"body":4431,"category":218,"cover":219,"description":4435,"extension":220,"meta":4583,"navigation":85,"path":4584,"pinned":223,"publishedAt":224,"seo":4585,"slug":4586,"stem":4587,"summary":4588,"tags":4589,"updatedAt":224,"visible":85,"__hash__":4591},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4432,"toc":4573},[4433,4436,4438,4441,4443,4449,4454,4456,4470,4472,4474,4512,4514,4520,4522,4524,4541,4543,4551,4553,4564,4566,4568,4571],[10,4434,4435],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4437,16],{"id":16},[10,4439,4440],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4442,22],{"id":22},[10,4444,4445],{},[26,4446],{"alt":4447,"src":4448},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4450,4451,4453],{},[33,4452,55],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4455,39],{"id":39},[41,4457,4458,4464,4467],{},[44,4459,4460,4463],{},[33,4461,4462],{},"range(1, 4)"," 包含 1，不包含 4。",[44,4465,4466],{},"只需要元素时直接遍历元素，不必手工维护索引。",[44,4468,4469],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4471,59],{"id":59},[10,4473,62],{},[64,4475,4477],{"className":66,"code":4476,"language":68,"meta":69,"style":69},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4478,4479,4484,4488,4493,4498,4502,4507],{"__ignoreMap":69},[73,4480,4481],{"class":75,"line":76},[73,4482,4483],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[73,4485,4486],{"class":75,"line":82},[73,4487,86],{"emptyLinePlaceholder":85},[73,4489,4490],{"class":75,"line":89},[73,4491,4492],{},"for course in courses:\n",[73,4494,4495],{"class":75,"line":95},[73,4496,4497],{},"    print(course)\n",[73,4499,4500],{"class":75,"line":101},[73,4501,86],{"emptyLinePlaceholder":85},[73,4503,4504],{"class":75,"line":107},[73,4505,4506],{},"for number in range(1, 4):\n",[73,4508,4509],{"class":75,"line":112},[73,4510,4511],{},"    print(number)\n",[10,4513,118],{},[64,4515,4518],{"className":4516,"code":4517,"language":124,"meta":69},[122],"变量\n字符串\n列表\n1\n2\n3\n",[33,4519,4517],{"__ignoreMap":69},[10,4521,129],{},[14,4523,132],{"id":132},[134,4525,4526,4536],{},[44,4527,4528,4529,4531,4532,4535],{},"第一个 ",[33,4530,55],{}," 依次从列表取得字符串，循环变量 ",[33,4533,4534],{},"course"," 每轮重新绑定。",[44,4537,4538,4540],{},[33,4539,4462],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4542,170],{"id":170},[41,4544,4545,4548],{},[44,4546,4547],{},"只需要元素却手工维护索引，增加越界风险。",[44,4549,4550],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4552,181],{"id":181},[134,4554,4555,4558],{},[44,4556,4557],{},"逐项输出一个字符串中的字符。",[44,4559,186,4560,4563],{},[33,4561,4562],{},"range()"," 输出 2、4、6、8。",[10,4565,195],{},[14,4567,198],{"id":198},[10,4569,4570],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,4572,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4574},[4575,4576,4577,4578,4579,4580,4581,4582],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4430,"description":4435},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[218,55,4590],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4593,"title":4594,"body":4595,"category":218,"cover":219,"description":4599,"extension":220,"meta":4773,"navigation":85,"path":4774,"pinned":223,"publishedAt":224,"seo":4775,"slug":4776,"stem":4777,"summary":4778,"tags":4779,"updatedAt":224,"visible":85,"__hash__":4780},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4596,"toc":4763},[4597,4600,4602,4605,4607,4613,4623,4625,4644,4646,4648,4700,4702,4708,4710,4712,4726,4728,4744,4746,4754,4756,4758,4761],[10,4598,4599],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4601,16],{"id":16},[10,4603,4604],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4606,22],{"id":22},[10,4608,4609],{},[26,4610],{"alt":4611,"src":4612},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4614,4615,4618,4619,4622],{},[33,4616,4617],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4620,4621],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4624,39],{"id":39},[41,4626,4627,4630,4638],{},[44,4628,4629],{},"先写普通循环，再在确有需要时加入流程控制语句。",[44,4631,4632,4634,4635,4637],{},[33,4633,4617],{}," 前要确认不会跳过 ",[33,4636,35],{}," 循环中的状态更新。",[44,4639,4640,4641,4643],{},"多层嵌套中 ",[33,4642,4621],{}," 只结束它所在的最内层循环。",[14,4645,59],{"id":59},[10,4647,62],{},[64,4649,4651],{"className":66,"code":4650,"language":68,"meta":69,"style":69},"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,4652,4653,4658,4662,4667,4672,4677,4682,4687,4691,4695],{"__ignoreMap":69},[73,4654,4655],{"class":75,"line":76},[73,4656,4657],{},"numbers = [3, -1, 0, 8, 12]\n",[73,4659,4660],{"class":75,"line":82},[73,4661,86],{"emptyLinePlaceholder":85},[73,4663,4664],{"class":75,"line":89},[73,4665,4666],{},"for number in numbers:\n",[73,4668,4669],{"class":75,"line":95},[73,4670,4671],{},"    if number \u003C 0:\n",[73,4673,4674],{"class":75,"line":101},[73,4675,4676],{},"        continue\n",[73,4678,4679],{"class":75,"line":107},[73,4680,4681],{},"    if number == 0:\n",[73,4683,4684],{"class":75,"line":112},[73,4685,4686],{},"        break\n",[73,4688,4689],{"class":75,"line":2484},[73,4690,4511],{},[73,4692,4693],{"class":75,"line":3943},[73,4694,86],{"emptyLinePlaceholder":85},[73,4696,4697],{"class":75,"line":4155},[73,4698,4699],{},"print(\"循环结束\")\n",[10,4701,118],{},[64,4703,4706],{"className":4704,"code":4705,"language":124,"meta":69},[122],"3\n循环结束\n",[33,4707,4705],{"__ignoreMap":69},[10,4709,129],{},[14,4711,132],{"id":132},[134,4713,4714,4720],{},[44,4715,4716,4717,4719],{},"遇到 -1 时 ",[33,4718,4617],{}," 立即结束本轮，后面的判断和输出都不执行。",[44,4721,4722,4723,4725],{},"遇到 0 时 ",[33,4724,4621],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4727,170],{"id":170},[41,4729,4730,4735],{},[44,4731,3457,4732,4734],{},[33,4733,4617],{}," 当作结束循环，实际它只跳到下一轮。",[44,4736,4737,4738,4740,4741,4743],{},"在 ",[33,4739,35],{}," 中把状态更新放在可能被 ",[33,4742,4617],{}," 跳过的位置，造成无限循环。",[14,4745,181],{"id":181},[134,4747,4748,4751],{},[44,4749,4750],{},"跳过列表中的空字符串并输出其他内容。",[44,4752,4753],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4755,195],{},[14,4757,198],{"id":198},[10,4759,4760],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,4762,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4764},[4765,4766,4767,4768,4769,4770,4771,4772],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4594,"description":4599},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[218,4621,4617],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4782,"title":4783,"body":4784,"category":218,"cover":219,"description":4788,"extension":220,"meta":4959,"navigation":85,"path":4960,"pinned":223,"publishedAt":224,"seo":4961,"slug":4962,"stem":4963,"summary":4964,"tags":4965,"updatedAt":224,"visible":85,"__hash__":4968},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4785,"toc":4947},[4786,4789,4791,4794,4796,4802,4805,4807,4831,4833,4835,4869,4871,4877,4879,4881,4898,4900,4903,4909,4912,4914,4928,4930,4938,4940,4942,4945],[10,4787,4788],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4790,16],{"id":16},[10,4792,4793],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4795,22],{"id":22},[10,4797,4798],{},[26,4799],{"alt":4800,"src":4801},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4803,4804],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4806,39],{"id":39},[41,4808,4809,4812,4815],{},[44,4810,4811],{},"每增加一层嵌套，阅读成本都会上升。",[44,4813,4814],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[44,4816,4817,4818,2248,4821,4824,4825,2248,4828,353],{},"变量名使用 ",[33,4819,4820],{},"row",[33,4822,4823],{},"cell"," 等层级含义，避免全部写成 ",[33,4826,4827],{},"i",[33,4829,4830],{},"j",[14,4832,59],{"id":59},[10,4834,62],{},[64,4836,4838],{"className":66,"code":4837,"language":68,"meta":69,"style":69},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4839,4840,4845,4849,4854,4859,4864],{"__ignoreMap":69},[73,4841,4842],{"class":75,"line":76},[73,4843,4844],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[73,4846,4847],{"class":75,"line":82},[73,4848,86],{"emptyLinePlaceholder":85},[73,4850,4851],{"class":75,"line":89},[73,4852,4853],{},"for row in table:\n",[73,4855,4856],{"class":75,"line":95},[73,4857,4858],{},"    for cell in row:\n",[73,4860,4861],{"class":75,"line":101},[73,4862,4863],{},"        print(cell)\n",[73,4865,4866],{"class":75,"line":107},[73,4867,4868],{},"    print(\"一行结束\")\n",[10,4870,118],{},[64,4872,4875],{"className":4873,"code":4874,"language":124,"meta":69},[122],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4876,4874],{"__ignoreMap":69},[10,4878,129],{},[14,4880,132],{"id":132},[134,4882,4883,4895],{},[44,4884,4885,4886,4888,4889,1148,4892,353],{},"外层变量 ",[33,4887,4820],{}," 先引用第一行列表，内层才依次处理 ",[33,4890,4891],{},"A1",[33,4893,4894],{},"A2",[44,4896,4897],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[150,4899,152],{"id":152},[10,4901,4902],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4904,4905],{},[26,4906],{"alt":4907,"src":4908},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4910,4911],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4913,170],{"id":170},[41,4915,4916,4925],{},[44,4917,4918,4919,1000,4922,4924],{},"把两层循环变量都叫 ",[33,4920,4921],{},"item",[33,4923,4827],{},"，难以确认当前层级。",[44,4926,4927],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4929,181],{"id":181},[134,4931,4932,4935],{},[44,4933,4934],{},"打印一个 2×3 数字表。",[44,4936,4937],{},"在内层增加条件，只输出大于 3 的元素。",[10,4939,195],{},[14,4941,198],{"id":198},[10,4943,4944],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,4946,205],{},{"title":69,"searchDepth":82,"depth":82,"links":4948},[4949,4950,4951,4952,4953,4956,4957,4958],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":4954},[4955],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4783,"description":4788},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[218,4966,4967],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4970,"title":4971,"body":4972,"category":218,"cover":219,"description":4976,"extension":220,"meta":5114,"navigation":85,"path":5115,"pinned":223,"publishedAt":224,"seo":5116,"slug":5117,"stem":5118,"summary":5119,"tags":5120,"updatedAt":224,"visible":85,"__hash__":5123},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4973,"toc":5104},[4974,4977,4979,4982,4984,4990,4993,4995,5006,5008,5010,5048,5050,5056,5058,5060,5072,5074,5085,5087,5095,5097,5099,5102],[10,4975,4976],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4978,16],{"id":16},[10,4980,4981],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4983,22],{"id":22},[10,4985,4986],{},[26,4987],{"alt":4988,"src":4989},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4991,4992],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4994,39],{"id":39},[41,4996,4997,5000,5003],{},[44,4998,4999],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[44,5001,5002],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[44,5004,5005],{},"推导式创建新列表，不修改输入列表。",[14,5007,59],{"id":59},[10,5009,62],{},[64,5011,5013],{"className":66,"code":5012,"language":68,"meta":69,"style":69},"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,5014,5015,5020,5024,5029,5034,5038,5043],{"__ignoreMap":69},[73,5016,5017],{"class":75,"line":76},[73,5018,5019],{},"numbers = [1, 2, 3, 4, 5]\n",[73,5021,5022],{"class":75,"line":82},[73,5023,86],{"emptyLinePlaceholder":85},[73,5025,5026],{"class":75,"line":89},[73,5027,5028],{},"squares = [number * number for number in numbers]\n",[73,5030,5031],{"class":75,"line":95},[73,5032,5033],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[73,5035,5036],{"class":75,"line":101},[73,5037,86],{"emptyLinePlaceholder":85},[73,5039,5040],{"class":75,"line":107},[73,5041,5042],{},"print(squares)\n",[73,5044,5045],{"class":75,"line":112},[73,5046,5047],{},"print(even_squares)\n",[10,5049,118],{},[64,5051,5054],{"className":5052,"code":5053,"language":124,"meta":69},[122],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5055,5053],{"__ignoreMap":69},[10,5057,129],{},[14,5059,132],{"id":132},[134,5061,5062,5065],{},[44,5063,5064],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[44,5066,5067,5068,5071],{},"第二条先用 ",[33,5069,5070],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5073,170],{"id":170},[41,5075,5076,5082],{},[44,5077,5078,5079,5081],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5080,55],{}," 开始找输入。",[44,5083,5084],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5086,181],{"id":181},[134,5088,5089,5092],{},[44,5090,5091],{},"把字符串列表转换为长度列表。",[44,5093,5094],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5096,195],{},[14,5098,198],{"id":198},[10,5100,5101],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,5103,205],{},{"title":69,"searchDepth":82,"depth":82,"links":5105},[5106,5107,5108,5109,5110,5111,5112,5113],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4971,"description":4976},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[218,5121,5122],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5125,"title":5126,"body":5127,"category":218,"cover":219,"description":5131,"extension":220,"meta":5274,"navigation":85,"path":5275,"pinned":223,"publishedAt":224,"seo":5276,"slug":5277,"stem":5278,"summary":5279,"tags":5280,"updatedAt":224,"visible":85,"__hash__":5283},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5128,"toc":5264},[5129,5132,5134,5137,5139,5145,5148,5150,5161,5163,5165,5204,5206,5212,5214,5216,5231,5233,5241,5243,5255,5257,5259,5262],[10,5130,5131],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5133,16],{"id":16},[10,5135,5136],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5138,22],{"id":22},[10,5140,5141],{},[26,5142],{"alt":5143,"src":5144},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5146,5147],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5149,39],{"id":39},[41,5151,5152,5155,5158],{},[44,5153,5154],{},"函数名描述动作，使用小写字母和下划线。",[44,5156,5157],{},"函数定义要先执行，之后才能调用。",[44,5159,5160],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5162,59],{"id":59},[10,5164,62],{},[64,5166,5168],{"className":66,"code":5167,"language":68,"meta":69,"style":69},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5169,5170,5175,5180,5185,5189,5194,5199],{"__ignoreMap":69},[73,5171,5172],{"class":75,"line":76},[73,5173,5174],{},"def show_progress():\n",[73,5176,5177],{"class":75,"line":82},[73,5178,5179],{},"    print(\"正在学习函数\")\n",[73,5181,5182],{"class":75,"line":89},[73,5183,5184],{},"    print(\"本节完成 50%\")\n",[73,5186,5187],{"class":75,"line":95},[73,5188,86],{"emptyLinePlaceholder":85},[73,5190,5191],{"class":75,"line":101},[73,5192,5193],{},"print(\"调用前\")\n",[73,5195,5196],{"class":75,"line":107},[73,5197,5198],{},"show_progress()\n",[73,5200,5201],{"class":75,"line":112},[73,5202,5203],{},"print(\"调用后\")\n",[10,5205,118],{},[64,5207,5210],{"className":5208,"code":5209,"language":124,"meta":69},[122],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5211,5209],{"__ignoreMap":69},[10,5213,129],{},[14,5215,132],{"id":132},[134,5217,5218,5224],{},[44,5219,929,5220,5223],{},[33,5221,5222],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[44,5225,5226,5227,5230],{},"运行到 ",[33,5228,5229],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5232,170],{"id":170},[41,5234,5235,5238],{},[44,5236,5237],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[44,5239,5240],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5242,181],{"id":181},[134,5244,5245,5252],{},[44,5246,5247,5248,5251],{},"定义 ",[33,5249,5250],{},"show_plan()"," 输出两行学习计划。",[44,5253,5254],{},"连续调用同一个函数两次，观察执行顺序。",[10,5256,195],{},[14,5258,198],{"id":198},[10,5260,5261],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,5263,205],{},{"title":69,"searchDepth":82,"depth":82,"links":5265},[5266,5267,5268,5269,5270,5271,5272,5273],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5126,"description":5131},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[218,5281,5282],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5285,"title":5286,"body":5287,"category":218,"cover":219,"description":5291,"extension":220,"meta":5471,"navigation":85,"path":5472,"pinned":223,"publishedAt":224,"seo":5473,"slug":5474,"stem":5475,"summary":5476,"tags":5477,"updatedAt":224,"visible":85,"__hash__":5480},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5288,"toc":5459},[5289,5292,5294,5297,5299,5305,5312,5314,5331,5333,5335,5369,5371,5377,5379,5381,5402,5404,5407,5413,5423,5425,5440,5442,5450,5452,5454,5457],[10,5290,5291],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5293,16],{"id":16},[10,5295,5296],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5298,22],{"id":22},[10,5300,5301],{},[26,5302],{"alt":5303,"src":5304},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5306,5307,5308,5311],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5309,5310],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5313,39],{"id":39},[41,5315,5316,5319,5322],{},[44,5317,5318],{},"形参出现在函数定义中，实参出现在函数调用中。",[44,5320,5321],{},"局部变量默认只在函数内部可见。",[44,5323,5324,5325,5327,5328,353],{},"没有显式 ",[33,5326,5310],{}," 的函数会返回 ",[33,5329,5330],{},"None",[14,5332,59],{"id":59},[10,5334,62],{},[64,5336,5338],{"className":66,"code":5337,"language":68,"meta":69,"style":69},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5339,5340,5345,5350,5355,5359,5364],{"__ignoreMap":69},[73,5341,5342],{"class":75,"line":76},[73,5343,5344],{},"def calculate_total(price, count):\n",[73,5346,5347],{"class":75,"line":82},[73,5348,5349],{},"    total = price * count\n",[73,5351,5352],{"class":75,"line":89},[73,5353,5354],{},"    return total\n",[73,5356,5357],{"class":75,"line":95},[73,5358,86],{"emptyLinePlaceholder":85},[73,5360,5361],{"class":75,"line":101},[73,5362,5363],{},"result = calculate_total(25, 4)\n",[73,5365,5366],{"class":75,"line":107},[73,5367,5368],{},"print(result)\n",[10,5370,118],{},[64,5372,5375],{"className":5373,"code":5374,"language":124,"meta":69},[122],"100\n",[33,5376,5374],{"__ignoreMap":69},[10,5378,129],{},[14,5380,132],{"id":132},[134,5382,5383,5392],{},[44,5384,5385,5386,2248,5389,5391],{},"调用时 25 和 4 分别绑定到 ",[33,5387,5388],{},"price",[33,5390,141],{},"，它们只在本次函数调用的局部范围中使用。",[44,5393,5394,5397,5398,5401],{},[33,5395,5396],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5399,5400],{},"result"," 并输出。",[150,5403,152],{"id":152},[10,5405,5406],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5408,5409],{},[26,5410],{"alt":5411,"src":5412},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5414,5415,2248,5417,1148,5419,5422],{},[33,5416,5388],{},[33,5418,141],{},[33,5420,5421],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5424,170],{"id":170},[41,5426,5427,5434],{},[44,5428,5429,5430,5433],{},"在函数内部只 ",[33,5431,5432],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[44,5435,5436,5437,5439],{},"试图在函数外直接访问局部变量 ",[33,5438,5421],{},"，它的名字只在调用期间的局部作用域存在。",[14,5441,181],{"id":181},[134,5443,5444,5447],{},[44,5445,5446],{},"编写计算长方形面积的函数。",[44,5448,5449],{},"让函数返回结果后在调用方加上单位再输出。",[10,5451,195],{},[14,5453,198],{"id":198},[10,5455,5456],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,5458,205],{},{"title":69,"searchDepth":82,"depth":82,"links":5460},[5461,5462,5463,5464,5465,5468,5469,5470],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":5466},[5467],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5286,"description":5291},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[218,5478,5479],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5482,"title":5483,"body":5484,"category":218,"cover":219,"description":5488,"extension":220,"meta":5668,"navigation":85,"path":5669,"pinned":223,"publishedAt":224,"seo":5670,"slug":5671,"stem":5672,"summary":5673,"tags":5674,"updatedAt":224,"visible":85,"__hash__":5677},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5485,"toc":5656},[5486,5489,5491,5494,5496,5502,5505,5507,5524,5526,5528,5580,5582,5588,5590,5592,5610,5612,5615,5621,5624,5626,5637,5639,5647,5649,5651,5654],[10,5487,5488],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5490,16],{"id":16},[10,5492,5493],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5495,22],{"id":22},[10,5497,5498],{},[26,5499],{"alt":5500,"src":5501},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5503,5504],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5506,39],{"id":39},[41,5508,5509,5512,5518],{},[44,5510,5511],{},"必需参数应放在有默认值的参数之前。",[44,5513,5514,5517],{},[33,5515,5516],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[44,5519,5520,5523],{},[33,5521,5522],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5525,59],{"id":59},[10,5527,62],{},[64,5529,5531],{"className":66,"code":5530,"language":68,"meta":69,"style":69},"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,5532,5533,5538,5543,5547,5552,5557,5561,5566,5571,5575],{"__ignoreMap":69},[73,5534,5535],{"class":75,"line":76},[73,5536,5537],{},"def build_title(name, level=\"基础\"):\n",[73,5539,5540],{"class":75,"line":82},[73,5541,5542],{},"    return name + \"｜\" + level\n",[73,5544,5545],{"class":75,"line":89},[73,5546,86],{"emptyLinePlaceholder":85},[73,5548,5549],{"class":75,"line":95},[73,5550,5551],{},"print(build_title(\"Python\"))\n",[73,5553,5554],{"class":75,"line":101},[73,5555,5556],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[73,5558,5559],{"class":75,"line":107},[73,5560,86],{"emptyLinePlaceholder":85},[73,5562,5563],{"class":75,"line":112},[73,5564,5565],{},"def total(*numbers):\n",[73,5567,5568],{"class":75,"line":2484},[73,5569,5570],{},"    return sum(numbers)\n",[73,5572,5573],{"class":75,"line":3943},[73,5574,86],{"emptyLinePlaceholder":85},[73,5576,5577],{"class":75,"line":4155},[73,5578,5579],{},"print(total(10, 20, 30))\n",[10,5581,118],{},[64,5583,5586],{"className":5584,"code":5585,"language":124,"meta":69},[122],"Python｜基础\n异常处理｜进阶\n60\n",[33,5587,5585],{"__ignoreMap":69},[10,5589,129],{},[14,5591,132],{"id":132},[134,5593,5594,5601],{},[44,5595,5596,5597,5600],{},"第一次调用只提供必需参数，",[33,5598,5599],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[44,5602,5603,5606,5607,353],{},[33,5604,5605],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5608,5609],{},"sum()",[150,5611,152],{"id":152},[10,5613,5614],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5616,5617],{},[26,5618],{"alt":5619,"src":5620},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5622,5623],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5625,170],{"id":170},[41,5627,5628,5634],{},[44,5629,5630,5631,5633],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5632,5330],{}," 再在函数内创建。",[44,5635,5636],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5638,181],{"id":181},[134,5640,5641,5644],{},[44,5642,5643],{},"给问候函数增加默认称呼。",[44,5645,5646],{},"编写接收任意数量分数并返回总分的函数。",[10,5648,195],{},[14,5650,198],{"id":198},[10,5652,5653],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,5655,205],{},{"title":69,"searchDepth":82,"depth":82,"links":5657},[5658,5659,5660,5661,5662,5665,5666,5667],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":5663},[5664],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5483,"description":5488},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[218,5675,5676],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5679,"title":5680,"body":5681,"category":218,"cover":219,"description":5685,"extension":220,"meta":5882,"navigation":85,"path":5883,"pinned":223,"publishedAt":224,"seo":5884,"slug":5885,"stem":5886,"summary":5887,"tags":5888,"updatedAt":224,"visible":85,"__hash__":5891},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5682,"toc":5870},[5683,5686,5688,5691,5693,5699,5702,5704,5721,5723,5725,5788,5790,5796,5798,5800,5827,5829,5832,5838,5841,5843,5851,5853,5861,5863,5865,5868],[10,5684,5685],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5687,16],{"id":16},[10,5689,5690],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5692,22],{"id":22},[10,5694,5695],{},[26,5696],{"alt":5697,"src":5698},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5700,5701],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5703,39],{"id":39},[41,5705,5706,5709,5712],{},[44,5707,5708],{},"函数内部赋值默认创建局部变量。",[44,5710,5711],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[44,5713,5714,2167,5717,5720],{},[33,5715,5716],{},"global",[33,5718,5719],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5722,59],{"id":59},[10,5724,62],{},[64,5726,5728],{"className":66,"code":5727,"language":68,"meta":69,"style":69},"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,5729,5730,5735,5739,5744,5749,5753,5758,5763,5768,5772,5777,5782],{"__ignoreMap":69},[73,5731,5732],{"class":75,"line":76},[73,5733,5734],{},"course = \"Python\"\n",[73,5736,5737],{"class":75,"line":82},[73,5738,86],{"emptyLinePlaceholder":85},[73,5740,5741],{"class":75,"line":89},[73,5742,5743],{},"def outer():\n",[73,5745,5746],{"class":75,"line":95},[73,5747,5748],{},"    level = \"基础\"\n",[73,5750,5751],{"class":75,"line":101},[73,5752,86],{"emptyLinePlaceholder":85},[73,5754,5755],{"class":75,"line":107},[73,5756,5757],{},"    def show():\n",[73,5759,5760],{"class":75,"line":112},[73,5761,5762],{},"        lesson = \"作用域\"\n",[73,5764,5765],{"class":75,"line":2484},[73,5766,5767],{},"        print(course, level, lesson)\n",[73,5769,5770],{"class":75,"line":3943},[73,5771,86],{"emptyLinePlaceholder":85},[73,5773,5774],{"class":75,"line":4155},[73,5775,5776],{},"    show()\n",[73,5778,5780],{"class":75,"line":5779},11,[73,5781,86],{"emptyLinePlaceholder":85},[73,5783,5785],{"class":75,"line":5784},12,[73,5786,5787],{},"outer()\n",[10,5789,118],{},[64,5791,5794],{"className":5792,"code":5793,"language":124,"meta":69},[122],"Python 基础 作用域\n",[33,5795,5793],{"__ignoreMap":69},[10,5797,129],{},[14,5799,132],{"id":132},[134,5801,5802,5819],{},[44,5803,5804,5807,5808,5811,5812,5814,5815,5818],{},[33,5805,5806],{},"show()"," 中查找 ",[33,5809,5810],{},"lesson"," 时先在局部找到，查找 ",[33,5813,5599],{}," 时到外层 ",[33,5816,5817],{},"outer()"," 找到。",[44,5820,5821,5823,5824,5826],{},[33,5822,4534],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5825,2199],{}," 最后在内置作用域找到。",[150,5828,152],{"id":152},[10,5830,5831],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5833,5834],{},[26,5835],{"alt":5836,"src":5837},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5839,5840],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5842,170],{"id":170},[41,5844,5845,5848],{},[44,5846,5847],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[44,5849,5850],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5852,181],{"id":181},[134,5854,5855,5858],{},[44,5856,5857],{},"在内外层定义同名变量，观察最近作用域优先。",[44,5859,5860],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5862,195],{},[14,5864,198],{"id":198},[10,5866,5867],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,5869,205],{},{"title":69,"searchDepth":82,"depth":82,"links":5871},[5872,5873,5874,5875,5876,5879,5880,5881],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":5877},[5878],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5680,"description":5685},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[218,5889,5890],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5893,"title":5894,"body":5895,"category":218,"cover":219,"description":5899,"extension":220,"meta":6049,"navigation":85,"path":6050,"pinned":223,"publishedAt":224,"seo":6051,"slug":6052,"stem":6053,"summary":6054,"tags":6055,"updatedAt":224,"visible":85,"__hash__":6058},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5896,"toc":6039},[5897,5900,5902,5905,5907,5913,5916,5918,5937,5939,5941,5975,5977,5983,5985,5987,6002,6004,6016,6018,6030,6032,6034,6037],[10,5898,5899],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5901,16],{"id":16},[10,5903,5904],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5906,22],{"id":22},[10,5908,5909],{},[26,5910],{"alt":5911,"src":5912},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5914,5915],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5917,39],{"id":39},[41,5919,5920,5923,5926],{},[44,5921,5922],{},"文档字符串紧跟在函数定义后的第一条语句。",[44,5924,5925],{},"注解表达接口意图，不代替输入校验和测试。",[44,5927,5928,5929,2248,5931,2248,5933,5936],{},"基础注解优先使用 ",[33,5930,2251],{},[33,5932,2416],{},[33,5934,5935],{},"list[str]"," 等直接写法。",[14,5938,59],{"id":59},[10,5940,62],{},[64,5942,5944],{"className":66,"code":5943,"language":68,"meta":69,"style":69},"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,5945,5946,5951,5956,5961,5965,5970],{"__ignoreMap":69},[73,5947,5948],{"class":75,"line":76},[73,5949,5950],{},"def format_score(name: str, score: int) -> str:\n",[73,5952,5953],{"class":75,"line":82},[73,5954,5955],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[73,5957,5958],{"class":75,"line":89},[73,5959,5960],{},"    return name + \"：\" + str(score)\n",[73,5962,5963],{"class":75,"line":95},[73,5964,86],{"emptyLinePlaceholder":85},[73,5966,5967],{"class":75,"line":101},[73,5968,5969],{},"print(format_score(\"小郑\", 95))\n",[73,5971,5972],{"class":75,"line":107},[73,5973,5974],{},"print(format_score.__doc__)\n",[10,5976,118],{},[64,5978,5981],{"className":5979,"code":5980,"language":124,"meta":69},[122],"小郑：95\n返回带姓名的分数文本。\n",[33,5982,5980],{"__ignoreMap":69},[10,5984,129],{},[14,5986,132],{"id":132},[134,5988,5989,5999],{},[44,5990,5991,5992,5995,5996,5998],{},"函数签名说明 ",[33,5993,5994],{},"name"," 预期为字符串、",[33,5997,2237],{}," 预期为整数，返回值预期为字符串。",[44,6000,6001],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6003,170],{"id":170},[41,6005,6006,6013],{},[44,6007,6008,6009,6012],{},"认为加了 ",[33,6010,6011],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[44,6014,6015],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6017,181],{"id":181},[134,6019,6020,6023],{},[44,6021,6022],{},"为面积函数补充参数和返回值注解。",[44,6024,6025,6026,6029],{},"通过 ",[33,6027,6028],{},"函数名.__doc__"," 查看文档字符串。",[10,6031,195],{},[14,6033,198],{"id":198},[10,6035,6036],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,6038,205],{},{"title":69,"searchDepth":82,"depth":82,"links":6040},[6041,6042,6043,6044,6045,6046,6047,6048],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5894,"description":5899},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[218,6056,6057],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6060,"title":6061,"body":6062,"category":218,"cover":219,"description":6066,"extension":220,"meta":6293,"navigation":85,"path":6294,"pinned":223,"publishedAt":224,"seo":6295,"slug":6296,"stem":6297,"summary":6298,"tags":6299,"updatedAt":224,"visible":85,"__hash__":6302},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6063,"toc":6281},[6064,6067,6069,6075,6077,6083,6094,6096,6114,6116,6123,6152,6159,6178,6187,6189,6195,6197,6199,6222,6224,6227,6233,6239,6241,6257,6259,6272,6274,6276,6279],[10,6065,6066],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6068,16],{"id":16},[10,6070,6071,6072,6074],{},"本篇只处理“模块、import 与 ",[286,6073,5994],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6076,22],{"id":22},[10,6078,6079],{},[26,6080],{"alt":6081,"src":6082},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6084,6085,6086,6089,6090,6093],{},"同一个文件直接运行时 ",[33,6087,6088],{},"__name__"," 等于 ",[33,6091,6092],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6095,39],{"id":39},[41,6097,6098,6104,6107],{},[44,6099,6100,6101,6103],{},"一个 ",[33,6102,1162],{}," 文件就是一个模块。",[44,6105,6106],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[44,6108,6109,6110,6113],{},"避免使用 ",[33,6111,6112],{},"from module import *","，它会让名字来源不清楚。",[14,6115,59],{"id":59},[10,6117,6118,6119,6122],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6120,6121],{},"calculator.py","：",[64,6124,6126],{"className":66,"code":6125,"language":68,"meta":69,"style":69},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6127,6128,6133,6138,6142,6147],{"__ignoreMap":69},[73,6129,6130],{"class":75,"line":76},[73,6131,6132],{},"def add(left, right):\n",[73,6134,6135],{"class":75,"line":82},[73,6136,6137],{},"    return left + right\n",[73,6139,6140],{"class":75,"line":89},[73,6141,86],{"emptyLinePlaceholder":85},[73,6143,6144],{"class":75,"line":95},[73,6145,6146],{},"if __name__ == \"__main__\":\n",[73,6148,6149],{"class":75,"line":101},[73,6150,6151],{},"    print(add(2, 3))\n",[10,6153,6154,6155,6158],{},"再创建 ",[33,6156,6157],{},"app.py","，从模块中导入函数：",[64,6160,6162],{"className":66,"code":6161,"language":68,"meta":69,"style":69},"from calculator import add\n\nprint(add(10, 20))\n",[33,6163,6164,6169,6173],{"__ignoreMap":69},[73,6165,6166],{"class":75,"line":76},[73,6167,6168],{},"from calculator import add\n",[73,6170,6171],{"class":75,"line":82},[73,6172,86],{"emptyLinePlaceholder":85},[73,6174,6175],{"class":75,"line":89},[73,6176,6177],{},"print(add(10, 20))\n",[10,6179,6180,6181,1148,6184,353],{},"分别执行 ",[33,6182,6183],{},"python3 calculator.py",[33,6185,6186],{},"python3 app.py",[10,6188,118],{},[64,6190,6193],{"className":6191,"code":6192,"language":124,"meta":69},[122],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6194,6192],{"__ignoreMap":69},[10,6196,129],{},[14,6198,132],{"id":132},[134,6200,6201,6211],{},[44,6202,6203,6204,6206,6207,6210],{},"直接运行 ",[33,6205,6121],{}," 时，模块名是 ",[33,6208,6209],{},"__main__","，入口代码输出 5。",[44,6212,6213,6215,6216,6218,6219,6221],{},[33,6214,6157],{}," 导入模块时，",[33,6217,6121],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6220,6157],{}," 调用函数输出 30。",[150,6223,152],{"id":152},[10,6225,6226],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6228,6229],{},[26,6230],{"alt":6231,"src":6232},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6234,6235,6236,6238],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6237,6209],{}," 保护下的演示代码。",[14,6240,170],{"id":170},[41,6242,6243,6250],{},[44,6244,6245,6246,1148,6248,353],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6247,6121],{},[33,6249,6157],{},[44,6251,6252,6253,6256],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6254,6255],{},"json.py","，导致导入目标被遮蔽。",[14,6258,181],{"id":181},[134,6260,6261,6267],{},[44,6262,2344,6263,6266],{},[33,6264,6265],{},"text_tools.py"," 并导出一个格式化函数。",[44,6268,6269,6270,353],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6271,6088],{},[10,6273,195],{},[14,6275,198],{"id":198},[10,6277,6278],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,6280,205],{},{"title":69,"searchDepth":82,"depth":82,"links":6282},[6283,6284,6285,6286,6287,6290,6291,6292],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":6288},[6289],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6061,"description":6066},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[218,6300,6301],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6304,"title":6305,"body":6306,"category":218,"cover":219,"description":6310,"extension":220,"meta":6475,"navigation":85,"path":6476,"pinned":223,"publishedAt":224,"seo":6477,"slug":6478,"stem":6479,"summary":6480,"tags":6481,"updatedAt":224,"visible":85,"__hash__":6483},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6307,"toc":6465},[6308,6311,6313,6316,6318,6324,6327,6329,6343,6345,6347,6393,6395,6401,6403,6405,6431,6433,6443,6445,6456,6458,6460,6463],[10,6309,6310],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6312,16],{"id":16},[10,6314,6315],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6317,22],{"id":22},[10,6319,6320],{},[26,6321],{"alt":6322,"src":6323},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6325,6326],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6328,39],{"id":39},[41,6330,6331,6337,6340],{},[44,6332,6333,6336],{},[33,6334,6335],{},".venv"," 是常见目录名，不应提交到 Git。",[44,6338,6339],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[44,6341,6342],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6344,59],{"id":59},[10,6346,1565],{},[64,6348,6350],{"className":582,"code":6349,"language":584,"meta":69,"style":69},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6351,6352,6364,6372,6378,6388],{"__ignoreMap":69},[73,6353,6354,6356,6358,6361],{"class":75,"line":76},[73,6355,682],{"class":591},[73,6357,624],{"class":594},[73,6359,6360],{"class":627}," venv",[73,6362,6363],{"class":627}," .venv\n",[73,6365,6366,6369],{"class":75,"line":82},[73,6367,6368],{"class":594},"source",[73,6370,6371],{"class":627}," .venv\u002Fbin\u002Factivate\n",[73,6373,6374,6376],{"class":75,"line":89},[73,6375,68],{"class":591},[73,6377,595],{"class":594},[73,6379,6380,6382,6384,6386],{"class":75,"line":95},[73,6381,68],{"class":591},[73,6383,624],{"class":594},[73,6385,628],{"class":627},[73,6387,595],{"class":594},[73,6389,6390],{"class":75,"line":101},[73,6391,6392],{"class":591},"deactivate\n",[10,6394,118],{},[64,6396,6399],{"className":6397,"code":6398,"language":124,"meta":69},[122],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6400,6398],{"__ignoreMap":69},[10,6402,129],{},[14,6404,132],{"id":132},[134,6406,6407,6416],{},[44,6408,6409,6412,6413,6415],{},[33,6410,6411],{},"venv"," 根据当前 ",[33,6414,682],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[44,6417,6418,6419,2167,6421,6424,6425,3718,6427,6430],{},"激活后 ",[33,6420,68],{},[33,6422,6423],{},"python -m pip"," 优先指向 ",[33,6426,6335],{},[33,6428,6429],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6432,170],{"id":170},[41,6434,6435,6438],{},[44,6436,6437],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[44,6439,3457,6440,6442],{},[33,6441,6335],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6444,181],{"id":181},[134,6446,6447,6453],{},[44,6448,6449,6450,353],{},"创建虚拟环境并记录激活前后的 ",[33,6451,6452],{},"which python",[44,6454,6455],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6457,195],{},[14,6459,198],{"id":198},[10,6461,6462],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,6464,1649],{},{"title":69,"searchDepth":82,"depth":82,"links":6466},[6467,6468,6469,6470,6471,6472,6473,6474],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6305,"description":6310},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[218,6482,252],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6485,"title":6486,"body":6487,"category":218,"cover":219,"description":6491,"extension":220,"meta":6679,"navigation":85,"path":6680,"pinned":223,"publishedAt":224,"seo":6681,"slug":6682,"stem":6683,"summary":6684,"tags":6685,"updatedAt":224,"visible":85,"__hash__":6688},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6488,"toc":6669},[6489,6492,6494,6497,6499,6505,6514,6516,6540,6542,6544,6597,6599,6605,6607,6609,6625,6627,6646,6648,6660,6662,6664,6667],[10,6490,6491],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6493,16],{"id":16},[10,6495,6496],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6498,22],{"id":22},[10,6500,6501],{},[26,6502],{"alt":6503,"src":6504},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6506,6507,6510,6511,6513],{},[33,6508,6509],{},"Path"," 使用 ",[33,6512,2426],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6515,39],{"id":39},[41,6517,6518,6521,6533],{},[44,6519,6520],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[44,6522,6523,2248,6526,2248,6529,6532],{},[33,6524,6525],{},"exists()",[33,6527,6528],{},"is_file()",[33,6530,6531],{},"is_dir()"," 检查真实文件系统状态。",[44,6534,6535,6536,6539],{},"创建目录前明确目标；",[33,6537,6538],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6541,59],{"id":59},[10,6543,62],{},[64,6545,6547],{"className":66,"code":6546,"language":68,"meta":69,"style":69},"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,6548,6549,6554,6558,6563,6568,6573,6577,6582,6587,6592],{"__ignoreMap":69},[73,6550,6551],{"class":75,"line":76},[73,6552,6553],{},"from pathlib import Path\n",[73,6555,6556],{"class":75,"line":82},[73,6557,86],{"emptyLinePlaceholder":85},[73,6559,6560],{"class":75,"line":89},[73,6561,6562],{},"project = Path.cwd()\n",[73,6564,6565],{"class":75,"line":95},[73,6566,6567],{},"data_dir = project \u002F \"data\"\n",[73,6569,6570],{"class":75,"line":101},[73,6571,6572],{},"file_path = data_dir \u002F \"records.json\"\n",[73,6574,6575],{"class":75,"line":107},[73,6576,86],{"emptyLinePlaceholder":85},[73,6578,6579],{"class":75,"line":112},[73,6580,6581],{},"print(project)\n",[73,6583,6584],{"class":75,"line":2484},[73,6585,6586],{},"print(file_path.name)\n",[73,6588,6589],{"class":75,"line":3943},[73,6590,6591],{},"print(file_path.suffix)\n",[73,6593,6594],{"class":75,"line":4155},[73,6595,6596],{},"print(file_path.exists())\n",[10,6598,118],{},[64,6600,6603],{"className":6601,"code":6602,"language":124,"meta":69},[122],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6604,6602],{"__ignoreMap":69},[10,6606,129],{},[14,6608,132],{"id":132},[134,6610,6611,6617],{},[44,6612,6613,6616],{},[33,6614,6615],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[44,6618,186,6619,6621,6622,6624],{},[33,6620,2426],{}," 组合路径片段只创建新的 ",[33,6623,6509],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6626,170],{"id":170},[41,6628,6629,6637],{},[44,6630,3457,6631,6633,6634,6636],{},[33,6632,6509],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6635,6525],{}," 等方法确认。",[44,6638,6639,6640,1000,6642,6645],{},"手工拼接 ",[33,6641,2426],{},[33,6643,6644],{},"\\"," 分隔符，降低跨平台可读性。",[14,6647,181],{"id":181},[134,6649,6650,6657],{},[44,6651,6652,6653,6656],{},"组合 ",[33,6654,6655],{},"output\u002Freport.txt"," 路径但先不创建文件。",[44,6658,6659],{},"输出路径的父目录、文件名和扩展名。",[10,6661,195],{},[14,6663,198],{"id":198},[10,6665,6666],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,6668,205],{},{"title":69,"searchDepth":82,"depth":82,"links":6670},[6671,6672,6673,6674,6675,6676,6677,6678],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6486,"description":6491},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[218,6686,6687],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6690,"title":6691,"body":6692,"category":218,"cover":219,"description":6696,"extension":220,"meta":6874,"navigation":85,"path":6875,"pinned":223,"publishedAt":224,"seo":6876,"slug":6877,"stem":6878,"summary":6879,"tags":6880,"updatedAt":224,"visible":85,"__hash__":6883},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6693,"toc":6864},[6694,6697,6699,6702,6704,6710,6713,6715,6743,6745,6747,6804,6806,6812,6814,6816,6827,6829,6842,6844,6855,6857,6859,6862],[10,6695,6696],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6698,16],{"id":16},[10,6700,6701],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6703,22],{"id":22},[10,6705,6706],{},[26,6707],{"alt":6708,"src":6709},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6711,6712],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6714,39],{"id":39},[41,6716,6717,6723,6732],{},[44,6718,6719,6722],{},[33,6720,6721],{},"w"," 模式会截断原文件，写入前必须确认目标。",[44,6724,6725,6728,6729,353],{},[33,6726,6727],{},"r"," 模式读取不存在文件会产生 ",[33,6730,6731],{},"FileNotFoundError",[44,6733,6734,6735,6738,6739,6742],{},"本篇显式调用 ",[33,6736,6737],{},"close()","；第 34 篇会用 ",[33,6740,6741],{},"with"," 更可靠地管理关闭动作。",[14,6744,59],{"id":59},[10,6746,62],{},[64,6748,6750],{"className":66,"code":6749,"language":68,"meta":69,"style":69},"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,6751,6752,6756,6760,6765,6770,6775,6780,6784,6789,6794,6799],{"__ignoreMap":69},[73,6753,6754],{"class":75,"line":76},[73,6755,6553],{},[73,6757,6758],{"class":75,"line":82},[73,6759,86],{"emptyLinePlaceholder":85},[73,6761,6762],{"class":75,"line":89},[73,6763,6764],{},"file_path = Path(\"notes.txt\")\n",[73,6766,6767],{"class":75,"line":95},[73,6768,6769],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[73,6771,6772],{"class":75,"line":101},[73,6773,6774],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[73,6776,6777],{"class":75,"line":107},[73,6778,6779],{},"writer.close()\n",[73,6781,6782],{"class":75,"line":112},[73,6783,86],{"emptyLinePlaceholder":85},[73,6785,6786],{"class":75,"line":2484},[73,6787,6788],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[73,6790,6791],{"class":75,"line":3943},[73,6792,6793],{},"content = reader.read()\n",[73,6795,6796],{"class":75,"line":4155},[73,6797,6798],{},"reader.close()\n",[73,6800,6801],{"class":75,"line":5779},[73,6802,6803],{},"print(content)\n",[10,6805,118],{},[64,6807,6810],{"className":6808,"code":6809,"language":124,"meta":69},[122],"变量\n循环\n函数\n",[33,6811,6809],{"__ignoreMap":69},[10,6813,129],{},[14,6815,132],{"id":132},[134,6817,6818,6824],{},[44,6819,6820,6821,6823],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6822,6737],{}," 确保缓冲内容交给文件系统。",[44,6825,6826],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6828,170],{"id":170},[41,6830,6831,6836],{},[44,6832,186,6833,6835],{},[33,6834,6721],{}," 模式打开重要文件却未确认覆盖风险。",[44,6837,6838,6839,353],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6840,6841],{},"encoding=\"utf-8\"",[14,6843,181],{"id":181},[134,6845,6846,6849],{},[44,6847,6848],{},"写入三行学习记录并读取。",[44,6850,6851,6852,6854],{},"改用 ",[33,6853,327],{}," 模式追加一行，确认原内容仍保留。",[10,6856,195],{},[14,6858,198],{"id":198},[10,6860,6861],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,6863,205],{},{"title":69,"searchDepth":82,"depth":82,"links":6865},[6866,6867,6868,6869,6870,6871,6872,6873],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6691,"description":6696},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[218,6881,6882],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6885,"title":6886,"body":6887,"category":218,"cover":219,"description":6891,"extension":220,"meta":7058,"navigation":85,"path":7059,"pinned":223,"publishedAt":224,"seo":7060,"slug":7061,"stem":7062,"summary":7063,"tags":7064,"updatedAt":224,"visible":85,"__hash__":7067},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6888,"toc":7048},[6889,6892,6894,6897,6899,6905,6915,6917,6931,6933,6935,6995,6997,7003,7005,7007,7019,7021,7029,7031,7039,7041,7043,7046],[10,6890,6891],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6893,16],{"id":16},[10,6895,6896],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6898,22],{"id":22},[10,6900,6901],{},[26,6902],{"alt":6903,"src":6904},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6906,6907,6910,6911,6914],{},[33,6908,6909],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6912,6913],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6916,39],{"id":39},[41,6918,6919,6922,6928],{},[44,6920,6921],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[44,6923,6924,6927],{},[33,6925,6926],{},"ensure_ascii=False"," 让中文以可读字符写入。",[44,6929,6930],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6932,59],{"id":59},[10,6934,62],{},[64,6936,6938],{"className":66,"code":6937,"language":68,"meta":69,"style":69},"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,6939,6940,6945,6949,6954,6958,6963,6968,6972,6976,6981,6986,6990],{"__ignoreMap":69},[73,6941,6942],{"class":75,"line":76},[73,6943,6944],{},"import json\n",[73,6946,6947],{"class":75,"line":82},[73,6948,86],{"emptyLinePlaceholder":85},[73,6950,6951],{"class":75,"line":89},[73,6952,6953],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[73,6955,6956],{"class":75,"line":95},[73,6957,86],{"emptyLinePlaceholder":85},[73,6959,6960],{"class":75,"line":101},[73,6961,6962],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[73,6964,6965],{"class":75,"line":107},[73,6966,6967],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[73,6969,6970],{"class":75,"line":112},[73,6971,6779],{},[73,6973,6974],{"class":75,"line":2484},[73,6975,86],{"emptyLinePlaceholder":85},[73,6977,6978],{"class":75,"line":3943},[73,6979,6980],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[73,6982,6983],{"class":75,"line":4155},[73,6984,6985],{},"loaded = json.load(reader)\n",[73,6987,6988],{"class":75,"line":5779},[73,6989,6798],{},[73,6991,6992],{"class":75,"line":5784},[73,6993,6994],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6996,118],{},[64,6998,7001],{"className":6999,"code":7000,"language":124,"meta":69},[122],"Python 60\n",[33,7002,7000],{"__ignoreMap":69},[10,7004,129],{},[14,7006,132],{"id":132},[134,7008,7009,7014],{},[44,7010,7011,7013],{},[33,7012,6909],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[44,7015,7016,7018],{},[33,7017,6913],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7020,170],{"id":170},[41,7022,7023,7026],{},[44,7024,7025],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[44,7027,7028],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7030,181],{"id":181},[134,7032,7033,7036],{},[44,7034,7035],{},"保存包含两条学习记录的列表。",[44,7037,7038],{},"读取后修改进度，再重新写回文件。",[10,7040,195],{},[14,7042,198],{"id":198},[10,7044,7045],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,7047,205],{},{"title":69,"searchDepth":82,"depth":82,"links":7049},[7050,7051,7052,7053,7054,7055,7056,7057],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6886,"description":6891},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[218,7065,7066],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7069,"title":7070,"body":7071,"category":218,"cover":219,"description":7075,"extension":220,"meta":7259,"navigation":85,"path":7260,"pinned":223,"publishedAt":224,"seo":7261,"slug":7262,"stem":7263,"summary":7264,"tags":7265,"updatedAt":224,"visible":85,"__hash__":7268},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7072,"toc":7249},[7073,7076,7078,7081,7083,7089,7095,7097,7119,7121,7123,7186,7188,7194,7196,7198,7214,7216,7230,7232,7240,7242,7244,7247],[10,7074,7075],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7077,16],{"id":16},[10,7079,7080],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7082,22],{"id":22},[10,7084,7085],{},[26,7086],{"alt":7087,"src":7088},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7090,7091,7094],{},[33,7092,7093],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7096,39],{"id":39},[41,7098,7099,7109,7116],{},[44,7100,186,7101,7104,7105,7108],{},[33,7102,7103],{},"newline=\"\""," 让 ",[33,7106,7107],{},"csv"," 模块正确处理换行。",[44,7110,7111,7112,7115],{},"字段顺序由 ",[33,7113,7114],{},"fieldnames"," 决定，字典键需要与字段名一致。",[44,7117,7118],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7120,59],{"id":59},[10,7122,62],{},[64,7124,7126],{"className":66,"code":7125,"language":68,"meta":69,"style":69},"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,7127,7128,7133,7137,7142,7147,7152,7157,7162,7166,7171,7176,7181],{"__ignoreMap":69},[73,7129,7130],{"class":75,"line":76},[73,7131,7132],{},"import csv\n",[73,7134,7135],{"class":75,"line":82},[73,7136,86],{"emptyLinePlaceholder":85},[73,7138,7139],{"class":75,"line":89},[73,7140,7141],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[73,7143,7144],{"class":75,"line":95},[73,7145,7146],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[73,7148,7149],{"class":75,"line":101},[73,7150,7151],{},"writer.writeheader()\n",[73,7153,7154],{"class":75,"line":107},[73,7155,7156],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[73,7158,7159],{"class":75,"line":112},[73,7160,7161],{},"writer_file.close()\n",[73,7163,7164],{"class":75,"line":2484},[73,7165,86],{"emptyLinePlaceholder":85},[73,7167,7168],{"class":75,"line":3943},[73,7169,7170],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[73,7172,7173],{"class":75,"line":4155},[73,7174,7175],{},"for row in csv.DictReader(reader_file):\n",[73,7177,7178],{"class":75,"line":5779},[73,7179,7180],{},"    print(row[\"name\"], row[\"score\"])\n",[73,7182,7183],{"class":75,"line":5784},[73,7184,7185],{},"reader_file.close()\n",[10,7187,118],{},[64,7189,7192],{"className":7190,"code":7191,"language":124,"meta":69},[122],"小郑 95\n",[33,7193,7191],{"__ignoreMap":69},[10,7195,129],{},[14,7197,132],{"id":132},[134,7199,7200,7209],{},[44,7201,7202,7205,7206,7208],{},[33,7203,7204],{},"DictWriter"," 按 ",[33,7207,7114],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[44,7210,7211,7213],{},[33,7212,7093],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7215,170],{"id":170},[41,7217,7218,7221],{},[44,7219,7220],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[44,7222,7223,7224,7226,7227,7229],{},"在 macOS 以外环境忽略 ",[33,7225,7103],{}," 可能出现额外空行；统一交给 ",[33,7228,7107],{}," 模块管理换行。",[14,7231,181],{"id":181},[134,7233,7234,7237],{},[44,7235,7236],{},"写入三名学习者的课程和分数。",[44,7238,7239],{},"读取 CSV 后把分数字符串转换为整数。",[10,7241,195],{},[14,7243,198],{"id":198},[10,7245,7246],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,7248,205],{},{"title":69,"searchDepth":82,"depth":82,"links":7250},[7251,7252,7253,7254,7255,7256,7257,7258],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7070,"description":7075},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[218,7266,7267],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7270,"title":7271,"body":7272,"category":218,"cover":219,"description":7276,"extension":220,"meta":7549,"navigation":85,"path":7550,"pinned":223,"publishedAt":224,"seo":7551,"slug":7552,"stem":7553,"summary":7554,"tags":7555,"updatedAt":224,"visible":85,"__hash__":7558},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7273,"toc":7536},[7274,7277,7279,7282,7284,7290,7301,7303,7320,7322,7324,7399,7401,7407,7409,7411,7436,7438,7447,7453,7464,7466,7472,7478,7487,7489,7504,7506,7527,7529,7531,7534],[10,7275,7276],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7278,16],{"id":16},[10,7280,7281],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7283,22],{"id":22},[10,7285,7286],{},[26,7287],{"alt":7288,"src":7289},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7291,7292,7293,7296,7297,7300],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7294,7295],{},"except","；无论是否异常，",[33,7298,7299],{},"finally"," 都会在离开结构前执行。",[14,7302,39],{"id":39},[41,7304,7305,7311,7317],{},[44,7306,7307,7308,7310],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7309,7295],{}," 吞掉全部错误。",[44,7312,7313,7316],{},[33,7314,7315],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[44,7318,7319],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7321,59],{"id":59},[10,7323,62],{},[64,7325,7327],{"className":66,"code":7326,"language":68,"meta":69,"style":69},"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,7328,7329,7334,7339,7344,7349,7354,7358,7363,7368,7373,7378,7382,7387,7393],{"__ignoreMap":69},[73,7330,7331],{"class":75,"line":76},[73,7332,7333],{},"def parse_age(text):\n",[73,7335,7336],{"class":75,"line":82},[73,7337,7338],{},"    age = int(text)\n",[73,7340,7341],{"class":75,"line":89},[73,7342,7343],{},"    if age \u003C 0:\n",[73,7345,7346],{"class":75,"line":95},[73,7347,7348],{},"        raise ValueError(\"年龄不能为负数\")\n",[73,7350,7351],{"class":75,"line":101},[73,7352,7353],{},"    return age\n",[73,7355,7356],{"class":75,"line":107},[73,7357,86],{"emptyLinePlaceholder":85},[73,7359,7360],{"class":75,"line":112},[73,7361,7362],{},"try:\n",[73,7364,7365],{"class":75,"line":2484},[73,7366,7367],{},"    age = parse_age(\"18\")\n",[73,7369,7370],{"class":75,"line":3943},[73,7371,7372],{},"except ValueError as error:\n",[73,7374,7375],{"class":75,"line":4155},[73,7376,7377],{},"    print(\"输入错误：\", error)\n",[73,7379,7380],{"class":75,"line":5779},[73,7381,1137],{},[73,7383,7384],{"class":75,"line":5784},[73,7385,7386],{},"    print(\"年龄：\", age)\n",[73,7388,7390],{"class":75,"line":7389},13,[73,7391,7392],{},"finally:\n",[73,7394,7396],{"class":75,"line":7395},14,[73,7397,7398],{},"    print(\"处理结束\")\n",[10,7400,118],{},[64,7402,7405],{"className":7403,"code":7404,"language":124,"meta":69},[122],"年龄： 18\n处理结束\n",[33,7406,7404],{"__ignoreMap":69},[10,7408,129],{},[14,7410,132],{"id":132},[134,7412,7413,7425],{},[44,7414,7415,7417,7418,7420,7421,7424],{},[33,7416,3026],{}," 或主动 ",[33,7419,7315],{}," 都可能产生 ",[33,7422,7423],{},"ValueError","，控制流立即离开当前正常路径。",[44,7426,7427,7428,7430,7431,7433,7434,353],{},"有异常时进入匹配的 ",[33,7429,7295],{},"；没有异常时执行 ",[33,7432,1151],{},"；两种情况最后都会执行 ",[33,7435,7299],{},[150,7437,152],{"id":152},[10,7439,7440,2248,7442,1148,7444,7446],{},[33,7441,7295],{},[33,7443,1151],{},[33,7445,7299],{}," 的职责不同，不能只看它们出现的顺序。",[10,7448,7449],{},[26,7450],{"alt":7451,"src":7452},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7454,7455,7457,7458,7460,7461,7463],{},[33,7456,7295],{}," 处理匹配异常，",[33,7459,1151],{}," 只在无异常时运行，",[33,7462,7299],{}," 负责两条路径都需要的清理动作。",[150,7465,152],{"id":4210},[10,7467,7468,7471],{},[33,7469,7470],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7473,7474],{},[26,7475],{"alt":7476,"src":7477},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7479,7480,7481,7483,7484,7486],{},"只把可能产生预期异常的操作放进 ",[33,7482,7470],{},"，后续正常业务放进 ",[33,7485,1151],{},"，错误边界会更清楚。",[14,7488,170],{"id":170},[41,7490,7491,7498],{},[44,7492,7493,7494,7497],{},"使用裸 ",[33,7495,7496],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[44,7499,7500,7501,7503],{},"把整个程序包在一个巨大 ",[33,7502,7470],{}," 中，无法判断究竟哪一步允许失败。",[14,7505,181],{"id":181},[134,7507,7508,7521],{},[44,7509,7510,7511,7514,7515,1148,7518,353],{},"让 ",[33,7512,7513],{},"parse_age"," 分别处理 ",[33,7516,7517],{},"\"abc\"",[33,7519,7520],{},"\"-1\"",[44,7522,7523,7524,7526],{},"为文件读取捕获 ",[33,7525,6731],{}," 并给出清晰提示。",[10,7528,195],{},[14,7530,198],{"id":198},[10,7532,7533],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,7535,205],{},{"title":69,"searchDepth":82,"depth":82,"links":7537},[7538,7539,7540,7541,7542,7546,7547,7548],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":7543},[7544,7545],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7271,"description":7276},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[218,7556,7557],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7560,"title":7561,"body":7562,"category":218,"cover":219,"description":7566,"extension":220,"meta":7742,"navigation":85,"path":7743,"pinned":223,"publishedAt":224,"seo":7744,"slug":7745,"stem":7746,"summary":7747,"tags":7748,"updatedAt":224,"visible":85,"__hash__":7750},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7563,"toc":7732},[7564,7567,7569,7572,7574,7580,7586,7588,7604,7606,7608,7662,7664,7670,7672,7674,7687,7689,7702,7704,7723,7725,7727,7730],[10,7565,7566],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7568,16],{"id":16},[10,7570,7571],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7573,22],{"id":22},[10,7575,7576],{},[26,7577],{"alt":7578,"src":7579},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7581,7582,7583,7585],{},"进入 ",[33,7584,6741],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7587,39],{"id":39},[41,7589,7590,7595,7601],{},[44,7591,7592,7594],{},[33,7593,6741],{}," 把资源获取和释放配成一个清晰边界。",[44,7596,7597,7600],{},[33,7598,7599],{},"as file"," 得到的是上下文返回的资源对象。",[44,7602,7603],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7605,59],{"id":59},[10,7607,62],{},[64,7609,7611],{"className":66,"code":7610,"language":68,"meta":69,"style":69},"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,7612,7613,7617,7621,7625,7629,7634,7639,7643,7648,7653,7657],{"__ignoreMap":69},[73,7614,7615],{"class":75,"line":76},[73,7616,6553],{},[73,7618,7619],{"class":75,"line":82},[73,7620,86],{"emptyLinePlaceholder":85},[73,7622,7623],{"class":75,"line":89},[73,7624,6764],{},[73,7626,7627],{"class":75,"line":95},[73,7628,86],{"emptyLinePlaceholder":85},[73,7630,7631],{"class":75,"line":101},[73,7632,7633],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[73,7635,7636],{"class":75,"line":107},[73,7637,7638],{},"    file.write(\"上下文管理器\\n\")\n",[73,7640,7641],{"class":75,"line":112},[73,7642,86],{"emptyLinePlaceholder":85},[73,7644,7645],{"class":75,"line":2484},[73,7646,7647],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[73,7649,7650],{"class":75,"line":3943},[73,7651,7652],{},"    print(file.read())\n",[73,7654,7655],{"class":75,"line":4155},[73,7656,86],{"emptyLinePlaceholder":85},[73,7658,7659],{"class":75,"line":5779},[73,7660,7661],{},"print(file.closed)\n",[10,7663,118],{},[64,7665,7668],{"className":7666,"code":7667,"language":124,"meta":69},[122],"上下文管理器\n\nTrue\n",[33,7669,7667],{"__ignoreMap":69},[10,7671,129],{},[14,7673,132],{"id":132},[134,7675,7676,7684],{},[44,7677,7582,7678,7680,7681,353],{},[33,7679,6741],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7682,7683],{},"file",[44,7685,7686],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7688,170],{"id":170},[41,7690,7691,7696],{},[44,7692,4737,7693,7695],{},[33,7694,6741],{}," 代码块外继续读写已经关闭的文件对象。",[44,7697,7698,7699,7701],{},"误以为 ",[33,7700,6741],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7703,181],{"id":181},[134,7705,7706,7715],{},[44,7707,7708,7709,7712,7713,353],{},"把第 30 篇的手动 ",[33,7710,7711],{},"open\u002Fclose"," 改写为 ",[33,7714,6741],{},[44,7716,4737,7717,7719,7720,353],{},[33,7718,6741],{}," 块后检查 ",[33,7721,7722],{},"file.closed",[10,7724,195],{},[14,7726,198],{"id":198},[10,7728,7729],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,7731,205],{},{"title":69,"searchDepth":82,"depth":82,"links":7733},[7734,7735,7736,7737,7738,7739,7740,7741],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7561,"description":7566},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[218,6741,7749],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7752,"title":7753,"body":7754,"category":218,"cover":219,"description":7758,"extension":220,"meta":7970,"navigation":85,"path":7971,"pinned":223,"publishedAt":224,"seo":7972,"slug":7973,"stem":7974,"summary":7975,"tags":7976,"updatedAt":224,"visible":85,"__hash__":7979},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7755,"toc":7958},[7756,7759,7761,7764,7766,7772,7775,7777,7794,7796,7798,7866,7868,7874,7876,7878,7903,7905,7908,7914,7923,7925,7936,7938,7949,7951,7953,7956],[10,7757,7758],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7760,16],{"id":16},[10,7762,7763],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7765,22],{"id":22},[10,7767,7768],{},[26,7769],{"alt":7770,"src":7771},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7773,7774],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7776,39],{"id":39},[41,7778,7779,7785,7791],{},[44,7780,7781,7784],{},[33,7782,7783],{},"self"," 表示当前实例，由方法调用自动传入。",[44,7786,7787,7790],{},[33,7788,7789],{},"__init__"," 在实例创建过程中初始化属性。",[44,7792,7793],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7795,59],{"id":59},[10,7797,62],{},[64,7799,7801],{"className":66,"code":7800,"language":68,"meta":69,"style":69},"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,7802,7803,7808,7813,7818,7823,7827,7832,7837,7842,7847,7851,7856,7861],{"__ignoreMap":69},[73,7804,7805],{"class":75,"line":76},[73,7806,7807],{},"class LearningRecord:\n",[73,7809,7810],{"class":75,"line":82},[73,7811,7812],{},"    def __init__(self, course, progress=0):\n",[73,7814,7815],{"class":75,"line":89},[73,7816,7817],{},"        self.course = course\n",[73,7819,7820],{"class":75,"line":95},[73,7821,7822],{},"        self.progress = progress\n",[73,7824,7825],{"class":75,"line":101},[73,7826,86],{"emptyLinePlaceholder":85},[73,7828,7829],{"class":75,"line":107},[73,7830,7831],{},"    def advance(self, amount):\n",[73,7833,7834],{"class":75,"line":112},[73,7835,7836],{},"        self.progress = self.progress + amount\n",[73,7838,7839],{"class":75,"line":2484},[73,7840,7841],{},"        if self.progress > 100:\n",[73,7843,7844],{"class":75,"line":3943},[73,7845,7846],{},"            self.progress = 100\n",[73,7848,7849],{"class":75,"line":4155},[73,7850,86],{"emptyLinePlaceholder":85},[73,7852,7853],{"class":75,"line":5779},[73,7854,7855],{},"record = LearningRecord(\"Python\", 40)\n",[73,7857,7858],{"class":75,"line":5784},[73,7859,7860],{},"record.advance(15)\n",[73,7862,7863],{"class":75,"line":7389},[73,7864,7865],{},"print(record.course, record.progress)\n",[10,7867,118],{},[64,7869,7872],{"className":7870,"code":7871,"language":124,"meta":69},[122],"Python 55\n",[33,7873,7871],{"__ignoreMap":69},[10,7875,129],{},[14,7877,132],{"id":132},[134,7879,7880,7890],{},[44,7881,7882,7883,7886,7887,7889],{},"调用 ",[33,7884,7885],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7888,7789],{}," 把课程和进度保存在该实例属性中。",[44,7891,7892,7895,7896,7899,7900,7902],{},[33,7893,7894],{},"record.advance(15)"," 自动把 ",[33,7897,7898],{},"record"," 作为 ",[33,7901,7783],{},"，方法更新同一实例的进度并限制上限。",[150,7904,152],{"id":152},[10,7906,7907],{},"类是共同定义，实例则各自保存状态。",[10,7909,7910],{},[26,7911],{"alt":7912,"src":7913},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7915,7916,7917,1148,7919,7922],{},"两个实例共享同一套方法定义，但 ",[33,7918,4534],{},[33,7920,7921],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7924,170],{"id":170},[41,7926,7927,7933],{},[44,7928,7929,7930,7932],{},"调用实例方法时手工再传一次 ",[33,7931,7783],{},"。通过实例调用时 Python 会自动绑定。",[44,7934,7935],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7937,181],{"id":181},[134,7939,7940,7946],{},[44,7941,5247,7942,7945],{},[33,7943,7944],{},"Book"," 类，保存标题和阅读页数。",[44,7947,7948],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7950,195],{},[14,7952,198],{"id":198},[10,7954,7955],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,7957,205],{},{"title":69,"searchDepth":82,"depth":82,"links":7959},[7960,7961,7962,7963,7964,7967,7968,7969],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":7965},[7966],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7753,"description":7758},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[218,7977,7978],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7981,"title":7982,"body":7983,"category":218,"cover":219,"description":7987,"extension":220,"meta":8165,"navigation":85,"path":8166,"pinned":223,"publishedAt":224,"seo":8167,"slug":8168,"stem":8169,"summary":8170,"tags":8171,"updatedAt":224,"visible":85,"__hash__":8174},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7984,"toc":8155},[7985,7988,7990,7993,7995,8001,8004,8006,8017,8019,8021,8088,8090,8096,8098,8100,8119,8121,8129,8131,8146,8148,8150,8153],[10,7986,7987],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7989,16],{"id":16},[10,7991,7992],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7994,22],{"id":22},[10,7996,7997],{},[26,7998],{"alt":7999,"src":8000},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8002,8003],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8005,39],{"id":39},[41,8007,8008,8011,8014],{},[44,8009,8010],{},"封装让对象通过方法维护自己的有效状态。",[44,8012,8013],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[44,8015,8016],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8018,59],{"id":59},[10,8020,62],{},[64,8022,8024],{"className":66,"code":8023,"language":68,"meta":69,"style":69},"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,8025,8026,8031,8036,8041,8045,8050,8055,8060,8064,8069,8074,8078,8083],{"__ignoreMap":69},[73,8027,8028],{"class":75,"line":76},[73,8029,8030],{},"class Storage:\n",[73,8032,8033],{"class":75,"line":82},[73,8034,8035],{},"    def save(self, text):\n",[73,8037,8038],{"class":75,"line":89},[73,8039,8040],{},"        print(\"保存：\", text)\n",[73,8042,8043],{"class":75,"line":95},[73,8044,86],{"emptyLinePlaceholder":85},[73,8046,8047],{"class":75,"line":101},[73,8048,8049],{},"class LearningService:\n",[73,8051,8052],{"class":75,"line":107},[73,8053,8054],{},"    def __init__(self, storage):\n",[73,8056,8057],{"class":75,"line":112},[73,8058,8059],{},"        self.storage = storage\n",[73,8061,8062],{"class":75,"line":2484},[73,8063,86],{"emptyLinePlaceholder":85},[73,8065,8066],{"class":75,"line":3943},[73,8067,8068],{},"    def finish_lesson(self, title):\n",[73,8070,8071],{"class":75,"line":4155},[73,8072,8073],{},"        self.storage.save(title)\n",[73,8075,8076],{"class":75,"line":5779},[73,8077,86],{"emptyLinePlaceholder":85},[73,8079,8080],{"class":75,"line":5784},[73,8081,8082],{},"service = LearningService(Storage())\n",[73,8084,8085],{"class":75,"line":7389},[73,8086,8087],{},"service.finish_lesson(\"异常处理\")\n",[10,8089,118],{},[64,8091,8094],{"className":8092,"code":8093,"language":124,"meta":69},[122],"保存： 异常处理\n",[33,8095,8093],{"__ignoreMap":69},[10,8097,129],{},[14,8099,132],{"id":132},[134,8101,8102,8112],{},[44,8103,8104,8107,8108,8111],{},[33,8105,8106],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8109,8110],{},"save()"," 的协作对象。",[44,8113,8114,8115,8118],{},"调用业务方法时，服务把保存动作委托给 ",[33,8116,8117],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8120,170],{"id":170},[41,8122,8123,8126],{},[44,8124,8125],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[44,8127,8128],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8130,181],{"id":181},[134,8132,8133,8143],{},[44,8134,8135,8136,8139,8140,353],{},"用组合让 ",[33,8137,8138],{},"OrderService"," 使用一个 ",[33,8141,8142],{},"Notifier",[44,8144,8145],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8147,195],{},[14,8149,198],{"id":198},[10,8151,8152],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,8154,205],{},{"title":69,"searchDepth":82,"depth":82,"links":8156},[8157,8158,8159,8160,8161,8162,8163,8164],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7982,"description":7987},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[218,8172,8173],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8176,"title":8177,"body":8178,"category":218,"cover":219,"description":8182,"extension":220,"meta":8385,"navigation":85,"path":8386,"pinned":223,"publishedAt":224,"seo":8387,"slug":8388,"stem":8389,"summary":8390,"tags":8391,"updatedAt":224,"visible":85,"__hash__":8394},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8179,"toc":8373},[8180,8183,8185,8188,8190,8196,8203,8205,8230,8232,8234,8286,8288,8294,8296,8298,8319,8321,8327,8333,8339,8341,8349,8351,8364,8366,8368,8371],[10,8181,8182],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8184,16],{"id":16},[10,8186,8187],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8189,22],{"id":22},[10,8191,8192],{},[26,8193],{"alt":8194,"src":8195},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8197,8198,8199,8202],{},"生成器运行到 ",[33,8200,8201],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8204,39],{"id":39},[41,8206,8207,8217,8227],{},[44,8208,8209,8212,8213,8216],{},[33,8210,8211],{},"iter()"," 从可迭代对象取得迭代器，",[33,8214,8215],{},"next()"," 请求下一个值。",[44,8218,8219,8220,8223,8224,8226],{},"没有更多值时迭代器抛出 ",[33,8221,8222],{},"StopIteration","，",[33,8225,55],{}," 会自动处理。",[44,8228,8229],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8231,59],{"id":59},[10,8233,62],{},[64,8235,8237],{"className":66,"code":8236,"language":68,"meta":69,"style":69},"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,8238,8239,8244,8249,8254,8259,8264,8268,8273,8278,8282],{"__ignoreMap":69},[73,8240,8241],{"class":75,"line":76},[73,8242,8243],{},"def countdown(start):\n",[73,8245,8246],{"class":75,"line":82},[73,8247,8248],{},"    current = start\n",[73,8250,8251],{"class":75,"line":89},[73,8252,8253],{},"    while current > 0:\n",[73,8255,8256],{"class":75,"line":95},[73,8257,8258],{},"        yield current\n",[73,8260,8261],{"class":75,"line":101},[73,8262,8263],{},"        current = current - 1\n",[73,8265,8266],{"class":75,"line":107},[73,8267,86],{"emptyLinePlaceholder":85},[73,8269,8270],{"class":75,"line":112},[73,8271,8272],{},"iterator = countdown(3)\n",[73,8274,8275],{"class":75,"line":2484},[73,8276,8277],{},"print(next(iterator))\n",[73,8279,8280],{"class":75,"line":3943},[73,8281,8277],{},[73,8283,8284],{"class":75,"line":4155},[73,8285,8277],{},[10,8287,118],{},[64,8289,8292],{"className":8290,"code":8291,"language":124,"meta":69},[122],"3\n2\n1\n",[33,8293,8291],{"__ignoreMap":69},[10,8295,129],{},[14,8297,132],{"id":132},[134,8299,8300,8306],{},[44,8301,7882,8302,8305],{},[33,8303,8304],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[44,8307,8308,8309,8311,8312,8314,8315,8318],{},"每次 ",[33,8310,8215],{}," 运行到下一个 ",[33,8313,8201],{}," 并暂停，局部变量 ",[33,8316,8317],{},"current"," 和执行位置被保留。",[150,8320,152],{"id":152},[10,8322,8323,8324,8326],{},"生成器的暂停位置可以展开成多次 ",[33,8325,8215],{}," 的时间线。",[10,8328,8329],{},[26,8330],{"alt":8331,"src":8332},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8334,8335,8336,8338],{},"每次请求只推进到下一个 ",[33,8337,8201],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8340,170],{"id":170},[41,8342,8343,8346],{},[44,8344,8345],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[44,8347,8348],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8350,181],{"id":181},[134,8352,8353,8356],{},[44,8354,8355],{},"编写产生 1 到指定上限偶数的生成器。",[44,8357,4001,8358,8360,8361,8363],{},[33,8359,55],{}," 遍历生成器，比较手动 ",[33,8362,8215],{}," 的差异。",[10,8365,195],{},[14,8367,198],{"id":198},[10,8369,8370],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,8372,205],{},{"title":69,"searchDepth":82,"depth":82,"links":8374},[8375,8376,8377,8378,8379,8382,8383,8384],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":8380},[8381],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8177,"description":8182},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[218,8392,8393],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8396,"title":8397,"body":8398,"category":218,"cover":219,"description":8402,"extension":220,"meta":8626,"navigation":85,"path":8627,"pinned":223,"publishedAt":224,"seo":8628,"slug":8629,"stem":8630,"summary":8631,"tags":8632,"updatedAt":224,"visible":85,"__hash__":8634},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8399,"toc":8614},[8400,8403,8405,8408,8410,8416,8419,8421,8441,8443,8445,8527,8529,8535,8537,8539,8561,8563,8566,8572,8579,8581,8591,8593,8605,8607,8609,8612],[10,8401,8402],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8404,16],{"id":16},[10,8406,8407],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8409,22],{"id":22},[10,8411,8412],{},[26,8413],{"alt":8414,"src":8415},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8417,8418],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8420,39],{"id":39},[41,8422,8423,8432,8435],{},[44,8424,8425,8428,8429,353],{},[33,8426,8427],{},"@trace"," 等价于 ",[33,8430,8431],{},"add = trace(add)",[44,8433,8434],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[44,8436,8437,8440],{},[33,8438,8439],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8442,59],{"id":59},[10,8444,62],{},[64,8446,8448],{"className":66,"code":8447,"language":68,"meta":69,"style":69},"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,8449,8450,8455,8459,8464,8469,8474,8479,8484,8489,8494,8499,8503,8508,8512,8516,8521],{"__ignoreMap":69},[73,8451,8452],{"class":75,"line":76},[73,8453,8454],{},"from functools import wraps\n",[73,8456,8457],{"class":75,"line":82},[73,8458,86],{"emptyLinePlaceholder":85},[73,8460,8461],{"class":75,"line":89},[73,8462,8463],{},"def trace(function):\n",[73,8465,8466],{"class":75,"line":95},[73,8467,8468],{},"    @wraps(function)\n",[73,8470,8471],{"class":75,"line":101},[73,8472,8473],{},"    def wrapper(*args, **kwargs):\n",[73,8475,8476],{"class":75,"line":107},[73,8477,8478],{},"        print(\"开始：\", function.__name__)\n",[73,8480,8481],{"class":75,"line":112},[73,8482,8483],{},"        result = function(*args, **kwargs)\n",[73,8485,8486],{"class":75,"line":2484},[73,8487,8488],{},"        print(\"结束：\", function.__name__)\n",[73,8490,8491],{"class":75,"line":3943},[73,8492,8493],{},"        return result\n",[73,8495,8496],{"class":75,"line":4155},[73,8497,8498],{},"    return wrapper\n",[73,8500,8501],{"class":75,"line":5779},[73,8502,86],{"emptyLinePlaceholder":85},[73,8504,8505],{"class":75,"line":5784},[73,8506,8507],{},"@trace\n",[73,8509,8510],{"class":75,"line":7389},[73,8511,6132],{},[73,8513,8514],{"class":75,"line":7395},[73,8515,6137],{},[73,8517,8519],{"class":75,"line":8518},15,[73,8520,86],{"emptyLinePlaceholder":85},[73,8522,8524],{"class":75,"line":8523},16,[73,8525,8526],{},"print(add(2, 3))\n",[10,8528,118],{},[64,8530,8533],{"className":8531,"code":8532,"language":124,"meta":69},[122],"开始： add\n结束： add\n5\n",[33,8534,8532],{"__ignoreMap":69},[10,8536,129],{},[14,8538,132],{"id":132},[134,8540,8541,8558],{},[44,8542,8543,8544,8547,8548,8551,8552,8555,8556,353],{},"解释器执行定义时，把原 ",[33,8545,8546],{},"add"," 函数交给 ",[33,8549,8550],{},"trace","，返回的 ",[33,8553,8554],{},"wrapper"," 重新绑定到名字 ",[33,8557,8546],{},[44,8559,8560],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[150,8562,152],{"id":152},[10,8564,8565],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8567,8568],{},[26,8569],{"alt":8570,"src":8571},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8573,8574,8576,8577,353],{},[33,8575,8427],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8578,8431],{},[14,8580,170],{"id":170},[41,8582,8583,8588],{},[44,8584,8585,8586,353],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8587,5330],{},[44,8589,8590],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8592,181],{"id":181},[134,8594,8595,8598],{},[44,8596,8597],{},"编写只记录调用次数的简单装饰器。",[44,8599,8600,8601,8604],{},"删除包装函数的 ",[33,8602,8603],{},"return result","，观察调用方得到什么。",[10,8606,195],{},[14,8608,198],{"id":198},[10,8610,8611],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,8613,205],{},{"title":69,"searchDepth":82,"depth":82,"links":8615},[8616,8617,8618,8619,8620,8623,8624,8625],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":8621},[8622],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8397,"description":8402},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[218,8633,5281],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8636,"title":8637,"body":8638,"category":218,"cover":219,"description":8642,"extension":220,"meta":8829,"navigation":85,"path":8830,"pinned":223,"publishedAt":224,"seo":8831,"slug":8832,"stem":8833,"summary":8834,"tags":8835,"updatedAt":224,"visible":85,"__hash__":8838},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8639,"toc":8817},[8640,8643,8645,8648,8650,8656,8659,8661,8672,8674,8676,8751,8753,8759,8761,8763,8774,8776,8779,8785,8788,8790,8798,8800,8808,8810,8812,8815],[10,8641,8642],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8644,16],{"id":16},[10,8646,8647],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8649,22],{"id":22},[10,8651,8652],{},[26,8653],{"alt":8654,"src":8655},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8657,8658],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8660,39],{"id":39},[41,8662,8663,8666,8669],{},[44,8664,8665],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[44,8667,8668],{},"日志记录运行状态，测试判断结果是否符合约定。",[44,8670,8671],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8673,59],{"id":59},[10,8675,62],{},[64,8677,8679],{"className":66,"code":8678,"language":68,"meta":69,"style":69},"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,8680,8681,8686,8691,8695,8700,8704,8709,8714,8719,8723,8728,8733,8738,8742,8746],{"__ignoreMap":69},[73,8682,8683],{"class":75,"line":76},[73,8684,8685],{},"import logging\n",[73,8687,8688],{"class":75,"line":82},[73,8689,8690],{},"import unittest\n",[73,8692,8693],{"class":75,"line":89},[73,8694,86],{"emptyLinePlaceholder":85},[73,8696,8697],{"class":75,"line":95},[73,8698,8699],{},"logging.basicConfig(level=logging.INFO)\n",[73,8701,8702],{"class":75,"line":101},[73,8703,86],{"emptyLinePlaceholder":85},[73,8705,8706],{"class":75,"line":107},[73,8707,8708],{},"def clamp_progress(value):\n",[73,8710,8711],{"class":75,"line":112},[73,8712,8713],{},"    logging.info(\"检查进度：%s\", value)\n",[73,8715,8716],{"class":75,"line":2484},[73,8717,8718],{},"    return max(0, min(100, value))\n",[73,8720,8721],{"class":75,"line":3943},[73,8722,86],{"emptyLinePlaceholder":85},[73,8724,8725],{"class":75,"line":4155},[73,8726,8727],{},"class ProgressTest(unittest.TestCase):\n",[73,8729,8730],{"class":75,"line":5779},[73,8731,8732],{},"    def test_upper_limit(self):\n",[73,8734,8735],{"class":75,"line":5784},[73,8736,8737],{},"        self.assertEqual(clamp_progress(120), 100)\n",[73,8739,8740],{"class":75,"line":7389},[73,8741,86],{"emptyLinePlaceholder":85},[73,8743,8744],{"class":75,"line":7395},[73,8745,6146],{},[73,8747,8748],{"class":75,"line":8518},[73,8749,8750],{},"    unittest.main()\n",[10,8752,118],{},[64,8754,8757],{"className":8755,"code":8756,"language":124,"meta":69},[122],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8758,8756],{"__ignoreMap":69},[10,8760,129],{},[14,8762,132],{"id":132},[134,8764,8765,8771],{},[44,8766,8767,8770],{},[33,8768,8769],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[44,8772,8773],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[150,8775,152],{"id":152},[10,8777,8778],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8780,8781],{},[26,8782],{"alt":8783,"src":8784},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8786,8787],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8789,170],{"id":170},[41,8791,8792,8795],{},[44,8793,8794],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[44,8796,8797],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8799,181],{"id":181},[134,8801,8802,8805],{},[44,8803,8804],{},"为负数进度增加测试。",[44,8806,8807],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8809,195],{},[14,8811,198],{"id":198},[10,8813,8814],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,8816,205],{},{"title":69,"searchDepth":82,"depth":82,"links":8818},[8819,8820,8821,8822,8823,8826,8827,8828],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":8824},[8825],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8637,"description":8642},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[218,8836,8837],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8840,"title":8841,"body":8842,"category":218,"cover":219,"description":8846,"extension":220,"meta":9146,"navigation":85,"path":9147,"pinned":223,"publishedAt":224,"seo":9148,"slug":9149,"stem":9150,"summary":9151,"tags":9152,"updatedAt":224,"visible":85,"__hash__":9155},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8843,"toc":9133},[8844,8847,8849,8852,8854,8860,8863,8865,8880,8882,8884,9031,9033,9039,9041,9043,9056,9058,9061,9067,9070,9072,9075,9081,9088,9090,9101,9103,9124,9126,9128,9131],[10,8845,8846],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8848,16],{"id":16},[10,8850,8851],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8853,22],{"id":22},[10,8855,8856],{},[26,8857],{"alt":8858,"src":8859},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8861,8862],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8864,39],{"id":39},[41,8866,8867,8870,8873],{},[44,8868,8869],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[44,8871,8872],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[44,8874,8875,8876,8879],{},"实际扩展前先为 ",[33,8877,8878],{},"add()"," 和存储边界补充测试。",[14,8881,59],{"id":59},[10,8883,62],{},[64,8885,8887],{"className":66,"code":8886,"language":68,"meta":69,"style":69},"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,8888,8889,8893,8897,8901,8906,8911,8916,8921,8925,8930,8935,8940,8945,8950,8954,8959,8964,8970,8975,8981,8986,8991,8997,9003,9009,9014,9020,9025],{"__ignoreMap":69},[73,8890,8891],{"class":75,"line":76},[73,8892,6944],{},[73,8894,8895],{"class":75,"line":82},[73,8896,6553],{},[73,8898,8899],{"class":75,"line":89},[73,8900,86],{"emptyLinePlaceholder":85},[73,8902,8903],{"class":75,"line":95},[73,8904,8905],{},"class LearningRecords:\n",[73,8907,8908],{"class":75,"line":101},[73,8909,8910],{},"    def __init__(self, file_path):\n",[73,8912,8913],{"class":75,"line":107},[73,8914,8915],{},"        self.file_path = Path(file_path)\n",[73,8917,8918],{"class":75,"line":112},[73,8919,8920],{},"        self.items = []\n",[73,8922,8923],{"class":75,"line":2484},[73,8924,86],{"emptyLinePlaceholder":85},[73,8926,8927],{"class":75,"line":3943},[73,8928,8929],{},"    def add(self, title):\n",[73,8931,8932],{"class":75,"line":4155},[73,8933,8934],{},"        title = title.strip()\n",[73,8936,8937],{"class":75,"line":5779},[73,8938,8939],{},"        if not title:\n",[73,8941,8942],{"class":75,"line":5784},[73,8943,8944],{},"            raise ValueError(\"课程名称不能为空\")\n",[73,8946,8947],{"class":75,"line":7389},[73,8948,8949],{},"        self.items.append({\"title\": title, \"done\": False})\n",[73,8951,8952],{"class":75,"line":7395},[73,8953,86],{"emptyLinePlaceholder":85},[73,8955,8956],{"class":75,"line":8518},[73,8957,8958],{},"    def save(self):\n",[73,8960,8961],{"class":75,"line":8523},[73,8962,8963],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[73,8965,8967],{"class":75,"line":8966},17,[73,8968,8969],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[73,8971,8973],{"class":75,"line":8972},18,[73,8974,86],{"emptyLinePlaceholder":85},[73,8976,8978],{"class":75,"line":8977},19,[73,8979,8980],{},"records = LearningRecords(\"learning-records.json\")\n",[73,8982,8984],{"class":75,"line":8983},20,[73,8985,86],{"emptyLinePlaceholder":85},[73,8987,8989],{"class":75,"line":8988},21,[73,8990,7362],{},[73,8992,8994],{"class":75,"line":8993},22,[73,8995,8996],{},"    title = input(\"输入已学习课程：\")\n",[73,8998,9000],{"class":75,"line":8999},23,[73,9001,9002],{},"    records.add(title)\n",[73,9004,9006],{"class":75,"line":9005},24,[73,9007,9008],{},"    records.save()\n",[73,9010,9012],{"class":75,"line":9011},25,[73,9013,7372],{},[73,9015,9017],{"class":75,"line":9016},26,[73,9018,9019],{},"    print(\"无法保存：\", error)\n",[73,9021,9023],{"class":75,"line":9022},27,[73,9024,1137],{},[73,9026,9028],{"class":75,"line":9027},28,[73,9029,9030],{},"    print(\"已保存 1 条学习记录\")\n",[10,9032,118],{},[64,9034,9037],{"className":9035,"code":9036,"language":124,"meta":69},[122],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9038,9036],{"__ignoreMap":69},[10,9040,129],{},[14,9042,132],{"id":132},[134,9044,9045,9051],{},[44,9046,9047,9048,9050],{},"输入层取得课程名后，",[33,9049,8878],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[44,9052,9053,9055],{},[33,9054,8110],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[150,9057,152],{"id":152},[10,9059,9060],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9062,9063],{},[26,9064],{"alt":9065,"src":9066},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9068,9069],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[150,9071,152],{"id":4210},[10,9073,9074],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9076,9077],{},[26,9078],{"alt":9079,"src":9080},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9082,9083,9084,9087],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9085,9086],{},"load()"," 把文件状态恢复到内存。",[14,9089,170],{"id":170},[41,9091,9092,9095],{},[44,9093,9094],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[44,9096,9097,9098,9100],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9099,9086],{}," 是下一项必要扩展。",[14,9102,181],{"id":181},[134,9104,9105,9111,9114],{},[44,9106,9107,9108,9110],{},"增加 ",[33,9109,9086],{},"，文件不存在时从空列表开始。",[44,9112,9113],{},"增加按序号标记完成的功能，并校验序号范围。",[44,9115,9116,9117,9120,9121,9123],{},"把输入循环放进 ",[33,9118,9119],{},"main()","，通过 ",[33,9122,6088],{}," 控制程序入口。",[10,9125,195],{},[14,9127,198],{"id":198},[10,9129,9130],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[203,9132,205],{},{"title":69,"searchDepth":82,"depth":82,"links":9134},[9135,9136,9137,9138,9139,9143,9144,9145],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":9140},[9141,9142],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8841,"description":8846},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[218,9153,9154],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9157,9260,9379,9510,9653,9778,9915,10052,10193,10362,10499,10632,10755,10884,11011,11174,11350,11491,11620,11769,11912,12033,12156,12305,12458,12623,12750,12931,13074,13231,13382,13529,13684,13902,14057,14232,14383,14550,14737,14900,15142,15382],{"id":1384,"title":1385,"body":9158,"category":218,"cover":219,"description":1390,"extension":220,"meta":9257,"navigation":85,"path":1509,"pinned":223,"publishedAt":224,"seo":9258,"slug":1511,"stem":1512,"summary":1513,"tags":9259,"updatedAt":224,"visible":85,"__hash__":1516},{"type":7,"value":9159,"toc":9247},[9160,9162,9164,9166,9168,9172,9176,9178,9188,9190,9192,9200,9202,9207,9209,9211,9221,9223,9231,9233,9239,9241,9243,9245],[10,9161,1390],{},[14,9163,16],{"id":16},[10,9165,1395],{},[14,9167,22],{"id":22},[10,9169,9170],{},[26,9171],{"alt":1402,"src":1403},[10,9173,9174,1408],{},[33,9175,1162],{},[14,9177,39],{"id":39},[41,9179,9180,9184,9186],{},[44,9181,1415,9182,1418],{},[33,9183,1162],{},[44,9185,1421],{},[44,9187,1424],{},[14,9189,59],{"id":59},[10,9191,62],{},[64,9193,9194],{"className":66,"code":1431,"language":68,"meta":69,"style":69},[33,9195,9196],{"__ignoreMap":69},[73,9197,9198],{"class":75,"line":76},[73,9199,1431],{},[10,9201,118],{},[64,9203,9205],{"className":9204,"code":1443,"language":124,"meta":69},[122],[33,9206,1443],{"__ignoreMap":69},[10,9208,129],{},[14,9210,132],{"id":132},[134,9212,9213,9217],{},[44,9214,1454,9215,1458],{},[33,9216,1457],{},[44,9218,1461,9219,1465],{},[33,9220,1464],{},[14,9222,170],{"id":170},[41,9224,9225,9227],{},[44,9226,1472],{},[44,9228,1475,9229,1478],{},[33,9230,1162],{},[14,9232,181],{"id":181},[134,9234,9235,9237],{},[44,9236,1485],{},[44,9238,1488],{},[10,9240,195],{},[14,9242,198],{"id":198},[10,9244,1495],{},[203,9246,205],{},{"title":69,"searchDepth":82,"depth":82,"links":9248},[9249,9250,9251,9252,9253,9254,9255,9256],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":1385,"description":1390},[218,1380,1515],{"id":1518,"title":1519,"body":9261,"category":218,"cover":219,"description":1524,"extension":220,"meta":9376,"navigation":85,"path":1661,"pinned":223,"publishedAt":224,"seo":9377,"slug":1663,"stem":1664,"summary":1665,"tags":9378,"updatedAt":224,"visible":85,"__hash__":1668},{"type":7,"value":9262,"toc":9366},[9263,9265,9267,9269,9271,9275,9279,9281,9291,9293,9295,9315,9317,9322,9324,9326,9336,9338,9348,9350,9358,9360,9362,9364],[10,9264,1524],{},[14,9266,16],{"id":16},[10,9268,1529],{},[14,9270,22],{"id":22},[10,9272,9273],{},[26,9274],{"alt":1536,"src":1537},[10,9276,1540,9277,1543],{},[33,9278,682],{},[14,9280,39],{"id":39},[41,9282,9283,9285,9287],{},[44,9284,1550],{},[44,9286,1553],{},[44,9288,1556,9289,1560],{},[33,9290,1559],{},[14,9292,59],{"id":59},[10,9294,1565],{},[64,9296,9297],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,9298,9299,9305],{"__ignoreMap":69},[73,9300,9301,9303],{"class":75,"line":76},[73,9302,682],{"class":591},[73,9304,595],{"class":594},[73,9306,9307,9309,9311,9313],{"class":75,"line":82},[73,9308,682],{"class":591},[73,9310,624],{"class":594},[73,9312,628],{"class":627},[73,9314,595],{"class":594},[10,9316,118],{},[64,9318,9320],{"className":9319,"code":1591,"language":124,"meta":69},[122],[33,9321,1591],{"__ignoreMap":69},[10,9323,129],{},[14,9325,132],{"id":132},[134,9327,9328,9332],{},[44,9329,9330,1605],{},[33,9331,1604],{},[44,9333,9334,1610],{},[33,9335,690],{},[14,9337,170],{"id":170},[41,9339,9340,9344],{},[44,9341,1617,9342,1620],{},[33,9343,682],{},[44,9345,1623,9346,1626],{},[33,9347,682],{},[14,9349,181],{"id":181},[134,9351,9352,9356],{},[44,9353,929,9354,1636],{},[33,9355,1635],{},[44,9357,1639],{},[10,9359,195],{},[14,9361,198],{"id":198},[10,9363,1646],{},[203,9365,1649],{},{"title":69,"searchDepth":82,"depth":82,"links":9367},[9368,9369,9370,9371,9372,9373,9374,9375],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":1519,"description":1524},[218,1667,1043],{"id":1670,"title":1671,"body":9380,"category":218,"cover":219,"description":1837,"extension":220,"meta":9507,"navigation":85,"path":1839,"pinned":223,"publishedAt":224,"seo":9508,"slug":1841,"stem":1842,"summary":1843,"tags":9509,"updatedAt":224,"visible":85,"__hash__":1847},{"type":7,"value":9381,"toc":9497},[9382,9386,9388,9390,9392,9396,9398,9400,9416,9418,9420,9440,9442,9447,9449,9451,9463,9465,9475,9477,9487,9489,9491,9495],[10,9383,1676,9384,1679],{},[33,9385,1162],{},[14,9387,16],{"id":16},[10,9389,1684],{},[14,9391,22],{"id":22},[10,9393,9394],{},[26,9395],{"alt":1691,"src":1692},[10,9397,1695],{},[14,9399,39],{"id":39},[41,9401,9402,9408,9412],{},[44,9403,1702,9404,1705,9406,353],{},[33,9405,682],{},[33,9407,1708],{},[44,9409,1711,9410,1715],{},[33,9411,1714],{},[44,9413,1718,9414,1721],{},[33,9415,1162],{},[14,9417,59],{"id":59},[10,9419,62],{},[64,9421,9422],{"className":1728,"code":1729,"language":1730,"meta":69,"style":69},[33,9423,9424,9428,9432,9436],{"__ignoreMap":69},[73,9425,9426],{"class":75,"line":76},[73,9427,1737],{},[73,9429,9430],{"class":75,"line":82},[73,9431,1742],{},[73,9433,9434],{"class":75,"line":89},[73,9435,1747],{},[73,9437,9438],{"class":75,"line":95},[73,9439,1752],{},[10,9441,118],{},[64,9443,9445],{"className":9444,"code":1758,"language":124,"meta":69},[122],[33,9446,1758],{"__ignoreMap":69},[10,9448,129],{},[14,9450,132],{"id":132},[134,9452,9453,9459],{},[44,9454,1769,9455,1773,9457,353],{},[33,9456,1772],{},[33,9458,1776],{},[44,9460,1779,9461,1782],{},[33,9462,1464],{},[14,9464,170],{"id":170},[41,9466,9467,9473],{},[44,9468,1789,9469,1792,9471,1795],{},[33,9470,1708],{},[33,9472,1162],{},[44,9474,1798],{},[14,9476,181],{"id":181},[134,9478,9479,9483],{},[44,9480,1805,9481,353],{},[33,9482,1808],{},[44,9484,1811,9485,1814],{},[33,9486,1464],{},[10,9488,195],{},[14,9490,198],{"id":198},[10,9492,1821,9493,1824],{},[33,9494,1162],{},[203,9496,205],{},{"title":69,"searchDepth":82,"depth":82,"links":9498},[9499,9500,9501,9502,9503,9504,9505,9506],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":1671,"description":1837},[218,1845,1846],{"id":1849,"title":1850,"body":9511,"category":218,"cover":219,"description":1855,"extension":220,"meta":9650,"navigation":85,"path":2027,"pinned":223,"publishedAt":224,"seo":9651,"slug":2029,"stem":2030,"summary":2031,"tags":9652,"updatedAt":224,"visible":85,"__hash__":2035},{"type":7,"value":9512,"toc":9640},[9513,9515,9517,9519,9521,9525,9529,9531,9543,9545,9547,9583,9585,9590,9592,9594,9610,9612,9622,9624,9632,9634,9636,9638],[10,9514,1855],{},[14,9516,16],{"id":16},[10,9518,1860],{},[14,9520,22],{"id":22},[10,9522,9523],{},[26,9524],{"alt":1867,"src":1868},[10,9526,9527,1874],{},[33,9528,1873],{},[14,9530,39],{"id":39},[41,9532,9533,9535,9541],{},[44,9534,1881],{},[44,9536,9537,1887,9539,1891],{},[33,9538,1886],{},[33,9540,1890],{},[44,9542,1894],{},[14,9544,59],{"id":59},[10,9546,1565],{},[64,9548,9549],{"className":582,"code":1901,"language":584,"meta":69,"style":69},[33,9550,9551,9557,9563,9567,9577],{"__ignoreMap":69},[73,9552,9553,9555],{"class":75,"line":76},[73,9554,1908],{"class":591},[73,9556,1911],{"class":627},[73,9558,9559,9561],{"class":75,"line":82},[73,9560,1916],{"class":594},[73,9562,1911],{"class":627},[73,9564,9565],{"class":75,"line":89},[73,9566,1923],{"class":594},[73,9568,9569,9571,9573,9575],{"class":75,"line":95},[73,9570,1928],{"class":594},[73,9572,1931],{"class":627},[73,9574,1935],{"class":1934},[73,9576,1206],{"class":627},[73,9578,9579,9581],{"class":75,"line":101},[73,9580,682],{"class":591},[73,9582,1206],{"class":627},[10,9584,118],{},[64,9586,9588],{"className":9587,"code":1949,"language":124,"meta":69},[122],[33,9589,1949],{"__ignoreMap":69},[10,9591,129],{},[14,9593,132],{"id":132},[134,9595,9596,9604],{},[44,9597,9598,1962,9600,1965,9602,1968],{},[33,9599,1908],{},[33,9601,1916],{},[33,9603,1886],{},[44,9605,9606,1973,9608,1977],{},[33,9607,1873],{},[33,9609,1976],{},[14,9611,170],{"id":170},[41,9613,9614,9620],{},[44,9615,1984,9616,1148,9618,353],{},[33,9617,1886],{},[33,9619,1890],{},[44,9621,1991],{},[14,9623,181],{"id":181},[134,9625,9626,9630],{},[44,9627,1998,9628,2002],{},[33,9629,2001],{},[44,9631,2005],{},[10,9633,195],{},[14,9635,198],{"id":198},[10,9637,2012],{},[203,9639,2015],{},{"title":69,"searchDepth":82,"depth":82,"links":9641},[9642,9643,9644,9645,9646,9647,9648,9649],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":1850,"description":1855},[218,2033,2034],{"id":2037,"title":2038,"body":9654,"category":218,"cover":219,"description":2043,"extension":220,"meta":9775,"navigation":85,"path":2192,"pinned":223,"publishedAt":224,"seo":9776,"slug":2194,"stem":2195,"summary":2196,"tags":9777,"updatedAt":224,"visible":85,"__hash__":2200},{"type":7,"value":9655,"toc":9765},[9656,9658,9660,9662,9664,9668,9676,9678,9692,9694,9696,9712,9714,9719,9721,9723,9737,9739,9745,9747,9757,9759,9761,9763],[10,9657,2043],{},[14,9659,16],{"id":16},[10,9661,2048],{},[14,9663,22],{"id":22},[10,9665,9666],{},[26,9667],{"alt":2055,"src":2056},[10,9669,2059,9670,353,9672,2065,9674,353],{},[33,9671,1464],{},[33,9673,2064],{},[33,9675,1772],{},[14,9677,39],{"id":39},[41,9679,9680,9684,9690],{},[44,9681,9682,2077],{},[33,9683,2076],{},[44,9685,9686,2083,9688,353],{},[33,9687,2082],{},[33,9689,2086],{},[44,9691,2089],{},[14,9693,59],{"id":59},[10,9695,62],{},[64,9697,9698],{"className":66,"code":2096,"language":68,"meta":69,"style":69},[33,9699,9700,9704,9708],{"__ignoreMap":69},[73,9701,9702],{"class":75,"line":76},[73,9703,2103],{},[73,9705,9706],{"class":75,"line":82},[73,9707,2108],{},[73,9709,9710],{"class":75,"line":89},[73,9711,2113],{},[10,9713,118],{},[64,9715,9717],{"className":9716,"code":2119,"language":124,"meta":69},[122],[33,9718,2119],{"__ignoreMap":69},[10,9720,129],{},[14,9722,132],{"id":132},[134,9724,9725,9731],{},[44,9726,9727,2133,9729,353],{},[33,9728,2132],{},[33,9730,2086],{},[44,9732,9733,2140,9735,2144],{},[33,9734,1464],{},[33,9736,2143],{},[14,9738,170],{"id":170},[41,9740,9741,9743],{},[44,9742,2151],{},[44,9744,2154],{},[14,9746,181],{"id":181},[134,9748,9749,9751],{},[44,9750,2161],{},[44,9752,2164,9753,2167,9755,2171],{},[33,9754,2064],{},[33,9756,2170],{},[10,9758,195],{},[14,9760,198],{"id":198},[10,9762,2178],{},[203,9764,205],{},{"title":69,"searchDepth":82,"depth":82,"links":9766},[9767,9768,9769,9770,9771,9772,9773,9774],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2038,"description":2043},[218,2198,2199],{"id":2202,"title":2203,"body":9779,"category":218,"cover":219,"description":2208,"extension":220,"meta":9912,"navigation":85,"path":2375,"pinned":223,"publishedAt":224,"seo":9913,"slug":2377,"stem":2378,"summary":2379,"tags":9914,"updatedAt":224,"visible":85,"__hash__":2383},{"type":7,"value":9780,"toc":9902},[9781,9783,9785,9787,9789,9793,9795,9797,9813,9815,9817,9841,9843,9848,9850,9852,9868,9870,9882,9884,9894,9896,9898,9900],[10,9782,2208],{},[14,9784,16],{"id":16},[10,9786,2213],{},[14,9788,22],{"id":22},[10,9790,9791],{},[26,9792],{"alt":2220,"src":2221},[10,9794,2224],{},[14,9796,39],{"id":39},[41,9798,9799,9801,9807],{},[44,9800,2231],{},[44,9802,2234,9803,2167,9805,2241],{},[33,9804,2237],{},[33,9806,2240],{},[44,9808,2244,9809,2248,9811,2252],{},[33,9810,2247],{},[33,9812,2251],{},[14,9814,59],{"id":59},[10,9816,62],{},[64,9818,9819],{"className":66,"code":2259,"language":68,"meta":69,"style":69},[33,9820,9821,9825,9829,9833,9837],{"__ignoreMap":69},[73,9822,9823],{"class":75,"line":76},[73,9824,2266],{},[73,9826,9827],{"class":75,"line":82},[73,9828,2271],{},[73,9830,9831],{"class":75,"line":89},[73,9832,86],{"emptyLinePlaceholder":85},[73,9834,9835],{"class":75,"line":95},[73,9836,2280],{},[73,9838,9839],{"class":75,"line":101},[73,9840,2271],{},[10,9842,118],{},[64,9844,9846],{"className":9845,"code":2290,"language":124,"meta":69},[122],[33,9847,2290],{"__ignoreMap":69},[10,9849,129],{},[14,9851,132],{"id":132},[134,9853,9854,9860],{},[44,9855,929,9856,2304,9858,2307],{},[33,9857,2303],{},[33,9859,2237],{},[44,9861,929,9862,2313,9864,2317,9866,353],{},[33,9863,2312],{},[33,9865,2316],{},[33,9867,2320],{},[14,9869,170],{"id":170},[41,9871,9872,9874],{},[44,9873,2327],{},[44,9875,186,9876,2248,9878,2248,9880,2337],{},[33,9877,2247],{},[33,9879,2251],{},[33,9881,2336],{},[14,9883,181],{"id":181},[134,9885,9886,9892],{},[44,9887,2344,9888,1148,9890,2351],{},[33,9889,2347],{},[33,9891,2350],{},[44,9893,2354],{},[10,9895,195],{},[14,9897,198],{"id":198},[10,9899,2361],{},[203,9901,205],{},{"title":69,"searchDepth":82,"depth":82,"links":9903},[9904,9905,9906,9907,9908,9909,9910,9911],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2203,"description":2208},[218,2381,2382],{"id":2385,"title":2386,"body":9916,"category":218,"cover":219,"description":2391,"extension":220,"meta":10049,"navigation":85,"path":2557,"pinned":223,"publishedAt":224,"seo":10050,"slug":2559,"stem":2560,"summary":2561,"tags":10051,"updatedAt":224,"visible":85,"__hash__":2565},{"type":7,"value":9917,"toc":10039},[9918,9920,9922,9924,9926,9930,9932,9934,9952,9954,9956,9992,9994,9999,10001,10003,10013,10015,10023,10025,10031,10033,10035,10037],[10,9919,2391],{},[14,9921,16],{"id":16},[10,9923,2396],{},[14,9925,22],{"id":22},[10,9927,9928],{},[26,9929],{"alt":2403,"src":2404},[10,9931,2407],{},[14,9933,39],{"id":39},[41,9935,9936,9942,9950],{},[44,9937,9938,2417,9940,2421],{},[33,9939,2416],{},[33,9941,2420],{},[44,9943,9944,2427,9946,2431,9948,2435],{},[33,9945,2426],{},[33,9947,2430],{},[33,9949,2434],{},[44,9951,2438],{},[14,9953,59],{"id":59},[10,9955,62],{},[64,9957,9958],{"className":66,"code":2445,"language":68,"meta":69,"style":69},[33,9959,9960,9964,9968,9972,9976,9980,9984,9988],{"__ignoreMap":69},[73,9961,9962],{"class":75,"line":76},[73,9963,2452],{},[73,9965,9966],{"class":75,"line":82},[73,9967,2457],{},[73,9969,9970],{"class":75,"line":89},[73,9971,2462],{},[73,9973,9974],{"class":75,"line":95},[73,9975,86],{"emptyLinePlaceholder":85},[73,9977,9978],{"class":75,"line":101},[73,9979,2471],{},[73,9981,9982],{"class":75,"line":107},[73,9983,2476],{},[73,9985,9986],{"class":75,"line":112},[73,9987,2481],{},[73,9989,9990],{"class":75,"line":2484},[73,9991,2487],{},[10,9993,118],{},[64,9995,9997],{"className":9996,"code":2493,"language":124,"meta":69},[122],[33,9998,2493],{"__ignoreMap":69},[10,10000,129],{},[14,10002,132],{"id":132},[134,10004,10005,10009],{},[44,10006,10007,2507],{},[33,10008,2506],{},[44,10010,10011,2513],{},[33,10012,2512],{},[14,10014,170],{"id":170},[41,10016,10017,10021],{},[44,10018,2520,10019,353],{},[33,10020,2523],{},[44,10022,2526],{},[14,10024,181],{"id":181},[134,10026,10027,10029],{},[44,10028,2533],{},[44,10030,2536],{},[10,10032,195],{},[14,10034,198],{"id":198},[10,10036,2543],{},[203,10038,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10040},[10041,10042,10043,10044,10045,10046,10047,10048],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2386,"description":2391},[218,2563,2564],{"id":2567,"title":2568,"body":10053,"category":218,"cover":219,"description":2573,"extension":220,"meta":10190,"navigation":85,"path":2749,"pinned":223,"publishedAt":224,"seo":10191,"slug":2751,"stem":2752,"summary":2753,"tags":10192,"updatedAt":224,"visible":85,"__hash__":2757},{"type":7,"value":10054,"toc":10178},[10055,10057,10059,10061,10063,10067,10073,10075,10083,10085,10087,10111,10113,10118,10120,10122,10140,10142,10144,10148,10150,10152,10158,10160,10170,10172,10174,10176],[10,10056,2573],{},[14,10058,16],{"id":16},[10,10060,2578],{},[14,10062,22],{"id":22},[10,10064,10065],{},[26,10066],{"alt":2585,"src":2586},[10,10068,2589,10069,2593,10071,353],{},[33,10070,2592],{},[33,10072,2596],{},[14,10074,39],{"id":39},[41,10076,10077,10079,10081],{},[44,10078,2603],{},[44,10080,2606],{},[44,10082,2609],{},[14,10084,59],{"id":59},[10,10086,62],{},[64,10088,10089],{"className":66,"code":2616,"language":68,"meta":69,"style":69},[33,10090,10091,10095,10099,10103,10107],{"__ignoreMap":69},[73,10092,10093],{"class":75,"line":76},[73,10094,2623],{},[73,10096,10097],{"class":75,"line":82},[73,10098,2628],{},[73,10100,10101],{"class":75,"line":89},[73,10102,2633],{},[73,10104,10105],{"class":75,"line":95},[73,10106,2638],{},[73,10108,10109],{"class":75,"line":101},[73,10110,2643],{},[10,10112,118],{},[64,10114,10116],{"className":10115,"code":2649,"language":124,"meta":69},[122],[33,10117,2649],{"__ignoreMap":69},[10,10119,129],{},[14,10121,132],{"id":132},[134,10123,10124,10132],{},[44,10125,2660,10126,2663,10128,2667,10130,2671],{},[33,10127,218],{},[33,10129,2666],{},[33,10131,2670],{},[44,10133,10134,2677,10136,2681,10138,2685],{},[33,10135,2676],{},[33,10137,2680],{},[33,10139,2684],{},[150,10141,152],{"id":152},[10,10143,2690],{},[10,10145,10146],{},[26,10147],{"alt":2695,"src":2696},[10,10149,2699],{},[14,10151,170],{"id":170},[41,10153,10154,10156],{},[44,10155,2706],{},[44,10157,2709],{},[14,10159,181],{"id":181},[134,10161,10162,10168],{},[44,10163,2716,10164,2720,10166,353],{},[33,10165,2719],{},[33,10167,2723],{},[44,10169,2726],{},[10,10171,195],{},[14,10173,198],{"id":198},[10,10175,2733],{},[203,10177,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10179},[10180,10181,10182,10183,10184,10187,10188,10189],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":10185},[10186],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2568,"description":2573},[218,2755,2756],{"id":2759,"title":2760,"body":10194,"category":218,"cover":219,"description":2765,"extension":220,"meta":10359,"navigation":85,"path":2980,"pinned":223,"publishedAt":224,"seo":10360,"slug":2982,"stem":2983,"summary":2984,"tags":10361,"updatedAt":224,"visible":85,"__hash__":2988},{"type":7,"value":10195,"toc":10347},[10196,10198,10200,10202,10204,10208,10214,10216,10236,10238,10240,10276,10278,10283,10285,10287,10301,10303,10305,10309,10315,10317,10327,10329,10339,10341,10343,10345],[10,10197,2765],{},[14,10199,16],{"id":16},[10,10201,2770],{},[14,10203,22],{"id":22},[10,10205,10206],{},[26,10207],{"alt":2777,"src":2778},[10,10209,2781,10210,1000,10212,2788],{},[33,10211,2784],{},[33,10213,2787],{},[14,10215,39],{"id":39},[41,10217,10218,10226,10234],{},[44,10219,10220,2798,10222,2802,10224,2806],{},[33,10221,2797],{},[33,10223,2801],{},[33,10225,2805],{},[44,10227,10228,2812,10230,2816,10232,2820],{},[33,10229,2811],{},[33,10231,2815],{},[33,10233,2819],{},[44,10235,2823],{},[14,10237,59],{"id":59},[10,10239,62],{},[64,10241,10242],{"className":66,"code":2830,"language":68,"meta":69,"style":69},[33,10243,10244,10248,10252,10256,10260,10264,10268,10272],{"__ignoreMap":69},[73,10245,10246],{"class":75,"line":76},[73,10247,2837],{},[73,10249,10250],{"class":75,"line":82},[73,10251,2842],{},[73,10253,10254],{"class":75,"line":89},[73,10255,86],{"emptyLinePlaceholder":85},[73,10257,10258],{"class":75,"line":95},[73,10259,2851],{},[73,10261,10262],{"class":75,"line":101},[73,10263,2856],{},[73,10265,10266],{"class":75,"line":107},[73,10267,2861],{},[73,10269,10270],{"class":75,"line":112},[73,10271,2866],{},[73,10273,10274],{"class":75,"line":2484},[73,10275,2871],{},[10,10277,118],{},[64,10279,10281],{"className":10280,"code":2877,"language":124,"meta":69},[122],[33,10282,2877],{"__ignoreMap":69},[10,10284,129],{},[14,10286,132],{"id":132},[134,10288,10289,10295],{},[44,10290,10291,2891,10293,2895],{},[33,10292,2890],{},[33,10294,2894],{},[44,10296,10297,2901,10299,2904],{},[33,10298,2900],{},[33,10300,2819],{},[150,10302,152],{"id":152},[10,10304,2909],{},[10,10306,10307],{},[26,10308],{"alt":2914,"src":2915},[10,10310,10311,2920,10313,2923],{},[33,10312,2811],{},[33,10314,2815],{},[14,10316,170],{"id":170},[41,10318,10319,10325],{},[44,10320,2930,10321,2933,10323,2936],{},[33,10322,2805],{},[33,10324,2797],{},[44,10326,2939],{},[14,10328,181],{"id":181},[134,10330,10331,10335],{},[44,10332,2946,10333,2950],{},[33,10334,2949],{},[44,10336,2953,10337,2957],{},[33,10338,2956],{},[10,10340,195],{},[14,10342,198],{"id":198},[10,10344,2964],{},[203,10346,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10348},[10349,10350,10351,10352,10353,10356,10357,10358],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":10354},[10355],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2760,"description":2765},[218,2986,2987],{"id":2990,"title":2991,"body":10363,"category":218,"cover":219,"description":2996,"extension":220,"meta":10496,"navigation":85,"path":3165,"pinned":223,"publishedAt":224,"seo":10497,"slug":3167,"stem":3168,"summary":3169,"tags":10498,"updatedAt":224,"visible":85,"__hash__":3172},{"type":7,"value":10364,"toc":10486},[10365,10367,10369,10371,10373,10377,10387,10389,10399,10401,10403,10431,10433,10438,10440,10442,10456,10458,10466,10468,10478,10480,10482,10484],[10,10366,2996],{},[14,10368,16],{"id":16},[10,10370,3001],{},[14,10372,22],{"id":22},[10,10374,10375],{},[26,10376],{"alt":3008,"src":3009},[10,10378,10379,3015,10381,3019,10383,3023,10385,3027],{},[33,10380,3014],{},[33,10382,3018],{},[33,10384,3022],{},[33,10386,3026],{},[14,10388,39],{"id":39},[41,10390,10391,10393,10397],{},[44,10392,3034],{},[44,10394,10395,3039],{},[33,10396,3026],{},[44,10398,3042],{},[14,10400,59],{"id":59},[10,10402,62],{},[64,10404,10405],{"className":66,"code":3049,"language":68,"meta":69,"style":69},[33,10406,10407,10411,10415,10419,10423,10427],{"__ignoreMap":69},[73,10408,10409],{"class":75,"line":76},[73,10410,3056],{},[73,10412,10413],{"class":75,"line":82},[73,10414,3061],{},[73,10416,10417],{"class":75,"line":89},[73,10418,3066],{},[73,10420,10421],{"class":75,"line":95},[73,10422,86],{"emptyLinePlaceholder":85},[73,10424,10425],{"class":75,"line":101},[73,10426,3075],{},[73,10428,10429],{"class":75,"line":107},[73,10430,3080],{},[10,10432,118],{},[64,10434,10436],{"className":10435,"code":3086,"language":124,"meta":69},[122],[33,10437,3086],{"__ignoreMap":69},[10,10439,129],{},[14,10441,132],{"id":132},[134,10443,10444,10450],{},[44,10445,3097,10446,3100,10448,3104],{},[33,10447,3014],{},[33,10449,3103],{},[44,10451,10452,3110,10454,3114],{},[33,10453,3109],{},[33,10455,3113],{},[14,10457,170],{"id":170},[41,10459,10460,10464],{},[44,10461,3121,10462,3125],{},[33,10463,3124],{},[44,10465,3128],{},[14,10467,181],{"id":181},[134,10469,10470,10472],{},[44,10471,3135],{},[44,10473,1711,10474,3141,10476,3144],{},[33,10475,3140],{},[33,10477,3026],{},[10,10479,195],{},[14,10481,198],{"id":198},[10,10483,3151],{},[203,10485,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10487},[10488,10489,10490,10491,10492,10493,10494,10495],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":2991,"description":2996},[218,2336,3171],{"id":3174,"title":3175,"body":10500,"category":218,"cover":219,"description":3180,"extension":220,"meta":10629,"navigation":85,"path":3341,"pinned":223,"publishedAt":224,"seo":10630,"slug":3343,"stem":3344,"summary":3345,"tags":10631,"updatedAt":224,"visible":85,"__hash__":3349},{"type":7,"value":10501,"toc":10619},[10502,10504,10506,10508,10510,10514,10518,10520,10530,10532,10534,10566,10568,10573,10575,10577,10589,10591,10601,10603,10611,10613,10615,10617],[10,10503,3180],{},[14,10505,16],{"id":16},[10,10507,3185],{},[14,10509,22],{"id":22},[10,10511,10512],{},[26,10513],{"alt":3192,"src":3193},[10,10515,3196,10516,3200],{},[33,10517,3199],{},[14,10519,39],{"id":39},[41,10521,10522,10524,10526],{},[44,10523,3207],{},[44,10525,3210],{},[44,10527,3213,10528,353],{},[33,10529,3216],{},[14,10531,59],{"id":59},[10,10533,62],{},[64,10535,10536],{"className":66,"code":3223,"language":68,"meta":69,"style":69},[33,10537,10538,10542,10546,10550,10554,10558,10562],{"__ignoreMap":69},[73,10539,10540],{"class":75,"line":76},[73,10541,3230],{},[73,10543,10544],{"class":75,"line":82},[73,10545,3235],{},[73,10547,10548],{"class":75,"line":89},[73,10549,86],{"emptyLinePlaceholder":85},[73,10551,10552],{"class":75,"line":95},[73,10553,3244],{},[73,10555,10556],{"class":75,"line":101},[73,10557,3249],{},[73,10559,10560],{"class":75,"line":107},[73,10561,3254],{},[73,10563,10564],{"class":75,"line":112},[73,10565,3259],{},[10,10567,118],{},[64,10569,10571],{"className":10570,"code":3265,"language":124,"meta":69},[122],[33,10572,3265],{"__ignoreMap":69},[10,10574,129],{},[14,10576,132],{"id":132},[134,10578,10579,10581],{},[44,10580,3276],{},[44,10582,10583,3282,10585,3286,10587,3290],{},[33,10584,3281],{},[33,10586,3285],{},[33,10588,3289],{},[14,10590,170],{"id":170},[41,10592,10593,10599],{},[44,10594,3297,10595,3301,10597,353],{},[33,10596,3300],{},[33,10598,3304],{},[44,10600,3307],{},[14,10602,181],{"id":181},[134,10604,10605,10607],{},[44,10606,3314],{},[44,10608,3317,10609,3320],{},[33,10610,3289],{},[10,10612,195],{},[14,10614,198],{"id":198},[10,10616,3327],{},[203,10618,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10620},[10621,10622,10623,10624,10625,10626,10627,10628],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":3175,"description":3180},[218,3347,3348],{"id":3351,"title":3352,"body":10633,"category":218,"cover":219,"description":3357,"extension":220,"meta":10752,"navigation":85,"path":3499,"pinned":223,"publishedAt":224,"seo":10753,"slug":3501,"stem":3502,"summary":3503,"tags":10754,"updatedAt":224,"visible":85,"__hash__":3506},{"type":7,"value":10634,"toc":10742},[10635,10637,10639,10641,10643,10647,10649,10651,10659,10661,10663,10691,10693,10698,10700,10702,10712,10714,10722,10724,10734,10736,10738,10740],[10,10636,3357],{},[14,10638,16],{"id":16},[10,10640,3362],{},[14,10642,22],{"id":22},[10,10644,10645],{},[26,10646],{"alt":3369,"src":3370},[10,10648,3373],{},[14,10650,39],{"id":39},[41,10652,10653,10655,10657],{},[44,10654,3380],{},[44,10656,3383],{},[44,10658,3386],{},[14,10660,59],{"id":59},[10,10662,62],{},[64,10664,10665],{"className":66,"code":3393,"language":68,"meta":69,"style":69},[33,10666,10667,10671,10675,10679,10683,10687],{"__ignoreMap":69},[73,10668,10669],{"class":75,"line":76},[73,10670,3400],{},[73,10672,10673],{"class":75,"line":82},[73,10674,3405],{},[73,10676,10677],{"class":75,"line":89},[73,10678,3410],{},[73,10680,10681],{"class":75,"line":95},[73,10682,86],{"emptyLinePlaceholder":85},[73,10684,10685],{"class":75,"line":101},[73,10686,3419],{},[73,10688,10689],{"class":75,"line":107},[73,10690,3424],{},[10,10692,118],{},[64,10694,10696],{"className":10695,"code":3430,"language":124,"meta":69},[122],[33,10697,3430],{"__ignoreMap":69},[10,10699,129],{},[14,10701,132],{"id":132},[134,10703,10704,10708],{},[44,10705,10706,3444],{},[33,10707,3443],{},[44,10709,10710,3450],{},[33,10711,3449],{},[14,10713,170],{"id":170},[41,10715,10716,10720],{},[44,10717,3457,10718,3461],{},[33,10719,3460],{},[44,10721,3464],{},[14,10723,181],{"id":181},[134,10725,10726,10728],{},[44,10727,3471],{},[44,10729,2164,10730,2167,10732,3478],{},[33,10731,3460],{},[33,10733,3449],{},[10,10735,195],{},[14,10737,198],{"id":198},[10,10739,3485],{},[203,10741,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10743},[10744,10745,10746,10747,10748,10749,10750,10751],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":3352,"description":3357},[218,3505,3348],{"id":3508,"title":3509,"body":10756,"category":218,"cover":219,"description":3514,"extension":220,"meta":10881,"navigation":85,"path":3670,"pinned":223,"publishedAt":224,"seo":10882,"slug":3672,"stem":3673,"summary":3674,"tags":10883,"updatedAt":224,"visible":85,"__hash__":3677},{"type":7,"value":10757,"toc":10871},[10758,10760,10762,10764,10766,10770,10776,10778,10788,10790,10792,10820,10822,10827,10829,10831,10841,10843,10855,10857,10863,10865,10867,10869],[10,10759,3514],{},[14,10761,16],{"id":16},[10,10763,3519],{},[14,10765,22],{"id":22},[10,10767,10768],{},[26,10769],{"alt":3526,"src":3527},[10,10771,3530,10772,3534,10774,3537],{},[33,10773,3533],{},[33,10775,2237],{},[14,10777,39],{"id":39},[41,10779,10780,10782,10786],{},[44,10781,3544],{},[44,10783,186,10784,3550],{},[33,10785,3549],{},[44,10787,3553],{},[14,10789,59],{"id":59},[10,10791,62],{},[64,10793,10794],{"className":66,"code":3560,"language":68,"meta":69,"style":69},[33,10795,10796,10800,10804,10808,10812,10816],{"__ignoreMap":69},[73,10797,10798],{"class":75,"line":76},[73,10799,3567],{},[73,10801,10802],{"class":75,"line":82},[73,10803,3572],{},[73,10805,10806],{"class":75,"line":89},[73,10807,86],{"emptyLinePlaceholder":85},[73,10809,10810],{"class":75,"line":95},[73,10811,3581],{},[73,10813,10814],{"class":75,"line":101},[73,10815,3586],{},[73,10817,10818],{"class":75,"line":107},[73,10819,3591],{},[10,10821,118],{},[64,10823,10825],{"className":10824,"code":3597,"language":124,"meta":69},[122],[33,10826,3597],{"__ignoreMap":69},[10,10828,129],{},[14,10830,132],{"id":132},[134,10832,10833,10835],{},[44,10834,3608],{},[44,10836,3611,10837,3614,10839,3618],{},[33,10838,2237],{},[33,10840,3617],{},[14,10842,170],{"id":170},[41,10844,10845,10849],{},[44,10846,3625,10847,3629],{},[33,10848,3628],{},[44,10850,3632,10851,3636,10853,353],{},[33,10852,3635],{},[33,10854,3639],{},[14,10856,181],{"id":181},[134,10858,10859,10861],{},[44,10860,3646],{},[44,10862,3649],{},[10,10864,195],{},[14,10866,198],{"id":198},[10,10868,3656],{},[203,10870,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10872},[10873,10874,10875,10876,10877,10878,10879,10880],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":3509,"description":3514},[218,3676,3348],{"id":3679,"title":3680,"body":10885,"category":218,"cover":219,"description":3685,"extension":220,"meta":11008,"navigation":85,"path":3835,"pinned":223,"publishedAt":224,"seo":11009,"slug":3837,"stem":3838,"summary":3839,"tags":11010,"updatedAt":224,"visible":85,"__hash__":3842},{"type":7,"value":10886,"toc":10998},[10887,10889,10891,10893,10895,10899,10901,10903,10915,10917,10919,10947,10949,10954,10956,10958,10968,10970,10980,10982,10990,10992,10994,10996],[10,10888,3685],{},[14,10890,16],{"id":16},[10,10892,3690],{},[14,10894,22],{"id":22},[10,10896,10897],{},[26,10898],{"alt":3697,"src":3698},[10,10900,3701],{},[14,10902,39],{"id":39},[41,10904,10905,10907,10909],{},[44,10906,3708],{},[44,10908,3711],{},[44,10910,3714,10911,3718,10913,3722],{},[33,10912,3717],{},[33,10914,3721],{},[14,10916,59],{"id":59},[10,10918,62],{},[64,10920,10921],{"className":66,"code":3729,"language":68,"meta":69,"style":69},[33,10922,10923,10927,10931,10935,10939,10943],{"__ignoreMap":69},[73,10924,10925],{"class":75,"line":76},[73,10926,3736],{},[73,10928,10929],{"class":75,"line":82},[73,10930,3741],{},[73,10932,10933],{"class":75,"line":89},[73,10934,86],{"emptyLinePlaceholder":85},[73,10936,10937],{"class":75,"line":95},[73,10938,3750],{},[73,10940,10941],{"class":75,"line":101},[73,10942,3755],{},[73,10944,10945],{"class":75,"line":107},[73,10946,3760],{},[10,10948,118],{},[64,10950,10952],{"className":10951,"code":3766,"language":124,"meta":69},[122],[33,10953,3766],{"__ignoreMap":69},[10,10955,129],{},[14,10957,132],{"id":132},[134,10959,10960,10962],{},[44,10961,3777],{},[44,10963,10964,3783,10966,3787],{},[33,10965,3782],{},[33,10967,3786],{},[14,10969,170],{"id":170},[41,10971,10972,10978],{},[44,10973,186,10974,3796,10976,353],{},[33,10975,3721],{},[33,10977,3717],{},[44,10979,3801],{},[14,10981,181],{"id":181},[134,10983,10984,10988],{},[44,10985,3808,10986,3811],{},[33,10987,3717],{},[44,10989,3814],{},[10,10991,195],{},[14,10993,198],{"id":198},[10,10995,3821],{},[203,10997,205],{},{"title":69,"searchDepth":82,"depth":82,"links":10999},[11000,11001,11002,11003,11004,11005,11006,11007],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":3680,"description":3685},[218,3841,3348],{"id":3844,"title":3845,"body":11012,"category":218,"cover":219,"description":3850,"extension":220,"meta":11171,"navigation":85,"path":4049,"pinned":223,"publishedAt":224,"seo":11172,"slug":4051,"stem":4052,"summary":4053,"tags":11173,"updatedAt":224,"visible":85,"__hash__":4057},{"type":7,"value":11013,"toc":11159},[11014,11016,11018,11020,11022,11026,11032,11034,11046,11048,11050,11090,11092,11097,11099,11101,11115,11117,11119,11123,11125,11127,11137,11139,11151,11153,11155,11157],[10,11015,3850],{},[14,11017,16],{"id":16},[10,11019,3855],{},[14,11021,22],{"id":22},[10,11023,11024],{},[26,11025],{"alt":3862,"src":3863},[10,11027,11028,3869,11030,3873],{},[33,11029,3868],{},[33,11031,3872],{},[14,11033,39],{"id":39},[41,11035,11036,11042,11044],{},[44,11037,11038,3882,11040,3886],{},[33,11039,2797],{},[33,11041,3885],{},[44,11043,3889],{},[44,11045,3892],{},[14,11047,59],{"id":59},[10,11049,62],{},[64,11051,11052],{"className":66,"code":3899,"language":68,"meta":69,"style":69},[33,11053,11054,11058,11062,11066,11070,11074,11078,11082,11086],{"__ignoreMap":69},[73,11055,11056],{"class":75,"line":76},[73,11057,3906],{},[73,11059,11060],{"class":75,"line":82},[73,11061,3911],{},[73,11063,11064],{"class":75,"line":89},[73,11065,3916],{},[73,11067,11068],{"class":75,"line":95},[73,11069,86],{"emptyLinePlaceholder":85},[73,11071,11072],{"class":75,"line":101},[73,11073,3925],{},[73,11075,11076],{"class":75,"line":107},[73,11077,3930],{},[73,11079,11080],{"class":75,"line":112},[73,11081,3935],{},[73,11083,11084],{"class":75,"line":2484},[73,11085,3940],{},[73,11087,11088],{"class":75,"line":3943},[73,11089,3946],{},[10,11091,118],{},[64,11093,11095],{"className":11094,"code":3952,"language":124,"meta":69},[122],[33,11096,3952],{"__ignoreMap":69},[10,11098,129],{},[14,11100,132],{"id":132},[134,11102,11103,11107],{},[44,11104,11105,3966],{},[33,11106,3965],{},[44,11108,11109,3972,11111,3976,11113,3980],{},[33,11110,3971],{},[33,11112,3975],{},[33,11114,3979],{},[150,11116,152],{"id":152},[10,11118,3985],{},[10,11120,11121],{},[26,11122],{"alt":3990,"src":3991},[10,11124,3994],{},[14,11126,170],{"id":170},[41,11128,11129,11135],{},[44,11130,4001,11131,4004,11133,353],{},[33,11132,2797],{},[33,11134,3885],{},[44,11136,4009],{},[14,11138,181],{"id":181},[134,11140,11141,11143],{},[44,11142,4016],{},[44,11144,186,11145,4022,11147,1148,11149,353],{},[33,11146,4021],{},[33,11148,3885],{},[33,11150,2797],{},[10,11152,195],{},[14,11154,198],{"id":198},[10,11156,4033],{},[203,11158,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11160},[11161,11162,11163,11164,11165,11168,11169,11170],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":11166},[11167],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":3845,"description":3850},[218,4055,4056],{"id":4059,"title":4060,"body":11175,"category":218,"cover":219,"description":4065,"extension":220,"meta":11347,"navigation":85,"path":4279,"pinned":223,"publishedAt":224,"seo":11348,"slug":4281,"stem":4282,"summary":4283,"tags":11349,"updatedAt":224,"visible":85,"__hash__":4286},{"type":7,"value":11176,"toc":11334},[11177,11179,11181,11183,11185,11189,11197,11199,11207,11209,11211,11255,11257,11262,11264,11266,11278,11280,11282,11286,11292,11294,11296,11300,11304,11306,11318,11320,11326,11328,11330,11332],[10,11178,4065],{},[14,11180,16],{"id":16},[10,11182,4070],{},[14,11184,22],{"id":22},[10,11186,11187],{},[26,11188],{"alt":4077,"src":4078},[10,11190,11191,2248,11193,2248,11195,4088],{},[33,11192,1147],{},[33,11194,4085],{},[33,11196,1151],{},[14,11198,39],{"id":39},[41,11200,11201,11203,11205],{},[44,11202,4095],{},[44,11204,4098],{},[44,11206,4101],{},[14,11208,59],{"id":59},[10,11210,62],{},[64,11212,11213],{"className":66,"code":4108,"language":68,"meta":69,"style":69},[33,11214,11215,11219,11223,11227,11231,11235,11239,11243,11247,11251],{"__ignoreMap":69},[73,11216,11217],{"class":75,"line":76},[73,11218,4115],{},[73,11220,11221],{"class":75,"line":82},[73,11222,86],{"emptyLinePlaceholder":85},[73,11224,11225],{"class":75,"line":89},[73,11226,4124],{},[73,11228,11229],{"class":75,"line":95},[73,11230,4129],{},[73,11232,11233],{"class":75,"line":101},[73,11234,4134],{},[73,11236,11237],{"class":75,"line":107},[73,11238,4139],{},[73,11240,11241],{"class":75,"line":112},[73,11242,1137],{},[73,11244,11245],{"class":75,"line":2484},[73,11246,4148],{},[73,11248,11249],{"class":75,"line":3943},[73,11250,86],{"emptyLinePlaceholder":85},[73,11252,11253],{"class":75,"line":4155},[73,11254,4158],{},[10,11256,118],{},[64,11258,11260],{"className":11259,"code":4164,"language":124,"meta":69},[122],[33,11261,4164],{"__ignoreMap":69},[10,11263,129],{},[14,11265,132],{"id":132},[134,11267,11268,11272],{},[44,11269,4175,11270,4179],{},[33,11271,4178],{},[44,11273,11274,4185,11276,4188],{},[33,11275,4184],{},[33,11277,1151],{},[150,11279,152],{"id":152},[10,11281,4193],{},[10,11283,11284],{},[26,11285],{"alt":4198,"src":4199},[10,11287,11288,4204,11290,4207],{},[33,11289,4178],{},[33,11291,4184],{},[150,11293,152],{"id":4210},[10,11295,4213],{},[10,11297,11298],{},[26,11299],{"alt":4218,"src":4219},[10,11301,4222,11302,4225],{},[33,11303,1147],{},[14,11305,170],{"id":170},[41,11307,11308,11312],{},[44,11309,4232,11310,4235],{},[33,11311,4184],{},[44,11313,4238,11314,4241,11316,4245],{},[33,11315,1147],{},[33,11317,4244],{},[14,11319,181],{"id":181},[134,11321,11322,11324],{},[44,11323,4252],{},[44,11325,4255],{},[10,11327,195],{},[14,11329,198],{"id":198},[10,11331,4262],{},[203,11333,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11335},[11336,11337,11338,11339,11340,11344,11345,11346],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":11341},[11342,11343],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":4060,"description":4065},[218,1147,4285],{"id":4,"title":5,"body":11351,"category":218,"cover":219,"description":12,"extension":220,"meta":11488,"navigation":85,"path":222,"pinned":223,"publishedAt":224,"seo":11489,"slug":226,"stem":227,"summary":228,"tags":11490,"updatedAt":224,"visible":85,"__hash__":231},{"type":7,"value":11352,"toc":11476},[11353,11355,11357,11359,11361,11365,11369,11371,11381,11383,11385,11417,11419,11424,11426,11428,11438,11440,11442,11446,11450,11452,11458,11460,11468,11470,11472,11474],[10,11354,12],{},[14,11356,16],{"id":16},[10,11358,19],{},[14,11360,22],{"id":22},[10,11362,11363],{},[26,11364],{"alt":28,"src":29},[10,11366,11367,36],{},[33,11368,35],{},[14,11370,39],{"id":39},[41,11372,11373,11375,11377],{},[44,11374,46],{},[44,11376,49],{},[44,11378,52,11379,56],{},[33,11380,55],{},[14,11382,59],{"id":59},[10,11384,62],{},[64,11386,11387],{"className":66,"code":67,"language":68,"meta":69,"style":69},[33,11388,11389,11393,11397,11401,11405,11409,11413],{"__ignoreMap":69},[73,11390,11391],{"class":75,"line":76},[73,11392,79],{},[73,11394,11395],{"class":75,"line":82},[73,11396,86],{"emptyLinePlaceholder":85},[73,11398,11399],{"class":75,"line":89},[73,11400,92],{},[73,11402,11403],{"class":75,"line":95},[73,11404,98],{},[73,11406,11407],{"class":75,"line":101},[73,11408,104],{},[73,11410,11411],{"class":75,"line":107},[73,11412,86],{"emptyLinePlaceholder":85},[73,11414,11415],{"class":75,"line":112},[73,11416,115],{},[10,11418,118],{},[64,11420,11422],{"className":11421,"code":123,"language":124,"meta":69},[122],[33,11423,123],{"__ignoreMap":69},[10,11425,129],{},[14,11427,132],{"id":132},[134,11429,11430,11434],{},[44,11431,138,11432,142],{},[33,11433,141],{},[44,11435,145,11436,148],{},[33,11437,141],{},[150,11439,152],{"id":152},[10,11441,155],{},[10,11443,11444],{},[26,11445],{"alt":160,"src":161},[10,11447,164,11448,167],{},[33,11449,141],{},[14,11451,170],{"id":170},[41,11453,11454,11456],{},[44,11455,175],{},[44,11457,178],{},[14,11459,181],{"id":181},[134,11461,11462,11466],{},[44,11463,186,11464,189],{},[33,11465,35],{},[44,11467,192],{},[10,11469,195],{},[14,11471,198],{"id":198},[10,11473,201],{},[203,11475,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11477},[11478,11479,11480,11481,11482,11485,11486,11487],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":11483},[11484],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5,"description":12},[218,35,230],{"id":4429,"title":4430,"body":11492,"category":218,"cover":219,"description":4435,"extension":220,"meta":11617,"navigation":85,"path":4584,"pinned":223,"publishedAt":224,"seo":11618,"slug":4586,"stem":4587,"summary":4588,"tags":11619,"updatedAt":224,"visible":85,"__hash__":4591},{"type":7,"value":11493,"toc":11607},[11494,11496,11498,11500,11502,11506,11510,11512,11522,11524,11526,11558,11560,11565,11567,11569,11581,11583,11589,11591,11599,11601,11603,11605],[10,11495,4435],{},[14,11497,16],{"id":16},[10,11499,4440],{},[14,11501,22],{"id":22},[10,11503,11504],{},[26,11505],{"alt":4447,"src":4448},[10,11507,11508,4453],{},[33,11509,55],{},[14,11511,39],{"id":39},[41,11513,11514,11518,11520],{},[44,11515,11516,4463],{},[33,11517,4462],{},[44,11519,4466],{},[44,11521,4469],{},[14,11523,59],{"id":59},[10,11525,62],{},[64,11527,11528],{"className":66,"code":4476,"language":68,"meta":69,"style":69},[33,11529,11530,11534,11538,11542,11546,11550,11554],{"__ignoreMap":69},[73,11531,11532],{"class":75,"line":76},[73,11533,4483],{},[73,11535,11536],{"class":75,"line":82},[73,11537,86],{"emptyLinePlaceholder":85},[73,11539,11540],{"class":75,"line":89},[73,11541,4492],{},[73,11543,11544],{"class":75,"line":95},[73,11545,4497],{},[73,11547,11548],{"class":75,"line":101},[73,11549,86],{"emptyLinePlaceholder":85},[73,11551,11552],{"class":75,"line":107},[73,11553,4506],{},[73,11555,11556],{"class":75,"line":112},[73,11557,4511],{},[10,11559,118],{},[64,11561,11563],{"className":11562,"code":4517,"language":124,"meta":69},[122],[33,11564,4517],{"__ignoreMap":69},[10,11566,129],{},[14,11568,132],{"id":132},[134,11570,11571,11577],{},[44,11572,4528,11573,4531,11575,4535],{},[33,11574,55],{},[33,11576,4534],{},[44,11578,11579,4540],{},[33,11580,4462],{},[14,11582,170],{"id":170},[41,11584,11585,11587],{},[44,11586,4547],{},[44,11588,4550],{},[14,11590,181],{"id":181},[134,11592,11593,11595],{},[44,11594,4557],{},[44,11596,186,11597,4563],{},[33,11598,4562],{},[10,11600,195],{},[14,11602,198],{"id":198},[10,11604,4570],{},[203,11606,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11608},[11609,11610,11611,11612,11613,11614,11615,11616],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":4430,"description":4435},[218,55,4590],{"id":4593,"title":4594,"body":11621,"category":218,"cover":219,"description":4599,"extension":220,"meta":11766,"navigation":85,"path":4774,"pinned":223,"publishedAt":224,"seo":11767,"slug":4776,"stem":4777,"summary":4778,"tags":11768,"updatedAt":224,"visible":85,"__hash__":4780},{"type":7,"value":11622,"toc":11756},[11623,11625,11627,11629,11631,11635,11641,11643,11657,11659,11661,11705,11707,11712,11714,11716,11726,11728,11740,11742,11748,11750,11752,11754],[10,11624,4599],{},[14,11626,16],{"id":16},[10,11628,4604],{},[14,11630,22],{"id":22},[10,11632,11633],{},[26,11634],{"alt":4611,"src":4612},[10,11636,11637,4618,11639,4622],{},[33,11638,4617],{},[33,11640,4621],{},[14,11642,39],{"id":39},[41,11644,11645,11647,11653],{},[44,11646,4629],{},[44,11648,11649,4634,11651,4637],{},[33,11650,4617],{},[33,11652,35],{},[44,11654,4640,11655,4643],{},[33,11656,4621],{},[14,11658,59],{"id":59},[10,11660,62],{},[64,11662,11663],{"className":66,"code":4650,"language":68,"meta":69,"style":69},[33,11664,11665,11669,11673,11677,11681,11685,11689,11693,11697,11701],{"__ignoreMap":69},[73,11666,11667],{"class":75,"line":76},[73,11668,4657],{},[73,11670,11671],{"class":75,"line":82},[73,11672,86],{"emptyLinePlaceholder":85},[73,11674,11675],{"class":75,"line":89},[73,11676,4666],{},[73,11678,11679],{"class":75,"line":95},[73,11680,4671],{},[73,11682,11683],{"class":75,"line":101},[73,11684,4676],{},[73,11686,11687],{"class":75,"line":107},[73,11688,4681],{},[73,11690,11691],{"class":75,"line":112},[73,11692,4686],{},[73,11694,11695],{"class":75,"line":2484},[73,11696,4511],{},[73,11698,11699],{"class":75,"line":3943},[73,11700,86],{"emptyLinePlaceholder":85},[73,11702,11703],{"class":75,"line":4155},[73,11704,4699],{},[10,11706,118],{},[64,11708,11710],{"className":11709,"code":4705,"language":124,"meta":69},[122],[33,11711,4705],{"__ignoreMap":69},[10,11713,129],{},[14,11715,132],{"id":132},[134,11717,11718,11722],{},[44,11719,4716,11720,4719],{},[33,11721,4617],{},[44,11723,4722,11724,4725],{},[33,11725,4621],{},[14,11727,170],{"id":170},[41,11729,11730,11734],{},[44,11731,3457,11732,4734],{},[33,11733,4617],{},[44,11735,4737,11736,4740,11738,4743],{},[33,11737,35],{},[33,11739,4617],{},[14,11741,181],{"id":181},[134,11743,11744,11746],{},[44,11745,4750],{},[44,11747,4753],{},[10,11749,195],{},[14,11751,198],{"id":198},[10,11753,4760],{},[203,11755,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11757},[11758,11759,11760,11761,11762,11763,11764,11765],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":4594,"description":4599},[218,4621,4617],{"id":4782,"title":4783,"body":11770,"category":218,"cover":219,"description":4788,"extension":220,"meta":11909,"navigation":85,"path":4960,"pinned":223,"publishedAt":224,"seo":11910,"slug":4962,"stem":4963,"summary":4964,"tags":11911,"updatedAt":224,"visible":85,"__hash__":4968},{"type":7,"value":11771,"toc":11897},[11772,11774,11776,11778,11780,11784,11786,11788,11804,11806,11808,11836,11838,11843,11845,11847,11859,11861,11863,11867,11869,11871,11881,11883,11889,11891,11893,11895],[10,11773,4788],{},[14,11775,16],{"id":16},[10,11777,4793],{},[14,11779,22],{"id":22},[10,11781,11782],{},[26,11783],{"alt":4800,"src":4801},[10,11785,4804],{},[14,11787,39],{"id":39},[41,11789,11790,11792,11794],{},[44,11791,4811],{},[44,11793,4814],{},[44,11795,4817,11796,2248,11798,4824,11800,2248,11802,353],{},[33,11797,4820],{},[33,11799,4823],{},[33,11801,4827],{},[33,11803,4830],{},[14,11805,59],{"id":59},[10,11807,62],{},[64,11809,11810],{"className":66,"code":4837,"language":68,"meta":69,"style":69},[33,11811,11812,11816,11820,11824,11828,11832],{"__ignoreMap":69},[73,11813,11814],{"class":75,"line":76},[73,11815,4844],{},[73,11817,11818],{"class":75,"line":82},[73,11819,86],{"emptyLinePlaceholder":85},[73,11821,11822],{"class":75,"line":89},[73,11823,4853],{},[73,11825,11826],{"class":75,"line":95},[73,11827,4858],{},[73,11829,11830],{"class":75,"line":101},[73,11831,4863],{},[73,11833,11834],{"class":75,"line":107},[73,11835,4868],{},[10,11837,118],{},[64,11839,11841],{"className":11840,"code":4874,"language":124,"meta":69},[122],[33,11842,4874],{"__ignoreMap":69},[10,11844,129],{},[14,11846,132],{"id":132},[134,11848,11849,11857],{},[44,11850,4885,11851,4888,11853,1148,11855,353],{},[33,11852,4820],{},[33,11854,4891],{},[33,11856,4894],{},[44,11858,4897],{},[150,11860,152],{"id":152},[10,11862,4902],{},[10,11864,11865],{},[26,11866],{"alt":4907,"src":4908},[10,11868,4911],{},[14,11870,170],{"id":170},[41,11872,11873,11879],{},[44,11874,4918,11875,1000,11877,4924],{},[33,11876,4921],{},[33,11878,4827],{},[44,11880,4927],{},[14,11882,181],{"id":181},[134,11884,11885,11887],{},[44,11886,4934],{},[44,11888,4937],{},[10,11890,195],{},[14,11892,198],{"id":198},[10,11894,4944],{},[203,11896,205],{},{"title":69,"searchDepth":82,"depth":82,"links":11898},[11899,11900,11901,11902,11903,11906,11907,11908],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":11904},[11905],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":4783,"description":4788},[218,4966,4967],{"id":4970,"title":4971,"body":11913,"category":218,"cover":219,"description":4976,"extension":220,"meta":12030,"navigation":85,"path":5115,"pinned":223,"publishedAt":224,"seo":12031,"slug":5117,"stem":5118,"summary":5119,"tags":12032,"updatedAt":224,"visible":85,"__hash__":5123},{"type":7,"value":11914,"toc":12020},[11915,11917,11919,11921,11923,11927,11929,11931,11939,11941,11943,11975,11977,11982,11984,11986,11994,11996,12004,12006,12012,12014,12016,12018],[10,11916,4976],{},[14,11918,16],{"id":16},[10,11920,4981],{},[14,11922,22],{"id":22},[10,11924,11925],{},[26,11926],{"alt":4988,"src":4989},[10,11928,4992],{},[14,11930,39],{"id":39},[41,11932,11933,11935,11937],{},[44,11934,4999],{},[44,11936,5002],{},[44,11938,5005],{},[14,11940,59],{"id":59},[10,11942,62],{},[64,11944,11945],{"className":66,"code":5012,"language":68,"meta":69,"style":69},[33,11946,11947,11951,11955,11959,11963,11967,11971],{"__ignoreMap":69},[73,11948,11949],{"class":75,"line":76},[73,11950,5019],{},[73,11952,11953],{"class":75,"line":82},[73,11954,86],{"emptyLinePlaceholder":85},[73,11956,11957],{"class":75,"line":89},[73,11958,5028],{},[73,11960,11961],{"class":75,"line":95},[73,11962,5033],{},[73,11964,11965],{"class":75,"line":101},[73,11966,86],{"emptyLinePlaceholder":85},[73,11968,11969],{"class":75,"line":107},[73,11970,5042],{},[73,11972,11973],{"class":75,"line":112},[73,11974,5047],{},[10,11976,118],{},[64,11978,11980],{"className":11979,"code":5053,"language":124,"meta":69},[122],[33,11981,5053],{"__ignoreMap":69},[10,11983,129],{},[14,11985,132],{"id":132},[134,11987,11988,11990],{},[44,11989,5064],{},[44,11991,5067,11992,5071],{},[33,11993,5070],{},[14,11995,170],{"id":170},[41,11997,11998,12002],{},[44,11999,5078,12000,5081],{},[33,12001,55],{},[44,12003,5084],{},[14,12005,181],{"id":181},[134,12007,12008,12010],{},[44,12009,5091],{},[44,12011,5094],{},[10,12013,195],{},[14,12015,198],{"id":198},[10,12017,5101],{},[203,12019,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12021},[12022,12023,12024,12025,12026,12027,12028,12029],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":4971,"description":4976},[218,5121,5122],{"id":5125,"title":5126,"body":12034,"category":218,"cover":219,"description":5131,"extension":220,"meta":12153,"navigation":85,"path":5275,"pinned":223,"publishedAt":224,"seo":12154,"slug":5277,"stem":5278,"summary":5279,"tags":12155,"updatedAt":224,"visible":85,"__hash__":5283},{"type":7,"value":12035,"toc":12143},[12036,12038,12040,12042,12044,12048,12050,12052,12060,12062,12064,12096,12098,12103,12105,12107,12117,12119,12125,12127,12135,12137,12139,12141],[10,12037,5131],{},[14,12039,16],{"id":16},[10,12041,5136],{},[14,12043,22],{"id":22},[10,12045,12046],{},[26,12047],{"alt":5143,"src":5144},[10,12049,5147],{},[14,12051,39],{"id":39},[41,12053,12054,12056,12058],{},[44,12055,5154],{},[44,12057,5157],{},[44,12059,5160],{},[14,12061,59],{"id":59},[10,12063,62],{},[64,12065,12066],{"className":66,"code":5167,"language":68,"meta":69,"style":69},[33,12067,12068,12072,12076,12080,12084,12088,12092],{"__ignoreMap":69},[73,12069,12070],{"class":75,"line":76},[73,12071,5174],{},[73,12073,12074],{"class":75,"line":82},[73,12075,5179],{},[73,12077,12078],{"class":75,"line":89},[73,12079,5184],{},[73,12081,12082],{"class":75,"line":95},[73,12083,86],{"emptyLinePlaceholder":85},[73,12085,12086],{"class":75,"line":101},[73,12087,5193],{},[73,12089,12090],{"class":75,"line":107},[73,12091,5198],{},[73,12093,12094],{"class":75,"line":112},[73,12095,5203],{},[10,12097,118],{},[64,12099,12101],{"className":12100,"code":5209,"language":124,"meta":69},[122],[33,12102,5209],{"__ignoreMap":69},[10,12104,129],{},[14,12106,132],{"id":132},[134,12108,12109,12113],{},[44,12110,929,12111,5223],{},[33,12112,5222],{},[44,12114,5226,12115,5230],{},[33,12116,5229],{},[14,12118,170],{"id":170},[41,12120,12121,12123],{},[44,12122,5237],{},[44,12124,5240],{},[14,12126,181],{"id":181},[134,12128,12129,12133],{},[44,12130,5247,12131,5251],{},[33,12132,5250],{},[44,12134,5254],{},[10,12136,195],{},[14,12138,198],{"id":198},[10,12140,5261],{},[203,12142,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12144},[12145,12146,12147,12148,12149,12150,12151,12152],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5126,"description":5131},[218,5281,5282],{"id":5285,"title":5286,"body":12157,"category":218,"cover":219,"description":5291,"extension":220,"meta":12302,"navigation":85,"path":5472,"pinned":223,"publishedAt":224,"seo":12303,"slug":5474,"stem":5475,"summary":5476,"tags":12304,"updatedAt":224,"visible":85,"__hash__":5480},{"type":7,"value":12158,"toc":12290},[12159,12161,12163,12165,12167,12171,12175,12177,12189,12191,12193,12221,12223,12228,12230,12232,12246,12248,12250,12254,12262,12264,12274,12276,12282,12284,12286,12288],[10,12160,5291],{},[14,12162,16],{"id":16},[10,12164,5296],{},[14,12166,22],{"id":22},[10,12168,12169],{},[26,12170],{"alt":5303,"src":5304},[10,12172,5307,12173,5311],{},[33,12174,5310],{},[14,12176,39],{"id":39},[41,12178,12179,12181,12183],{},[44,12180,5318],{},[44,12182,5321],{},[44,12184,5324,12185,5327,12187,353],{},[33,12186,5310],{},[33,12188,5330],{},[14,12190,59],{"id":59},[10,12192,62],{},[64,12194,12195],{"className":66,"code":5337,"language":68,"meta":69,"style":69},[33,12196,12197,12201,12205,12209,12213,12217],{"__ignoreMap":69},[73,12198,12199],{"class":75,"line":76},[73,12200,5344],{},[73,12202,12203],{"class":75,"line":82},[73,12204,5349],{},[73,12206,12207],{"class":75,"line":89},[73,12208,5354],{},[73,12210,12211],{"class":75,"line":95},[73,12212,86],{"emptyLinePlaceholder":85},[73,12214,12215],{"class":75,"line":101},[73,12216,5363],{},[73,12218,12219],{"class":75,"line":107},[73,12220,5368],{},[10,12222,118],{},[64,12224,12226],{"className":12225,"code":5374,"language":124,"meta":69},[122],[33,12227,5374],{"__ignoreMap":69},[10,12229,129],{},[14,12231,132],{"id":132},[134,12233,12234,12240],{},[44,12235,5385,12236,2248,12238,5391],{},[33,12237,5388],{},[33,12239,141],{},[44,12241,12242,5397,12244,5401],{},[33,12243,5396],{},[33,12245,5400],{},[150,12247,152],{"id":152},[10,12249,5406],{},[10,12251,12252],{},[26,12253],{"alt":5411,"src":5412},[10,12255,12256,2248,12258,1148,12260,5422],{},[33,12257,5388],{},[33,12259,141],{},[33,12261,5421],{},[14,12263,170],{"id":170},[41,12265,12266,12270],{},[44,12267,5429,12268,5433],{},[33,12269,5432],{},[44,12271,5436,12272,5439],{},[33,12273,5421],{},[14,12275,181],{"id":181},[134,12277,12278,12280],{},[44,12279,5446],{},[44,12281,5449],{},[10,12283,195],{},[14,12285,198],{"id":198},[10,12287,5456],{},[203,12289,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12291},[12292,12293,12294,12295,12296,12299,12300,12301],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":12297},[12298],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5286,"description":5291},[218,5478,5479],{"id":5482,"title":5483,"body":12306,"category":218,"cover":219,"description":5488,"extension":220,"meta":12455,"navigation":85,"path":5669,"pinned":223,"publishedAt":224,"seo":12456,"slug":5671,"stem":5672,"summary":5673,"tags":12457,"updatedAt":224,"visible":85,"__hash__":5677},{"type":7,"value":12307,"toc":12443},[12308,12310,12312,12314,12316,12320,12322,12324,12336,12338,12340,12384,12386,12391,12393,12395,12407,12409,12411,12415,12417,12419,12427,12429,12435,12437,12439,12441],[10,12309,5488],{},[14,12311,16],{"id":16},[10,12313,5493],{},[14,12315,22],{"id":22},[10,12317,12318],{},[26,12319],{"alt":5500,"src":5501},[10,12321,5504],{},[14,12323,39],{"id":39},[41,12325,12326,12328,12332],{},[44,12327,5511],{},[44,12329,12330,5517],{},[33,12331,5516],{},[44,12333,12334,5523],{},[33,12335,5522],{},[14,12337,59],{"id":59},[10,12339,62],{},[64,12341,12342],{"className":66,"code":5530,"language":68,"meta":69,"style":69},[33,12343,12344,12348,12352,12356,12360,12364,12368,12372,12376,12380],{"__ignoreMap":69},[73,12345,12346],{"class":75,"line":76},[73,12347,5537],{},[73,12349,12350],{"class":75,"line":82},[73,12351,5542],{},[73,12353,12354],{"class":75,"line":89},[73,12355,86],{"emptyLinePlaceholder":85},[73,12357,12358],{"class":75,"line":95},[73,12359,5551],{},[73,12361,12362],{"class":75,"line":101},[73,12363,5556],{},[73,12365,12366],{"class":75,"line":107},[73,12367,86],{"emptyLinePlaceholder":85},[73,12369,12370],{"class":75,"line":112},[73,12371,5565],{},[73,12373,12374],{"class":75,"line":2484},[73,12375,5570],{},[73,12377,12378],{"class":75,"line":3943},[73,12379,86],{"emptyLinePlaceholder":85},[73,12381,12382],{"class":75,"line":4155},[73,12383,5579],{},[10,12385,118],{},[64,12387,12389],{"className":12388,"code":5585,"language":124,"meta":69},[122],[33,12390,5585],{"__ignoreMap":69},[10,12392,129],{},[14,12394,132],{"id":132},[134,12396,12397,12401],{},[44,12398,5596,12399,5600],{},[33,12400,5599],{},[44,12402,12403,5606,12405,353],{},[33,12404,5605],{},[33,12406,5609],{},[150,12408,152],{"id":152},[10,12410,5614],{},[10,12412,12413],{},[26,12414],{"alt":5619,"src":5620},[10,12416,5623],{},[14,12418,170],{"id":170},[41,12420,12421,12425],{},[44,12422,5630,12423,5633],{},[33,12424,5330],{},[44,12426,5636],{},[14,12428,181],{"id":181},[134,12430,12431,12433],{},[44,12432,5643],{},[44,12434,5646],{},[10,12436,195],{},[14,12438,198],{"id":198},[10,12440,5653],{},[203,12442,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12444},[12445,12446,12447,12448,12449,12452,12453,12454],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":12450},[12451],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5483,"description":5488},[218,5675,5676],{"id":5679,"title":5680,"body":12459,"category":218,"cover":219,"description":5685,"extension":220,"meta":12620,"navigation":85,"path":5883,"pinned":223,"publishedAt":224,"seo":12621,"slug":5885,"stem":5886,"summary":5887,"tags":12622,"updatedAt":224,"visible":85,"__hash__":5891},{"type":7,"value":12460,"toc":12608},[12461,12463,12465,12467,12469,12473,12475,12477,12489,12491,12493,12545,12547,12552,12554,12556,12574,12576,12578,12582,12584,12586,12592,12594,12600,12602,12604,12606],[10,12462,5685],{},[14,12464,16],{"id":16},[10,12466,5690],{},[14,12468,22],{"id":22},[10,12470,12471],{},[26,12472],{"alt":5697,"src":5698},[10,12474,5701],{},[14,12476,39],{"id":39},[41,12478,12479,12481,12483],{},[44,12480,5708],{},[44,12482,5711],{},[44,12484,12485,2167,12487,5720],{},[33,12486,5716],{},[33,12488,5719],{},[14,12490,59],{"id":59},[10,12492,62],{},[64,12494,12495],{"className":66,"code":5727,"language":68,"meta":69,"style":69},[33,12496,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533,12537,12541],{"__ignoreMap":69},[73,12498,12499],{"class":75,"line":76},[73,12500,5734],{},[73,12502,12503],{"class":75,"line":82},[73,12504,86],{"emptyLinePlaceholder":85},[73,12506,12507],{"class":75,"line":89},[73,12508,5743],{},[73,12510,12511],{"class":75,"line":95},[73,12512,5748],{},[73,12514,12515],{"class":75,"line":101},[73,12516,86],{"emptyLinePlaceholder":85},[73,12518,12519],{"class":75,"line":107},[73,12520,5757],{},[73,12522,12523],{"class":75,"line":112},[73,12524,5762],{},[73,12526,12527],{"class":75,"line":2484},[73,12528,5767],{},[73,12530,12531],{"class":75,"line":3943},[73,12532,86],{"emptyLinePlaceholder":85},[73,12534,12535],{"class":75,"line":4155},[73,12536,5776],{},[73,12538,12539],{"class":75,"line":5779},[73,12540,86],{"emptyLinePlaceholder":85},[73,12542,12543],{"class":75,"line":5784},[73,12544,5787],{},[10,12546,118],{},[64,12548,12550],{"className":12549,"code":5793,"language":124,"meta":69},[122],[33,12551,5793],{"__ignoreMap":69},[10,12553,129],{},[14,12555,132],{"id":132},[134,12557,12558,12568],{},[44,12559,12560,5807,12562,5811,12564,5814,12566,5818],{},[33,12561,5806],{},[33,12563,5810],{},[33,12565,5599],{},[33,12567,5817],{},[44,12569,12570,5823,12572,5826],{},[33,12571,4534],{},[33,12573,2199],{},[150,12575,152],{"id":152},[10,12577,5831],{},[10,12579,12580],{},[26,12581],{"alt":5836,"src":5837},[10,12583,5840],{},[14,12585,170],{"id":170},[41,12587,12588,12590],{},[44,12589,5847],{},[44,12591,5850],{},[14,12593,181],{"id":181},[134,12595,12596,12598],{},[44,12597,5857],{},[44,12599,5860],{},[10,12601,195],{},[14,12603,198],{"id":198},[10,12605,5867],{},[203,12607,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12609},[12610,12611,12612,12613,12614,12617,12618,12619],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":12615},[12616],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5680,"description":5685},[218,5889,5890],{"id":5893,"title":5894,"body":12624,"category":218,"cover":219,"description":5899,"extension":220,"meta":12747,"navigation":85,"path":6050,"pinned":223,"publishedAt":224,"seo":12748,"slug":6052,"stem":6053,"summary":6054,"tags":12749,"updatedAt":224,"visible":85,"__hash__":6058},{"type":7,"value":12625,"toc":12737},[12626,12628,12630,12632,12634,12638,12640,12642,12656,12658,12660,12688,12690,12695,12697,12699,12709,12711,12719,12721,12729,12731,12733,12735],[10,12627,5899],{},[14,12629,16],{"id":16},[10,12631,5904],{},[14,12633,22],{"id":22},[10,12635,12636],{},[26,12637],{"alt":5911,"src":5912},[10,12639,5915],{},[14,12641,39],{"id":39},[41,12643,12644,12646,12648],{},[44,12645,5922],{},[44,12647,5925],{},[44,12649,5928,12650,2248,12652,2248,12654,5936],{},[33,12651,2251],{},[33,12653,2416],{},[33,12655,5935],{},[14,12657,59],{"id":59},[10,12659,62],{},[64,12661,12662],{"className":66,"code":5943,"language":68,"meta":69,"style":69},[33,12663,12664,12668,12672,12676,12680,12684],{"__ignoreMap":69},[73,12665,12666],{"class":75,"line":76},[73,12667,5950],{},[73,12669,12670],{"class":75,"line":82},[73,12671,5955],{},[73,12673,12674],{"class":75,"line":89},[73,12675,5960],{},[73,12677,12678],{"class":75,"line":95},[73,12679,86],{"emptyLinePlaceholder":85},[73,12681,12682],{"class":75,"line":101},[73,12683,5969],{},[73,12685,12686],{"class":75,"line":107},[73,12687,5974],{},[10,12689,118],{},[64,12691,12693],{"className":12692,"code":5980,"language":124,"meta":69},[122],[33,12694,5980],{"__ignoreMap":69},[10,12696,129],{},[14,12698,132],{"id":132},[134,12700,12701,12707],{},[44,12702,5991,12703,5995,12705,5998],{},[33,12704,5994],{},[33,12706,2237],{},[44,12708,6001],{},[14,12710,170],{"id":170},[41,12712,12713,12717],{},[44,12714,6008,12715,6012],{},[33,12716,6011],{},[44,12718,6015],{},[14,12720,181],{"id":181},[134,12722,12723,12725],{},[44,12724,6022],{},[44,12726,6025,12727,6029],{},[33,12728,6028],{},[10,12730,195],{},[14,12732,198],{"id":198},[10,12734,6036],{},[203,12736,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12738},[12739,12740,12741,12742,12743,12744,12745,12746],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":5894,"description":5899},[218,6056,6057],{"id":6060,"title":6061,"body":12751,"category":218,"cover":219,"description":6066,"extension":220,"meta":12928,"navigation":85,"path":6294,"pinned":223,"publishedAt":224,"seo":12929,"slug":6296,"stem":6297,"summary":6298,"tags":12930,"updatedAt":224,"visible":85,"__hash__":6302},{"type":7,"value":12752,"toc":12916},[12753,12755,12757,12761,12763,12767,12773,12775,12787,12789,12793,12817,12821,12837,12843,12845,12850,12852,12854,12870,12872,12874,12878,12882,12884,12896,12898,12908,12910,12912,12914],[10,12754,6066],{},[14,12756,16],{"id":16},[10,12758,6071,12759,6074],{},[286,12760,5994],{},[14,12762,22],{"id":22},[10,12764,12765],{},[26,12766],{"alt":6081,"src":6082},[10,12768,6085,12769,6089,12771,6093],{},[33,12770,6088],{},[33,12772,6092],{},[14,12774,39],{"id":39},[41,12776,12777,12781,12783],{},[44,12778,6100,12779,6103],{},[33,12780,1162],{},[44,12782,6106],{},[44,12784,6109,12785,6113],{},[33,12786,6112],{},[14,12788,59],{"id":59},[10,12790,6118,12791,6122],{},[33,12792,6121],{},[64,12794,12795],{"className":66,"code":6125,"language":68,"meta":69,"style":69},[33,12796,12797,12801,12805,12809,12813],{"__ignoreMap":69},[73,12798,12799],{"class":75,"line":76},[73,12800,6132],{},[73,12802,12803],{"class":75,"line":82},[73,12804,6137],{},[73,12806,12807],{"class":75,"line":89},[73,12808,86],{"emptyLinePlaceholder":85},[73,12810,12811],{"class":75,"line":95},[73,12812,6146],{},[73,12814,12815],{"class":75,"line":101},[73,12816,6151],{},[10,12818,6154,12819,6158],{},[33,12820,6157],{},[64,12822,12823],{"className":66,"code":6161,"language":68,"meta":69,"style":69},[33,12824,12825,12829,12833],{"__ignoreMap":69},[73,12826,12827],{"class":75,"line":76},[73,12828,6168],{},[73,12830,12831],{"class":75,"line":82},[73,12832,86],{"emptyLinePlaceholder":85},[73,12834,12835],{"class":75,"line":89},[73,12836,6177],{},[10,12838,6180,12839,1148,12841,353],{},[33,12840,6183],{},[33,12842,6186],{},[10,12844,118],{},[64,12846,12848],{"className":12847,"code":6192,"language":124,"meta":69},[122],[33,12849,6192],{"__ignoreMap":69},[10,12851,129],{},[14,12853,132],{"id":132},[134,12855,12856,12862],{},[44,12857,6203,12858,6206,12860,6210],{},[33,12859,6121],{},[33,12861,6209],{},[44,12863,12864,6215,12866,6218,12868,6221],{},[33,12865,6157],{},[33,12867,6121],{},[33,12869,6157],{},[150,12871,152],{"id":152},[10,12873,6226],{},[10,12875,12876],{},[26,12877],{"alt":6231,"src":6232},[10,12879,6235,12880,6238],{},[33,12881,6209],{},[14,12883,170],{"id":170},[41,12885,12886,12892],{},[44,12887,6245,12888,1148,12890,353],{},[33,12889,6121],{},[33,12891,6157],{},[44,12893,6252,12894,6256],{},[33,12895,6255],{},[14,12897,181],{"id":181},[134,12899,12900,12904],{},[44,12901,2344,12902,6266],{},[33,12903,6265],{},[44,12905,6269,12906,353],{},[33,12907,6088],{},[10,12909,195],{},[14,12911,198],{"id":198},[10,12913,6278],{},[203,12915,205],{},{"title":69,"searchDepth":82,"depth":82,"links":12917},[12918,12919,12920,12921,12922,12925,12926,12927],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":12923},[12924],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":6061,"description":6066},[218,6300,6301],{"id":6304,"title":6305,"body":12932,"category":218,"cover":219,"description":6310,"extension":220,"meta":13071,"navigation":85,"path":6476,"pinned":223,"publishedAt":224,"seo":13072,"slug":6478,"stem":6479,"summary":6480,"tags":13073,"updatedAt":224,"visible":85,"__hash__":6483},{"type":7,"value":12933,"toc":13061},[12934,12936,12938,12940,12942,12946,12948,12950,12960,12962,12964,13004,13006,13011,13013,13015,13033,13035,13043,13045,13053,13055,13057,13059],[10,12935,6310],{},[14,12937,16],{"id":16},[10,12939,6315],{},[14,12941,22],{"id":22},[10,12943,12944],{},[26,12945],{"alt":6322,"src":6323},[10,12947,6326],{},[14,12949,39],{"id":39},[41,12951,12952,12956,12958],{},[44,12953,12954,6336],{},[33,12955,6335],{},[44,12957,6339],{},[44,12959,6342],{},[14,12961,59],{"id":59},[10,12963,1565],{},[64,12965,12966],{"className":582,"code":6349,"language":584,"meta":69,"style":69},[33,12967,12968,12978,12984,12990,13000],{"__ignoreMap":69},[73,12969,12970,12972,12974,12976],{"class":75,"line":76},[73,12971,682],{"class":591},[73,12973,624],{"class":594},[73,12975,6360],{"class":627},[73,12977,6363],{"class":627},[73,12979,12980,12982],{"class":75,"line":82},[73,12981,6368],{"class":594},[73,12983,6371],{"class":627},[73,12985,12986,12988],{"class":75,"line":89},[73,12987,68],{"class":591},[73,12989,595],{"class":594},[73,12991,12992,12994,12996,12998],{"class":75,"line":95},[73,12993,68],{"class":591},[73,12995,624],{"class":594},[73,12997,628],{"class":627},[73,12999,595],{"class":594},[73,13001,13002],{"class":75,"line":101},[73,13003,6392],{"class":591},[10,13005,118],{},[64,13007,13009],{"className":13008,"code":6398,"language":124,"meta":69},[122],[33,13010,6398],{"__ignoreMap":69},[10,13012,129],{},[14,13014,132],{"id":132},[134,13016,13017,13023],{},[44,13018,13019,6412,13021,6415],{},[33,13020,6411],{},[33,13022,682],{},[44,13024,6418,13025,2167,13027,6424,13029,3718,13031,6430],{},[33,13026,68],{},[33,13028,6423],{},[33,13030,6335],{},[33,13032,6429],{},[14,13034,170],{"id":170},[41,13036,13037,13039],{},[44,13038,6437],{},[44,13040,3457,13041,6442],{},[33,13042,6335],{},[14,13044,181],{"id":181},[134,13046,13047,13051],{},[44,13048,6449,13049,353],{},[33,13050,6452],{},[44,13052,6455],{},[10,13054,195],{},[14,13056,198],{"id":198},[10,13058,6462],{},[203,13060,1649],{},{"title":69,"searchDepth":82,"depth":82,"links":13062},[13063,13064,13065,13066,13067,13068,13069,13070],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":6305,"description":6310},[218,6482,252],{"id":6485,"title":6486,"body":13075,"category":218,"cover":219,"description":6491,"extension":220,"meta":13228,"navigation":85,"path":6680,"pinned":223,"publishedAt":224,"seo":13229,"slug":6682,"stem":6683,"summary":6684,"tags":13230,"updatedAt":224,"visible":85,"__hash__":6688},{"type":7,"value":13076,"toc":13218},[13077,13079,13081,13083,13085,13089,13095,13097,13113,13115,13117,13161,13163,13168,13170,13172,13184,13186,13200,13202,13210,13212,13214,13216],[10,13078,6491],{},[14,13080,16],{"id":16},[10,13082,6496],{},[14,13084,22],{"id":22},[10,13086,13087],{},[26,13088],{"alt":6503,"src":6504},[10,13090,13091,6510,13093,6513],{},[33,13092,6509],{},[33,13094,2426],{},[14,13096,39],{"id":39},[41,13098,13099,13101,13109],{},[44,13100,6520],{},[44,13102,13103,2248,13105,2248,13107,6532],{},[33,13104,6525],{},[33,13106,6528],{},[33,13108,6531],{},[44,13110,6535,13111,6539],{},[33,13112,6538],{},[14,13114,59],{"id":59},[10,13116,62],{},[64,13118,13119],{"className":66,"code":6546,"language":68,"meta":69,"style":69},[33,13120,13121,13125,13129,13133,13137,13141,13145,13149,13153,13157],{"__ignoreMap":69},[73,13122,13123],{"class":75,"line":76},[73,13124,6553],{},[73,13126,13127],{"class":75,"line":82},[73,13128,86],{"emptyLinePlaceholder":85},[73,13130,13131],{"class":75,"line":89},[73,13132,6562],{},[73,13134,13135],{"class":75,"line":95},[73,13136,6567],{},[73,13138,13139],{"class":75,"line":101},[73,13140,6572],{},[73,13142,13143],{"class":75,"line":107},[73,13144,86],{"emptyLinePlaceholder":85},[73,13146,13147],{"class":75,"line":112},[73,13148,6581],{},[73,13150,13151],{"class":75,"line":2484},[73,13152,6586],{},[73,13154,13155],{"class":75,"line":3943},[73,13156,6591],{},[73,13158,13159],{"class":75,"line":4155},[73,13160,6596],{},[10,13162,118],{},[64,13164,13166],{"className":13165,"code":6602,"language":124,"meta":69},[122],[33,13167,6602],{"__ignoreMap":69},[10,13169,129],{},[14,13171,132],{"id":132},[134,13173,13174,13178],{},[44,13175,13176,6616],{},[33,13177,6615],{},[44,13179,186,13180,6621,13182,6624],{},[33,13181,2426],{},[33,13183,6509],{},[14,13185,170],{"id":170},[41,13187,13188,13194],{},[44,13189,3457,13190,6633,13192,6636],{},[33,13191,6509],{},[33,13193,6525],{},[44,13195,6639,13196,1000,13198,6645],{},[33,13197,2426],{},[33,13199,6644],{},[14,13201,181],{"id":181},[134,13203,13204,13208],{},[44,13205,6652,13206,6656],{},[33,13207,6655],{},[44,13209,6659],{},[10,13211,195],{},[14,13213,198],{"id":198},[10,13215,6666],{},[203,13217,205],{},{"title":69,"searchDepth":82,"depth":82,"links":13219},[13220,13221,13222,13223,13224,13225,13226,13227],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":6486,"description":6491},[218,6686,6687],{"id":6690,"title":6691,"body":13232,"category":218,"cover":219,"description":6696,"extension":220,"meta":13379,"navigation":85,"path":6875,"pinned":223,"publishedAt":224,"seo":13380,"slug":6877,"stem":6878,"summary":6879,"tags":13381,"updatedAt":224,"visible":85,"__hash__":6883},{"type":7,"value":13233,"toc":13369},[13234,13236,13238,13240,13242,13246,13248,13250,13268,13270,13272,13320,13322,13327,13329,13331,13339,13341,13351,13353,13361,13363,13365,13367],[10,13235,6696],{},[14,13237,16],{"id":16},[10,13239,6701],{},[14,13241,22],{"id":22},[10,13243,13244],{},[26,13245],{"alt":6708,"src":6709},[10,13247,6712],{},[14,13249,39],{"id":39},[41,13251,13252,13256,13262],{},[44,13253,13254,6722],{},[33,13255,6721],{},[44,13257,13258,6728,13260,353],{},[33,13259,6727],{},[33,13261,6731],{},[44,13263,6734,13264,6738,13266,6742],{},[33,13265,6737],{},[33,13267,6741],{},[14,13269,59],{"id":59},[10,13271,62],{},[64,13273,13274],{"className":66,"code":6749,"language":68,"meta":69,"style":69},[33,13275,13276,13280,13284,13288,13292,13296,13300,13304,13308,13312,13316],{"__ignoreMap":69},[73,13277,13278],{"class":75,"line":76},[73,13279,6553],{},[73,13281,13282],{"class":75,"line":82},[73,13283,86],{"emptyLinePlaceholder":85},[73,13285,13286],{"class":75,"line":89},[73,13287,6764],{},[73,13289,13290],{"class":75,"line":95},[73,13291,6769],{},[73,13293,13294],{"class":75,"line":101},[73,13295,6774],{},[73,13297,13298],{"class":75,"line":107},[73,13299,6779],{},[73,13301,13302],{"class":75,"line":112},[73,13303,86],{"emptyLinePlaceholder":85},[73,13305,13306],{"class":75,"line":2484},[73,13307,6788],{},[73,13309,13310],{"class":75,"line":3943},[73,13311,6793],{},[73,13313,13314],{"class":75,"line":4155},[73,13315,6798],{},[73,13317,13318],{"class":75,"line":5779},[73,13319,6803],{},[10,13321,118],{},[64,13323,13325],{"className":13324,"code":6809,"language":124,"meta":69},[122],[33,13326,6809],{"__ignoreMap":69},[10,13328,129],{},[14,13330,132],{"id":132},[134,13332,13333,13337],{},[44,13334,6820,13335,6823],{},[33,13336,6737],{},[44,13338,6826],{},[14,13340,170],{"id":170},[41,13342,13343,13347],{},[44,13344,186,13345,6835],{},[33,13346,6721],{},[44,13348,6838,13349,353],{},[33,13350,6841],{},[14,13352,181],{"id":181},[134,13354,13355,13357],{},[44,13356,6848],{},[44,13358,6851,13359,6854],{},[33,13360,327],{},[10,13362,195],{},[14,13364,198],{"id":198},[10,13366,6861],{},[203,13368,205],{},{"title":69,"searchDepth":82,"depth":82,"links":13370},[13371,13372,13373,13374,13375,13376,13377,13378],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":6691,"description":6696},[218,6881,6882],{"id":6885,"title":6886,"body":13383,"category":218,"cover":219,"description":6891,"extension":220,"meta":13526,"navigation":85,"path":7059,"pinned":223,"publishedAt":224,"seo":13527,"slug":7061,"stem":7062,"summary":7063,"tags":13528,"updatedAt":224,"visible":85,"__hash__":7067},{"type":7,"value":13384,"toc":13516},[13385,13387,13389,13391,13393,13397,13403,13405,13415,13417,13419,13471,13473,13478,13480,13482,13492,13494,13500,13502,13508,13510,13512,13514],[10,13386,6891],{},[14,13388,16],{"id":16},[10,13390,6896],{},[14,13392,22],{"id":22},[10,13394,13395],{},[26,13396],{"alt":6903,"src":6904},[10,13398,13399,6910,13401,6914],{},[33,13400,6909],{},[33,13402,6913],{},[14,13404,39],{"id":39},[41,13406,13407,13409,13413],{},[44,13408,6921],{},[44,13410,13411,6927],{},[33,13412,6926],{},[44,13414,6930],{},[14,13416,59],{"id":59},[10,13418,62],{},[64,13420,13421],{"className":66,"code":6937,"language":68,"meta":69,"style":69},[33,13422,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459,13463,13467],{"__ignoreMap":69},[73,13424,13425],{"class":75,"line":76},[73,13426,6944],{},[73,13428,13429],{"class":75,"line":82},[73,13430,86],{"emptyLinePlaceholder":85},[73,13432,13433],{"class":75,"line":89},[73,13434,6953],{},[73,13436,13437],{"class":75,"line":95},[73,13438,86],{"emptyLinePlaceholder":85},[73,13440,13441],{"class":75,"line":101},[73,13442,6962],{},[73,13444,13445],{"class":75,"line":107},[73,13446,6967],{},[73,13448,13449],{"class":75,"line":112},[73,13450,6779],{},[73,13452,13453],{"class":75,"line":2484},[73,13454,86],{"emptyLinePlaceholder":85},[73,13456,13457],{"class":75,"line":3943},[73,13458,6980],{},[73,13460,13461],{"class":75,"line":4155},[73,13462,6985],{},[73,13464,13465],{"class":75,"line":5779},[73,13466,6798],{},[73,13468,13469],{"class":75,"line":5784},[73,13470,6994],{},[10,13472,118],{},[64,13474,13476],{"className":13475,"code":7000,"language":124,"meta":69},[122],[33,13477,7000],{"__ignoreMap":69},[10,13479,129],{},[14,13481,132],{"id":132},[134,13483,13484,13488],{},[44,13485,13486,7013],{},[33,13487,6909],{},[44,13489,13490,7018],{},[33,13491,6913],{},[14,13493,170],{"id":170},[41,13495,13496,13498],{},[44,13497,7025],{},[44,13499,7028],{},[14,13501,181],{"id":181},[134,13503,13504,13506],{},[44,13505,7035],{},[44,13507,7038],{},[10,13509,195],{},[14,13511,198],{"id":198},[10,13513,7045],{},[203,13515,205],{},{"title":69,"searchDepth":82,"depth":82,"links":13517},[13518,13519,13520,13521,13522,13523,13524,13525],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":6886,"description":6891},[218,7065,7066],{"id":7069,"title":7070,"body":13530,"category":218,"cover":219,"description":7075,"extension":220,"meta":13681,"navigation":85,"path":7260,"pinned":223,"publishedAt":224,"seo":13682,"slug":7262,"stem":7263,"summary":7264,"tags":13683,"updatedAt":224,"visible":85,"__hash__":7268},{"type":7,"value":13531,"toc":13671},[13532,13534,13536,13538,13540,13544,13548,13550,13564,13566,13568,13620,13622,13627,13629,13631,13643,13645,13655,13657,13663,13665,13667,13669],[10,13533,7075],{},[14,13535,16],{"id":16},[10,13537,7080],{},[14,13539,22],{"id":22},[10,13541,13542],{},[26,13543],{"alt":7087,"src":7088},[10,13545,13546,7094],{},[33,13547,7093],{},[14,13549,39],{"id":39},[41,13551,13552,13558,13562],{},[44,13553,186,13554,7104,13556,7108],{},[33,13555,7103],{},[33,13557,7107],{},[44,13559,7111,13560,7115],{},[33,13561,7114],{},[44,13563,7118],{},[14,13565,59],{"id":59},[10,13567,62],{},[64,13569,13570],{"className":66,"code":7125,"language":68,"meta":69,"style":69},[33,13571,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608,13612,13616],{"__ignoreMap":69},[73,13573,13574],{"class":75,"line":76},[73,13575,7132],{},[73,13577,13578],{"class":75,"line":82},[73,13579,86],{"emptyLinePlaceholder":85},[73,13581,13582],{"class":75,"line":89},[73,13583,7141],{},[73,13585,13586],{"class":75,"line":95},[73,13587,7146],{},[73,13589,13590],{"class":75,"line":101},[73,13591,7151],{},[73,13593,13594],{"class":75,"line":107},[73,13595,7156],{},[73,13597,13598],{"class":75,"line":112},[73,13599,7161],{},[73,13601,13602],{"class":75,"line":2484},[73,13603,86],{"emptyLinePlaceholder":85},[73,13605,13606],{"class":75,"line":3943},[73,13607,7170],{},[73,13609,13610],{"class":75,"line":4155},[73,13611,7175],{},[73,13613,13614],{"class":75,"line":5779},[73,13615,7180],{},[73,13617,13618],{"class":75,"line":5784},[73,13619,7185],{},[10,13621,118],{},[64,13623,13625],{"className":13624,"code":7191,"language":124,"meta":69},[122],[33,13626,7191],{"__ignoreMap":69},[10,13628,129],{},[14,13630,132],{"id":132},[134,13632,13633,13639],{},[44,13634,13635,7205,13637,7208],{},[33,13636,7204],{},[33,13638,7114],{},[44,13640,13641,7213],{},[33,13642,7093],{},[14,13644,170],{"id":170},[41,13646,13647,13649],{},[44,13648,7220],{},[44,13650,7223,13651,7226,13653,7229],{},[33,13652,7103],{},[33,13654,7107],{},[14,13656,181],{"id":181},[134,13658,13659,13661],{},[44,13660,7236],{},[44,13662,7239],{},[10,13664,195],{},[14,13666,198],{"id":198},[10,13668,7246],{},[203,13670,205],{},{"title":69,"searchDepth":82,"depth":82,"links":13672},[13673,13674,13675,13676,13677,13678,13679,13680],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":7070,"description":7075},[218,7266,7267],{"id":7270,"title":7271,"body":13685,"category":218,"cover":219,"description":7276,"extension":220,"meta":13899,"navigation":85,"path":7550,"pinned":223,"publishedAt":224,"seo":13900,"slug":7552,"stem":7553,"summary":7554,"tags":13901,"updatedAt":224,"visible":85,"__hash__":7558},{"type":7,"value":13686,"toc":13886},[13687,13689,13691,13693,13695,13699,13705,13707,13719,13721,13723,13783,13785,13790,13792,13794,13812,13814,13822,13826,13834,13836,13840,13844,13850,13852,13862,13864,13878,13880,13882,13884],[10,13688,7276],{},[14,13690,16],{"id":16},[10,13692,7281],{},[14,13694,22],{"id":22},[10,13696,13697],{},[26,13698],{"alt":7288,"src":7289},[10,13700,7292,13701,7296,13703,7300],{},[33,13702,7295],{},[33,13704,7299],{},[14,13706,39],{"id":39},[41,13708,13709,13713,13717],{},[44,13710,7307,13711,7310],{},[33,13712,7295],{},[44,13714,13715,7316],{},[33,13716,7315],{},[44,13718,7319],{},[14,13720,59],{"id":59},[10,13722,62],{},[64,13724,13725],{"className":66,"code":7326,"language":68,"meta":69,"style":69},[33,13726,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779],{"__ignoreMap":69},[73,13728,13729],{"class":75,"line":76},[73,13730,7333],{},[73,13732,13733],{"class":75,"line":82},[73,13734,7338],{},[73,13736,13737],{"class":75,"line":89},[73,13738,7343],{},[73,13740,13741],{"class":75,"line":95},[73,13742,7348],{},[73,13744,13745],{"class":75,"line":101},[73,13746,7353],{},[73,13748,13749],{"class":75,"line":107},[73,13750,86],{"emptyLinePlaceholder":85},[73,13752,13753],{"class":75,"line":112},[73,13754,7362],{},[73,13756,13757],{"class":75,"line":2484},[73,13758,7367],{},[73,13760,13761],{"class":75,"line":3943},[73,13762,7372],{},[73,13764,13765],{"class":75,"line":4155},[73,13766,7377],{},[73,13768,13769],{"class":75,"line":5779},[73,13770,1137],{},[73,13772,13773],{"class":75,"line":5784},[73,13774,7386],{},[73,13776,13777],{"class":75,"line":7389},[73,13778,7392],{},[73,13780,13781],{"class":75,"line":7395},[73,13782,7398],{},[10,13784,118],{},[64,13786,13788],{"className":13787,"code":7404,"language":124,"meta":69},[122],[33,13789,7404],{"__ignoreMap":69},[10,13791,129],{},[14,13793,132],{"id":132},[134,13795,13796,13804],{},[44,13797,13798,7417,13800,7420,13802,7424],{},[33,13799,3026],{},[33,13801,7315],{},[33,13803,7423],{},[44,13805,7427,13806,7430,13808,7433,13810,353],{},[33,13807,7295],{},[33,13809,1151],{},[33,13811,7299],{},[150,13813,152],{"id":152},[10,13815,13816,2248,13818,1148,13820,7446],{},[33,13817,7295],{},[33,13819,1151],{},[33,13821,7299],{},[10,13823,13824],{},[26,13825],{"alt":7451,"src":7452},[10,13827,13828,7457,13830,7460,13832,7463],{},[33,13829,7295],{},[33,13831,1151],{},[33,13833,7299],{},[150,13835,152],{"id":4210},[10,13837,13838,7471],{},[33,13839,7470],{},[10,13841,13842],{},[26,13843],{"alt":7476,"src":7477},[10,13845,7480,13846,7483,13848,7486],{},[33,13847,7470],{},[33,13849,1151],{},[14,13851,170],{"id":170},[41,13853,13854,13858],{},[44,13855,7493,13856,7497],{},[33,13857,7496],{},[44,13859,7500,13860,7503],{},[33,13861,7470],{},[14,13863,181],{"id":181},[134,13865,13866,13874],{},[44,13867,7510,13868,7514,13870,1148,13872,353],{},[33,13869,7513],{},[33,13871,7517],{},[33,13873,7520],{},[44,13875,7523,13876,7526],{},[33,13877,6731],{},[10,13879,195],{},[14,13881,198],{"id":198},[10,13883,7533],{},[203,13885,205],{},{"title":69,"searchDepth":82,"depth":82,"links":13887},[13888,13889,13890,13891,13892,13896,13897,13898],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":13893},[13894,13895],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":7271,"description":7276},[218,7556,7557],{"id":7560,"title":7561,"body":13903,"category":218,"cover":219,"description":7566,"extension":220,"meta":14054,"navigation":85,"path":7743,"pinned":223,"publishedAt":224,"seo":14055,"slug":7745,"stem":7746,"summary":7747,"tags":14056,"updatedAt":224,"visible":85,"__hash__":7750},{"type":7,"value":13904,"toc":14044},[13905,13907,13909,13911,13913,13917,13921,13923,13935,13937,13939,13987,13989,13994,13996,13998,14008,14010,14020,14022,14036,14038,14040,14042],[10,13906,7566],{},[14,13908,16],{"id":16},[10,13910,7571],{},[14,13912,22],{"id":22},[10,13914,13915],{},[26,13916],{"alt":7578,"src":7579},[10,13918,7582,13919,7585],{},[33,13920,6741],{},[14,13922,39],{"id":39},[41,13924,13925,13929,13933],{},[44,13926,13927,7594],{},[33,13928,6741],{},[44,13930,13931,7600],{},[33,13932,7599],{},[44,13934,7603],{},[14,13936,59],{"id":59},[10,13938,62],{},[64,13940,13941],{"className":66,"code":7610,"language":68,"meta":69,"style":69},[33,13942,13943,13947,13951,13955,13959,13963,13967,13971,13975,13979,13983],{"__ignoreMap":69},[73,13944,13945],{"class":75,"line":76},[73,13946,6553],{},[73,13948,13949],{"class":75,"line":82},[73,13950,86],{"emptyLinePlaceholder":85},[73,13952,13953],{"class":75,"line":89},[73,13954,6764],{},[73,13956,13957],{"class":75,"line":95},[73,13958,86],{"emptyLinePlaceholder":85},[73,13960,13961],{"class":75,"line":101},[73,13962,7633],{},[73,13964,13965],{"class":75,"line":107},[73,13966,7638],{},[73,13968,13969],{"class":75,"line":112},[73,13970,86],{"emptyLinePlaceholder":85},[73,13972,13973],{"class":75,"line":2484},[73,13974,7647],{},[73,13976,13977],{"class":75,"line":3943},[73,13978,7652],{},[73,13980,13981],{"class":75,"line":4155},[73,13982,86],{"emptyLinePlaceholder":85},[73,13984,13985],{"class":75,"line":5779},[73,13986,7661],{},[10,13988,118],{},[64,13990,13992],{"className":13991,"code":7667,"language":124,"meta":69},[122],[33,13993,7667],{"__ignoreMap":69},[10,13995,129],{},[14,13997,132],{"id":132},[134,13999,14000,14006],{},[44,14001,7582,14002,7680,14004,353],{},[33,14003,6741],{},[33,14005,7683],{},[44,14007,7686],{},[14,14009,170],{"id":170},[41,14011,14012,14016],{},[44,14013,4737,14014,7695],{},[33,14015,6741],{},[44,14017,7698,14018,7701],{},[33,14019,6741],{},[14,14021,181],{"id":181},[134,14023,14024,14030],{},[44,14025,7708,14026,7712,14028,353],{},[33,14027,7711],{},[33,14029,6741],{},[44,14031,4737,14032,7719,14034,353],{},[33,14033,6741],{},[33,14035,7722],{},[10,14037,195],{},[14,14039,198],{"id":198},[10,14041,7729],{},[203,14043,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14045},[14046,14047,14048,14049,14050,14051,14052,14053],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":7561,"description":7566},[218,6741,7749],{"id":7752,"title":7753,"body":14058,"category":218,"cover":219,"description":7758,"extension":220,"meta":14229,"navigation":85,"path":7971,"pinned":223,"publishedAt":224,"seo":14230,"slug":7973,"stem":7974,"summary":7975,"tags":14231,"updatedAt":224,"visible":85,"__hash__":7979},{"type":7,"value":14059,"toc":14217},[14060,14062,14064,14066,14068,14072,14074,14076,14088,14090,14092,14148,14150,14155,14157,14159,14175,14177,14179,14183,14189,14191,14199,14201,14209,14211,14213,14215],[10,14061,7758],{},[14,14063,16],{"id":16},[10,14065,7763],{},[14,14067,22],{"id":22},[10,14069,14070],{},[26,14071],{"alt":7770,"src":7771},[10,14073,7774],{},[14,14075,39],{"id":39},[41,14077,14078,14082,14086],{},[44,14079,14080,7784],{},[33,14081,7783],{},[44,14083,14084,7790],{},[33,14085,7789],{},[44,14087,7793],{},[14,14089,59],{"id":59},[10,14091,62],{},[64,14093,14094],{"className":66,"code":7800,"language":68,"meta":69,"style":69},[33,14095,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140,14144],{"__ignoreMap":69},[73,14097,14098],{"class":75,"line":76},[73,14099,7807],{},[73,14101,14102],{"class":75,"line":82},[73,14103,7812],{},[73,14105,14106],{"class":75,"line":89},[73,14107,7817],{},[73,14109,14110],{"class":75,"line":95},[73,14111,7822],{},[73,14113,14114],{"class":75,"line":101},[73,14115,86],{"emptyLinePlaceholder":85},[73,14117,14118],{"class":75,"line":107},[73,14119,7831],{},[73,14121,14122],{"class":75,"line":112},[73,14123,7836],{},[73,14125,14126],{"class":75,"line":2484},[73,14127,7841],{},[73,14129,14130],{"class":75,"line":3943},[73,14131,7846],{},[73,14133,14134],{"class":75,"line":4155},[73,14135,86],{"emptyLinePlaceholder":85},[73,14137,14138],{"class":75,"line":5779},[73,14139,7855],{},[73,14141,14142],{"class":75,"line":5784},[73,14143,7860],{},[73,14145,14146],{"class":75,"line":7389},[73,14147,7865],{},[10,14149,118],{},[64,14151,14153],{"className":14152,"code":7871,"language":124,"meta":69},[122],[33,14154,7871],{"__ignoreMap":69},[10,14156,129],{},[14,14158,132],{"id":132},[134,14160,14161,14167],{},[44,14162,7882,14163,7886,14165,7889],{},[33,14164,7885],{},[33,14166,7789],{},[44,14168,14169,7895,14171,7899,14173,7902],{},[33,14170,7894],{},[33,14172,7898],{},[33,14174,7783],{},[150,14176,152],{"id":152},[10,14178,7907],{},[10,14180,14181],{},[26,14182],{"alt":7912,"src":7913},[10,14184,7916,14185,1148,14187,7922],{},[33,14186,4534],{},[33,14188,7921],{},[14,14190,170],{"id":170},[41,14192,14193,14197],{},[44,14194,7929,14195,7932],{},[33,14196,7783],{},[44,14198,7935],{},[14,14200,181],{"id":181},[134,14202,14203,14207],{},[44,14204,5247,14205,7945],{},[33,14206,7944],{},[44,14208,7948],{},[10,14210,195],{},[14,14212,198],{"id":198},[10,14214,7955],{},[203,14216,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14218},[14219,14220,14221,14222,14223,14226,14227,14228],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":14224},[14225],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":7753,"description":7758},[218,7977,7978],{"id":7981,"title":7982,"body":14233,"category":218,"cover":219,"description":7987,"extension":220,"meta":14380,"navigation":85,"path":8166,"pinned":223,"publishedAt":224,"seo":14381,"slug":8168,"stem":8169,"summary":8170,"tags":14382,"updatedAt":224,"visible":85,"__hash__":8174},{"type":7,"value":14234,"toc":14370},[14235,14237,14239,14241,14243,14247,14249,14251,14259,14261,14263,14319,14321,14326,14328,14330,14342,14344,14350,14352,14362,14364,14366,14368],[10,14236,7987],{},[14,14238,16],{"id":16},[10,14240,7992],{},[14,14242,22],{"id":22},[10,14244,14245],{},[26,14246],{"alt":7999,"src":8000},[10,14248,8003],{},[14,14250,39],{"id":39},[41,14252,14253,14255,14257],{},[44,14254,8010],{},[44,14256,8013],{},[44,14258,8016],{},[14,14260,59],{"id":59},[10,14262,62],{},[64,14264,14265],{"className":66,"code":8023,"language":68,"meta":69,"style":69},[33,14266,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311,14315],{"__ignoreMap":69},[73,14268,14269],{"class":75,"line":76},[73,14270,8030],{},[73,14272,14273],{"class":75,"line":82},[73,14274,8035],{},[73,14276,14277],{"class":75,"line":89},[73,14278,8040],{},[73,14280,14281],{"class":75,"line":95},[73,14282,86],{"emptyLinePlaceholder":85},[73,14284,14285],{"class":75,"line":101},[73,14286,8049],{},[73,14288,14289],{"class":75,"line":107},[73,14290,8054],{},[73,14292,14293],{"class":75,"line":112},[73,14294,8059],{},[73,14296,14297],{"class":75,"line":2484},[73,14298,86],{"emptyLinePlaceholder":85},[73,14300,14301],{"class":75,"line":3943},[73,14302,8068],{},[73,14304,14305],{"class":75,"line":4155},[73,14306,8073],{},[73,14308,14309],{"class":75,"line":5779},[73,14310,86],{"emptyLinePlaceholder":85},[73,14312,14313],{"class":75,"line":5784},[73,14314,8082],{},[73,14316,14317],{"class":75,"line":7389},[73,14318,8087],{},[10,14320,118],{},[64,14322,14324],{"className":14323,"code":8093,"language":124,"meta":69},[122],[33,14325,8093],{"__ignoreMap":69},[10,14327,129],{},[14,14329,132],{"id":132},[134,14331,14332,14338],{},[44,14333,14334,8107,14336,8111],{},[33,14335,8106],{},[33,14337,8110],{},[44,14339,8114,14340,8118],{},[33,14341,8117],{},[14,14343,170],{"id":170},[41,14345,14346,14348],{},[44,14347,8125],{},[44,14349,8128],{},[14,14351,181],{"id":181},[134,14353,14354,14360],{},[44,14355,8135,14356,8139,14358,353],{},[33,14357,8138],{},[33,14359,8142],{},[44,14361,8145],{},[10,14363,195],{},[14,14365,198],{"id":198},[10,14367,8152],{},[203,14369,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14371},[14372,14373,14374,14375,14376,14377,14378,14379],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":7982,"description":7987},[218,8172,8173],{"id":8176,"title":8177,"body":14384,"category":218,"cover":219,"description":8182,"extension":220,"meta":14547,"navigation":85,"path":8386,"pinned":223,"publishedAt":224,"seo":14548,"slug":8388,"stem":8389,"summary":8390,"tags":14549,"updatedAt":224,"visible":85,"__hash__":8394},{"type":7,"value":14385,"toc":14535},[14386,14388,14390,14392,14394,14398,14402,14404,14420,14422,14424,14468,14470,14475,14477,14479,14493,14495,14499,14503,14507,14509,14515,14517,14527,14529,14531,14533],[10,14387,8182],{},[14,14389,16],{"id":16},[10,14391,8187],{},[14,14393,22],{"id":22},[10,14395,14396],{},[26,14397],{"alt":8194,"src":8195},[10,14399,8198,14400,8202],{},[33,14401,8201],{},[14,14403,39],{"id":39},[41,14405,14406,14412,14418],{},[44,14407,14408,8212,14410,8216],{},[33,14409,8211],{},[33,14411,8215],{},[44,14413,8219,14414,8223,14416,8226],{},[33,14415,8222],{},[33,14417,55],{},[44,14419,8229],{},[14,14421,59],{"id":59},[10,14423,62],{},[64,14425,14426],{"className":66,"code":8236,"language":68,"meta":69,"style":69},[33,14427,14428,14432,14436,14440,14444,14448,14452,14456,14460,14464],{"__ignoreMap":69},[73,14429,14430],{"class":75,"line":76},[73,14431,8243],{},[73,14433,14434],{"class":75,"line":82},[73,14435,8248],{},[73,14437,14438],{"class":75,"line":89},[73,14439,8253],{},[73,14441,14442],{"class":75,"line":95},[73,14443,8258],{},[73,14445,14446],{"class":75,"line":101},[73,14447,8263],{},[73,14449,14450],{"class":75,"line":107},[73,14451,86],{"emptyLinePlaceholder":85},[73,14453,14454],{"class":75,"line":112},[73,14455,8272],{},[73,14457,14458],{"class":75,"line":2484},[73,14459,8277],{},[73,14461,14462],{"class":75,"line":3943},[73,14463,8277],{},[73,14465,14466],{"class":75,"line":4155},[73,14467,8277],{},[10,14469,118],{},[64,14471,14473],{"className":14472,"code":8291,"language":124,"meta":69},[122],[33,14474,8291],{"__ignoreMap":69},[10,14476,129],{},[14,14478,132],{"id":132},[134,14480,14481,14485],{},[44,14482,7882,14483,8305],{},[33,14484,8304],{},[44,14486,8308,14487,8311,14489,8314,14491,8318],{},[33,14488,8215],{},[33,14490,8201],{},[33,14492,8317],{},[150,14494,152],{"id":152},[10,14496,8323,14497,8326],{},[33,14498,8215],{},[10,14500,14501],{},[26,14502],{"alt":8331,"src":8332},[10,14504,8335,14505,8338],{},[33,14506,8201],{},[14,14508,170],{"id":170},[41,14510,14511,14513],{},[44,14512,8345],{},[44,14514,8348],{},[14,14516,181],{"id":181},[134,14518,14519,14521],{},[44,14520,8355],{},[44,14522,4001,14523,8360,14525,8363],{},[33,14524,55],{},[33,14526,8215],{},[10,14528,195],{},[14,14530,198],{"id":198},[10,14532,8370],{},[203,14534,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14536},[14537,14538,14539,14540,14541,14544,14545,14546],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":14542},[14543],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":8177,"description":8182},[218,8392,8393],{"id":8396,"title":8397,"body":14551,"category":218,"cover":219,"description":8402,"extension":220,"meta":14734,"navigation":85,"path":8627,"pinned":223,"publishedAt":224,"seo":14735,"slug":8629,"stem":8630,"summary":8631,"tags":14736,"updatedAt":224,"visible":85,"__hash__":8634},{"type":7,"value":14552,"toc":14722},[14553,14555,14557,14559,14561,14565,14567,14569,14583,14585,14587,14655,14657,14662,14664,14666,14680,14682,14684,14688,14694,14696,14704,14706,14714,14716,14718,14720],[10,14554,8402],{},[14,14556,16],{"id":16},[10,14558,8407],{},[14,14560,22],{"id":22},[10,14562,14563],{},[26,14564],{"alt":8414,"src":8415},[10,14566,8418],{},[14,14568,39],{"id":39},[41,14570,14571,14577,14579],{},[44,14572,14573,8428,14575,353],{},[33,14574,8427],{},[33,14576,8431],{},[44,14578,8434],{},[44,14580,14581,8440],{},[33,14582,8439],{},[14,14584,59],{"id":59},[10,14586,62],{},[64,14588,14589],{"className":66,"code":8447,"language":68,"meta":69,"style":69},[33,14590,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651],{"__ignoreMap":69},[73,14592,14593],{"class":75,"line":76},[73,14594,8454],{},[73,14596,14597],{"class":75,"line":82},[73,14598,86],{"emptyLinePlaceholder":85},[73,14600,14601],{"class":75,"line":89},[73,14602,8463],{},[73,14604,14605],{"class":75,"line":95},[73,14606,8468],{},[73,14608,14609],{"class":75,"line":101},[73,14610,8473],{},[73,14612,14613],{"class":75,"line":107},[73,14614,8478],{},[73,14616,14617],{"class":75,"line":112},[73,14618,8483],{},[73,14620,14621],{"class":75,"line":2484},[73,14622,8488],{},[73,14624,14625],{"class":75,"line":3943},[73,14626,8493],{},[73,14628,14629],{"class":75,"line":4155},[73,14630,8498],{},[73,14632,14633],{"class":75,"line":5779},[73,14634,86],{"emptyLinePlaceholder":85},[73,14636,14637],{"class":75,"line":5784},[73,14638,8507],{},[73,14640,14641],{"class":75,"line":7389},[73,14642,6132],{},[73,14644,14645],{"class":75,"line":7395},[73,14646,6137],{},[73,14648,14649],{"class":75,"line":8518},[73,14650,86],{"emptyLinePlaceholder":85},[73,14652,14653],{"class":75,"line":8523},[73,14654,8526],{},[10,14656,118],{},[64,14658,14660],{"className":14659,"code":8532,"language":124,"meta":69},[122],[33,14661,8532],{"__ignoreMap":69},[10,14663,129],{},[14,14665,132],{"id":132},[134,14667,14668,14678],{},[44,14669,8543,14670,8547,14672,8551,14674,8555,14676,353],{},[33,14671,8546],{},[33,14673,8550],{},[33,14675,8554],{},[33,14677,8546],{},[44,14679,8560],{},[150,14681,152],{"id":152},[10,14683,8565],{},[10,14685,14686],{},[26,14687],{"alt":8570,"src":8571},[10,14689,14690,8576,14692,353],{},[33,14691,8427],{},[33,14693,8431],{},[14,14695,170],{"id":170},[41,14697,14698,14702],{},[44,14699,8585,14700,353],{},[33,14701,5330],{},[44,14703,8590],{},[14,14705,181],{"id":181},[134,14707,14708,14710],{},[44,14709,8597],{},[44,14711,8600,14712,8604],{},[33,14713,8603],{},[10,14715,195],{},[14,14717,198],{"id":198},[10,14719,8611],{},[203,14721,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14723},[14724,14725,14726,14727,14728,14731,14732,14733],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":14729},[14730],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":8397,"description":8402},[218,8633,5281],{"id":8636,"title":8637,"body":14738,"category":218,"cover":219,"description":8642,"extension":220,"meta":14897,"navigation":85,"path":8830,"pinned":223,"publishedAt":224,"seo":14898,"slug":8832,"stem":8833,"summary":8834,"tags":14899,"updatedAt":224,"visible":85,"__hash__":8838},{"type":7,"value":14739,"toc":14885},[14740,14742,14744,14746,14748,14752,14754,14756,14764,14766,14768,14832,14834,14839,14841,14843,14851,14853,14855,14859,14861,14863,14869,14871,14877,14879,14881,14883],[10,14741,8642],{},[14,14743,16],{"id":16},[10,14745,8647],{},[14,14747,22],{"id":22},[10,14749,14750],{},[26,14751],{"alt":8654,"src":8655},[10,14753,8658],{},[14,14755,39],{"id":39},[41,14757,14758,14760,14762],{},[44,14759,8665],{},[44,14761,8668],{},[44,14763,8671],{},[14,14765,59],{"id":59},[10,14767,62],{},[64,14769,14770],{"className":66,"code":8678,"language":68,"meta":69,"style":69},[33,14771,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828],{"__ignoreMap":69},[73,14773,14774],{"class":75,"line":76},[73,14775,8685],{},[73,14777,14778],{"class":75,"line":82},[73,14779,8690],{},[73,14781,14782],{"class":75,"line":89},[73,14783,86],{"emptyLinePlaceholder":85},[73,14785,14786],{"class":75,"line":95},[73,14787,8699],{},[73,14789,14790],{"class":75,"line":101},[73,14791,86],{"emptyLinePlaceholder":85},[73,14793,14794],{"class":75,"line":107},[73,14795,8708],{},[73,14797,14798],{"class":75,"line":112},[73,14799,8713],{},[73,14801,14802],{"class":75,"line":2484},[73,14803,8718],{},[73,14805,14806],{"class":75,"line":3943},[73,14807,86],{"emptyLinePlaceholder":85},[73,14809,14810],{"class":75,"line":4155},[73,14811,8727],{},[73,14813,14814],{"class":75,"line":5779},[73,14815,8732],{},[73,14817,14818],{"class":75,"line":5784},[73,14819,8737],{},[73,14821,14822],{"class":75,"line":7389},[73,14823,86],{"emptyLinePlaceholder":85},[73,14825,14826],{"class":75,"line":7395},[73,14827,6146],{},[73,14829,14830],{"class":75,"line":8518},[73,14831,8750],{},[10,14833,118],{},[64,14835,14837],{"className":14836,"code":8756,"language":124,"meta":69},[122],[33,14838,8756],{"__ignoreMap":69},[10,14840,129],{},[14,14842,132],{"id":132},[134,14844,14845,14849],{},[44,14846,14847,8770],{},[33,14848,8769],{},[44,14850,8773],{},[150,14852,152],{"id":152},[10,14854,8778],{},[10,14856,14857],{},[26,14858],{"alt":8783,"src":8784},[10,14860,8787],{},[14,14862,170],{"id":170},[41,14864,14865,14867],{},[44,14866,8794],{},[44,14868,8797],{},[14,14870,181],{"id":181},[134,14872,14873,14875],{},[44,14874,8804],{},[44,14876,8807],{},[10,14878,195],{},[14,14880,198],{"id":198},[10,14882,8814],{},[203,14884,205],{},{"title":69,"searchDepth":82,"depth":82,"links":14886},[14887,14888,14889,14890,14891,14894,14895,14896],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":14892},[14893],{"id":152,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":8637,"description":8642},[218,8836,8837],{"id":8840,"title":8841,"body":14901,"category":218,"cover":219,"description":8846,"extension":220,"meta":15139,"navigation":85,"path":9147,"pinned":223,"publishedAt":224,"seo":15140,"slug":9149,"stem":9150,"summary":9151,"tags":15141,"updatedAt":224,"visible":85,"__hash__":9155},{"type":7,"value":14902,"toc":15126},[14903,14905,14907,14909,14911,14915,14917,14919,14929,14931,14933,15049,15051,15056,15058,15060,15070,15072,15074,15078,15080,15082,15084,15088,15092,15094,15102,15104,15118,15120,15122,15124],[10,14904,8846],{},[14,14906,16],{"id":16},[10,14908,8851],{},[14,14910,22],{"id":22},[10,14912,14913],{},[26,14914],{"alt":8858,"src":8859},[10,14916,8862],{},[14,14918,39],{"id":39},[41,14920,14921,14923,14925],{},[44,14922,8869],{},[44,14924,8872],{},[44,14926,8875,14927,8879],{},[33,14928,8878],{},[14,14930,59],{"id":59},[10,14932,62],{},[64,14934,14935],{"className":66,"code":8886,"language":68,"meta":69,"style":69},[33,14936,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041,15045],{"__ignoreMap":69},[73,14938,14939],{"class":75,"line":76},[73,14940,6944],{},[73,14942,14943],{"class":75,"line":82},[73,14944,6553],{},[73,14946,14947],{"class":75,"line":89},[73,14948,86],{"emptyLinePlaceholder":85},[73,14950,14951],{"class":75,"line":95},[73,14952,8905],{},[73,14954,14955],{"class":75,"line":101},[73,14956,8910],{},[73,14958,14959],{"class":75,"line":107},[73,14960,8915],{},[73,14962,14963],{"class":75,"line":112},[73,14964,8920],{},[73,14966,14967],{"class":75,"line":2484},[73,14968,86],{"emptyLinePlaceholder":85},[73,14970,14971],{"class":75,"line":3943},[73,14972,8929],{},[73,14974,14975],{"class":75,"line":4155},[73,14976,8934],{},[73,14978,14979],{"class":75,"line":5779},[73,14980,8939],{},[73,14982,14983],{"class":75,"line":5784},[73,14984,8944],{},[73,14986,14987],{"class":75,"line":7389},[73,14988,8949],{},[73,14990,14991],{"class":75,"line":7395},[73,14992,86],{"emptyLinePlaceholder":85},[73,14994,14995],{"class":75,"line":8518},[73,14996,8958],{},[73,14998,14999],{"class":75,"line":8523},[73,15000,8963],{},[73,15002,15003],{"class":75,"line":8966},[73,15004,8969],{},[73,15006,15007],{"class":75,"line":8972},[73,15008,86],{"emptyLinePlaceholder":85},[73,15010,15011],{"class":75,"line":8977},[73,15012,8980],{},[73,15014,15015],{"class":75,"line":8983},[73,15016,86],{"emptyLinePlaceholder":85},[73,15018,15019],{"class":75,"line":8988},[73,15020,7362],{},[73,15022,15023],{"class":75,"line":8993},[73,15024,8996],{},[73,15026,15027],{"class":75,"line":8999},[73,15028,9002],{},[73,15030,15031],{"class":75,"line":9005},[73,15032,9008],{},[73,15034,15035],{"class":75,"line":9011},[73,15036,7372],{},[73,15038,15039],{"class":75,"line":9016},[73,15040,9019],{},[73,15042,15043],{"class":75,"line":9022},[73,15044,1137],{},[73,15046,15047],{"class":75,"line":9027},[73,15048,9030],{},[10,15050,118],{},[64,15052,15054],{"className":15053,"code":9036,"language":124,"meta":69},[122],[33,15055,9036],{"__ignoreMap":69},[10,15057,129],{},[14,15059,132],{"id":132},[134,15061,15062,15066],{},[44,15063,9047,15064,9050],{},[33,15065,8878],{},[44,15067,15068,9055],{},[33,15069,8110],{},[150,15071,152],{"id":152},[10,15073,9060],{},[10,15075,15076],{},[26,15077],{"alt":9065,"src":9066},[10,15079,9069],{},[150,15081,152],{"id":4210},[10,15083,9074],{},[10,15085,15086],{},[26,15087],{"alt":9079,"src":9080},[10,15089,9083,15090,9087],{},[33,15091,9086],{},[14,15093,170],{"id":170},[41,15095,15096,15098],{},[44,15097,9094],{},[44,15099,9097,15100,9100],{},[33,15101,9086],{},[14,15103,181],{"id":181},[134,15105,15106,15110,15112],{},[44,15107,9107,15108,9110],{},[33,15109,9086],{},[44,15111,9113],{},[44,15113,9116,15114,9120,15116,9123],{},[33,15115,9119],{},[33,15117,6088],{},[10,15119,195],{},[14,15121,198],{"id":198},[10,15123,9130],{},[203,15125,205],{},{"title":69,"searchDepth":82,"depth":82,"links":15127},[15128,15129,15130,15131,15132,15136,15137,15138],{"id":16,"depth":82,"text":16},{"id":22,"depth":82,"text":22},{"id":39,"depth":82,"text":39},{"id":59,"depth":82,"text":59},{"id":132,"depth":82,"text":132,"children":15133},[15134,15135],{"id":152,"depth":89,"text":152},{"id":4210,"depth":89,"text":152},{"id":170,"depth":82,"text":170},{"id":181,"depth":82,"text":181},{"id":198,"depth":82,"text":198},{},{"title":8841,"description":8846},[218,9153,9154],{"id":1047,"title":1048,"body":15143,"category":218,"cover":1056,"description":69,"extension":220,"meta":15379,"navigation":85,"path":1373,"pinned":223,"publishedAt":1374,"seo":15380,"slug":1376,"stem":1377,"summary":1378,"tags":15381,"updatedAt":1374,"visible":85,"__hash__":1382},{"type":7,"value":15144,"toc":15364},[15145,15149,15151,15153,15155,15157,15177,15179,15184,15186,15188,15216,15222,15224,15228,15230,15250,15252,15262,15264,15266,15268,15270,15272,15274,15276,15278,15280,15300,15302,15304,15308,15310,15312,15314,15316,15320,15322,15340,15342,15344,15346,15348,15350,15352,15354,15356,15358,15360,15362],[10,15146,15147],{},[26,15148],{"alt":1055,"src":1056},[10,15150,1059],{},[10,15152,1062],{},[14,15154,1066],{"id":1065},[10,15156,1069],{},[64,15158,15159],{"className":66,"code":1072,"language":68,"meta":69,"style":69},[33,15160,15161,15165,15169,15173],{"__ignoreMap":69},[73,15162,15163],{"class":75,"line":76},[73,15164,1079],{},[73,15166,15167],{"class":75,"line":82},[73,15168,1084],{},[73,15170,15171],{"class":75,"line":89},[73,15172,86],{"emptyLinePlaceholder":85},[73,15174,15175],{"class":75,"line":95},[73,15176,1093],{},[10,15178,1096],{},[64,15180,15182],{"className":15181,"code":1100,"language":124,"meta":69},[122],[33,15183,1100],{"__ignoreMap":69},[10,15185,1105],{},[10,15187,1108],{},[64,15189,15190],{"className":66,"code":1111,"language":68,"meta":69,"style":69},[33,15191,15192,15196,15200,15204,15208,15212],{"__ignoreMap":69},[73,15193,15194],{"class":75,"line":76},[73,15195,1118],{},[73,15197,15198],{"class":75,"line":82},[73,15199,86],{"emptyLinePlaceholder":85},[73,15201,15202],{"class":75,"line":89},[73,15203,1127],{},[73,15205,15206],{"class":75,"line":95},[73,15207,1132],{},[73,15209,15210],{"class":75,"line":101},[73,15211,1137],{},[73,15213,15214],{"class":75,"line":107},[73,15215,1142],{},[10,15217,15218,1148,15220,1152],{},[33,15219,1147],{},[33,15221,1151],{},[14,15223,1156],{"id":1155},[10,15225,1159,15226,1163],{},[33,15227,1162],{},[10,15229,1166],{},[64,15231,15232],{"className":66,"code":1169,"language":68,"meta":69,"style":69},[33,15233,15234,15238,15242,15246],{"__ignoreMap":69},[73,15235,15236],{"class":75,"line":76},[73,15237,1176],{},[73,15239,15240],{"class":75,"line":82},[73,15241,1181],{},[73,15243,15244],{"class":75,"line":89},[73,15245,1186],{},[73,15247,15248],{"class":75,"line":95},[73,15249,1191],{},[10,15251,1194],{},[64,15253,15254],{"className":582,"code":1197,"language":584,"meta":69,"style":69},[33,15255,15256],{"__ignoreMap":69},[73,15257,15258,15260],{"class":75,"line":76},[73,15259,682],{"class":591},[73,15261,1206],{"class":627},[10,15263,1209],{},[14,15265,1213],{"id":1212},[150,15267,1216],{"id":1216},[10,15269,1219],{},[150,15271,1222],{"id":1222},[10,15273,1225],{},[150,15275,1228],{"id":1228},[10,15277,1231],{},[10,15279,1234],{},[64,15281,15282],{"className":66,"code":1237,"language":68,"meta":69,"style":69},[33,15283,15284,15288,15292,15296],{"__ignoreMap":69},[73,15285,15286],{"class":75,"line":76},[73,15287,1244],{},[73,15289,15290],{"class":75,"line":82},[73,15291,86],{"emptyLinePlaceholder":85},[73,15293,15294],{"class":75,"line":89},[73,15295,1253],{},[73,15297,15298],{"class":75,"line":95},[73,15299,1258],{},[10,15301,1261],{},[150,15303,1264],{"id":1264},[10,15305,1267,15306,1270],{},[33,15307,252],{},[10,15309,1273],{},[150,15311,1276],{"id":1276},[10,15313,1279],{},[14,15315,1283],{"id":1282},[10,15317,15318],{},[26,15319],{"alt":1288,"src":1289},[10,15321,1292],{},[41,15323,15324,15326,15328,15330,15332,15334,15336,15338],{},[44,15325,1297],{},[44,15327,1300],{},[44,15329,1303],{},[44,15331,1306],{},[44,15333,1309],{},[44,15335,1312],{},[44,15337,1315],{},[44,15339,1318],{},[10,15341,1321],{},[14,15343,1325],{"id":1324},[10,15345,1328],{},[10,15347,1331],{},[14,15349,1335],{"id":1334},[10,15351,1338],{},[10,15353,1341],{},[10,15355,1344],{},[14,15357,1347],{"id":1347},[10,15359,1350],{},[10,15361,1353],{},[203,15363,1356],{},{"title":69,"searchDepth":82,"depth":82,"links":15365},[15366,15367,15368,15375,15376,15377,15378],{"id":1065,"depth":82,"text":1066},{"id":1155,"depth":82,"text":1156},{"id":1212,"depth":82,"text":1213,"children":15369},[15370,15371,15372,15373,15374],{"id":1216,"depth":89,"text":1216},{"id":1222,"depth":89,"text":1222},{"id":1228,"depth":89,"text":1228},{"id":1264,"depth":89,"text":1264},{"id":1276,"depth":89,"text":1276},{"id":1282,"depth":82,"text":1283},{"id":1324,"depth":82,"text":1325},{"id":1334,"depth":82,"text":1335},{"id":1347,"depth":82,"text":1347},{},{"title":1048,"description":69},[218,1380,1381],{"id":234,"title":235,"body":15383,"category":218,"cover":219,"description":69,"extension":220,"meta":15962,"navigation":85,"path":1036,"pinned":223,"publishedAt":1037,"seo":15963,"slug":1039,"stem":1040,"summary":1041,"tags":15964,"updatedAt":1037,"visible":85,"__hash__":1045},{"type":7,"value":15384,"toc":15938},[15385,15387,15389,15391,15395,15397,15399,15423,15435,15437,15439,15444,15448,15452,15464,15468,15472,15476,15478,15512,15514,15518,15522,15524,15546,15576,15588,15598,15606,15608,15614,15624,15626,15631,15635,15637,15651,15657,15677,15679,15681,15683,15693,15697,15699,15708,15712,15714,15716,15736,15740,15742,15744,15746,15748,15768,15770,15772,15774,15800,15802,15818,15820,15836,15840,15842,15844,15864,15866,15868,15870,15874,15884,15886,15888,15890,15900,15908,15910,15912,15926,15936],[14,15386,240],{"id":240},[10,15388,243],{},[10,15390,246],{},[10,15392,249,15393,253],{},[33,15394,252],{},[14,15396,256],{"id":256},[10,15398,259],{},[261,15400,15401,15403],{},[10,15402,265],{},[261,15404,15405,15411,15413,15417,15419],{},[10,15406,270,15407,274,15409,278],{},[33,15408,273],{},[33,15410,277],{},[10,15412,281],{},[10,15414,284,15415,289],{},[286,15416,288],{},[10,15418,292],{},[10,15420,15421],{},[26,15422],{"alt":297,"src":298},[261,15424,15425,15427],{},[10,15426,303],{},[261,15428,15429,15431],{},[10,15430,308],{},[10,15432,15433],{},[26,15434],{"alt":313,"src":314},[14,15436,318],{"id":317},[150,15438,322],{"id":321},[10,15440,325,15441,333],{},[327,15442,332],{"href":329,"rel":15443},[331],[261,15445,15446],{},[10,15447,338],{},[10,15449,15450],{},[26,15451],{"alt":343,"src":344},[41,15453,15454,15458,15462],{},[44,15455,349,15456,353],{},[286,15457,352],{},[44,15459,356,15460,353],{},[286,15461,359],{},[44,15463,362],{},[10,15465,15466],{},[26,15467],{"alt":367,"src":368},[261,15469,15470],{},[10,15471,373],{},[10,15473,15474],{},[26,15475],{"alt":378,"src":379},[150,15477,383],{"id":382},[261,15479,15480,15484,15488,15508],{},[261,15481,15482],{},[10,15483,390],{},[10,15485,393,15486,397],{},[286,15487,396],{},[64,15489,15490],{"className":66,"code":400,"language":68,"meta":69,"style":69},[33,15491,15492,15496,15500,15504],{"__ignoreMap":69},[73,15493,15494],{"class":75,"line":76},[73,15495,407],{},[73,15497,15498],{"class":75,"line":82},[73,15499,412],{},[73,15501,15502],{"class":75,"line":89},[73,15503,417],{},[73,15505,15506],{"class":75,"line":95},[73,15507,422],{},[10,15509,425,15510,429],{},[286,15511,428],{},[10,15513,432],{},[10,15515,435,15516,438],{},[33,15517,68],{},[10,15519,15520],{},[26,15521],{"alt":443,"src":444},[10,15523,447],{},[261,15525,15526,15528,15532],{},[10,15527,452],{},[10,15529,15530],{},[286,15531,457],{},[261,15533,15534,15538,15542],{},[10,15535,462,15536,465],{},[33,15537,68],{},[10,15539,468,15540,471],{},[33,15541,68],{},[10,15543,474,15544,478],{},[286,15545,477],{},[261,15547,15548,15550,15554],{},[10,15549,483],{},[10,15551,15552],{},[286,15553,488],{},[261,15555,15556,15562,15570,15572],{},[10,15557,15558,496,15560,500],{},[33,15559,495],{},[33,15561,499],{},[10,15563,503,15564,506,15566,510,15568,514],{},[33,15565,495],{},[286,15567,509],{},[286,15569,513],{},[10,15571,517],{},[10,15573,15574,523],{},[286,15575,522],{},[261,15577,15578,15580],{},[10,15579,528],{},[261,15581,15582,15586],{},[10,15583,533,15584,537],{},[286,15585,536],{},[10,15587,540],{},[261,15589,15590,15594],{},[10,15591,545,15592],{},[286,15593,548],{},[10,15595,15596],{},[26,15597],{"alt":553,"src":554},[261,15599,15600,15602],{},[10,15601,559],{},[10,15603,15604],{},[26,15605],{"alt":553,"src":564},[150,15607,568],{"id":567},[10,15609,571,15610,575,15612,579],{},[33,15611,574],{},[33,15613,578],{},[64,15615,15616],{"className":582,"code":583,"language":584,"meta":69,"style":69},[33,15617,15618],{"__ignoreMap":69},[73,15619,15620,15622],{"class":75,"line":76},[73,15621,68],{"class":591},[73,15623,595],{"class":594},[10,15625,598],{},[64,15627,15629],{"className":15628,"code":602,"language":124,"meta":69},[122],[33,15630,602],{"__ignoreMap":69},[10,15632,15633],{},[26,15634],{"alt":553,"src":609},[10,15636,612],{},[64,15638,15639],{"className":582,"code":615,"language":584,"meta":69,"style":69},[33,15640,15641],{"__ignoreMap":69},[73,15642,15643,15645,15647,15649],{"class":75,"line":76},[73,15644,68],{"class":591},[73,15646,624],{"class":594},[73,15648,628],{"class":627},[73,15650,595],{"class":594},[10,15652,633,15653,636,15655,640],{},[33,15654,68],{},[33,15656,639],{},[64,15658,15659],{"className":582,"code":643,"language":584,"meta":69,"style":69},[33,15660,15661,15667],{"__ignoreMap":69},[73,15662,15663,15665],{"class":75,"line":76},[73,15664,499],{"class":591},[73,15666,595],{"class":594},[73,15668,15669,15671,15673,15675],{"class":75,"line":82},[73,15670,499],{"class":591},[73,15672,624],{"class":594},[73,15674,628],{"class":627},[73,15676,595],{"class":594},[14,15678,665],{"id":664},[150,15680,669],{"id":668},[10,15682,672],{},[64,15684,15685],{"className":582,"code":675,"language":584,"meta":69,"style":69},[33,15686,15687],{"__ignoreMap":69},[73,15688,15689,15691],{"class":75,"line":76},[73,15690,682],{"class":591},[73,15692,595],{"class":594},[10,15694,687,15695,691],{},[33,15696,690],{},[150,15698,695],{"id":694},[10,15700,325,15701,703,15704,353,15706,710],{},[327,15702,702],{"href":700,"rel":15703},[331],[286,15705,706],{},[33,15707,709],{},[10,15709,713,15710,717],{},[33,15711,716],{},[150,15713,721],{"id":720},[10,15715,724],{},[64,15717,15718],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,15719,15720,15726],{"__ignoreMap":69},[73,15721,15722,15724],{"class":75,"line":76},[73,15723,682],{"class":591},[73,15725,595],{"class":594},[73,15727,15728,15730,15732,15734],{"class":75,"line":82},[73,15729,682],{"class":591},[73,15731,624],{"class":594},[73,15733,628],{"class":627},[73,15735,595],{"class":594},[10,15737,748,15738,751],{},[33,15739,682],{},[14,15741,755],{"id":754},[10,15743,758],{},[150,15745,762],{"id":761},[10,15747,765],{},[64,15749,15750],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,15751,15752,15758],{"__ignoreMap":69},[73,15753,15754,15756],{"class":75,"line":76},[73,15755,682],{"class":591},[73,15757,595],{"class":594},[73,15759,15760,15762,15764,15766],{"class":75,"line":82},[73,15761,682],{"class":591},[73,15763,624],{"class":594},[73,15765,628],{"class":627},[73,15767,595],{"class":594},[10,15769,788],{},[150,15771,792],{"id":791},[10,15773,795],{},[64,15775,15776],{"className":582,"code":798,"language":584,"meta":69,"style":69},[33,15777,15778,15786],{"__ignoreMap":69},[73,15779,15780,15782,15784],{"class":75,"line":76},[73,15781,805],{"class":591},[73,15783,808],{"class":627},[73,15785,811],{"class":627},[73,15787,15788,15790,15792,15794,15796,15798],{"class":75,"line":82},[73,15789,805],{"class":591},[73,15791,808],{"class":627},[73,15793,820],{"class":627},[73,15795,823],{"class":627},[73,15797,826],{"class":627},[73,15799,829],{"class":627},[10,15801,832],{},[64,15803,15804],{"className":582,"code":835,"language":584,"meta":69,"style":69},[33,15805,15806],{"__ignoreMap":69},[73,15807,15808,15810,15812,15814,15816],{"class":75,"line":76},[73,15809,805],{"class":591},[73,15811,844],{"class":627},[73,15813,820],{"class":627},[73,15815,823],{"class":627},[73,15817,851],{"class":627},[10,15819,854],{},[64,15821,15822],{"className":582,"code":857,"language":584,"meta":69,"style":69},[33,15823,15824],{"__ignoreMap":69},[73,15825,15826,15828,15830,15832,15834],{"class":75,"line":76},[73,15827,805],{"class":591},[73,15829,866],{"class":627},[73,15831,869],{"class":594},[73,15833,872],{"class":627},[73,15835,875],{"class":627},[10,15837,15838,880],{},[33,15839,805],{},[150,15841,884],{"id":883},[10,15843,887],{},[64,15845,15846],{"className":582,"code":727,"language":584,"meta":69,"style":69},[33,15847,15848,15854],{"__ignoreMap":69},[73,15849,15850,15852],{"class":75,"line":76},[73,15851,682],{"class":591},[73,15853,595],{"class":594},[73,15855,15856,15858,15860,15862],{"class":75,"line":82},[73,15857,682],{"class":591},[73,15859,624],{"class":594},[73,15861,628],{"class":627},[73,15863,595],{"class":594},[10,15865,910],{},[14,15867,913],{"id":913},[150,15869,917],{"id":916},[10,15871,920,15872,924],{},[33,15873,923],{},[134,15875,15876,15880,15882],{},[44,15877,929,15878,932],{},[33,15879,639],{},[44,15881,935],{},[44,15883,938],{},[10,15885,941],{},[150,15887,945],{"id":944},[10,15889,948],{},[64,15891,15892],{"className":582,"code":675,"language":584,"meta":69,"style":69},[33,15893,15894],{"__ignoreMap":69},[73,15895,15896,15898],{"class":75,"line":76},[73,15897,682],{"class":591},[73,15899,595],{"class":594},[10,15901,961,15902,964,15904,967,15906,353],{},[33,15903,682],{},[33,15905,68],{},[33,15907,682],{},[150,15909,973],{"id":972},[10,15911,976],{},[64,15913,15914],{"className":582,"code":979,"language":584,"meta":69,"style":69},[33,15915,15916],{"__ignoreMap":69},[73,15917,15918,15920,15922,15924],{"class":75,"line":76},[73,15919,682],{"class":591},[73,15921,624],{"class":594},[73,15923,628],{"class":627},[73,15925,595],{"class":594},[10,15927,994,15928,997,15930,1000,15932,1003,15934,1007],{},[33,15929,682],{},[33,15931,68],{},[33,15933,499],{},[33,15935,1006],{},[203,15937,1010],{},{"title":69,"searchDepth":82,"depth":82,"links":15939},[15940,15941,15942,15947,15952,15957],{"id":240,"depth":82,"text":240},{"id":256,"depth":82,"text":256},{"id":317,"depth":82,"text":318,"children":15943},[15944,15945,15946],{"id":321,"depth":89,"text":322},{"id":382,"depth":89,"text":383},{"id":567,"depth":89,"text":568},{"id":664,"depth":82,"text":665,"children":15948},[15949,15950,15951],{"id":668,"depth":89,"text":669},{"id":694,"depth":89,"text":695},{"id":720,"depth":89,"text":721},{"id":754,"depth":82,"text":755,"children":15953},[15954,15955,15956],{"id":761,"depth":89,"text":762},{"id":791,"depth":89,"text":792},{"id":883,"depth":89,"text":884},{"id":913,"depth":82,"text":913,"children":15958},[15959,15960,15961],{"id":916,"depth":89,"text":917},{"id":944,"depth":89,"text":945},{"id":972,"depth":89,"text":973},{},{"title":235,"description":69},[218,1043,1044],1786973365280]