[{"data":1,"prerenderedAt":15973},["ShallowReactive",2],{"post-python-parameters-return-scope":3,"sidebar-posts":249,"post-related-source":9164},{"id":4,"title":5,"body":6,"category":234,"cover":235,"description":12,"extension":236,"meta":237,"navigation":101,"path":238,"pinned":239,"publishedAt":240,"seo":241,"slug":242,"stem":243,"summary":244,"tags":245,"updatedAt":240,"visible":101,"__hash__":248},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":8,"toc":222},"minimark",[9,13,17,20,23,30,38,41,61,64,67,115,118,126,129,132,156,160,163,169,180,183,198,201,209,212,215,218],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,31,32,33,37],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,35,36],"code",{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,39,40],{"id":40},"核心概念",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"形参出现在函数定义中，实参出现在函数调用中。",[45,49,50],{},"局部变量默认只在函数内部可见。",[45,52,53,54,56,57,60],{},"没有显式 ",[34,55,36],{}," 的函数会返回 ",[34,58,59],{},"None","。",[14,62,63],{"id":63},"跟着示例运行",[10,65,66],{},"把下面代码保存到本课脚本并运行：",[68,69,74],"pre",{"className":70,"code":71,"language":72,"meta":73,"style":73},"language-python shiki shiki-themes github-dark","def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n","python","",[34,75,76,84,90,96,103,109],{"__ignoreMap":73},[77,78,81],"span",{"class":79,"line":80},"line",1,[77,82,83],{},"def calculate_total(price, count):\n",[77,85,87],{"class":79,"line":86},2,[77,88,89],{},"    total = price * count\n",[77,91,93],{"class":79,"line":92},3,[77,94,95],{},"    return total\n",[77,97,99],{"class":79,"line":98},4,[77,100,102],{"emptyLinePlaceholder":101},true,"\n",[77,104,106],{"class":79,"line":105},5,[77,107,108],{},"result = calculate_total(25, 4)\n",[77,110,112],{"class":79,"line":111},6,[77,113,114],{},"print(result)\n",[10,116,117],{},"预期结果：",[68,119,124],{"className":120,"code":122,"language":123,"meta":73},[121],"language-text","100\n","text",[34,125,122],{"__ignoreMap":73},[10,127,128],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,130,131],{"id":131},"按执行顺序拆开看",[133,134,135,146],"ol",{},[45,136,137,138,141,142,145],{},"调用时 25 和 4 分别绑定到 ",[34,139,140],{},"price","、",[34,143,144],{},"count","，它们只在本次函数调用的局部范围中使用。",[45,147,148,151,152,155],{},[34,149,150],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,153,154],{},"result"," 并输出。",[157,158,159],"h3",{"id":159},"再看一个具体细节",[10,161,162],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,164,165],{},[26,166],{"alt":167,"src":168},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,170,171,141,173,175,176,179],{},[34,172,140],{},[34,174,144],{}," 和 ",[34,177,178],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,181,182],{"id":182},"初学者容易混淆的地方",[42,184,185,192],{},[45,186,187,188,191],{},"在函数内部只 ",[34,189,190],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,193,194,195,197],{},"试图在函数外直接访问局部变量 ",[34,196,178],{},"，它的名字只在调用期间的局部作用域存在。",[14,199,200],{"id":200},"练习",[133,202,203,206],{},[45,204,205],{},"编写计算长方形面积的函数。",[45,207,208],{},"让函数返回结果后在调用方加上单位再输出。",[10,210,211],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,213,214],{"id":214},"本篇边界",[10,216,217],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,220,221],"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":73,"searchDepth":86,"depth":86,"links":223},[224,225,226,227,228,231,232,233],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":229},[230],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",false,"2026-08-17",{"title":5,"description":12},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[234,246,247],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",[250,1062,1398,1532,1684,1863,2051,2216,2399,2582,2774,3005,3189,3366,3523,3694,3859,4074,4303,4484,4648,4837,5025,5180,5340,5489,5686,5900,6067,6311,6492,6697,6892,7076,7277,7567,7759,7988,8183,8403,8643,8847],{"id":251,"title":252,"body":253,"category":234,"cover":235,"description":73,"extension":236,"meta":1051,"navigation":101,"path":1052,"pinned":239,"publishedAt":1053,"seo":1054,"slug":1055,"stem":1056,"summary":1057,"tags":1058,"updatedAt":1053,"visible":101,"__hash__":1061},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":254,"toc":1027},[255,258,261,264,271,274,277,316,332,336,340,351,356,362,379,385,390,396,400,446,449,455,461,464,495,540,557,571,581,585,596,612,615,621,626,629,647,657,678,682,686,689,701,708,712,727,734,738,741,762,768,772,775,779,782,802,805,809,812,846,849,868,871,892,897,901,904,924,927,930,934,941,955,958,962,965,975,986,990,993,1008,1024],[14,256,257],{"id":257},"引言",[10,259,260],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,262,263],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,265,266,267,270],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,268,269],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,272,273],{"id":273},"扫盲",[10,275,276],{},"那么这里有几个概念：",[278,279,280,283],"blockquote",{},[10,281,282],{},"为什么需要安装python解释器？",[278,284,285,296,299,307,310],{},[10,286,287,288,291,292,295],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,289,290],{},"0","和",[34,293,294],{},"1","组成的机器指令。",[10,297,298],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,300,301,302,306],{},"这样，我们就能用",[303,304,305],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,308,309],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,311,312],{},[26,313],{"alt":314,"src":315},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[278,317,318,321],{},[10,319,320],{},"pip又是什么？",[278,322,323,326],{},[10,324,325],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,327,328],{},[26,329],{"alt":330,"src":331},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,333,335],{"id":334},"windows-安装","Windows 安装",[157,337,339],{"id":338},"_1-下载官方安装程序","1. 下载官方安装程序",[10,341,342,343,350],{},"打开 ",[344,345,349],"a",{"href":346,"rel":347},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[348],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[278,352,353],{},[10,354,355],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,357,358],{},[26,359],{"alt":360,"src":361},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,363,364,370,376],{},[45,365,366,367,60],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[303,368,369],{},"Windows installer (64-bit)",[45,371,372,373,60],{},"搭载 ARM 处理器的 Windows 设备选择 ",[303,374,375],{},"Windows installer (ARM64)",[45,377,378],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,380,381],{},[26,382],{"alt":383,"src":384},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[278,386,387],{},[10,388,389],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,391,392],{},[26,393],{"alt":394,"src":395},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[157,397,399],{"id":398},"_2-安装并加入-path","2. 安装并加入 PATH",[278,401,402,407,414,439],{},[278,403,404],{},[10,405,406],{},"PATH 环境变量",[10,408,409,410,413],{},"Windows 有一个特殊的变量叫 ",[303,411,412],{},"PATH","，它里面存了一串文件夹路径，比如：",[68,415,417],{"className":70,"code":416,"language":72,"meta":73,"style":73},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,418,419,424,429,434],{"__ignoreMap":73},[77,420,421],{"class":79,"line":80},[77,422,423],{},"D:\\Python313\\\n",[77,425,426],{"class":79,"line":86},[77,427,428],{},"D:\\Python313\\Scripts\\\n",[77,430,431],{"class":79,"line":92},[77,432,433],{},"C:\\Windows\\System32\\\n",[77,435,436],{"class":79,"line":98},[77,437,438],{},"...\n",[10,440,441,442,445],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[303,443,444],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,447,448],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,450,451,452,454],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,453,72],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,456,457],{},[26,458],{"alt":459,"src":460},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,462,463],{},"对安装界面最底部的两个勾选项分别解释 :",[278,465,466,469,474],{},[10,467,468],{},"Add python.exe to PATH",[10,470,471],{},[303,472,473],{},"把 Python 添加到系统环境变量",[278,475,476,482,488],{},[10,477,478,479,481],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,480,72],{}," 就能运行",[10,483,484,485,487],{},"不勾选的话，命令行输入 ",[34,486,72],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,489,490,491,494],{},"必须",[303,492,493],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[278,496,497,500,505],{},[10,498,499],{},"Use admin privileges when installing py.exe",[10,501,502],{},[303,503,504],{},"使用管理员权限安装 py.exe（Python 启动器）",[278,506,507,517,531,534],{},[10,508,509,512,513,516],{},[34,510,511],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,514,515],{},"py"," 来启动 Python。",[10,518,519,520,522,523,526,527,530],{},"勾选后，",[34,521,511],{}," 会安装到",[303,524,525],{},"系统级目录","，电脑上",[303,528,529],{},"所有用户账户","都能用",[10,532,533],{},"不勾选，只有当前用户能用",[10,535,536,539],{},[303,537,538],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[278,541,542,545],{},[10,543,544],{},"操作建议",[278,546,547,554],{},[10,548,549,550,553],{},"两个都勾上之后，再点 ",[303,551,552],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,555,556],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[278,558,559,565],{},[10,560,561,562],{},"Python 安装的",[303,563,564],{},"可选功能页",[10,566,567],{},[26,568],{"alt":569,"src":570},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[278,572,573,576],{},[10,574,575],{},"高级选项页",[10,577,578],{},[26,579],{"alt":569,"src":580},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[157,582,584],{"id":583},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,586,587,588,591,592,595],{},"按 ",[34,589,590],{},"Win + R","，输入 ",[34,593,594],{},"cmd"," 并回车，然后执行：",[68,597,601],{"className":598,"code":599,"language":600,"meta":73,"style":73},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,602,603],{"__ignoreMap":73},[77,604,605,608],{"class":79,"line":80},[77,606,72],{"class":607},"svObZ",[77,609,611],{"class":610},"sDLfK"," --version\n",[10,613,614],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[68,616,619],{"className":617,"code":618,"language":123,"meta":73},[121],"Python 3.x.x\n",[34,620,618],{"__ignoreMap":73},[10,622,623],{},[26,624],{"alt":569,"src":625},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,627,628],{},"继续检查 pip：",[68,630,632],{"className":598,"code":631,"language":600,"meta":73,"style":73},"python -m pip --version\n",[34,633,634],{"__ignoreMap":73},[77,635,636,638,641,645],{"class":79,"line":80},[77,637,72],{"class":607},[77,639,640],{"class":610}," -m",[77,642,644],{"class":643},"sU2Wk"," pip",[77,646,611],{"class":610},[10,648,649,650,652,653,656],{},"如果 ",[34,651,72],{}," 无法识别，但 ",[34,654,655],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[68,658,660],{"className":598,"code":659,"language":600,"meta":73,"style":73},"py --version\npy -m pip --version\n",[34,661,662,668],{"__ignoreMap":73},[77,663,664,666],{"class":79,"line":80},[77,665,515],{"class":607},[77,667,611],{"class":610},[77,669,670,672,674,676],{"class":79,"line":86},[77,671,515],{"class":607},[77,673,640],{"class":610},[77,675,644],{"class":643},[77,677,611],{"class":610},[14,679,681],{"id":680},"macos-安装","macOS 安装",[157,683,685],{"id":684},"_1-先检查现有环境","1. 先检查现有环境",[10,687,688],{},"打开“终端”应用，执行：",[68,690,692],{"className":598,"code":691,"language":600,"meta":73,"style":73},"python3 --version\n",[34,693,694],{"__ignoreMap":73},[77,695,696,699],{"class":79,"line":80},[77,697,698],{"class":607},"python3",[77,700,611],{"class":610},[10,702,703,704,707],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,705,706],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[157,709,711],{"id":710},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,713,342,714,719,720,60,723,726],{},[344,715,718],{"href":716,"rel":717},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[348],"Python macOS 下载页","，下载当前稳定版的 ",[303,721,722],{},"macOS 64-bit universal2 installer",[34,724,725],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,728,729,730,733],{},"下载完成后打开 ",[34,731,732],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[157,735,737],{"id":736},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,739,740],{},"安装完成后重新打开终端，执行：",[68,742,744],{"className":598,"code":743,"language":600,"meta":73,"style":73},"python3 --version\npython3 -m pip --version\n",[34,745,746,752],{"__ignoreMap":73},[77,747,748,750],{"class":79,"line":80},[77,749,698],{"class":607},[77,751,611],{"class":610},[77,753,754,756,758,760],{"class":79,"line":86},[77,755,698],{"class":607},[77,757,640],{"class":610},[77,759,644],{"class":643},[77,761,611],{"class":610},[10,763,764,765,767],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,766,698],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,769,771],{"id":770},"linux-安装","Linux 安装",[10,773,774],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[157,776,778],{"id":777},"_1-检查是否已经安装","1. 检查是否已经安装",[10,780,781],{},"打开终端，执行：",[68,783,784],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,785,786,792],{"__ignoreMap":73},[77,787,788,790],{"class":79,"line":80},[77,789,698],{"class":607},[77,791,611],{"class":610},[77,793,794,796,798,800],{"class":79,"line":86},[77,795,698],{"class":607},[77,797,640],{"class":610},[77,799,644],{"class":643},[77,801,611],{"class":610},[10,803,804],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[157,806,808],{"id":807},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,810,811],{},"Ubuntu 或 Debian：",[68,813,815],{"className":598,"code":814,"language":600,"meta":73,"style":73},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,816,817,828],{"__ignoreMap":73},[77,818,819,822,825],{"class":79,"line":80},[77,820,821],{"class":607},"sudo",[77,823,824],{"class":643}," apt",[77,826,827],{"class":643}," update\n",[77,829,830,832,834,837,840,843],{"class":79,"line":86},[77,831,821],{"class":607},[77,833,824],{"class":643},[77,835,836],{"class":643}," install",[77,838,839],{"class":643}," python3",[77,841,842],{"class":643}," python3-pip",[77,844,845],{"class":643}," python3-venv\n",[10,847,848],{},"Fedora：",[68,850,852],{"className":598,"code":851,"language":600,"meta":73,"style":73},"sudo dnf install python3 python3-pip\n",[34,853,854],{"__ignoreMap":73},[77,855,856,858,861,863,865],{"class":79,"line":80},[77,857,821],{"class":607},[77,859,860],{"class":643}," dnf",[77,862,836],{"class":643},[77,864,839],{"class":643},[77,866,867],{"class":643}," python3-pip\n",[10,869,870],{},"Arch Linux：",[68,872,874],{"className":598,"code":873,"language":600,"meta":73,"style":73},"sudo pacman -S python python-pip\n",[34,875,876],{"__ignoreMap":73},[77,877,878,880,883,886,889],{"class":79,"line":80},[77,879,821],{"class":607},[77,881,882],{"class":643}," pacman",[77,884,885],{"class":610}," -S",[77,887,888],{"class":643}," python",[77,890,891],{"class":643}," python-pip\n",[10,893,894,896],{},[34,895,821],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[157,898,900],{"id":899},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,902,903],{},"安装结束后执行：",[68,905,906],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,907,908,914],{"__ignoreMap":73},[77,909,910,912],{"class":79,"line":80},[77,911,698],{"class":607},[77,913,611],{"class":610},[77,915,916,918,920,922],{"class":79,"line":86},[77,917,698],{"class":607},[77,919,640],{"class":610},[77,921,644],{"class":643},[77,923,611],{"class":610},[10,925,926],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,928,929],{"id":929},"常见问题",[157,931,933],{"id":932},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,935,936,937,940],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,938,939],{},"python --version","。如果仍然失败，按下面的顺序检查：",[133,942,943,949,952],{},[45,944,945,946,948],{},"执行 ",[34,947,655],{},"，确认 Python Launcher 是否可用。",[45,950,951],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,953,954],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,956,957],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[157,959,961],{"id":960},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,963,964],{},"先尝试：",[68,966,967],{"className":598,"code":691,"language":600,"meta":73,"style":73},[34,968,969],{"__ignoreMap":73},[77,970,971,973],{"class":79,"line":80},[77,972,698],{"class":607},[77,974,611],{"class":610},[10,976,977,978,980,981,983,984,60],{},"在这两个系统中，只有 ",[34,979,698],{}," 命令而没有 ",[34,982,72],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,985,698],{},[157,987,989],{"id":988},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,991,992],{},"先使用模块方式检查：",[68,994,996],{"className":598,"code":995,"language":600,"meta":73,"style":73},"python3 -m pip --version\n",[34,997,998],{"__ignoreMap":73},[77,999,1000,1002,1004,1006],{"class":79,"line":80},[77,1001,698],{"class":607},[77,1003,640],{"class":610},[77,1005,644],{"class":643},[77,1007,611],{"class":610},[10,1009,1010,1011,1013,1014,1016,1017,1019,1020,1023],{},"Windows 用户将命令中的 ",[34,1012,698],{}," 换成 ",[34,1015,72],{}," 或 ",[34,1018,515],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,1021,1022],{},"python3-pip","；不要直接使用其他系统的安装命令。",[219,1025,1026],{},"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":73,"searchDepth":86,"depth":86,"links":1028},[1029,1030,1031,1036,1041,1046],{"id":257,"depth":86,"text":257},{"id":273,"depth":86,"text":273},{"id":334,"depth":86,"text":335,"children":1032},[1033,1034,1035],{"id":338,"depth":92,"text":339},{"id":398,"depth":92,"text":399},{"id":583,"depth":92,"text":584},{"id":680,"depth":86,"text":681,"children":1037},[1038,1039,1040],{"id":684,"depth":92,"text":685},{"id":710,"depth":92,"text":711},{"id":736,"depth":92,"text":737},{"id":770,"depth":86,"text":771,"children":1042},[1043,1044,1045],{"id":777,"depth":92,"text":778},{"id":807,"depth":92,"text":808},{"id":899,"depth":92,"text":900},{"id":929,"depth":86,"text":929,"children":1047},[1048,1049,1050],{"id":932,"depth":92,"text":933},{"id":960,"depth":92,"text":961},{"id":988,"depth":92,"text":989},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":252,"description":73},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[234,1059,1060],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1063,"title":1064,"body":1065,"category":234,"cover":1072,"description":73,"extension":236,"meta":1387,"navigation":101,"path":1388,"pinned":239,"publishedAt":1389,"seo":1390,"slug":1391,"stem":1392,"summary":1393,"tags":1394,"updatedAt":1389,"visible":101,"__hash__":1397},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1066,"toc":1372},[1067,1073,1076,1079,1083,1086,1110,1113,1119,1122,1125,1159,1168,1172,1179,1182,1207,1210,1222,1225,1229,1232,1235,1238,1241,1244,1247,1250,1274,1277,1280,1286,1289,1292,1295,1299,1305,1308,1334,1337,1341,1344,1347,1351,1354,1357,1360,1363,1366,1369],[10,1068,1069],{},[26,1070],{"alt":1071,"src":1072},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1074,1075],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1077,1078],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1080,1082],{"id":1081},"python-代码是什么样的","Python 代码是什么样的",[10,1084,1085],{},"下面是一段简单的 Python 代码：",[68,1087,1089],{"className":70,"code":1088,"language":72,"meta":73,"style":73},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1090,1091,1096,1101,1105],{"__ignoreMap":73},[77,1092,1093],{"class":79,"line":80},[77,1094,1095],{},"name = \"Python\"\n",[77,1097,1098],{"class":79,"line":86},[77,1099,1100],{},"year = 2026\n",[77,1102,1103],{"class":79,"line":92},[77,1104,102],{"emptyLinePlaceholder":101},[77,1106,1107],{"class":79,"line":98},[77,1108,1109],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1111,1112],{},"运行结果：",[68,1114,1117],{"className":1115,"code":1116,"language":123,"meta":73},[121],"正在学习 Python，当前年份是 2026\n",[34,1118,1116],{"__ignoreMap":73},[10,1120,1121],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1123,1124],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[68,1126,1128],{"className":70,"code":1127,"language":72,"meta":73,"style":73},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1129,1130,1135,1139,1144,1149,1154],{"__ignoreMap":73},[77,1131,1132],{"class":79,"line":80},[77,1133,1134],{},"score = 85\n",[77,1136,1137],{"class":79,"line":86},[77,1138,102],{"emptyLinePlaceholder":101},[77,1140,1141],{"class":79,"line":92},[77,1142,1143],{},"if score >= 60:\n",[77,1145,1146],{"class":79,"line":98},[77,1147,1148],{},"    print(\"成绩合格\")\n",[77,1150,1151],{"class":79,"line":105},[77,1152,1153],{},"else:\n",[77,1155,1156],{"class":79,"line":111},[77,1157,1158],{},"    print(\"需要继续学习\")\n",[10,1160,1161,175,1164,1167],{},[34,1162,1163],{},"if",[34,1165,1166],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1169,1171],{"id":1170},"python-如何运行代码","Python 如何运行代码",[10,1173,1174,1175,1178],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1176,1177],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1180,1181],{},"交互式环境适合快速验证一个表达式：",[68,1183,1185],{"className":70,"code":1184,"language":72,"meta":73,"style":73},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1186,1187,1192,1197,1202],{"__ignoreMap":73},[77,1188,1189],{"class":79,"line":80},[77,1190,1191],{},">>> 10 + 20\n",[77,1193,1194],{"class":79,"line":86},[77,1195,1196],{},"30\n",[77,1198,1199],{"class":79,"line":92},[77,1200,1201],{},">>> \"Python\".lower()\n",[77,1203,1204],{"class":79,"line":98},[77,1205,1206],{},"'python'\n",[10,1208,1209],{},"需要保存和重复运行的程序，则可以写入文件：",[68,1211,1213],{"className":598,"code":1212,"language":600,"meta":73,"style":73},"python3 hello.py\n",[34,1214,1215],{"__ignoreMap":73},[77,1216,1217,1219],{"class":79,"line":80},[77,1218,698],{"class":607},[77,1220,1221],{"class":643}," hello.py\n",[10,1223,1224],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1226,1228],{"id":1227},"python-的特点","Python 的特点",[157,1230,1231],{"id":1231},"语法相对简洁",[10,1233,1234],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[157,1236,1237],{"id":1237},"支持多种编程方式",[10,1239,1240],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[157,1242,1243],{"id":1243},"标准库比较完整",[10,1245,1246],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1248,1249],{},"例如，获取当前时间：",[68,1251,1253],{"className":70,"code":1252,"language":72,"meta":73,"style":73},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1254,1255,1260,1264,1269],{"__ignoreMap":73},[77,1256,1257],{"class":79,"line":80},[77,1258,1259],{},"from datetime import datetime\n",[77,1261,1262],{"class":79,"line":86},[77,1263,102],{"emptyLinePlaceholder":101},[77,1265,1266],{"class":79,"line":92},[77,1267,1268],{},"now = datetime.now()\n",[77,1270,1271],{"class":79,"line":98},[77,1272,1273],{},"print(now)\n",[10,1275,1276],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[157,1278,1279],{"id":1279},"第三方工具丰富",[10,1281,1282,1283,1285],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1284,269],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1287,1288],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[157,1290,1291],{"id":1291},"支持多个操作系统",[10,1293,1294],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1296,1298],{"id":1297},"python-可以做什么","Python 可以做什么",[10,1300,1301],{},[26,1302],{"alt":1303,"src":1304},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1306,1307],{},"Python 的应用范围比较广，常见方向包括：",[42,1309,1310,1313,1316,1319,1322,1325,1328,1331],{},[45,1311,1312],{},"编写自动化脚本，批量处理文件和重复任务；",[45,1314,1315],{},"开发网站后端和 API 服务；",[45,1317,1318],{},"进行数据清洗、统计分析和图表展示；",[45,1320,1321],{},"编写网络爬虫和信息采集工具；",[45,1323,1324],{},"开发自动化测试程序；",[45,1326,1327],{},"进行机器学习和人工智能开发；",[45,1329,1330],{},"编写运维、监控和辅助开发工具；",[45,1332,1333],{},"开发部分桌面应用和插件。",[10,1335,1336],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1338,1340],{"id":1339},"python-的发展","Python 的发展",[10,1342,1343],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1345,1346],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1348,1350],{"id":1349},"python-也有局限","Python 也有局限",[10,1352,1353],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1355,1356],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1358,1359],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1361,1362],{"id":1362},"写在最后",[10,1364,1365],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1367,1368],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[219,1370,1371],{},"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":73,"searchDepth":86,"depth":86,"links":1373},[1374,1375,1376,1383,1384,1385,1386],{"id":1081,"depth":86,"text":1082},{"id":1170,"depth":86,"text":1171},{"id":1227,"depth":86,"text":1228,"children":1377},[1378,1379,1380,1381,1382],{"id":1231,"depth":92,"text":1231},{"id":1237,"depth":92,"text":1237},{"id":1243,"depth":92,"text":1243},{"id":1279,"depth":92,"text":1279},{"id":1291,"depth":92,"text":1291},{"id":1297,"depth":86,"text":1298},{"id":1339,"depth":86,"text":1340},{"id":1349,"depth":86,"text":1350},{"id":1362,"depth":86,"text":1362},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1064,"description":73},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[234,1395,1396],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1399,"title":1400,"body":1401,"category":234,"cover":235,"description":1405,"extension":236,"meta":1523,"navigation":101,"path":1524,"pinned":239,"publishedAt":240,"seo":1525,"slug":1526,"stem":1527,"summary":1528,"tags":1529,"updatedAt":240,"visible":101,"__hash__":1531},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1402,"toc":1513},[1403,1406,1408,1411,1413,1419,1424,1426,1440,1442,1444,1453,1455,1461,1463,1465,1481,1483,1494,1496,1504,1506,1508,1511],[10,1404,1405],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1407,16],{"id":16},[10,1409,1410],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1412,22],{"id":22},[10,1414,1415],{},[26,1416],{"alt":1417,"src":1418},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1420,1421,1423],{},[34,1422,1177],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1425,40],{"id":40},[42,1427,1428,1434,1437],{},[45,1429,1430,1431,1433],{},"源代码是人编写的文本，通常保存在 ",[34,1432,1177],{}," 文件中。",[45,1435,1436],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,1438,1439],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1441,63],{"id":63},[10,1443,66],{},[68,1445,1447],{"className":70,"code":1446,"language":72,"meta":73,"style":73},"print(\"你好，Python\")\n",[34,1448,1449],{"__ignoreMap":73},[77,1450,1451],{"class":79,"line":80},[77,1452,1446],{},[10,1454,117],{},[68,1456,1459],{"className":1457,"code":1458,"language":123,"meta":73},[121],"你好，Python\n",[34,1460,1458],{"__ignoreMap":73},[10,1462,128],{},[14,1464,131],{"id":131},[133,1466,1467,1474],{},[45,1468,1469,1470,1473],{},"终端启动解释器后，解释器读取 ",[34,1471,1472],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,1475,1476,1477,1480],{},"字符串对象先准备好，再交给 ",[34,1478,1479],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1482,182],{"id":182},[42,1484,1485,1488],{},[45,1486,1487],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,1489,1490,1491,1493],{},"认为 ",[34,1492,1177],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1495,200],{"id":200},[133,1497,1498,1501],{},[45,1499,1500],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,1502,1503],{},"把示例文字改成自己的学习目标并重新运行。",[10,1505,211],{},[14,1507,214],{"id":214},[10,1509,1510],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,1512,221],{},{"title":73,"searchDepth":86,"depth":86,"links":1514},[1515,1516,1517,1518,1519,1520,1521,1522],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1400,"description":1405},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[234,1395,1530],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1533,"title":1534,"body":1535,"category":234,"cover":235,"description":1539,"extension":236,"meta":1675,"navigation":101,"path":1676,"pinned":239,"publishedAt":240,"seo":1677,"slug":1678,"stem":1679,"summary":1680,"tags":1681,"updatedAt":240,"visible":101,"__hash__":1683},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1536,"toc":1665},[1537,1540,1542,1545,1547,1553,1559,1561,1576,1578,1581,1601,1603,1609,1611,1613,1626,1628,1642,1644,1655,1657,1659,1662],[10,1538,1539],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1541,16],{"id":16},[10,1543,1544],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1546,22],{"id":22},[10,1548,1549],{},[26,1550],{"alt":1551,"src":1552},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1554,1555,1556,1558],{},"终端收到 ",[34,1557,698],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1560,40],{"id":40},[42,1562,1563,1566,1569],{},[45,1564,1565],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,1567,1568],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,1570,1571,1572,1575],{},"检查 pip 时使用 ",[34,1573,1574],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1577,63],{"id":63},[10,1579,1580],{},"在 macOS 终端执行：",[68,1582,1583],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,1584,1585,1591],{"__ignoreMap":73},[77,1586,1587,1589],{"class":79,"line":80},[77,1588,698],{"class":607},[77,1590,611],{"class":610},[77,1592,1593,1595,1597,1599],{"class":79,"line":86},[77,1594,698],{"class":607},[77,1596,640],{"class":610},[77,1598,644],{"class":643},[77,1600,611],{"class":610},[10,1602,117],{},[68,1604,1607],{"className":1605,"code":1606,"language":123,"meta":73},[121],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1608,1606],{"__ignoreMap":73},[10,1610,128],{},[14,1612,131],{"id":131},[133,1614,1615,1621],{},[45,1616,1617,1620],{},[34,1618,1619],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,1622,1623,1625],{},[34,1624,706],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1627,182],{"id":182},[42,1629,1630,1636],{},[45,1631,1632,1633,1635],{},"看到系统已有 ",[34,1634,698],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,1637,1638,1639,1641],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1640,698],{},"，不修改系统自带工具。",[14,1643,200],{"id":200},[133,1645,1646,1652],{},[45,1647,945,1648,1651],{},[34,1649,1650],{},"which python3","，记录当前解释器路径。",[45,1653,1654],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1656,211],{},[14,1658,214],{"id":214},[10,1660,1661],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,1663,1664],{},"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":73,"searchDepth":86,"depth":86,"links":1666},[1667,1668,1669,1670,1671,1672,1673,1674],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1534,"description":1539},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[234,1682,1059],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1685,"title":1686,"body":1687,"category":234,"cover":235,"description":1852,"extension":236,"meta":1853,"navigation":101,"path":1854,"pinned":239,"publishedAt":240,"seo":1855,"slug":1856,"stem":1857,"summary":1858,"tags":1859,"updatedAt":240,"visible":101,"__hash__":1862},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1688,"toc":1842},[1689,1695,1697,1700,1702,1708,1711,1713,1737,1739,1741,1768,1770,1776,1778,1780,1798,1800,1814,1816,1830,1832,1834,1840],[10,1690,1691,1692,1694],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1693,1177],{}," 脚本。",[14,1696,16],{"id":16},[10,1698,1699],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1701,22],{"id":22},[10,1703,1704],{},[26,1705],{"alt":1706,"src":1707},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1709,1710],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1712,40],{"id":40},[42,1714,1715,1724,1731],{},[45,1716,1717,1718,1720,1721,60],{},"在终端输入 ",[34,1719,698],{}," 进入 REPL，提示符通常是 ",[34,1722,1723],{},">>>",[45,1725,1726,1727,1730],{},"输入 ",[34,1728,1729],{},"exit()"," 或按 Control-D 退出 REPL。",[45,1732,1733,1734,1736],{},"需要保存、复查或多次运行的代码应写入 ",[34,1735,1177],{}," 文件。",[14,1738,63],{"id":63},[10,1740,66],{},[68,1742,1746],{"className":1743,"code":1744,"language":1745,"meta":73,"style":73},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1747,1748,1753,1758,1763],{"__ignoreMap":73},[77,1749,1750],{"class":79,"line":80},[77,1751,1752],{},">>> 2 + 3\n",[77,1754,1755],{"class":79,"line":86},[77,1756,1757],{},"5\n",[77,1759,1760],{"class":79,"line":92},[77,1761,1762],{},">>> \"python\".upper()\n",[77,1764,1765],{"class":79,"line":98},[77,1766,1767],{},"'PYTHON'\n",[10,1769,117],{},[68,1771,1774],{"className":1772,"code":1773,"language":123,"meta":73},[121],"REPL 会直接显示表达式结果\n",[34,1775,1773],{"__ignoreMap":73},[10,1777,128],{},[14,1779,131],{"id":131},[133,1781,1782,1792],{},[45,1783,1784,1785,1788,1789,60],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1786,1787],{},"2 + 3"," 能直接看到 ",[34,1790,1791],{},"5",[45,1793,1794,1795,1797],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1796,1479],{}," 才会写到标准输出。",[14,1799,182],{"id":182},[42,1801,1802,1811],{},[45,1803,1804,1805,1807,1808,1810],{},"把提示符 ",[34,1806,1723],{}," 复制进 ",[34,1809,1177],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,1812,1813],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1815,200],{"id":200},[133,1817,1818,1824],{},[45,1819,1820,1821,60],{},"在 REPL 计算 ",[34,1822,1823],{},"12 * 8",[45,1825,1826,1827,1829],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1828,1479],{}," 时是否显示结果。",[10,1831,211],{},[14,1833,214],{"id":214},[10,1835,1836,1837,1839],{},"本篇目标是根据任务选择 REPL 或 ",[34,1838,1177],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,1841,221],{},{"title":73,"searchDepth":86,"depth":86,"links":1843},[1844,1845,1846,1847,1848,1849,1850,1851],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1686,"description":1852},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[234,1860,1861],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1864,"title":1865,"body":1866,"category":234,"cover":235,"description":1870,"extension":236,"meta":2041,"navigation":101,"path":2042,"pinned":239,"publishedAt":240,"seo":2043,"slug":2044,"stem":2045,"summary":2046,"tags":2047,"updatedAt":240,"visible":101,"__hash__":2050},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1867,"toc":2031},[1868,1871,1873,1876,1878,1884,1890,1892,1910,1912,1914,1959,1961,1967,1969,1971,1993,1995,2007,2009,2021,2023,2025,2028],[10,1869,1870],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1872,16],{"id":16},[10,1874,1875],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1877,22],{"id":22},[10,1879,1880],{},[26,1881],{"alt":1882,"src":1883},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1885,1886,1889],{},[34,1887,1888],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1891,40],{"id":40},[42,1893,1894,1897,1907],{},[45,1895,1896],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,1898,1899,1902,1903,1906],{},[34,1900,1901],{},"pwd"," 显示当前目录，",[34,1904,1905],{},"ls"," 显示目录里的文件。",[45,1908,1909],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1911,63],{"id":63},[10,1913,1580],{},[68,1915,1917],{"className":598,"code":1916,"language":600,"meta":73,"style":73},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1918,1919,1927,1934,1939,1953],{"__ignoreMap":73},[77,1920,1921,1924],{"class":79,"line":80},[77,1922,1923],{"class":607},"mkdir",[77,1925,1926],{"class":643}," python-study\n",[77,1928,1929,1932],{"class":79,"line":86},[77,1930,1931],{"class":610},"cd",[77,1933,1926],{"class":643},[77,1935,1936],{"class":79,"line":92},[77,1937,1938],{"class":610},"pwd\n",[77,1940,1941,1944,1947,1951],{"class":79,"line":98},[77,1942,1943],{"class":610},"printf",[77,1945,1946],{"class":643}," 'print(\"项目已经运行\")\\n'",[77,1948,1950],{"class":1949},"snl16"," >",[77,1952,1221],{"class":643},[77,1954,1955,1957],{"class":79,"line":105},[77,1956,698],{"class":607},[77,1958,1221],{"class":643},[10,1960,117],{},[68,1962,1965],{"className":1963,"code":1964,"language":123,"meta":73},[121],"项目已经运行\n",[34,1966,1964],{"__ignoreMap":73},[10,1968,128],{},[14,1970,131],{"id":131},[133,1972,1973,1984],{},[45,1974,1975,1977,1978,1980,1981,1983],{},[34,1976,1923],{}," 创建目录，",[34,1979,1931],{}," 改变终端当前目录，",[34,1982,1901],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,1985,1986,1988,1989,1992],{},[34,1987,1888],{}," 会在当前目录寻找 ",[34,1990,1991],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1994,182],{"id":182},[42,1996,1997,2004],{},[45,1998,1999,2000,175,2002,60],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,2001,1901],{},[34,2003,1905],{},[45,2005,2006],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2008,200],{"id":200},[133,2010,2011,2018],{},[45,2012,2013,2014,2017],{},"新建 ",[34,2015,2016],{},"lesson01.py"," 并输出课程编号。",[45,2019,2020],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2022,211],{},[14,2024,214],{"id":214},[10,2026,2027],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2029,2030],{},"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":73,"searchDepth":86,"depth":86,"links":2032},[2033,2034,2035,2036,2037,2038,2039,2040],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1865,"description":1870},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[234,2048,2049],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2052,"title":2053,"body":2054,"category":234,"cover":235,"description":2058,"extension":236,"meta":2206,"navigation":101,"path":2207,"pinned":239,"publishedAt":240,"seo":2208,"slug":2209,"stem":2210,"summary":2211,"tags":2212,"updatedAt":240,"visible":101,"__hash__":2215},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2055,"toc":2196},[2056,2059,2061,2064,2066,2072,2083,2085,2105,2107,2109,2129,2131,2137,2139,2141,2160,2162,2170,2172,2187,2189,2191,2194],[10,2057,2058],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2060,16],{"id":16},[10,2062,2063],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2065,22],{"id":22},[10,2067,2068],{},[26,2069],{"alt":2070,"src":2071},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2073,2074,2075,60,2077,2080,2081,60],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2076,1479],{},[34,2078,2079],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2082,1787],{},[14,2084,40],{"id":40},[42,2086,2087,2093,2102],{},[45,2088,2089,2092],{},[34,2090,2091],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,2094,2095,2098,2099,60],{},[34,2096,2097],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2100,2101],{},"12",[45,2103,2104],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2106,63],{"id":63},[10,2108,66],{},[68,2110,2112],{"className":70,"code":2111,"language":72,"meta":73,"style":73},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2113,2114,2119,2124],{"__ignoreMap":73},[77,2115,2116],{"class":79,"line":80},[77,2117,2118],{},"print(42)\n",[77,2120,2121],{"class":79,"line":86},[77,2122,2123],{},"print(7 + 5)\n",[77,2125,2126],{"class":79,"line":92},[77,2127,2128],{},"print(\"Python 基础课\")\n",[10,2130,117],{},[68,2132,2135],{"className":2133,"code":2134,"language":123,"meta":73},[121],"42\n12\nPython 基础课\n",[34,2136,2134],{"__ignoreMap":73},[10,2138,128],{},[14,2140,131],{"id":131},[133,2142,2143,2151],{},[45,2144,2145,2148,2149,60],{},[34,2146,2147],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2150,2101],{},[45,2152,2153,2155,2156,2159],{},[34,2154,1479],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2157,2158],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2161,182],{"id":182},[42,2163,2164,2167],{},[45,2165,2166],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,2168,2169],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2171,200],{"id":200},[133,2173,2174,2177],{},[45,2175,2176],{},"分别输出一个整数、一个小数和一段文本。",[45,2178,2179,2180,2182,2183,2186],{},"比较 ",[34,2181,2079],{}," 与 ",[34,2184,2185],{},"print(\"2 + 3\")"," 的结果。",[10,2188,211],{},[14,2190,214],{"id":214},[10,2192,2193],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2195,221],{},{"title":73,"searchDepth":86,"depth":86,"links":2197},[2198,2199,2200,2201,2202,2203,2204,2205],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2053,"description":2058},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[234,2213,2214],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2217,"title":2218,"body":2219,"category":234,"cover":235,"description":2223,"extension":236,"meta":2389,"navigation":101,"path":2390,"pinned":239,"publishedAt":240,"seo":2391,"slug":2392,"stem":2393,"summary":2394,"tags":2395,"updatedAt":240,"visible":101,"__hash__":2398},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2220,"toc":2379},[2221,2224,2226,2229,2231,2237,2240,2242,2267,2269,2271,2299,2301,2307,2309,2311,2335,2337,2353,2355,2370,2372,2374,2377],[10,2222,2223],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2225,16],{"id":16},[10,2227,2228],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2230,22],{"id":22},[10,2232,2233],{},[26,2234],{"alt":2235,"src":2236},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2238,2239],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2241,40],{"id":40},[42,2243,2244,2247,2257],{},[45,2245,2246],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,2248,2249,2250,2182,2253,2256],{},"变量名区分大小写，",[34,2251,2252],{},"score",[34,2254,2255],{},"Score"," 是两个名字。",[45,2258,2259,2260,141,2263,2266],{},"使用能表达含义的名称；不要用 ",[34,2261,2262],{},"list",[34,2264,2265],{},"str"," 等内置名称作为普通变量名。",[14,2268,63],{"id":63},[10,2270,66],{},[68,2272,2274],{"className":70,"code":2273,"language":72,"meta":73,"style":73},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2275,2276,2281,2286,2290,2295],{"__ignoreMap":73},[77,2277,2278],{"class":79,"line":80},[77,2279,2280],{},"score = 90\n",[77,2282,2283],{"class":79,"line":86},[77,2284,2285],{},"print(score)\n",[77,2287,2288],{"class":79,"line":92},[77,2289,102],{"emptyLinePlaceholder":101},[77,2291,2292],{"class":79,"line":98},[77,2293,2294],{},"score = 95\n",[77,2296,2297],{"class":79,"line":105},[77,2298,2285],{},[10,2300,117],{},[68,2302,2305],{"className":2303,"code":2304,"language":123,"meta":73},[121],"90\n95\n",[34,2306,2304],{"__ignoreMap":73},[10,2308,128],{},[14,2310,131],{"id":131},[133,2312,2313,2322],{},[45,2314,945,2315,2318,2319,2321],{},[34,2316,2317],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2320,2252],{}," 再绑定到它。",[45,2323,945,2324,2327,2328,2331,2332,60],{},[34,2325,2326],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2329,2330],{},"90"," 没有被改造成 ",[34,2333,2334],{},"95",[14,2336,182],{"id":182},[42,2338,2339,2342],{},[45,2340,2341],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,2343,2344,2345,141,2347,141,2349,2352],{},"使用 ",[34,2346,2262],{},[34,2348,2265],{},[34,2350,2351],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2354,200],{"id":200},[133,2356,2357,2367],{},[45,2358,2359,2360,175,2363,2366],{},"创建 ",[34,2361,2362],{},"course_name",[34,2364,2365],{},"lesson_count"," 两个变量并输出。",[45,2368,2369],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2371,211],{},[14,2373,214],{"id":214},[10,2375,2376],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2378,221],{},{"title":73,"searchDepth":86,"depth":86,"links":2380},[2381,2382,2383,2384,2385,2386,2387,2388],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2218,"description":2223},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[234,2396,2397],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2400,"title":2401,"body":2402,"category":234,"cover":235,"description":2406,"extension":236,"meta":2572,"navigation":101,"path":2573,"pinned":239,"publishedAt":240,"seo":2574,"slug":2575,"stem":2576,"summary":2577,"tags":2578,"updatedAt":240,"visible":101,"__hash__":2581},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2403,"toc":2562},[2404,2407,2409,2412,2414,2420,2423,2425,2454,2456,2458,2504,2506,2512,2514,2516,2530,2532,2543,2545,2553,2555,2557,2560],[10,2405,2406],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2408,16],{"id":16},[10,2410,2411],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2413,22],{"id":22},[10,2415,2416],{},[26,2417],{"alt":2418,"src":2419},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2421,2422],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2424,40],{"id":40},[42,2426,2427,2437,2451],{},[45,2428,2429,2432,2433,2436],{},[34,2430,2431],{},"int"," 表示整数，",[34,2434,2435],{},"float"," 表示浮点数。",[45,2438,2439,2442,2443,2446,2447,2450],{},[34,2440,2441],{},"\u002F"," 总是进行真除法；",[34,2444,2445],{},"\u002F\u002F"," 是向下取整除法，",[34,2448,2449],{},"%"," 得到余数。",[45,2452,2453],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2455,63],{"id":63},[10,2457,66],{},[68,2459,2461],{"className":70,"code":2460,"language":72,"meta":73,"style":73},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2462,2463,2468,2473,2478,2482,2487,2492,2498],{"__ignoreMap":73},[77,2464,2465],{"class":79,"line":80},[77,2466,2467],{},"price = 25\n",[77,2469,2470],{"class":79,"line":86},[77,2471,2472],{},"count = 4\n",[77,2474,2475],{"class":79,"line":92},[77,2476,2477],{},"discount = 0.9\n",[77,2479,2480],{"class":79,"line":98},[77,2481,102],{"emptyLinePlaceholder":101},[77,2483,2484],{"class":79,"line":105},[77,2485,2486],{},"total = price * count * discount\n",[77,2488,2489],{"class":79,"line":111},[77,2490,2491],{},"average = total \u002F count\n",[77,2493,2495],{"class":79,"line":2494},7,[77,2496,2497],{},"print(total)\n",[77,2499,2501],{"class":79,"line":2500},8,[77,2502,2503],{},"print(average)\n",[10,2505,117],{},[68,2507,2510],{"className":2508,"code":2509,"language":123,"meta":73},[121],"90.0\n22.5\n",[34,2511,2509],{"__ignoreMap":73},[10,2513,128],{},[14,2515,131],{"id":131},[133,2517,2518,2524],{},[45,2519,2520,2523],{},[34,2521,2522],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,2525,2526,2529],{},[34,2527,2528],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2531,182],{"id":182},[42,2533,2534,2540],{},[45,2535,2536,2537,60],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2538,2539],{},"decimal.Decimal",[45,2541,2542],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2544,200],{"id":200},[133,2546,2547,2550],{},[45,2548,2549],{},"计算 137 除以 10 的商和余数。",[45,2551,2552],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2554,211],{},[14,2556,214],{"id":214},[10,2558,2559],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2561,221],{},{"title":73,"searchDepth":86,"depth":86,"links":2563},[2564,2565,2566,2567,2568,2569,2570,2571],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2401,"description":2406},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[234,2579,2580],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2583,"title":2584,"body":2585,"category":234,"cover":235,"description":2589,"extension":236,"meta":2764,"navigation":101,"path":2765,"pinned":239,"publishedAt":240,"seo":2766,"slug":2767,"stem":2768,"summary":2769,"tags":2770,"updatedAt":240,"visible":101,"__hash__":2773},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2586,"toc":2752},[2587,2590,2592,2595,2597,2603,2613,2615,2626,2628,2630,2660,2662,2668,2670,2672,2702,2704,2707,2713,2716,2718,2726,2728,2743,2745,2747,2750],[10,2588,2589],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2591,16],{"id":16},[10,2593,2594],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2596,22],{"id":22},[10,2598,2599],{},[26,2600],{"alt":2601,"src":2602},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2604,2605,2606,2609,2610,60],{},"切片 ",[34,2607,2608],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2611,2612],{},"stop - start",[14,2614,40],{"id":40},[42,2616,2617,2620,2623],{},[45,2618,2619],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,2621,2622],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,2624,2625],{},"切片会创建新的字符串，不会修改原字符串。",[14,2627,63],{"id":63},[10,2629,66],{},[68,2631,2633],{"className":70,"code":2632,"language":72,"meta":73,"style":73},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2634,2635,2640,2645,2650,2655],{"__ignoreMap":73},[77,2636,2637],{"class":79,"line":80},[77,2638,2639],{},"language = \"Python\"\n",[77,2641,2642],{"class":79,"line":86},[77,2643,2644],{},"print(language[0])\n",[77,2646,2647],{"class":79,"line":92},[77,2648,2649],{},"print(language[-1])\n",[77,2651,2652],{"class":79,"line":98},[77,2653,2654],{},"print(language[0:3])\n",[77,2656,2657],{"class":79,"line":105},[77,2658,2659],{},"print(language + \" 3.14\")\n",[10,2661,117],{},[68,2663,2666],{"className":2664,"code":2665,"language":123,"meta":73},[121],"P\nn\nPyt\nPython 3.14\n",[34,2667,2665],{"__ignoreMap":73},[10,2669,128],{},[14,2671,131],{"id":131},[133,2673,2674,2688],{},[45,2675,2676,2677,2679,2680,2683,2684,2687],{},"字符串 ",[34,2678,234],{}," 的正索引从 ",[34,2681,2682],{},"P"," 的 0 开始，负索引从末尾 ",[34,2685,2686],{},"n"," 的 -1 开始。",[45,2689,2690,2693,2694,2697,2698,2701],{},[34,2691,2692],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2695,2696],{},"Pyt","；索引 3 的 ",[34,2699,2700],{},"h"," 不在结果中。",[157,2703,159],{"id":159},[10,2705,2706],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2708,2709],{},[26,2710],{"alt":2711,"src":2712},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2714,2715],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2717,182],{"id":182},[42,2719,2720,2723],{},[45,2721,2722],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,2724,2725],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2727,200],{"id":200},[133,2729,2730,2740],{},[45,2731,2732,2733,2736,2737,60],{},"从 ",[34,2734,2735],{},"\"programming\""," 中切出 ",[34,2738,2739],{},"\"gram\"",[45,2741,2742],{},"使用负索引取得字符串倒数第二个字符。",[10,2744,211],{},[14,2746,214],{"id":214},[10,2748,2749],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2751,221],{},{"title":73,"searchDepth":86,"depth":86,"links":2753},[2754,2755,2756,2757,2758,2761,2762,2763],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":2759},[2760],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2584,"description":2589},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[234,2771,2772],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2775,"title":2776,"body":2777,"category":234,"cover":235,"description":2781,"extension":236,"meta":2995,"navigation":101,"path":2996,"pinned":239,"publishedAt":240,"seo":2997,"slug":2998,"stem":2999,"summary":3000,"tags":3001,"updatedAt":240,"visible":101,"__hash__":3004},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2778,"toc":2983},[2779,2782,2784,2787,2789,2795,2805,2807,2840,2842,2844,2888,2890,2896,2898,2900,2921,2923,2926,2932,2940,2942,2956,2958,2974,2976,2978,2981],[10,2780,2781],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2783,16],{"id":16},[10,2785,2786],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2788,22],{"id":22},[10,2790,2791],{},[26,2792],{"alt":2793,"src":2794},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2796,2797,2798,1016,2801,2804],{},"比较表达式先产生 ",[34,2799,2800],{},"True",[34,2802,2803],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2806,40],{"id":40},[42,2808,2809,2823,2837],{},[45,2810,2811,2814,2815,2818,2819,2822],{},[34,2812,2813],{},"=="," 判断是否相等，",[34,2816,2817],{},"!="," 判断是否不等；单个 ",[34,2820,2821],{},"="," 是赋值。",[45,2824,2825,2828,2829,2832,2833,2836],{},[34,2826,2827],{},"and"," 要求两侧都为真，",[34,2830,2831],{},"or"," 只需一侧为真，",[34,2834,2835],{},"not"," 取反。",[45,2838,2839],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2841,63],{"id":63},[10,2843,66],{},[68,2845,2847],{"className":70,"code":2846,"language":72,"meta":73,"style":73},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[34,2848,2849,2854,2859,2863,2868,2873,2878,2883],{"__ignoreMap":73},[77,2850,2851],{"class":79,"line":80},[77,2852,2853],{},"age = 20\n",[77,2855,2856],{"class":79,"line":86},[77,2857,2858],{},"has_ticket = True\n",[77,2860,2861],{"class":79,"line":92},[77,2862,102],{"emptyLinePlaceholder":101},[77,2864,2865],{"class":79,"line":98},[77,2866,2867],{},"is_adult = age >= 18\n",[77,2869,2870],{"class":79,"line":105},[77,2871,2872],{},"can_enter = is_adult and has_ticket\n",[77,2874,2875],{"class":79,"line":111},[77,2876,2877],{},"print(is_adult)\n",[77,2879,2880],{"class":79,"line":2494},[77,2881,2882],{},"print(can_enter)\n",[77,2884,2885],{"class":79,"line":2500},[77,2886,2887],{},"print(not has_ticket)\n",[10,2889,117],{},[68,2891,2894],{"className":2892,"code":2893,"language":123,"meta":73},[121],"True\nTrue\nFalse\n",[34,2895,2893],{"__ignoreMap":73},[10,2897,128],{},[14,2899,131],{"id":131},[133,2901,2902,2912],{},[45,2903,2904,2907,2908,2911],{},[34,2905,2906],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2909,2910],{},"is_adult","，这一步没有任何分支跳转。",[45,2913,2914,2917,2918,2920],{},[34,2915,2916],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2919,2835],{}," 只对紧随其后的值取反。",[157,2922,159],{"id":159},[10,2924,2925],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2927,2928],{},[26,2929],{"alt":2930,"src":2931},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2933,2934,2936,2937,2939],{},[34,2935,2827],{}," 只有“真、真”得到真；",[34,2938,2831],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2941,182],{"id":182},[42,2943,2944,2953],{},[45,2945,2946,2947,2949,2950,2952],{},"用单个等号判断相等。",[34,2948,2821],{}," 是赋值，",[34,2951,2813],{}," 才是相等比较。",[45,2954,2955],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2957,200],{"id":200},[133,2959,2960,2967],{},[45,2961,2962,2963,2966],{},"判断数字 ",[34,2964,2965],{},"15"," 是否同时大于 10 且小于 20。",[45,2968,2969,2970,2973],{},"分别修改年龄和票据状态，记录 ",[34,2971,2972],{},"can_enter"," 的四种组合结果。",[10,2975,211],{},[14,2977,214],{"id":214},[10,2979,2980],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,2982,221],{},{"title":73,"searchDepth":86,"depth":86,"links":2984},[2985,2986,2987,2988,2989,2992,2993,2994],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":2990},[2991],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2776,"description":2781},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[234,3002,3003],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3006,"title":3007,"body":3008,"category":234,"cover":235,"description":3012,"extension":236,"meta":3180,"navigation":101,"path":3181,"pinned":239,"publishedAt":240,"seo":3182,"slug":3183,"stem":3184,"summary":3185,"tags":3186,"updatedAt":240,"visible":101,"__hash__":3188},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3009,"toc":3170},[3010,3013,3015,3018,3020,3026,3044,3046,3059,3061,3063,3097,3099,3105,3107,3109,3131,3133,3145,3147,3161,3163,3165,3168],[10,3011,3012],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3014,16],{"id":16},[10,3016,3017],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3019,22],{"id":22},[10,3021,3022],{},[26,3023],{"alt":3024,"src":3025},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3027,3028,3031,3032,3035,3036,3039,3040,3043],{},[34,3029,3030],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,3033,3034],{},"18","，程序首先得到的也是 ",[34,3037,3038],{},"\"18\"","，需要 ",[34,3041,3042],{},"int()"," 后才能按整数参与计算。",[14,3045,40],{"id":40},[42,3047,3048,3051,3056],{},[45,3049,3050],{},"提示文字应告诉用户需要输入什么。",[45,3052,3053,3055],{},[34,3054,3042],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,3057,3058],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3060,63],{"id":63},[10,3062,66],{},[68,3064,3066],{"className":70,"code":3065,"language":72,"meta":73,"style":73},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3067,3068,3073,3078,3083,3087,3092],{"__ignoreMap":73},[77,3069,3070],{"class":79,"line":80},[77,3071,3072],{},"name = input(\"请输入姓名：\")\n",[77,3074,3075],{"class":79,"line":86},[77,3076,3077],{},"age_text = input(\"请输入年龄：\")\n",[77,3079,3080],{"class":79,"line":92},[77,3081,3082],{},"age = int(age_text)\n",[77,3084,3085],{"class":79,"line":98},[77,3086,102],{"emptyLinePlaceholder":101},[77,3088,3089],{"class":79,"line":105},[77,3090,3091],{},"print(\"你好，\" + name)\n",[77,3093,3094],{"class":79,"line":111},[77,3095,3096],{},"print(age + 1)\n",[10,3098,117],{},[68,3100,3103],{"className":3101,"code":3102,"language":123,"meta":73},[121],"根据输入显示姓名，并输出下一年的年龄\n",[34,3104,3102],{"__ignoreMap":73},[10,3106,128],{},[14,3108,131],{"id":131},[133,3110,3111,3121],{},[45,3112,3113,3114,3116,3117,3120],{},"两次 ",[34,3115,3030],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3118,3119],{},"age_text"," 用来提醒这仍是文本。",[45,3122,3123,3126,3127,3130],{},[34,3124,3125],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3128,3129],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3132,182],{"id":182},[42,3134,3135,3142],{},[45,3136,3137,3138,3141],{},"直接计算 ",[34,3139,3140],{},"input(...) + 1","，忽略输入结果是字符串。",[45,3143,3144],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3146,200],{"id":200},[133,3148,3149,3152],{},[45,3150,3151],{},"接收两个整数并输出它们的和。",[45,3153,1726,3154,3157,3158,3160],{},[34,3155,3156],{},"18.5"," 给 ",[34,3159,3042],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3162,211],{},[14,3164,214],{"id":214},[10,3166,3167],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,3169,221],{},{"title":73,"searchDepth":86,"depth":86,"links":3171},[3172,3173,3174,3175,3176,3177,3178,3179],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3007,"description":3012},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[234,2351,3187],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3190,"title":3191,"body":3192,"category":234,"cover":235,"description":3196,"extension":236,"meta":3356,"navigation":101,"path":3357,"pinned":239,"publishedAt":240,"seo":3358,"slug":3359,"stem":3360,"summary":3361,"tags":3362,"updatedAt":240,"visible":101,"__hash__":3365},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3193,"toc":3346},[3194,3197,3199,3202,3204,3210,3217,3219,3233,3235,3237,3276,3278,3284,3286,3288,3307,3309,3324,3326,3337,3339,3341,3344],[10,3195,3196],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3198,16],{"id":16},[10,3200,3201],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3203,22],{"id":22},[10,3205,3206],{},[26,3207],{"alt":3208,"src":3209},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3211,3212,3213,3216],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3214,3215],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3218,40],{"id":40},[42,3220,3221,3224,3227],{},[45,3222,3223],{},"列表使用方括号，元素之间用逗号分隔。",[45,3225,3226],{},"列表可变，可以替换、追加和删除元素。",[45,3228,3229,3230,60],{},"访问不存在的索引会产生 ",[34,3231,3232],{},"IndexError",[14,3234,63],{"id":63},[10,3236,66],{},[68,3238,3240],{"className":70,"code":3239,"language":72,"meta":73,"style":73},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3241,3242,3247,3252,3256,3261,3266,3271],{"__ignoreMap":73},[77,3243,3244],{"class":79,"line":80},[77,3245,3246],{},"scores = [82, 90, 76]\n",[77,3248,3249],{"class":79,"line":86},[77,3250,3251],{},"print(scores[0])\n",[77,3253,3254],{"class":79,"line":92},[77,3255,102],{"emptyLinePlaceholder":101},[77,3257,3258],{"class":79,"line":98},[77,3259,3260],{},"scores[1] = 95\n",[77,3262,3263],{"class":79,"line":105},[77,3264,3265],{},"scores.append(88)\n",[77,3267,3268],{"class":79,"line":111},[77,3269,3270],{},"print(scores)\n",[77,3272,3273],{"class":79,"line":2494},[77,3274,3275],{},"print(len(scores))\n",[10,3277,117],{},[68,3279,3282],{"className":3280,"code":3281,"language":123,"meta":73},[121],"82\n[82, 95, 76, 88]\n4\n",[34,3283,3281],{"__ignoreMap":73},[10,3285,128],{},[14,3287,131],{"id":131},[133,3289,3290,3293],{},[45,3291,3292],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,3294,3295,3298,3299,3302,3303,3306],{},[34,3296,3297],{},"scores[1] = 95"," 替换第二个位置，",[34,3300,3301],{},"append(88)"," 在末尾增加新位置，",[34,3304,3305],{},"len()"," 因而从 3 变为 4。",[14,3308,182],{"id":182},[42,3310,3311,3321],{},[45,3312,3313,3314,3317,3318,60],{},"访问 ",[34,3315,3316],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3319,3320],{},"len(scores) - 1",[45,3322,3323],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3325,200],{"id":200},[133,3327,3328,3331],{},[45,3329,3330],{},"建立三项学习任务列表，再追加第四项。",[45,3332,3333,3334,3336],{},"修改第二项，并用 ",[34,3335,3305],{}," 检查元素数量。",[10,3338,211],{},[14,3340,214],{"id":214},[10,3342,3343],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,3345,221],{},{"title":73,"searchDepth":86,"depth":86,"links":3347},[3348,3349,3350,3351,3352,3353,3354,3355],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3191,"description":3196},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[234,3363,3364],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3367,"title":3368,"body":3369,"category":234,"cover":235,"description":3373,"extension":236,"meta":3514,"navigation":101,"path":3515,"pinned":239,"publishedAt":240,"seo":3516,"slug":3517,"stem":3518,"summary":3519,"tags":3520,"updatedAt":240,"visible":101,"__hash__":3522},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3370,"toc":3504},[3371,3374,3376,3379,3381,3387,3390,3392,3403,3405,3407,3441,3443,3449,3451,3453,3467,3469,3481,3483,3495,3497,3499,3502],[10,3372,3373],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3375,16],{"id":16},[10,3377,3378],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3380,22],{"id":22},[10,3382,3383],{},[26,3384],{"alt":3385,"src":3386},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3388,3389],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3391,40],{"id":40},[42,3393,3394,3397,3400],{},[45,3395,3396],{},"元组常用来表达固定数量、固定含义的一组值。",[45,3398,3399],{},"只有一个元素的元组必须保留尾随逗号。",[45,3401,3402],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3404,63],{"id":63},[10,3406,66],{},[68,3408,3410],{"className":70,"code":3409,"language":72,"meta":73,"style":73},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3411,3412,3417,3422,3427,3431,3436],{"__ignoreMap":73},[77,3413,3414],{"class":79,"line":80},[77,3415,3416],{},"point = (120, 80)\n",[77,3418,3419],{"class":79,"line":86},[77,3420,3421],{},"print(point[0])\n",[77,3423,3424],{"class":79,"line":92},[77,3425,3426],{},"print(point[1])\n",[77,3428,3429],{"class":79,"line":98},[77,3430,102],{"emptyLinePlaceholder":101},[77,3432,3433],{"class":79,"line":105},[77,3434,3435],{},"single = (5,)\n",[77,3437,3438],{"class":79,"line":111},[77,3439,3440],{},"print(single)\n",[10,3442,117],{},[68,3444,3447],{"className":3445,"code":3446,"language":123,"meta":73},[121],"120\n80\n(5,)\n",[34,3448,3446],{"__ignoreMap":73},[10,3450,128],{},[14,3452,131],{"id":131},[133,3454,3455,3461],{},[45,3456,3457,3460],{},[34,3458,3459],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,3462,3463,3466],{},[34,3464,3465],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3468,182],{"id":182},[42,3470,3471,3478],{},[45,3472,3473,3474,3477],{},"把 ",[34,3475,3476],{},"(5)"," 当作元组，实际它仍是整数。",[45,3479,3480],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3482,200],{"id":200},[133,3484,3485,3488],{},[45,3486,3487],{},"用元组表示宽度和高度。",[45,3489,2179,3490,2182,3492,3494],{},[34,3491,3476],{},[34,3493,3465],{}," 的类型。",[10,3496,211],{},[14,3498,214],{"id":214},[10,3500,3501],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,3503,221],{},{"title":73,"searchDepth":86,"depth":86,"links":3505},[3506,3507,3508,3509,3510,3511,3512,3513],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3368,"description":3373},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[234,3521,3364],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3524,"title":3525,"body":3526,"category":234,"cover":235,"description":3530,"extension":236,"meta":3685,"navigation":101,"path":3686,"pinned":239,"publishedAt":240,"seo":3687,"slug":3688,"stem":3689,"summary":3690,"tags":3691,"updatedAt":240,"visible":101,"__hash__":3693},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3527,"toc":3675},[3528,3531,3533,3536,3538,3544,3554,3556,3570,3572,3574,3608,3610,3616,3618,3620,3635,3637,3656,3658,3666,3668,3670,3673],[10,3529,3530],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3532,16],{"id":16},[10,3534,3535],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3537,22],{"id":22},[10,3539,3540],{},[26,3541],{"alt":3542,"src":3543},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3545,3546,3547,3550,3551,3553],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3548,3549],{},"student[\"score\"]"," 读取的是键 ",[34,3552,2252],{}," 对应的值，而不是“第几个元素”。",[14,3555,40],{"id":40},[42,3557,3558,3561,3567],{},[45,3559,3560],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,3562,2344,3563,3566],{},[34,3564,3565],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,3568,3569],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3571,63],{"id":63},[10,3573,66],{},[68,3575,3577],{"className":70,"code":3576,"language":72,"meta":73,"style":73},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3578,3579,3584,3589,3593,3598,3603],{"__ignoreMap":73},[77,3580,3581],{"class":79,"line":80},[77,3582,3583],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[77,3585,3586],{"class":79,"line":86},[77,3587,3588],{},"print(student[\"name\"])\n",[77,3590,3591],{"class":79,"line":92},[77,3592,102],{"emptyLinePlaceholder":101},[77,3594,3595],{"class":79,"line":98},[77,3596,3597],{},"student[\"score\"] = 95\n",[77,3599,3600],{"class":79,"line":105},[77,3601,3602],{},"student[\"city\"] = \"郑州\"\n",[77,3604,3605],{"class":79,"line":111},[77,3606,3607],{},"print(student)\n",[10,3609,117],{},[68,3611,3614],{"className":3612,"code":3613,"language":123,"meta":73},[121],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3615,3613],{"__ignoreMap":73},[10,3617,128],{},[14,3619,131],{"id":131},[133,3621,3622,3625],{},[45,3623,3624],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,3626,3627,3628,3630,3631,3634],{},"给已有键 ",[34,3629,2252],{}," 赋值会更新映射，给新键 ",[34,3632,3633],{},"city"," 赋值会增加映射。",[14,3636,182],{"id":182},[42,3638,3639,3646],{},[45,3640,3641,3642,3645],{},"按位置理解字典并尝试 ",[34,3643,3644],{},"student[0]","，而实际键是字符串。",[45,3647,3648,3649,3652,3653,60],{},"直接读取不确定存在的键并忽略 ",[34,3650,3651],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3654,3655],{},"get()",[14,3657,200],{"id":200},[133,3659,3660,3663],{},[45,3661,3662],{},"建立一本书的标题、作者和页数字典。",[45,3664,3665],{},"添加分类键，再修改页数。",[10,3667,211],{},[14,3669,214],{"id":214},[10,3671,3672],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,3674,221],{},{"title":73,"searchDepth":86,"depth":86,"links":3676},[3677,3678,3679,3680,3681,3682,3683,3684],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3525,"description":3530},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[234,3692,3364],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3695,"title":3696,"body":3697,"category":234,"cover":235,"description":3701,"extension":236,"meta":3850,"navigation":101,"path":3851,"pinned":239,"publishedAt":240,"seo":3852,"slug":3853,"stem":3854,"summary":3855,"tags":3856,"updatedAt":240,"visible":101,"__hash__":3858},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3698,"toc":3840},[3699,3702,3704,3707,3709,3715,3718,3720,3739,3741,3743,3777,3779,3785,3787,3789,3804,3806,3818,3820,3831,3833,3835,3838],[10,3700,3701],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3703,16],{"id":16},[10,3705,3706],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3708,22],{"id":22},[10,3710,3711],{},[26,3712],{"alt":3713,"src":3714},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3716,3717],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3719,40],{"id":40},[42,3721,3722,3725,3728],{},[45,3723,3724],{},"集合中的元素不重复。",[45,3726,3727],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,3729,3730,3731,3734,3735,3738],{},"创建空集合必须写 ",[34,3732,3733],{},"set()","；",[34,3736,3737],{},"{}"," 创建的是空字典。",[14,3740,63],{"id":63},[10,3742,66],{},[68,3744,3746],{"className":70,"code":3745,"language":72,"meta":73,"style":73},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3747,3748,3753,3758,3762,3767,3772],{"__ignoreMap":73},[77,3749,3750],{"class":79,"line":80},[77,3751,3752],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[77,3754,3755],{"class":79,"line":86},[77,3756,3757],{},"right = {\"Python\", \"Docker\"}\n",[77,3759,3760],{"class":79,"line":92},[77,3761,102],{"emptyLinePlaceholder":101},[77,3763,3764],{"class":79,"line":98},[77,3765,3766],{},"print(left & right)\n",[77,3768,3769],{"class":79,"line":105},[77,3770,3771],{},"print(left | right)\n",[77,3773,3774],{"class":79,"line":111},[77,3775,3776],{},"print(\"Git\" in left)\n",[10,3778,117],{},[68,3780,3783],{"className":3781,"code":3782,"language":123,"meta":73},[121],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3784,3782],{"__ignoreMap":73},[10,3786,128],{},[14,3788,131],{"id":131},[133,3790,3791,3794],{},[45,3792,3793],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,3795,3796,3799,3800,3803],{},[34,3797,3798],{},"&"," 计算交集，",[34,3801,3802],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3805,182],{"id":182},[42,3807,3808,3815],{},[45,3809,2344,3810,3812,3813,60],{},[34,3811,3737],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3814,3733],{},[45,3816,3817],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3819,200],{"id":200},[133,3821,3822,3828],{},[45,3823,3824,3825,3827],{},"把包含重复标签的列表交给 ",[34,3826,3733],{}," 去重。",[45,3829,3830],{},"计算两组课程标签的交集和差集。",[10,3832,211],{},[14,3834,214],{"id":214},[10,3836,3837],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,3839,221],{},{"title":73,"searchDepth":86,"depth":86,"links":3841},[3842,3843,3844,3845,3846,3847,3848,3849],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3696,"description":3701},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[234,3857,3364],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3860,"title":3861,"body":3862,"category":234,"cover":235,"description":3866,"extension":236,"meta":4064,"navigation":101,"path":4065,"pinned":239,"publishedAt":240,"seo":4066,"slug":4067,"stem":4068,"summary":4069,"tags":4070,"updatedAt":240,"visible":101,"__hash__":4073},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3863,"toc":4052},[3864,3867,3869,3872,3874,3880,3890,3892,3909,3911,3913,3963,3965,3971,3973,3975,3997,3999,4002,4008,4011,4013,4026,4028,4043,4045,4047,4050],[10,3865,3866],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3868,16],{"id":16},[10,3870,3871],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3873,22],{"id":22},[10,3875,3876],{},[26,3877],{"alt":3878,"src":3879},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3881,3882,3885,3886,3889],{},[34,3883,3884],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3887,3888],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3891,40],{"id":40},[42,3893,3894,3903,3906],{},[45,3895,3896,3898,3899,3902],{},[34,3897,2813],{}," 比较内容是否相等，",[34,3900,3901],{},"is"," 比较是否为同一个对象。",[45,3904,3905],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,3907,3908],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3910,63],{"id":63},[10,3912,66],{},[68,3914,3916],{"className":70,"code":3915,"language":72,"meta":73,"style":73},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3917,3918,3923,3928,3933,3937,3942,3947,3952,3957],{"__ignoreMap":73},[77,3919,3920],{"class":79,"line":80},[77,3921,3922],{},"tasks = [\"变量\", \"字符串\"]\n",[77,3924,3925],{"class":79,"line":86},[77,3926,3927],{},"shared = tasks\n",[77,3929,3930],{"class":79,"line":92},[77,3931,3932],{},"backup = tasks.copy()\n",[77,3934,3935],{"class":79,"line":98},[77,3936,102],{"emptyLinePlaceholder":101},[77,3938,3939],{"class":79,"line":105},[77,3940,3941],{},"tasks.append(\"列表\")\n",[77,3943,3944],{"class":79,"line":111},[77,3945,3946],{},"print(shared)\n",[77,3948,3949],{"class":79,"line":2494},[77,3950,3951],{},"print(backup)\n",[77,3953,3954],{"class":79,"line":2500},[77,3955,3956],{},"print(tasks is shared)\n",[77,3958,3960],{"class":79,"line":3959},9,[77,3961,3962],{},"print(tasks is backup)\n",[10,3964,117],{},[68,3966,3969],{"className":3967,"code":3968,"language":123,"meta":73},[121],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3970,3968],{"__ignoreMap":73},[10,3972,128],{},[14,3974,131],{"id":131},[133,3976,3977,3983],{},[45,3978,3979,3982],{},[34,3980,3981],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,3984,3985,3988,3989,3992,3993,3996],{},[34,3986,3987],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3990,3991],{},"shared"," 能观察到变化，",[34,3994,3995],{},"backup"," 不会。",[157,3998,159],{"id":159},[10,4000,4001],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4003,4004],{},[26,4005],{"alt":4006,"src":4007},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4009,4010],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4012,182],{"id":182},[42,4014,4015,4023],{},[45,4016,4017,4018,4020,4021,60],{},"用 ",[34,4019,2813],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,4022,3901],{},[45,4024,4025],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4027,200],{"id":200},[133,4029,4030,4033],{},[45,4031,4032],{},"让两个变量引用同一个字典并修改其中一个。",[45,4034,2344,4035,4038,4039,175,4041,60],{},[34,4036,4037],{},"copy()"," 创建外层副本，再比较 ",[34,4040,3901],{},[34,4042,2813],{},[10,4044,211],{},[14,4046,214],{"id":214},[10,4048,4049],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,4051,221],{},{"title":73,"searchDepth":86,"depth":86,"links":4053},[4054,4055,4056,4057,4058,4061,4062,4063],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4059},[4060],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3861,"description":3866},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[234,4071,4072],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4075,"title":4076,"body":4077,"category":234,"cover":235,"description":4081,"extension":236,"meta":4294,"navigation":101,"path":4295,"pinned":239,"publishedAt":240,"seo":4296,"slug":4297,"stem":4298,"summary":4299,"tags":4300,"updatedAt":240,"visible":101,"__hash__":4302},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4078,"toc":4281},[4079,4082,4084,4087,4089,4095,4105,4107,4118,4120,4122,4175,4177,4183,4185,4187,4205,4207,4210,4216,4224,4227,4230,4236,4242,4244,4262,4264,4272,4274,4276,4279],[10,4080,4081],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4083,16],{"id":16},[10,4085,4086],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4088,22],{"id":22},[10,4090,4091],{},[26,4092],{"alt":4093,"src":4094},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4096,4097,141,4099,141,4102,4104],{},[34,4098,1163],{},[34,4100,4101],{},"elif",[34,4103,1166],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4106,40],{"id":40},[42,4108,4109,4112,4115],{},[45,4110,4111],{},"冒号表示接下来开始一个代码块。",[45,4113,4114],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,4116,4117],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4119,63],{"id":63},[10,4121,66],{},[68,4123,4125],{"className":70,"code":4124,"language":72,"meta":73,"style":73},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4126,4127,4132,4136,4141,4146,4151,4156,4160,4165,4169],{"__ignoreMap":73},[77,4128,4129],{"class":79,"line":80},[77,4130,4131],{},"score = int(input(\"请输入分数：\"))\n",[77,4133,4134],{"class":79,"line":86},[77,4135,102],{"emptyLinePlaceholder":101},[77,4137,4138],{"class":79,"line":92},[77,4139,4140],{},"if score >= 90:\n",[77,4142,4143],{"class":79,"line":98},[77,4144,4145],{},"    level = \"优秀\"\n",[77,4147,4148],{"class":79,"line":105},[77,4149,4150],{},"elif score >= 60:\n",[77,4152,4153],{"class":79,"line":111},[77,4154,4155],{},"    level = \"合格\"\n",[77,4157,4158],{"class":79,"line":2494},[77,4159,1153],{},[77,4161,4162],{"class":79,"line":2500},[77,4163,4164],{},"    level = \"需要继续学习\"\n",[77,4166,4167],{"class":79,"line":3959},[77,4168,102],{"emptyLinePlaceholder":101},[77,4170,4172],{"class":79,"line":4171},10,[77,4173,4174],{},"print(level)\n",[10,4176,117],{},[68,4178,4181],{"className":4179,"code":4180,"language":123,"meta":73},[121],"输入 85 时输出：合格\n",[34,4182,4180],{"__ignoreMap":73},[10,4184,128],{},[14,4186,131],{"id":131},[133,4188,4189,4196],{},[45,4190,4191,4192,4195],{},"输入先转换为整数，程序从 ",[34,4193,4194],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,4197,4198,4201,4202,4204],{},[34,4199,4200],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4203,1166],{}," 被跳过；最终三个分支只会选择一个。",[157,4206,159],{"id":159},[10,4208,4209],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4211,4212],{},[26,4213],{"alt":4214,"src":4215},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4217,4218,4220,4221,4223],{},[34,4219,4194],{}," 必须放在 ",[34,4222,4200],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[157,4225,159],{"id":4226},"再看一个具体细节-1",[10,4228,4229],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4231,4232],{},[26,4233],{"alt":4234,"src":4235},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4237,4238,4239,4241],{},"同一缩进层级属于同一个代码块；回到 ",[34,4240,1163],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4243,182],{"id":182},[42,4245,4246,4252],{},[45,4247,4248,4249,4251],{},"先写 ",[34,4250,4200],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,4253,4254,4255,4257,4258,4261],{},"混用多个独立 ",[34,4256,1163],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4259,4260],{},"if\u002Felif\u002Felse"," 链。",[14,4263,200],{"id":200},[133,4265,4266,4269],{},[45,4267,4268],{},"根据温度输出“冷、适中、热”三个等级。",[45,4270,4271],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4273,211],{},[14,4275,214],{"id":214},[10,4277,4278],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,4280,221],{},{"title":73,"searchDepth":86,"depth":86,"links":4282},[4283,4284,4285,4286,4287,4291,4292,4293],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4288},[4289,4290],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4076,"description":4081},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[234,1163,4301],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4304,"title":4305,"body":4306,"category":234,"cover":235,"description":4310,"extension":236,"meta":4475,"navigation":101,"path":4476,"pinned":239,"publishedAt":240,"seo":4477,"slug":4478,"stem":4479,"summary":4480,"tags":4481,"updatedAt":240,"visible":101,"__hash__":4483},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4307,"toc":4463},[4308,4311,4313,4316,4318,4324,4330,4332,4347,4349,4351,4389,4391,4397,4399,4401,4415,4417,4420,4426,4432,4434,4442,4444,4454,4456,4458,4461],[10,4309,4310],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4312,16],{"id":16},[10,4314,4315],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4317,22],{"id":22},[10,4319,4320],{},[26,4321],{"alt":4322,"src":4323},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4325,4326,4329],{},[34,4327,4328],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4331,40],{"id":40},[42,4333,4334,4337,4340],{},[45,4335,4336],{},"进入循环前先准备参与条件判断的状态。",[45,4338,4339],{},"循环体中必须有机会让条件变为假。",[45,4341,4342,4343,4346],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4344,4345],{},"for"," 通常更直接。",[14,4348,63],{"id":63},[10,4350,66],{},[68,4352,4354],{"className":70,"code":4353,"language":72,"meta":73,"style":73},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4355,4356,4361,4365,4370,4375,4380,4384],{"__ignoreMap":73},[77,4357,4358],{"class":79,"line":80},[77,4359,4360],{},"count = 1\n",[77,4362,4363],{"class":79,"line":86},[77,4364,102],{"emptyLinePlaceholder":101},[77,4366,4367],{"class":79,"line":92},[77,4368,4369],{},"while count \u003C= 3:\n",[77,4371,4372],{"class":79,"line":98},[77,4373,4374],{},"    print(\"第\", count, \"次练习\")\n",[77,4376,4377],{"class":79,"line":105},[77,4378,4379],{},"    count = count + 1\n",[77,4381,4382],{"class":79,"line":111},[77,4383,102],{"emptyLinePlaceholder":101},[77,4385,4386],{"class":79,"line":2494},[77,4387,4388],{},"print(\"练习结束\")\n",[10,4390,117],{},[68,4392,4395],{"className":4393,"code":4394,"language":123,"meta":73},[121],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4396,4394],{"__ignoreMap":73},[10,4398,128],{},[14,4400,131],{"id":131},[133,4402,4403,4409],{},[45,4404,4405,4406,4408],{},"进入循环前 ",[34,4407,144],{}," 为 1，每轮开头判断它是否仍小于等于 3。",[45,4410,4411,4412,4414],{},"循环体末尾把 ",[34,4413,144],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[157,4416,159],{"id":159},[10,4418,4419],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4421,4422],{},[26,4423],{"alt":4424,"src":4425},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4427,4428,4429,4431],{},"第4次检查时 ",[34,4430,144],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4433,182],{"id":182},[42,4435,4436,4439],{},[45,4437,4438],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,4440,4441],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4443,200],{"id":200},[133,4445,4446,4451],{},[45,4447,2344,4448,4450],{},[34,4449,4328],{}," 输出 1 到 5。",[45,4452,4453],{},"计算 1 到 10 的累加和。",[10,4455,211],{},[14,4457,214],{"id":214},[10,4459,4460],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,4462,221],{},{"title":73,"searchDepth":86,"depth":86,"links":4464},[4465,4466,4467,4468,4469,4472,4473,4474],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":4470},[4471],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4305,"description":4310},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[234,4328,4482],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4485,"title":4486,"body":4487,"category":234,"cover":235,"description":4491,"extension":236,"meta":4639,"navigation":101,"path":4640,"pinned":239,"publishedAt":240,"seo":4641,"slug":4642,"stem":4643,"summary":4644,"tags":4645,"updatedAt":240,"visible":101,"__hash__":4647},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4488,"toc":4629},[4489,4492,4494,4497,4499,4505,4510,4512,4526,4528,4530,4568,4570,4576,4578,4580,4597,4599,4607,4609,4620,4622,4624,4627],[10,4490,4491],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4493,16],{"id":16},[10,4495,4496],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4498,22],{"id":22},[10,4500,4501],{},[26,4502],{"alt":4503,"src":4504},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4506,4507,4509],{},[34,4508,4345],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4511,40],{"id":40},[42,4513,4514,4520,4523],{},[45,4515,4516,4519],{},[34,4517,4518],{},"range(1, 4)"," 包含 1，不包含 4。",[45,4521,4522],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,4524,4525],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4527,63],{"id":63},[10,4529,66],{},[68,4531,4533],{"className":70,"code":4532,"language":72,"meta":73,"style":73},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4534,4535,4540,4544,4549,4554,4558,4563],{"__ignoreMap":73},[77,4536,4537],{"class":79,"line":80},[77,4538,4539],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[77,4541,4542],{"class":79,"line":86},[77,4543,102],{"emptyLinePlaceholder":101},[77,4545,4546],{"class":79,"line":92},[77,4547,4548],{},"for course in courses:\n",[77,4550,4551],{"class":79,"line":98},[77,4552,4553],{},"    print(course)\n",[77,4555,4556],{"class":79,"line":105},[77,4557,102],{"emptyLinePlaceholder":101},[77,4559,4560],{"class":79,"line":111},[77,4561,4562],{},"for number in range(1, 4):\n",[77,4564,4565],{"class":79,"line":2494},[77,4566,4567],{},"    print(number)\n",[10,4569,117],{},[68,4571,4574],{"className":4572,"code":4573,"language":123,"meta":73},[121],"变量\n字符串\n列表\n1\n2\n3\n",[34,4575,4573],{"__ignoreMap":73},[10,4577,128],{},[14,4579,131],{"id":131},[133,4581,4582,4592],{},[45,4583,4584,4585,4587,4588,4591],{},"第一个 ",[34,4586,4345],{}," 依次从列表取得字符串，循环变量 ",[34,4589,4590],{},"course"," 每轮重新绑定。",[45,4593,4594,4596],{},[34,4595,4518],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4598,182],{"id":182},[42,4600,4601,4604],{},[45,4602,4603],{},"只需要元素却手工维护索引，增加越界风险。",[45,4605,4606],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4608,200],{"id":200},[133,4610,4611,4614],{},[45,4612,4613],{},"逐项输出一个字符串中的字符。",[45,4615,2344,4616,4619],{},[34,4617,4618],{},"range()"," 输出 2、4、6、8。",[10,4621,211],{},[14,4623,214],{"id":214},[10,4625,4626],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,4628,221],{},{"title":73,"searchDepth":86,"depth":86,"links":4630},[4631,4632,4633,4634,4635,4636,4637,4638],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4486,"description":4491},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[234,4345,4646],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4649,"title":4650,"body":4651,"category":234,"cover":235,"description":4655,"extension":236,"meta":4829,"navigation":101,"path":4830,"pinned":239,"publishedAt":240,"seo":4831,"slug":4832,"stem":4833,"summary":4834,"tags":4835,"updatedAt":240,"visible":101,"__hash__":4836},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4652,"toc":4819},[4653,4656,4658,4661,4663,4669,4679,4681,4700,4702,4704,4756,4758,4764,4766,4768,4782,4784,4800,4802,4810,4812,4814,4817],[10,4654,4655],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4657,16],{"id":16},[10,4659,4660],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4662,22],{"id":22},[10,4664,4665],{},[26,4666],{"alt":4667,"src":4668},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4670,4671,4674,4675,4678],{},[34,4672,4673],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4676,4677],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4680,40],{"id":40},[42,4682,4683,4686,4694],{},[45,4684,4685],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,4687,4688,4690,4691,4693],{},[34,4689,4673],{}," 前要确认不会跳过 ",[34,4692,4328],{}," 循环中的状态更新。",[45,4695,4696,4697,4699],{},"多层嵌套中 ",[34,4698,4677],{}," 只结束它所在的最内层循环。",[14,4701,63],{"id":63},[10,4703,66],{},[68,4705,4707],{"className":70,"code":4706,"language":72,"meta":73,"style":73},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4708,4709,4714,4718,4723,4728,4733,4738,4743,4747,4751],{"__ignoreMap":73},[77,4710,4711],{"class":79,"line":80},[77,4712,4713],{},"numbers = [3, -1, 0, 8, 12]\n",[77,4715,4716],{"class":79,"line":86},[77,4717,102],{"emptyLinePlaceholder":101},[77,4719,4720],{"class":79,"line":92},[77,4721,4722],{},"for number in numbers:\n",[77,4724,4725],{"class":79,"line":98},[77,4726,4727],{},"    if number \u003C 0:\n",[77,4729,4730],{"class":79,"line":105},[77,4731,4732],{},"        continue\n",[77,4734,4735],{"class":79,"line":111},[77,4736,4737],{},"    if number == 0:\n",[77,4739,4740],{"class":79,"line":2494},[77,4741,4742],{},"        break\n",[77,4744,4745],{"class":79,"line":2500},[77,4746,4567],{},[77,4748,4749],{"class":79,"line":3959},[77,4750,102],{"emptyLinePlaceholder":101},[77,4752,4753],{"class":79,"line":4171},[77,4754,4755],{},"print(\"循环结束\")\n",[10,4757,117],{},[68,4759,4762],{"className":4760,"code":4761,"language":123,"meta":73},[121],"3\n循环结束\n",[34,4763,4761],{"__ignoreMap":73},[10,4765,128],{},[14,4767,131],{"id":131},[133,4769,4770,4776],{},[45,4771,4772,4773,4775],{},"遇到 -1 时 ",[34,4774,4673],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,4777,4778,4779,4781],{},"遇到 0 时 ",[34,4780,4677],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4783,182],{"id":182},[42,4785,4786,4791],{},[45,4787,3473,4788,4790],{},[34,4789,4673],{}," 当作结束循环，实际它只跳到下一轮。",[45,4792,4793,4794,4796,4797,4799],{},"在 ",[34,4795,4328],{}," 中把状态更新放在可能被 ",[34,4798,4673],{}," 跳过的位置，造成无限循环。",[14,4801,200],{"id":200},[133,4803,4804,4807],{},[45,4805,4806],{},"跳过列表中的空字符串并输出其他内容。",[45,4808,4809],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4811,211],{},[14,4813,214],{"id":214},[10,4815,4816],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,4818,221],{},{"title":73,"searchDepth":86,"depth":86,"links":4820},[4821,4822,4823,4824,4825,4826,4827,4828],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4650,"description":4655},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[234,4677,4673],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4838,"title":4839,"body":4840,"category":234,"cover":235,"description":4844,"extension":236,"meta":5015,"navigation":101,"path":5016,"pinned":239,"publishedAt":240,"seo":5017,"slug":5018,"stem":5019,"summary":5020,"tags":5021,"updatedAt":240,"visible":101,"__hash__":5024},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4841,"toc":5003},[4842,4845,4847,4850,4852,4858,4861,4863,4887,4889,4891,4925,4927,4933,4935,4937,4954,4956,4959,4965,4968,4970,4984,4986,4994,4996,4998,5001],[10,4843,4844],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4846,16],{"id":16},[10,4848,4849],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4851,22],{"id":22},[10,4853,4854],{},[26,4855],{"alt":4856,"src":4857},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4859,4860],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4862,40],{"id":40},[42,4864,4865,4868,4871],{},[45,4866,4867],{},"每增加一层嵌套，阅读成本都会上升。",[45,4869,4870],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,4872,4873,4874,141,4877,4880,4881,141,4884,60],{},"变量名使用 ",[34,4875,4876],{},"row",[34,4878,4879],{},"cell"," 等层级含义，避免全部写成 ",[34,4882,4883],{},"i",[34,4885,4886],{},"j",[14,4888,63],{"id":63},[10,4890,66],{},[68,4892,4894],{"className":70,"code":4893,"language":72,"meta":73,"style":73},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4895,4896,4901,4905,4910,4915,4920],{"__ignoreMap":73},[77,4897,4898],{"class":79,"line":80},[77,4899,4900],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[77,4902,4903],{"class":79,"line":86},[77,4904,102],{"emptyLinePlaceholder":101},[77,4906,4907],{"class":79,"line":92},[77,4908,4909],{},"for row in table:\n",[77,4911,4912],{"class":79,"line":98},[77,4913,4914],{},"    for cell in row:\n",[77,4916,4917],{"class":79,"line":105},[77,4918,4919],{},"        print(cell)\n",[77,4921,4922],{"class":79,"line":111},[77,4923,4924],{},"    print(\"一行结束\")\n",[10,4926,117],{},[68,4928,4931],{"className":4929,"code":4930,"language":123,"meta":73},[121],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4932,4930],{"__ignoreMap":73},[10,4934,128],{},[14,4936,131],{"id":131},[133,4938,4939,4951],{},[45,4940,4941,4942,4944,4945,175,4948,60],{},"外层变量 ",[34,4943,4876],{}," 先引用第一行列表，内层才依次处理 ",[34,4946,4947],{},"A1",[34,4949,4950],{},"A2",[45,4952,4953],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[157,4955,159],{"id":159},[10,4957,4958],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4960,4961],{},[26,4962],{"alt":4963,"src":4964},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4966,4967],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4969,182],{"id":182},[42,4971,4972,4981],{},[45,4973,4974,4975,1016,4978,4980],{},"把两层循环变量都叫 ",[34,4976,4977],{},"item",[34,4979,4883],{},"，难以确认当前层级。",[45,4982,4983],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4985,200],{"id":200},[133,4987,4988,4991],{},[45,4989,4990],{},"打印一个 2×3 数字表。",[45,4992,4993],{},"在内层增加条件，只输出大于 3 的元素。",[10,4995,211],{},[14,4997,214],{"id":214},[10,4999,5000],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,5002,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5004},[5005,5006,5007,5008,5009,5012,5013,5014],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5010},[5011],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4839,"description":4844},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[234,5022,5023],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5026,"title":5027,"body":5028,"category":234,"cover":235,"description":5032,"extension":236,"meta":5170,"navigation":101,"path":5171,"pinned":239,"publishedAt":240,"seo":5172,"slug":5173,"stem":5174,"summary":5175,"tags":5176,"updatedAt":240,"visible":101,"__hash__":5179},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5029,"toc":5160},[5030,5033,5035,5038,5040,5046,5049,5051,5062,5064,5066,5104,5106,5112,5114,5116,5128,5130,5141,5143,5151,5153,5155,5158],[10,5031,5032],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5034,16],{"id":16},[10,5036,5037],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5039,22],{"id":22},[10,5041,5042],{},[26,5043],{"alt":5044,"src":5045},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5047,5048],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5050,40],{"id":40},[42,5052,5053,5056,5059],{},[45,5054,5055],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,5057,5058],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,5060,5061],{},"推导式创建新列表，不修改输入列表。",[14,5063,63],{"id":63},[10,5065,66],{},[68,5067,5069],{"className":70,"code":5068,"language":72,"meta":73,"style":73},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,5070,5071,5076,5080,5085,5090,5094,5099],{"__ignoreMap":73},[77,5072,5073],{"class":79,"line":80},[77,5074,5075],{},"numbers = [1, 2, 3, 4, 5]\n",[77,5077,5078],{"class":79,"line":86},[77,5079,102],{"emptyLinePlaceholder":101},[77,5081,5082],{"class":79,"line":92},[77,5083,5084],{},"squares = [number * number for number in numbers]\n",[77,5086,5087],{"class":79,"line":98},[77,5088,5089],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[77,5091,5092],{"class":79,"line":105},[77,5093,102],{"emptyLinePlaceholder":101},[77,5095,5096],{"class":79,"line":111},[77,5097,5098],{},"print(squares)\n",[77,5100,5101],{"class":79,"line":2494},[77,5102,5103],{},"print(even_squares)\n",[10,5105,117],{},[68,5107,5110],{"className":5108,"code":5109,"language":123,"meta":73},[121],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5111,5109],{"__ignoreMap":73},[10,5113,128],{},[14,5115,131],{"id":131},[133,5117,5118,5121],{},[45,5119,5120],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,5122,5123,5124,5127],{},"第二条先用 ",[34,5125,5126],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5129,182],{"id":182},[42,5131,5132,5138],{},[45,5133,5134,5135,5137],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5136,4345],{}," 开始找输入。",[45,5139,5140],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5142,200],{"id":200},[133,5144,5145,5148],{},[45,5146,5147],{},"把字符串列表转换为长度列表。",[45,5149,5150],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5152,211],{},[14,5154,214],{"id":214},[10,5156,5157],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,5159,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5161},[5162,5163,5164,5165,5166,5167,5168,5169],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5027,"description":5032},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[234,5177,5178],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5181,"title":5182,"body":5183,"category":234,"cover":235,"description":5187,"extension":236,"meta":5330,"navigation":101,"path":5331,"pinned":239,"publishedAt":240,"seo":5332,"slug":5333,"stem":5334,"summary":5335,"tags":5336,"updatedAt":240,"visible":101,"__hash__":5339},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5184,"toc":5320},[5185,5188,5190,5193,5195,5201,5204,5206,5217,5219,5221,5260,5262,5268,5270,5272,5287,5289,5297,5299,5311,5313,5315,5318],[10,5186,5187],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5189,16],{"id":16},[10,5191,5192],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5194,22],{"id":22},[10,5196,5197],{},[26,5198],{"alt":5199,"src":5200},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5202,5203],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5205,40],{"id":40},[42,5207,5208,5211,5214],{},[45,5209,5210],{},"函数名描述动作，使用小写字母和下划线。",[45,5212,5213],{},"函数定义要先执行，之后才能调用。",[45,5215,5216],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5218,63],{"id":63},[10,5220,66],{},[68,5222,5224],{"className":70,"code":5223,"language":72,"meta":73,"style":73},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5225,5226,5231,5236,5241,5245,5250,5255],{"__ignoreMap":73},[77,5227,5228],{"class":79,"line":80},[77,5229,5230],{},"def show_progress():\n",[77,5232,5233],{"class":79,"line":86},[77,5234,5235],{},"    print(\"正在学习函数\")\n",[77,5237,5238],{"class":79,"line":92},[77,5239,5240],{},"    print(\"本节完成 50%\")\n",[77,5242,5243],{"class":79,"line":98},[77,5244,102],{"emptyLinePlaceholder":101},[77,5246,5247],{"class":79,"line":105},[77,5248,5249],{},"print(\"调用前\")\n",[77,5251,5252],{"class":79,"line":111},[77,5253,5254],{},"show_progress()\n",[77,5256,5257],{"class":79,"line":2494},[77,5258,5259],{},"print(\"调用后\")\n",[10,5261,117],{},[68,5263,5266],{"className":5264,"code":5265,"language":123,"meta":73},[121],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5267,5265],{"__ignoreMap":73},[10,5269,128],{},[14,5271,131],{"id":131},[133,5273,5274,5280],{},[45,5275,945,5276,5279],{},[34,5277,5278],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,5281,5282,5283,5286],{},"运行到 ",[34,5284,5285],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5288,182],{"id":182},[42,5290,5291,5294],{},[45,5292,5293],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,5295,5296],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5298,200],{"id":200},[133,5300,5301,5308],{},[45,5302,5303,5304,5307],{},"定义 ",[34,5305,5306],{},"show_plan()"," 输出两行学习计划。",[45,5309,5310],{},"连续调用同一个函数两次，观察执行顺序。",[10,5312,211],{},[14,5314,214],{"id":214},[10,5316,5317],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,5319,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5321},[5322,5323,5324,5325,5326,5327,5328,5329],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5182,"description":5187},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[234,5337,5338],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":4,"title":5,"body":5341,"category":234,"cover":235,"description":12,"extension":236,"meta":5486,"navigation":101,"path":238,"pinned":239,"publishedAt":240,"seo":5487,"slug":242,"stem":243,"summary":244,"tags":5488,"updatedAt":240,"visible":101,"__hash__":248},{"type":7,"value":5342,"toc":5474},[5343,5345,5347,5349,5351,5355,5359,5361,5373,5375,5377,5405,5407,5412,5414,5416,5430,5432,5434,5438,5446,5448,5458,5460,5466,5468,5470,5472],[10,5344,12],{},[14,5346,16],{"id":16},[10,5348,19],{},[14,5350,22],{"id":22},[10,5352,5353],{},[26,5354],{"alt":28,"src":29},[10,5356,32,5357,37],{},[34,5358,36],{},[14,5360,40],{"id":40},[42,5362,5363,5365,5367],{},[45,5364,47],{},[45,5366,50],{},[45,5368,53,5369,56,5371,60],{},[34,5370,36],{},[34,5372,59],{},[14,5374,63],{"id":63},[10,5376,66],{},[68,5378,5379],{"className":70,"code":71,"language":72,"meta":73,"style":73},[34,5380,5381,5385,5389,5393,5397,5401],{"__ignoreMap":73},[77,5382,5383],{"class":79,"line":80},[77,5384,83],{},[77,5386,5387],{"class":79,"line":86},[77,5388,89],{},[77,5390,5391],{"class":79,"line":92},[77,5392,95],{},[77,5394,5395],{"class":79,"line":98},[77,5396,102],{"emptyLinePlaceholder":101},[77,5398,5399],{"class":79,"line":105},[77,5400,108],{},[77,5402,5403],{"class":79,"line":111},[77,5404,114],{},[10,5406,117],{},[68,5408,5410],{"className":5409,"code":122,"language":123,"meta":73},[121],[34,5411,122],{"__ignoreMap":73},[10,5413,128],{},[14,5415,131],{"id":131},[133,5417,5418,5424],{},[45,5419,137,5420,141,5422,145],{},[34,5421,140],{},[34,5423,144],{},[45,5425,5426,151,5428,155],{},[34,5427,150],{},[34,5429,154],{},[157,5431,159],{"id":159},[10,5433,162],{},[10,5435,5436],{},[26,5437],{"alt":167,"src":168},[10,5439,5440,141,5442,175,5444,179],{},[34,5441,140],{},[34,5443,144],{},[34,5445,178],{},[14,5447,182],{"id":182},[42,5449,5450,5454],{},[45,5451,187,5452,191],{},[34,5453,190],{},[45,5455,194,5456,197],{},[34,5457,178],{},[14,5459,200],{"id":200},[133,5461,5462,5464],{},[45,5463,205],{},[45,5465,208],{},[10,5467,211],{},[14,5469,214],{"id":214},[10,5471,217],{},[219,5473,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5475},[5476,5477,5478,5479,5480,5483,5484,5485],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5481},[5482],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5,"description":12},[234,246,247],{"id":5490,"title":5491,"body":5492,"category":234,"cover":235,"description":5496,"extension":236,"meta":5676,"navigation":101,"path":5677,"pinned":239,"publishedAt":240,"seo":5678,"slug":5679,"stem":5680,"summary":5681,"tags":5682,"updatedAt":240,"visible":101,"__hash__":5685},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5493,"toc":5664},[5494,5497,5499,5502,5504,5510,5513,5515,5532,5534,5536,5588,5590,5596,5598,5600,5618,5620,5623,5629,5632,5634,5645,5647,5655,5657,5659,5662],[10,5495,5496],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5498,16],{"id":16},[10,5500,5501],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5503,22],{"id":22},[10,5505,5506],{},[26,5507],{"alt":5508,"src":5509},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5511,5512],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5514,40],{"id":40},[42,5516,5517,5520,5526],{},[45,5518,5519],{},"必需参数应放在有默认值的参数之前。",[45,5521,5522,5525],{},[34,5523,5524],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,5527,5528,5531],{},[34,5529,5530],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5533,63],{"id":63},[10,5535,66],{},[68,5537,5539],{"className":70,"code":5538,"language":72,"meta":73,"style":73},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5540,5541,5546,5551,5555,5560,5565,5569,5574,5579,5583],{"__ignoreMap":73},[77,5542,5543],{"class":79,"line":80},[77,5544,5545],{},"def build_title(name, level=\"基础\"):\n",[77,5547,5548],{"class":79,"line":86},[77,5549,5550],{},"    return name + \"｜\" + level\n",[77,5552,5553],{"class":79,"line":92},[77,5554,102],{"emptyLinePlaceholder":101},[77,5556,5557],{"class":79,"line":98},[77,5558,5559],{},"print(build_title(\"Python\"))\n",[77,5561,5562],{"class":79,"line":105},[77,5563,5564],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[77,5566,5567],{"class":79,"line":111},[77,5568,102],{"emptyLinePlaceholder":101},[77,5570,5571],{"class":79,"line":2494},[77,5572,5573],{},"def total(*numbers):\n",[77,5575,5576],{"class":79,"line":2500},[77,5577,5578],{},"    return sum(numbers)\n",[77,5580,5581],{"class":79,"line":3959},[77,5582,102],{"emptyLinePlaceholder":101},[77,5584,5585],{"class":79,"line":4171},[77,5586,5587],{},"print(total(10, 20, 30))\n",[10,5589,117],{},[68,5591,5594],{"className":5592,"code":5593,"language":123,"meta":73},[121],"Python｜基础\n异常处理｜进阶\n60\n",[34,5595,5593],{"__ignoreMap":73},[10,5597,128],{},[14,5599,131],{"id":131},[133,5601,5602,5609],{},[45,5603,5604,5605,5608],{},"第一次调用只提供必需参数，",[34,5606,5607],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,5610,5611,5614,5615,60],{},[34,5612,5613],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5616,5617],{},"sum()",[157,5619,159],{"id":159},[10,5621,5622],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5624,5625],{},[26,5626],{"alt":5627,"src":5628},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5630,5631],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5633,182],{"id":182},[42,5635,5636,5642],{},[45,5637,5638,5639,5641],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5640,59],{}," 再在函数内创建。",[45,5643,5644],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5646,200],{"id":200},[133,5648,5649,5652],{},[45,5650,5651],{},"给问候函数增加默认称呼。",[45,5653,5654],{},"编写接收任意数量分数并返回总分的函数。",[10,5656,211],{},[14,5658,214],{"id":214},[10,5660,5661],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,5663,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5665},[5666,5667,5668,5669,5670,5673,5674,5675],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5671},[5672],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5491,"description":5496},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[234,5683,5684],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5687,"title":5688,"body":5689,"category":234,"cover":235,"description":5693,"extension":236,"meta":5890,"navigation":101,"path":5891,"pinned":239,"publishedAt":240,"seo":5892,"slug":5893,"stem":5894,"summary":5895,"tags":5896,"updatedAt":240,"visible":101,"__hash__":5899},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5690,"toc":5878},[5691,5694,5696,5699,5701,5707,5710,5712,5729,5731,5733,5796,5798,5804,5806,5808,5835,5837,5840,5846,5849,5851,5859,5861,5869,5871,5873,5876],[10,5692,5693],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5695,16],{"id":16},[10,5697,5698],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5700,22],{"id":22},[10,5702,5703],{},[26,5704],{"alt":5705,"src":5706},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5708,5709],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5711,40],{"id":40},[42,5713,5714,5717,5720],{},[45,5715,5716],{},"函数内部赋值默认创建局部变量。",[45,5718,5719],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,5721,5722,2182,5725,5728],{},[34,5723,5724],{},"global",[34,5726,5727],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5730,63],{"id":63},[10,5732,66],{},[68,5734,5736],{"className":70,"code":5735,"language":72,"meta":73,"style":73},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5737,5738,5743,5747,5752,5757,5761,5766,5771,5776,5780,5785,5790],{"__ignoreMap":73},[77,5739,5740],{"class":79,"line":80},[77,5741,5742],{},"course = \"Python\"\n",[77,5744,5745],{"class":79,"line":86},[77,5746,102],{"emptyLinePlaceholder":101},[77,5748,5749],{"class":79,"line":92},[77,5750,5751],{},"def outer():\n",[77,5753,5754],{"class":79,"line":98},[77,5755,5756],{},"    level = \"基础\"\n",[77,5758,5759],{"class":79,"line":105},[77,5760,102],{"emptyLinePlaceholder":101},[77,5762,5763],{"class":79,"line":111},[77,5764,5765],{},"    def show():\n",[77,5767,5768],{"class":79,"line":2494},[77,5769,5770],{},"        lesson = \"作用域\"\n",[77,5772,5773],{"class":79,"line":2500},[77,5774,5775],{},"        print(course, level, lesson)\n",[77,5777,5778],{"class":79,"line":3959},[77,5779,102],{"emptyLinePlaceholder":101},[77,5781,5782],{"class":79,"line":4171},[77,5783,5784],{},"    show()\n",[77,5786,5788],{"class":79,"line":5787},11,[77,5789,102],{"emptyLinePlaceholder":101},[77,5791,5793],{"class":79,"line":5792},12,[77,5794,5795],{},"outer()\n",[10,5797,117],{},[68,5799,5802],{"className":5800,"code":5801,"language":123,"meta":73},[121],"Python 基础 作用域\n",[34,5803,5801],{"__ignoreMap":73},[10,5805,128],{},[14,5807,131],{"id":131},[133,5809,5810,5827],{},[45,5811,5812,5815,5816,5819,5820,5822,5823,5826],{},[34,5813,5814],{},"show()"," 中查找 ",[34,5817,5818],{},"lesson"," 时先在局部找到，查找 ",[34,5821,5607],{}," 时到外层 ",[34,5824,5825],{},"outer()"," 找到。",[45,5828,5829,5831,5832,5834],{},[34,5830,4590],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5833,2214],{}," 最后在内置作用域找到。",[157,5836,159],{"id":159},[10,5838,5839],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5841,5842],{},[26,5843],{"alt":5844,"src":5845},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5847,5848],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5850,182],{"id":182},[42,5852,5853,5856],{},[45,5854,5855],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,5857,5858],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5860,200],{"id":200},[133,5862,5863,5866],{},[45,5864,5865],{},"在内外层定义同名变量，观察最近作用域优先。",[45,5867,5868],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5870,211],{},[14,5872,214],{"id":214},[10,5874,5875],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,5877,221],{},{"title":73,"searchDepth":86,"depth":86,"links":5879},[5880,5881,5882,5883,5884,5887,5888,5889],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":5885},[5886],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5688,"description":5693},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[234,5897,5898],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5901,"title":5902,"body":5903,"category":234,"cover":235,"description":5907,"extension":236,"meta":6057,"navigation":101,"path":6058,"pinned":239,"publishedAt":240,"seo":6059,"slug":6060,"stem":6061,"summary":6062,"tags":6063,"updatedAt":240,"visible":101,"__hash__":6066},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5904,"toc":6047},[5905,5908,5910,5913,5915,5921,5924,5926,5945,5947,5949,5983,5985,5991,5993,5995,6010,6012,6024,6026,6038,6040,6042,6045],[10,5906,5907],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5909,16],{"id":16},[10,5911,5912],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5914,22],{"id":22},[10,5916,5917],{},[26,5918],{"alt":5919,"src":5920},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5922,5923],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5925,40],{"id":40},[42,5927,5928,5931,5934],{},[45,5929,5930],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,5932,5933],{},"注解表达接口意图，不代替输入校验和测试。",[45,5935,5936,5937,141,5939,141,5941,5944],{},"基础注解优先使用 ",[34,5938,2265],{},[34,5940,2431],{},[34,5942,5943],{},"list[str]"," 等直接写法。",[14,5946,63],{"id":63},[10,5948,66],{},[68,5950,5952],{"className":70,"code":5951,"language":72,"meta":73,"style":73},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5953,5954,5959,5964,5969,5973,5978],{"__ignoreMap":73},[77,5955,5956],{"class":79,"line":80},[77,5957,5958],{},"def format_score(name: str, score: int) -> str:\n",[77,5960,5961],{"class":79,"line":86},[77,5962,5963],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[77,5965,5966],{"class":79,"line":92},[77,5967,5968],{},"    return name + \"：\" + str(score)\n",[77,5970,5971],{"class":79,"line":98},[77,5972,102],{"emptyLinePlaceholder":101},[77,5974,5975],{"class":79,"line":105},[77,5976,5977],{},"print(format_score(\"小郑\", 95))\n",[77,5979,5980],{"class":79,"line":111},[77,5981,5982],{},"print(format_score.__doc__)\n",[10,5984,117],{},[68,5986,5989],{"className":5987,"code":5988,"language":123,"meta":73},[121],"小郑：95\n返回带姓名的分数文本。\n",[34,5990,5988],{"__ignoreMap":73},[10,5992,128],{},[14,5994,131],{"id":131},[133,5996,5997,6007],{},[45,5998,5999,6000,6003,6004,6006],{},"函数签名说明 ",[34,6001,6002],{},"name"," 预期为字符串、",[34,6005,2252],{}," 预期为整数，返回值预期为字符串。",[45,6008,6009],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6011,182],{"id":182},[42,6013,6014,6021],{},[45,6015,6016,6017,6020],{},"认为加了 ",[34,6018,6019],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,6022,6023],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6025,200],{"id":200},[133,6027,6028,6031],{},[45,6029,6030],{},"为面积函数补充参数和返回值注解。",[45,6032,6033,6034,6037],{},"通过 ",[34,6035,6036],{},"函数名.__doc__"," 查看文档字符串。",[10,6039,211],{},[14,6041,214],{"id":214},[10,6043,6044],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,6046,221],{},{"title":73,"searchDepth":86,"depth":86,"links":6048},[6049,6050,6051,6052,6053,6054,6055,6056],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5902,"description":5907},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[234,6064,6065],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6068,"title":6069,"body":6070,"category":234,"cover":235,"description":6074,"extension":236,"meta":6301,"navigation":101,"path":6302,"pinned":239,"publishedAt":240,"seo":6303,"slug":6304,"stem":6305,"summary":6306,"tags":6307,"updatedAt":240,"visible":101,"__hash__":6310},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6071,"toc":6289},[6072,6075,6077,6083,6085,6091,6102,6104,6122,6124,6131,6160,6167,6186,6195,6197,6203,6205,6207,6230,6232,6235,6241,6247,6249,6265,6267,6280,6282,6284,6287],[10,6073,6074],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6076,16],{"id":16},[10,6078,6079,6080,6082],{},"本篇只处理“模块、import 与 ",[303,6081,6002],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6084,22],{"id":22},[10,6086,6087],{},[26,6088],{"alt":6089,"src":6090},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6092,6093,6094,6097,6098,6101],{},"同一个文件直接运行时 ",[34,6095,6096],{},"__name__"," 等于 ",[34,6099,6100],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6103,40],{"id":40},[42,6105,6106,6112,6115],{},[45,6107,6108,6109,6111],{},"一个 ",[34,6110,1177],{}," 文件就是一个模块。",[45,6113,6114],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,6116,6117,6118,6121],{},"避免使用 ",[34,6119,6120],{},"from module import *","，它会让名字来源不清楚。",[14,6123,63],{"id":63},[10,6125,6126,6127,6130],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6128,6129],{},"calculator.py","：",[68,6132,6134],{"className":70,"code":6133,"language":72,"meta":73,"style":73},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6135,6136,6141,6146,6150,6155],{"__ignoreMap":73},[77,6137,6138],{"class":79,"line":80},[77,6139,6140],{},"def add(left, right):\n",[77,6142,6143],{"class":79,"line":86},[77,6144,6145],{},"    return left + right\n",[77,6147,6148],{"class":79,"line":92},[77,6149,102],{"emptyLinePlaceholder":101},[77,6151,6152],{"class":79,"line":98},[77,6153,6154],{},"if __name__ == \"__main__\":\n",[77,6156,6157],{"class":79,"line":105},[77,6158,6159],{},"    print(add(2, 3))\n",[10,6161,6162,6163,6166],{},"再创建 ",[34,6164,6165],{},"app.py","，从模块中导入函数：",[68,6168,6170],{"className":70,"code":6169,"language":72,"meta":73,"style":73},"from calculator import add\n\nprint(add(10, 20))\n",[34,6171,6172,6177,6181],{"__ignoreMap":73},[77,6173,6174],{"class":79,"line":80},[77,6175,6176],{},"from calculator import add\n",[77,6178,6179],{"class":79,"line":86},[77,6180,102],{"emptyLinePlaceholder":101},[77,6182,6183],{"class":79,"line":92},[77,6184,6185],{},"print(add(10, 20))\n",[10,6187,6188,6189,175,6192,60],{},"分别执行 ",[34,6190,6191],{},"python3 calculator.py",[34,6193,6194],{},"python3 app.py",[10,6196,117],{},[68,6198,6201],{"className":6199,"code":6200,"language":123,"meta":73},[121],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6202,6200],{"__ignoreMap":73},[10,6204,128],{},[14,6206,131],{"id":131},[133,6208,6209,6219],{},[45,6210,6211,6212,6214,6215,6218],{},"直接运行 ",[34,6213,6129],{}," 时，模块名是 ",[34,6216,6217],{},"__main__","，入口代码输出 5。",[45,6220,6221,6223,6224,6226,6227,6229],{},[34,6222,6165],{}," 导入模块时，",[34,6225,6129],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6228,6165],{}," 调用函数输出 30。",[157,6231,159],{"id":159},[10,6233,6234],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6236,6237],{},[26,6238],{"alt":6239,"src":6240},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6242,6243,6244,6246],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6245,6217],{}," 保护下的演示代码。",[14,6248,182],{"id":182},[42,6250,6251,6258],{},[45,6252,6253,6254,175,6256,60],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6255,6129],{},[34,6257,6165],{},[45,6259,6260,6261,6264],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6262,6263],{},"json.py","，导致导入目标被遮蔽。",[14,6266,200],{"id":200},[133,6268,6269,6275],{},[45,6270,2359,6271,6274],{},[34,6272,6273],{},"text_tools.py"," 并导出一个格式化函数。",[45,6276,6277,6278,60],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6279,6096],{},[10,6281,211],{},[14,6283,214],{"id":214},[10,6285,6286],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,6288,221],{},{"title":73,"searchDepth":86,"depth":86,"links":6290},[6291,6292,6293,6294,6295,6298,6299,6300],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":6296},[6297],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6069,"description":6074},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[234,6308,6309],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6312,"title":6313,"body":6314,"category":234,"cover":235,"description":6318,"extension":236,"meta":6483,"navigation":101,"path":6484,"pinned":239,"publishedAt":240,"seo":6485,"slug":6486,"stem":6487,"summary":6488,"tags":6489,"updatedAt":240,"visible":101,"__hash__":6491},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6315,"toc":6473},[6316,6319,6321,6324,6326,6332,6335,6337,6351,6353,6355,6401,6403,6409,6411,6413,6439,6441,6451,6453,6464,6466,6468,6471],[10,6317,6318],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6320,16],{"id":16},[10,6322,6323],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6325,22],{"id":22},[10,6327,6328],{},[26,6329],{"alt":6330,"src":6331},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6333,6334],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6336,40],{"id":40},[42,6338,6339,6345,6348],{},[45,6340,6341,6344],{},[34,6342,6343],{},".venv"," 是常见目录名，不应提交到 Git。",[45,6346,6347],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,6349,6350],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6352,63],{"id":63},[10,6354,1580],{},[68,6356,6358],{"className":598,"code":6357,"language":600,"meta":73,"style":73},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6359,6360,6372,6380,6386,6396],{"__ignoreMap":73},[77,6361,6362,6364,6366,6369],{"class":79,"line":80},[77,6363,698],{"class":607},[77,6365,640],{"class":610},[77,6367,6368],{"class":643}," venv",[77,6370,6371],{"class":643}," .venv\n",[77,6373,6374,6377],{"class":79,"line":86},[77,6375,6376],{"class":610},"source",[77,6378,6379],{"class":643}," .venv\u002Fbin\u002Factivate\n",[77,6381,6382,6384],{"class":79,"line":92},[77,6383,72],{"class":607},[77,6385,611],{"class":610},[77,6387,6388,6390,6392,6394],{"class":79,"line":98},[77,6389,72],{"class":607},[77,6391,640],{"class":610},[77,6393,644],{"class":643},[77,6395,611],{"class":610},[77,6397,6398],{"class":79,"line":105},[77,6399,6400],{"class":607},"deactivate\n",[10,6402,117],{},[68,6404,6407],{"className":6405,"code":6406,"language":123,"meta":73},[121],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6408,6406],{"__ignoreMap":73},[10,6410,128],{},[14,6412,131],{"id":131},[133,6414,6415,6424],{},[45,6416,6417,6420,6421,6423],{},[34,6418,6419],{},"venv"," 根据当前 ",[34,6422,698],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,6425,6426,6427,2182,6429,6432,6433,3734,6435,6438],{},"激活后 ",[34,6428,72],{},[34,6430,6431],{},"python -m pip"," 优先指向 ",[34,6434,6343],{},[34,6436,6437],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6440,182],{"id":182},[42,6442,6443,6446],{},[45,6444,6445],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,6447,3473,6448,6450],{},[34,6449,6343],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6452,200],{"id":200},[133,6454,6455,6461],{},[45,6456,6457,6458,60],{},"创建虚拟环境并记录激活前后的 ",[34,6459,6460],{},"which python",[45,6462,6463],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6465,211],{},[14,6467,214],{"id":214},[10,6469,6470],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,6472,1664],{},{"title":73,"searchDepth":86,"depth":86,"links":6474},[6475,6476,6477,6478,6479,6480,6481,6482],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6313,"description":6318},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[234,6490,269],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6493,"title":6494,"body":6495,"category":234,"cover":235,"description":6499,"extension":236,"meta":6687,"navigation":101,"path":6688,"pinned":239,"publishedAt":240,"seo":6689,"slug":6690,"stem":6691,"summary":6692,"tags":6693,"updatedAt":240,"visible":101,"__hash__":6696},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6496,"toc":6677},[6497,6500,6502,6505,6507,6513,6522,6524,6548,6550,6552,6605,6607,6613,6615,6617,6633,6635,6654,6656,6668,6670,6672,6675],[10,6498,6499],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6501,16],{"id":16},[10,6503,6504],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6506,22],{"id":22},[10,6508,6509],{},[26,6510],{"alt":6511,"src":6512},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6514,6515,6518,6519,6521],{},[34,6516,6517],{},"Path"," 使用 ",[34,6520,2441],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6523,40],{"id":40},[42,6525,6526,6529,6541],{},[45,6527,6528],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,6530,6531,141,6534,141,6537,6540],{},[34,6532,6533],{},"exists()",[34,6535,6536],{},"is_file()",[34,6538,6539],{},"is_dir()"," 检查真实文件系统状态。",[45,6542,6543,6544,6547],{},"创建目录前明确目标；",[34,6545,6546],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6549,63],{"id":63},[10,6551,66],{},[68,6553,6555],{"className":70,"code":6554,"language":72,"meta":73,"style":73},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6556,6557,6562,6566,6571,6576,6581,6585,6590,6595,6600],{"__ignoreMap":73},[77,6558,6559],{"class":79,"line":80},[77,6560,6561],{},"from pathlib import Path\n",[77,6563,6564],{"class":79,"line":86},[77,6565,102],{"emptyLinePlaceholder":101},[77,6567,6568],{"class":79,"line":92},[77,6569,6570],{},"project = Path.cwd()\n",[77,6572,6573],{"class":79,"line":98},[77,6574,6575],{},"data_dir = project \u002F \"data\"\n",[77,6577,6578],{"class":79,"line":105},[77,6579,6580],{},"file_path = data_dir \u002F \"records.json\"\n",[77,6582,6583],{"class":79,"line":111},[77,6584,102],{"emptyLinePlaceholder":101},[77,6586,6587],{"class":79,"line":2494},[77,6588,6589],{},"print(project)\n",[77,6591,6592],{"class":79,"line":2500},[77,6593,6594],{},"print(file_path.name)\n",[77,6596,6597],{"class":79,"line":3959},[77,6598,6599],{},"print(file_path.suffix)\n",[77,6601,6602],{"class":79,"line":4171},[77,6603,6604],{},"print(file_path.exists())\n",[10,6606,117],{},[68,6608,6611],{"className":6609,"code":6610,"language":123,"meta":73},[121],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6612,6610],{"__ignoreMap":73},[10,6614,128],{},[14,6616,131],{"id":131},[133,6618,6619,6625],{},[45,6620,6621,6624],{},[34,6622,6623],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,6626,2344,6627,6629,6630,6632],{},[34,6628,2441],{}," 组合路径片段只创建新的 ",[34,6631,6517],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6634,182],{"id":182},[42,6636,6637,6645],{},[45,6638,3473,6639,6641,6642,6644],{},[34,6640,6517],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6643,6533],{}," 等方法确认。",[45,6646,6647,6648,1016,6650,6653],{},"手工拼接 ",[34,6649,2441],{},[34,6651,6652],{},"\\"," 分隔符，降低跨平台可读性。",[14,6655,200],{"id":200},[133,6657,6658,6665],{},[45,6659,6660,6661,6664],{},"组合 ",[34,6662,6663],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,6666,6667],{},"输出路径的父目录、文件名和扩展名。",[10,6669,211],{},[14,6671,214],{"id":214},[10,6673,6674],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,6676,221],{},{"title":73,"searchDepth":86,"depth":86,"links":6678},[6679,6680,6681,6682,6683,6684,6685,6686],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6494,"description":6499},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[234,6694,6695],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6698,"title":6699,"body":6700,"category":234,"cover":235,"description":6704,"extension":236,"meta":6882,"navigation":101,"path":6883,"pinned":239,"publishedAt":240,"seo":6884,"slug":6885,"stem":6886,"summary":6887,"tags":6888,"updatedAt":240,"visible":101,"__hash__":6891},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6701,"toc":6872},[6702,6705,6707,6710,6712,6718,6721,6723,6751,6753,6755,6812,6814,6820,6822,6824,6835,6837,6850,6852,6863,6865,6867,6870],[10,6703,6704],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6706,16],{"id":16},[10,6708,6709],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6711,22],{"id":22},[10,6713,6714],{},[26,6715],{"alt":6716,"src":6717},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6719,6720],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6722,40],{"id":40},[42,6724,6725,6731,6740],{},[45,6726,6727,6730],{},[34,6728,6729],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,6732,6733,6736,6737,60],{},[34,6734,6735],{},"r"," 模式读取不存在文件会产生 ",[34,6738,6739],{},"FileNotFoundError",[45,6741,6742,6743,6746,6747,6750],{},"本篇显式调用 ",[34,6744,6745],{},"close()","；第 34 篇会用 ",[34,6748,6749],{},"with"," 更可靠地管理关闭动作。",[14,6752,63],{"id":63},[10,6754,66],{},[68,6756,6758],{"className":70,"code":6757,"language":72,"meta":73,"style":73},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6759,6760,6764,6768,6773,6778,6783,6788,6792,6797,6802,6807],{"__ignoreMap":73},[77,6761,6762],{"class":79,"line":80},[77,6763,6561],{},[77,6765,6766],{"class":79,"line":86},[77,6767,102],{"emptyLinePlaceholder":101},[77,6769,6770],{"class":79,"line":92},[77,6771,6772],{},"file_path = Path(\"notes.txt\")\n",[77,6774,6775],{"class":79,"line":98},[77,6776,6777],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[77,6779,6780],{"class":79,"line":105},[77,6781,6782],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[77,6784,6785],{"class":79,"line":111},[77,6786,6787],{},"writer.close()\n",[77,6789,6790],{"class":79,"line":2494},[77,6791,102],{"emptyLinePlaceholder":101},[77,6793,6794],{"class":79,"line":2500},[77,6795,6796],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[77,6798,6799],{"class":79,"line":3959},[77,6800,6801],{},"content = reader.read()\n",[77,6803,6804],{"class":79,"line":4171},[77,6805,6806],{},"reader.close()\n",[77,6808,6809],{"class":79,"line":5787},[77,6810,6811],{},"print(content)\n",[10,6813,117],{},[68,6815,6818],{"className":6816,"code":6817,"language":123,"meta":73},[121],"变量\n循环\n函数\n",[34,6819,6817],{"__ignoreMap":73},[10,6821,128],{},[14,6823,131],{"id":131},[133,6825,6826,6832],{},[45,6827,6828,6829,6831],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6830,6745],{}," 确保缓冲内容交给文件系统。",[45,6833,6834],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6836,182],{"id":182},[42,6838,6839,6844],{},[45,6840,2344,6841,6843],{},[34,6842,6729],{}," 模式打开重要文件却未确认覆盖风险。",[45,6845,6846,6847,60],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6848,6849],{},"encoding=\"utf-8\"",[14,6851,200],{"id":200},[133,6853,6854,6857],{},[45,6855,6856],{},"写入三行学习记录并读取。",[45,6858,6859,6860,6862],{},"改用 ",[34,6861,344],{}," 模式追加一行，确认原内容仍保留。",[10,6864,211],{},[14,6866,214],{"id":214},[10,6868,6869],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,6871,221],{},{"title":73,"searchDepth":86,"depth":86,"links":6873},[6874,6875,6876,6877,6878,6879,6880,6881],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6699,"description":6704},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[234,6889,6890],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6893,"title":6894,"body":6895,"category":234,"cover":235,"description":6899,"extension":236,"meta":7066,"navigation":101,"path":7067,"pinned":239,"publishedAt":240,"seo":7068,"slug":7069,"stem":7070,"summary":7071,"tags":7072,"updatedAt":240,"visible":101,"__hash__":7075},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6896,"toc":7056},[6897,6900,6902,6905,6907,6913,6923,6925,6939,6941,6943,7003,7005,7011,7013,7015,7027,7029,7037,7039,7047,7049,7051,7054],[10,6898,6899],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6901,16],{"id":16},[10,6903,6904],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6906,22],{"id":22},[10,6908,6909],{},[26,6910],{"alt":6911,"src":6912},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6914,6915,6918,6919,6922],{},[34,6916,6917],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6920,6921],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6924,40],{"id":40},[42,6926,6927,6930,6936],{},[45,6928,6929],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,6931,6932,6935],{},[34,6933,6934],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,6937,6938],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6940,63],{"id":63},[10,6942,66],{},[68,6944,6946],{"className":70,"code":6945,"language":72,"meta":73,"style":73},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6947,6948,6953,6957,6962,6966,6971,6976,6980,6984,6989,6994,6998],{"__ignoreMap":73},[77,6949,6950],{"class":79,"line":80},[77,6951,6952],{},"import json\n",[77,6954,6955],{"class":79,"line":86},[77,6956,102],{"emptyLinePlaceholder":101},[77,6958,6959],{"class":79,"line":92},[77,6960,6961],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[77,6963,6964],{"class":79,"line":98},[77,6965,102],{"emptyLinePlaceholder":101},[77,6967,6968],{"class":79,"line":105},[77,6969,6970],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[77,6972,6973],{"class":79,"line":111},[77,6974,6975],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[77,6977,6978],{"class":79,"line":2494},[77,6979,6787],{},[77,6981,6982],{"class":79,"line":2500},[77,6983,102],{"emptyLinePlaceholder":101},[77,6985,6986],{"class":79,"line":3959},[77,6987,6988],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[77,6990,6991],{"class":79,"line":4171},[77,6992,6993],{},"loaded = json.load(reader)\n",[77,6995,6996],{"class":79,"line":5787},[77,6997,6806],{},[77,6999,7000],{"class":79,"line":5792},[77,7001,7002],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7004,117],{},[68,7006,7009],{"className":7007,"code":7008,"language":123,"meta":73},[121],"Python 60\n",[34,7010,7008],{"__ignoreMap":73},[10,7012,128],{},[14,7014,131],{"id":131},[133,7016,7017,7022],{},[45,7018,7019,7021],{},[34,7020,6917],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,7023,7024,7026],{},[34,7025,6921],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7028,182],{"id":182},[42,7030,7031,7034],{},[45,7032,7033],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,7035,7036],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7038,200],{"id":200},[133,7040,7041,7044],{},[45,7042,7043],{},"保存包含两条学习记录的列表。",[45,7045,7046],{},"读取后修改进度，再重新写回文件。",[10,7048,211],{},[14,7050,214],{"id":214},[10,7052,7053],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,7055,221],{},{"title":73,"searchDepth":86,"depth":86,"links":7057},[7058,7059,7060,7061,7062,7063,7064,7065],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6894,"description":6899},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[234,7073,7074],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7077,"title":7078,"body":7079,"category":234,"cover":235,"description":7083,"extension":236,"meta":7267,"navigation":101,"path":7268,"pinned":239,"publishedAt":240,"seo":7269,"slug":7270,"stem":7271,"summary":7272,"tags":7273,"updatedAt":240,"visible":101,"__hash__":7276},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7080,"toc":7257},[7081,7084,7086,7089,7091,7097,7103,7105,7127,7129,7131,7194,7196,7202,7204,7206,7222,7224,7238,7240,7248,7250,7252,7255],[10,7082,7083],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7085,16],{"id":16},[10,7087,7088],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7090,22],{"id":22},[10,7092,7093],{},[26,7094],{"alt":7095,"src":7096},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7098,7099,7102],{},[34,7100,7101],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7104,40],{"id":40},[42,7106,7107,7117,7124],{},[45,7108,2344,7109,7112,7113,7116],{},[34,7110,7111],{},"newline=\"\""," 让 ",[34,7114,7115],{},"csv"," 模块正确处理换行。",[45,7118,7119,7120,7123],{},"字段顺序由 ",[34,7121,7122],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,7125,7126],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7128,63],{"id":63},[10,7130,66],{},[68,7132,7134],{"className":70,"code":7133,"language":72,"meta":73,"style":73},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7135,7136,7141,7145,7150,7155,7160,7165,7170,7174,7179,7184,7189],{"__ignoreMap":73},[77,7137,7138],{"class":79,"line":80},[77,7139,7140],{},"import csv\n",[77,7142,7143],{"class":79,"line":86},[77,7144,102],{"emptyLinePlaceholder":101},[77,7146,7147],{"class":79,"line":92},[77,7148,7149],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[77,7151,7152],{"class":79,"line":98},[77,7153,7154],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[77,7156,7157],{"class":79,"line":105},[77,7158,7159],{},"writer.writeheader()\n",[77,7161,7162],{"class":79,"line":111},[77,7163,7164],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[77,7166,7167],{"class":79,"line":2494},[77,7168,7169],{},"writer_file.close()\n",[77,7171,7172],{"class":79,"line":2500},[77,7173,102],{"emptyLinePlaceholder":101},[77,7175,7176],{"class":79,"line":3959},[77,7177,7178],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[77,7180,7181],{"class":79,"line":4171},[77,7182,7183],{},"for row in csv.DictReader(reader_file):\n",[77,7185,7186],{"class":79,"line":5787},[77,7187,7188],{},"    print(row[\"name\"], row[\"score\"])\n",[77,7190,7191],{"class":79,"line":5792},[77,7192,7193],{},"reader_file.close()\n",[10,7195,117],{},[68,7197,7200],{"className":7198,"code":7199,"language":123,"meta":73},[121],"小郑 95\n",[34,7201,7199],{"__ignoreMap":73},[10,7203,128],{},[14,7205,131],{"id":131},[133,7207,7208,7217],{},[45,7209,7210,7213,7214,7216],{},[34,7211,7212],{},"DictWriter"," 按 ",[34,7215,7122],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,7218,7219,7221],{},[34,7220,7101],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7223,182],{"id":182},[42,7225,7226,7229],{},[45,7227,7228],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,7230,7231,7232,7234,7235,7237],{},"在 macOS 以外环境忽略 ",[34,7233,7111],{}," 可能出现额外空行；统一交给 ",[34,7236,7115],{}," 模块管理换行。",[14,7239,200],{"id":200},[133,7241,7242,7245],{},[45,7243,7244],{},"写入三名学习者的课程和分数。",[45,7246,7247],{},"读取 CSV 后把分数字符串转换为整数。",[10,7249,211],{},[14,7251,214],{"id":214},[10,7253,7254],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,7256,221],{},{"title":73,"searchDepth":86,"depth":86,"links":7258},[7259,7260,7261,7262,7263,7264,7265,7266],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7078,"description":7083},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[234,7274,7275],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7278,"title":7279,"body":7280,"category":234,"cover":235,"description":7284,"extension":236,"meta":7557,"navigation":101,"path":7558,"pinned":239,"publishedAt":240,"seo":7559,"slug":7560,"stem":7561,"summary":7562,"tags":7563,"updatedAt":240,"visible":101,"__hash__":7566},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7281,"toc":7544},[7282,7285,7287,7290,7292,7298,7309,7311,7328,7330,7332,7407,7409,7415,7417,7419,7444,7446,7455,7461,7472,7474,7480,7486,7495,7497,7512,7514,7535,7537,7539,7542],[10,7283,7284],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7286,16],{"id":16},[10,7288,7289],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7291,22],{"id":22},[10,7293,7294],{},[26,7295],{"alt":7296,"src":7297},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7299,7300,7301,7304,7305,7308],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7302,7303],{},"except","；无论是否异常，",[34,7306,7307],{},"finally"," 都会在离开结构前执行。",[14,7310,40],{"id":40},[42,7312,7313,7319,7325],{},[45,7314,7315,7316,7318],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7317,7303],{}," 吞掉全部错误。",[45,7320,7321,7324],{},[34,7322,7323],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,7326,7327],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7329,63],{"id":63},[10,7331,66],{},[68,7333,7335],{"className":70,"code":7334,"language":72,"meta":73,"style":73},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7336,7337,7342,7347,7352,7357,7362,7366,7371,7376,7381,7386,7390,7395,7401],{"__ignoreMap":73},[77,7338,7339],{"class":79,"line":80},[77,7340,7341],{},"def parse_age(text):\n",[77,7343,7344],{"class":79,"line":86},[77,7345,7346],{},"    age = int(text)\n",[77,7348,7349],{"class":79,"line":92},[77,7350,7351],{},"    if age \u003C 0:\n",[77,7353,7354],{"class":79,"line":98},[77,7355,7356],{},"        raise ValueError(\"年龄不能为负数\")\n",[77,7358,7359],{"class":79,"line":105},[77,7360,7361],{},"    return age\n",[77,7363,7364],{"class":79,"line":111},[77,7365,102],{"emptyLinePlaceholder":101},[77,7367,7368],{"class":79,"line":2494},[77,7369,7370],{},"try:\n",[77,7372,7373],{"class":79,"line":2500},[77,7374,7375],{},"    age = parse_age(\"18\")\n",[77,7377,7378],{"class":79,"line":3959},[77,7379,7380],{},"except ValueError as error:\n",[77,7382,7383],{"class":79,"line":4171},[77,7384,7385],{},"    print(\"输入错误：\", error)\n",[77,7387,7388],{"class":79,"line":5787},[77,7389,1153],{},[77,7391,7392],{"class":79,"line":5792},[77,7393,7394],{},"    print(\"年龄：\", age)\n",[77,7396,7398],{"class":79,"line":7397},13,[77,7399,7400],{},"finally:\n",[77,7402,7404],{"class":79,"line":7403},14,[77,7405,7406],{},"    print(\"处理结束\")\n",[10,7408,117],{},[68,7410,7413],{"className":7411,"code":7412,"language":123,"meta":73},[121],"年龄： 18\n处理结束\n",[34,7414,7412],{"__ignoreMap":73},[10,7416,128],{},[14,7418,131],{"id":131},[133,7420,7421,7433],{},[45,7422,7423,7425,7426,7428,7429,7432],{},[34,7424,3042],{}," 或主动 ",[34,7427,7323],{}," 都可能产生 ",[34,7430,7431],{},"ValueError","，控制流立即离开当前正常路径。",[45,7434,7435,7436,7438,7439,7441,7442,60],{},"有异常时进入匹配的 ",[34,7437,7303],{},"；没有异常时执行 ",[34,7440,1166],{},"；两种情况最后都会执行 ",[34,7443,7307],{},[157,7445,159],{"id":159},[10,7447,7448,141,7450,175,7452,7454],{},[34,7449,7303],{},[34,7451,1166],{},[34,7453,7307],{}," 的职责不同，不能只看它们出现的顺序。",[10,7456,7457],{},[26,7458],{"alt":7459,"src":7460},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7462,7463,7465,7466,7468,7469,7471],{},[34,7464,7303],{}," 处理匹配异常，",[34,7467,1166],{}," 只在无异常时运行，",[34,7470,7307],{}," 负责两条路径都需要的清理动作。",[157,7473,159],{"id":4226},[10,7475,7476,7479],{},[34,7477,7478],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7481,7482],{},[26,7483],{"alt":7484,"src":7485},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7487,7488,7489,7491,7492,7494],{},"只把可能产生预期异常的操作放进 ",[34,7490,7478],{},"，后续正常业务放进 ",[34,7493,1166],{},"，错误边界会更清楚。",[14,7496,182],{"id":182},[42,7498,7499,7506],{},[45,7500,7501,7502,7505],{},"使用裸 ",[34,7503,7504],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,7507,7508,7509,7511],{},"把整个程序包在一个巨大 ",[34,7510,7478],{}," 中，无法判断究竟哪一步允许失败。",[14,7513,200],{"id":200},[133,7515,7516,7529],{},[45,7517,7518,7519,7522,7523,175,7526,60],{},"让 ",[34,7520,7521],{},"parse_age"," 分别处理 ",[34,7524,7525],{},"\"abc\"",[34,7527,7528],{},"\"-1\"",[45,7530,7531,7532,7534],{},"为文件读取捕获 ",[34,7533,6739],{}," 并给出清晰提示。",[10,7536,211],{},[14,7538,214],{"id":214},[10,7540,7541],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,7543,221],{},{"title":73,"searchDepth":86,"depth":86,"links":7545},[7546,7547,7548,7549,7550,7554,7555,7556],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":7551},[7552,7553],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7279,"description":7284},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[234,7564,7565],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7568,"title":7569,"body":7570,"category":234,"cover":235,"description":7574,"extension":236,"meta":7750,"navigation":101,"path":7751,"pinned":239,"publishedAt":240,"seo":7752,"slug":7753,"stem":7754,"summary":7755,"tags":7756,"updatedAt":240,"visible":101,"__hash__":7758},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7571,"toc":7740},[7572,7575,7577,7580,7582,7588,7594,7596,7612,7614,7616,7670,7672,7678,7680,7682,7695,7697,7710,7712,7731,7733,7735,7738],[10,7573,7574],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7576,16],{"id":16},[10,7578,7579],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7581,22],{"id":22},[10,7583,7584],{},[26,7585],{"alt":7586,"src":7587},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7589,7590,7591,7593],{},"进入 ",[34,7592,6749],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7595,40],{"id":40},[42,7597,7598,7603,7609],{},[45,7599,7600,7602],{},[34,7601,6749],{}," 把资源获取和释放配成一个清晰边界。",[45,7604,7605,7608],{},[34,7606,7607],{},"as file"," 得到的是上下文返回的资源对象。",[45,7610,7611],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7613,63],{"id":63},[10,7615,66],{},[68,7617,7619],{"className":70,"code":7618,"language":72,"meta":73,"style":73},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[34,7620,7621,7625,7629,7633,7637,7642,7647,7651,7656,7661,7665],{"__ignoreMap":73},[77,7622,7623],{"class":79,"line":80},[77,7624,6561],{},[77,7626,7627],{"class":79,"line":86},[77,7628,102],{"emptyLinePlaceholder":101},[77,7630,7631],{"class":79,"line":92},[77,7632,6772],{},[77,7634,7635],{"class":79,"line":98},[77,7636,102],{"emptyLinePlaceholder":101},[77,7638,7639],{"class":79,"line":105},[77,7640,7641],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[77,7643,7644],{"class":79,"line":111},[77,7645,7646],{},"    file.write(\"上下文管理器\\n\")\n",[77,7648,7649],{"class":79,"line":2494},[77,7650,102],{"emptyLinePlaceholder":101},[77,7652,7653],{"class":79,"line":2500},[77,7654,7655],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[77,7657,7658],{"class":79,"line":3959},[77,7659,7660],{},"    print(file.read())\n",[77,7662,7663],{"class":79,"line":4171},[77,7664,102],{"emptyLinePlaceholder":101},[77,7666,7667],{"class":79,"line":5787},[77,7668,7669],{},"print(file.closed)\n",[10,7671,117],{},[68,7673,7676],{"className":7674,"code":7675,"language":123,"meta":73},[121],"上下文管理器\n\nTrue\n",[34,7677,7675],{"__ignoreMap":73},[10,7679,128],{},[14,7681,131],{"id":131},[133,7683,7684,7692],{},[45,7685,7590,7686,7688,7689,60],{},[34,7687,6749],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7690,7691],{},"file",[45,7693,7694],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7696,182],{"id":182},[42,7698,7699,7704],{},[45,7700,4793,7701,7703],{},[34,7702,6749],{}," 代码块外继续读写已经关闭的文件对象。",[45,7705,7706,7707,7709],{},"误以为 ",[34,7708,6749],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7711,200],{"id":200},[133,7713,7714,7723],{},[45,7715,7716,7717,7720,7721,60],{},"把第 30 篇的手动 ",[34,7718,7719],{},"open\u002Fclose"," 改写为 ",[34,7722,6749],{},[45,7724,4793,7725,7727,7728,60],{},[34,7726,6749],{}," 块后检查 ",[34,7729,7730],{},"file.closed",[10,7732,211],{},[14,7734,214],{"id":214},[10,7736,7737],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,7739,221],{},{"title":73,"searchDepth":86,"depth":86,"links":7741},[7742,7743,7744,7745,7746,7747,7748,7749],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7569,"description":7574},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[234,6749,7757],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7760,"title":7761,"body":7762,"category":234,"cover":235,"description":7766,"extension":236,"meta":7978,"navigation":101,"path":7979,"pinned":239,"publishedAt":240,"seo":7980,"slug":7981,"stem":7982,"summary":7983,"tags":7984,"updatedAt":240,"visible":101,"__hash__":7987},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7763,"toc":7966},[7764,7767,7769,7772,7774,7780,7783,7785,7802,7804,7806,7874,7876,7882,7884,7886,7911,7913,7916,7922,7931,7933,7944,7946,7957,7959,7961,7964],[10,7765,7766],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7768,16],{"id":16},[10,7770,7771],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7773,22],{"id":22},[10,7775,7776],{},[26,7777],{"alt":7778,"src":7779},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7781,7782],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7784,40],{"id":40},[42,7786,7787,7793,7799],{},[45,7788,7789,7792],{},[34,7790,7791],{},"self"," 表示当前实例，由方法调用自动传入。",[45,7794,7795,7798],{},[34,7796,7797],{},"__init__"," 在实例创建过程中初始化属性。",[45,7800,7801],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7803,63],{"id":63},[10,7805,66],{},[68,7807,7809],{"className":70,"code":7808,"language":72,"meta":73,"style":73},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7810,7811,7816,7821,7826,7831,7835,7840,7845,7850,7855,7859,7864,7869],{"__ignoreMap":73},[77,7812,7813],{"class":79,"line":80},[77,7814,7815],{},"class LearningRecord:\n",[77,7817,7818],{"class":79,"line":86},[77,7819,7820],{},"    def __init__(self, course, progress=0):\n",[77,7822,7823],{"class":79,"line":92},[77,7824,7825],{},"        self.course = course\n",[77,7827,7828],{"class":79,"line":98},[77,7829,7830],{},"        self.progress = progress\n",[77,7832,7833],{"class":79,"line":105},[77,7834,102],{"emptyLinePlaceholder":101},[77,7836,7837],{"class":79,"line":111},[77,7838,7839],{},"    def advance(self, amount):\n",[77,7841,7842],{"class":79,"line":2494},[77,7843,7844],{},"        self.progress = self.progress + amount\n",[77,7846,7847],{"class":79,"line":2500},[77,7848,7849],{},"        if self.progress > 100:\n",[77,7851,7852],{"class":79,"line":3959},[77,7853,7854],{},"            self.progress = 100\n",[77,7856,7857],{"class":79,"line":4171},[77,7858,102],{"emptyLinePlaceholder":101},[77,7860,7861],{"class":79,"line":5787},[77,7862,7863],{},"record = LearningRecord(\"Python\", 40)\n",[77,7865,7866],{"class":79,"line":5792},[77,7867,7868],{},"record.advance(15)\n",[77,7870,7871],{"class":79,"line":7397},[77,7872,7873],{},"print(record.course, record.progress)\n",[10,7875,117],{},[68,7877,7880],{"className":7878,"code":7879,"language":123,"meta":73},[121],"Python 55\n",[34,7881,7879],{"__ignoreMap":73},[10,7883,128],{},[14,7885,131],{"id":131},[133,7887,7888,7898],{},[45,7889,7890,7891,7894,7895,7897],{},"调用 ",[34,7892,7893],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7896,7797],{}," 把课程和进度保存在该实例属性中。",[45,7899,7900,7903,7904,7907,7908,7910],{},[34,7901,7902],{},"record.advance(15)"," 自动把 ",[34,7905,7906],{},"record"," 作为 ",[34,7909,7791],{},"，方法更新同一实例的进度并限制上限。",[157,7912,159],{"id":159},[10,7914,7915],{},"类是共同定义，实例则各自保存状态。",[10,7917,7918],{},[26,7919],{"alt":7920,"src":7921},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7923,7924,7925,175,7927,7930],{},"两个实例共享同一套方法定义，但 ",[34,7926,4590],{},[34,7928,7929],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7932,182],{"id":182},[42,7934,7935,7941],{},[45,7936,7937,7938,7940],{},"调用实例方法时手工再传一次 ",[34,7939,7791],{},"。通过实例调用时 Python 会自动绑定。",[45,7942,7943],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7945,200],{"id":200},[133,7947,7948,7954],{},[45,7949,5303,7950,7953],{},[34,7951,7952],{},"Book"," 类，保存标题和阅读页数。",[45,7955,7956],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7958,211],{},[14,7960,214],{"id":214},[10,7962,7963],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,7965,221],{},{"title":73,"searchDepth":86,"depth":86,"links":7967},[7968,7969,7970,7971,7972,7975,7976,7977],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":7973},[7974],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7761,"description":7766},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[234,7985,7986],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7989,"title":7990,"body":7991,"category":234,"cover":235,"description":7995,"extension":236,"meta":8173,"navigation":101,"path":8174,"pinned":239,"publishedAt":240,"seo":8175,"slug":8176,"stem":8177,"summary":8178,"tags":8179,"updatedAt":240,"visible":101,"__hash__":8182},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7992,"toc":8163},[7993,7996,7998,8001,8003,8009,8012,8014,8025,8027,8029,8096,8098,8104,8106,8108,8127,8129,8137,8139,8154,8156,8158,8161],[10,7994,7995],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7997,16],{"id":16},[10,7999,8000],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8002,22],{"id":22},[10,8004,8005],{},[26,8006],{"alt":8007,"src":8008},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8010,8011],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8013,40],{"id":40},[42,8015,8016,8019,8022],{},[45,8017,8018],{},"封装让对象通过方法维护自己的有效状态。",[45,8020,8021],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,8023,8024],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8026,63],{"id":63},[10,8028,66],{},[68,8030,8032],{"className":70,"code":8031,"language":72,"meta":73,"style":73},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8033,8034,8039,8044,8049,8053,8058,8063,8068,8072,8077,8082,8086,8091],{"__ignoreMap":73},[77,8035,8036],{"class":79,"line":80},[77,8037,8038],{},"class Storage:\n",[77,8040,8041],{"class":79,"line":86},[77,8042,8043],{},"    def save(self, text):\n",[77,8045,8046],{"class":79,"line":92},[77,8047,8048],{},"        print(\"保存：\", text)\n",[77,8050,8051],{"class":79,"line":98},[77,8052,102],{"emptyLinePlaceholder":101},[77,8054,8055],{"class":79,"line":105},[77,8056,8057],{},"class LearningService:\n",[77,8059,8060],{"class":79,"line":111},[77,8061,8062],{},"    def __init__(self, storage):\n",[77,8064,8065],{"class":79,"line":2494},[77,8066,8067],{},"        self.storage = storage\n",[77,8069,8070],{"class":79,"line":2500},[77,8071,102],{"emptyLinePlaceholder":101},[77,8073,8074],{"class":79,"line":3959},[77,8075,8076],{},"    def finish_lesson(self, title):\n",[77,8078,8079],{"class":79,"line":4171},[77,8080,8081],{},"        self.storage.save(title)\n",[77,8083,8084],{"class":79,"line":5787},[77,8085,102],{"emptyLinePlaceholder":101},[77,8087,8088],{"class":79,"line":5792},[77,8089,8090],{},"service = LearningService(Storage())\n",[77,8092,8093],{"class":79,"line":7397},[77,8094,8095],{},"service.finish_lesson(\"异常处理\")\n",[10,8097,117],{},[68,8099,8102],{"className":8100,"code":8101,"language":123,"meta":73},[121],"保存： 异常处理\n",[34,8103,8101],{"__ignoreMap":73},[10,8105,128],{},[14,8107,131],{"id":131},[133,8109,8110,8120],{},[45,8111,8112,8115,8116,8119],{},[34,8113,8114],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8117,8118],{},"save()"," 的协作对象。",[45,8121,8122,8123,8126],{},"调用业务方法时，服务把保存动作委托给 ",[34,8124,8125],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8128,182],{"id":182},[42,8130,8131,8134],{},[45,8132,8133],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,8135,8136],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8138,200],{"id":200},[133,8140,8141,8151],{},[45,8142,8143,8144,8147,8148,60],{},"用组合让 ",[34,8145,8146],{},"OrderService"," 使用一个 ",[34,8149,8150],{},"Notifier",[45,8152,8153],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8155,211],{},[14,8157,214],{"id":214},[10,8159,8160],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,8162,221],{},{"title":73,"searchDepth":86,"depth":86,"links":8164},[8165,8166,8167,8168,8169,8170,8171,8172],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7990,"description":7995},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[234,8180,8181],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8184,"title":8185,"body":8186,"category":234,"cover":235,"description":8190,"extension":236,"meta":8393,"navigation":101,"path":8394,"pinned":239,"publishedAt":240,"seo":8395,"slug":8396,"stem":8397,"summary":8398,"tags":8399,"updatedAt":240,"visible":101,"__hash__":8402},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8187,"toc":8381},[8188,8191,8193,8196,8198,8204,8211,8213,8238,8240,8242,8294,8296,8302,8304,8306,8327,8329,8335,8341,8347,8349,8357,8359,8372,8374,8376,8379],[10,8189,8190],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8192,16],{"id":16},[10,8194,8195],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8197,22],{"id":22},[10,8199,8200],{},[26,8201],{"alt":8202,"src":8203},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8205,8206,8207,8210],{},"生成器运行到 ",[34,8208,8209],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8212,40],{"id":40},[42,8214,8215,8225,8235],{},[45,8216,8217,8220,8221,8224],{},[34,8218,8219],{},"iter()"," 从可迭代对象取得迭代器，",[34,8222,8223],{},"next()"," 请求下一个值。",[45,8226,8227,8228,8231,8232,8234],{},"没有更多值时迭代器抛出 ",[34,8229,8230],{},"StopIteration","，",[34,8233,4345],{}," 会自动处理。",[45,8236,8237],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8239,63],{"id":63},[10,8241,66],{},[68,8243,8245],{"className":70,"code":8244,"language":72,"meta":73,"style":73},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8246,8247,8252,8257,8262,8267,8272,8276,8281,8286,8290],{"__ignoreMap":73},[77,8248,8249],{"class":79,"line":80},[77,8250,8251],{},"def countdown(start):\n",[77,8253,8254],{"class":79,"line":86},[77,8255,8256],{},"    current = start\n",[77,8258,8259],{"class":79,"line":92},[77,8260,8261],{},"    while current > 0:\n",[77,8263,8264],{"class":79,"line":98},[77,8265,8266],{},"        yield current\n",[77,8268,8269],{"class":79,"line":105},[77,8270,8271],{},"        current = current - 1\n",[77,8273,8274],{"class":79,"line":111},[77,8275,102],{"emptyLinePlaceholder":101},[77,8277,8278],{"class":79,"line":2494},[77,8279,8280],{},"iterator = countdown(3)\n",[77,8282,8283],{"class":79,"line":2500},[77,8284,8285],{},"print(next(iterator))\n",[77,8287,8288],{"class":79,"line":3959},[77,8289,8285],{},[77,8291,8292],{"class":79,"line":4171},[77,8293,8285],{},[10,8295,117],{},[68,8297,8300],{"className":8298,"code":8299,"language":123,"meta":73},[121],"3\n2\n1\n",[34,8301,8299],{"__ignoreMap":73},[10,8303,128],{},[14,8305,131],{"id":131},[133,8307,8308,8314],{},[45,8309,7890,8310,8313],{},[34,8311,8312],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,8315,8316,8317,8319,8320,8322,8323,8326],{},"每次 ",[34,8318,8223],{}," 运行到下一个 ",[34,8321,8209],{}," 并暂停，局部变量 ",[34,8324,8325],{},"current"," 和执行位置被保留。",[157,8328,159],{"id":159},[10,8330,8331,8332,8334],{},"生成器的暂停位置可以展开成多次 ",[34,8333,8223],{}," 的时间线。",[10,8336,8337],{},[26,8338],{"alt":8339,"src":8340},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8342,8343,8344,8346],{},"每次请求只推进到下一个 ",[34,8345,8209],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8348,182],{"id":182},[42,8350,8351,8354],{},[45,8352,8353],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,8355,8356],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8358,200],{"id":200},[133,8360,8361,8364],{},[45,8362,8363],{},"编写产生 1 到指定上限偶数的生成器。",[45,8365,4017,8366,8368,8369,8371],{},[34,8367,4345],{}," 遍历生成器，比较手动 ",[34,8370,8223],{}," 的差异。",[10,8373,211],{},[14,8375,214],{"id":214},[10,8377,8378],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,8380,221],{},{"title":73,"searchDepth":86,"depth":86,"links":8382},[8383,8384,8385,8386,8387,8390,8391,8392],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8388},[8389],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8185,"description":8190},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[234,8400,8401],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8404,"title":8405,"body":8406,"category":234,"cover":235,"description":8410,"extension":236,"meta":8634,"navigation":101,"path":8635,"pinned":239,"publishedAt":240,"seo":8636,"slug":8637,"stem":8638,"summary":8639,"tags":8640,"updatedAt":240,"visible":101,"__hash__":8642},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8407,"toc":8622},[8408,8411,8413,8416,8418,8424,8427,8429,8449,8451,8453,8535,8537,8543,8545,8547,8569,8571,8574,8580,8587,8589,8599,8601,8613,8615,8617,8620],[10,8409,8410],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8412,16],{"id":16},[10,8414,8415],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8417,22],{"id":22},[10,8419,8420],{},[26,8421],{"alt":8422,"src":8423},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8425,8426],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8428,40],{"id":40},[42,8430,8431,8440,8443],{},[45,8432,8433,8436,8437,60],{},[34,8434,8435],{},"@trace"," 等价于 ",[34,8438,8439],{},"add = trace(add)",[45,8441,8442],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,8444,8445,8448],{},[34,8446,8447],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8450,63],{"id":63},[10,8452,66],{},[68,8454,8456],{"className":70,"code":8455,"language":72,"meta":73,"style":73},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8457,8458,8463,8467,8472,8477,8482,8487,8492,8497,8502,8507,8511,8516,8520,8524,8529],{"__ignoreMap":73},[77,8459,8460],{"class":79,"line":80},[77,8461,8462],{},"from functools import wraps\n",[77,8464,8465],{"class":79,"line":86},[77,8466,102],{"emptyLinePlaceholder":101},[77,8468,8469],{"class":79,"line":92},[77,8470,8471],{},"def trace(function):\n",[77,8473,8474],{"class":79,"line":98},[77,8475,8476],{},"    @wraps(function)\n",[77,8478,8479],{"class":79,"line":105},[77,8480,8481],{},"    def wrapper(*args, **kwargs):\n",[77,8483,8484],{"class":79,"line":111},[77,8485,8486],{},"        print(\"开始：\", function.__name__)\n",[77,8488,8489],{"class":79,"line":2494},[77,8490,8491],{},"        result = function(*args, **kwargs)\n",[77,8493,8494],{"class":79,"line":2500},[77,8495,8496],{},"        print(\"结束：\", function.__name__)\n",[77,8498,8499],{"class":79,"line":3959},[77,8500,8501],{},"        return result\n",[77,8503,8504],{"class":79,"line":4171},[77,8505,8506],{},"    return wrapper\n",[77,8508,8509],{"class":79,"line":5787},[77,8510,102],{"emptyLinePlaceholder":101},[77,8512,8513],{"class":79,"line":5792},[77,8514,8515],{},"@trace\n",[77,8517,8518],{"class":79,"line":7397},[77,8519,6140],{},[77,8521,8522],{"class":79,"line":7403},[77,8523,6145],{},[77,8525,8527],{"class":79,"line":8526},15,[77,8528,102],{"emptyLinePlaceholder":101},[77,8530,8532],{"class":79,"line":8531},16,[77,8533,8534],{},"print(add(2, 3))\n",[10,8536,117],{},[68,8538,8541],{"className":8539,"code":8540,"language":123,"meta":73},[121],"开始： add\n结束： add\n5\n",[34,8542,8540],{"__ignoreMap":73},[10,8544,128],{},[14,8546,131],{"id":131},[133,8548,8549,8566],{},[45,8550,8551,8552,8555,8556,8559,8560,8563,8564,60],{},"解释器执行定义时，把原 ",[34,8553,8554],{},"add"," 函数交给 ",[34,8557,8558],{},"trace","，返回的 ",[34,8561,8562],{},"wrapper"," 重新绑定到名字 ",[34,8565,8554],{},[45,8567,8568],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[157,8570,159],{"id":159},[10,8572,8573],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8575,8576],{},[26,8577],{"alt":8578,"src":8579},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8581,8582,8584,8585,60],{},[34,8583,8435],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8586,8439],{},[14,8588,182],{"id":182},[42,8590,8591,8596],{},[45,8592,8593,8594,60],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8595,59],{},[45,8597,8598],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8600,200],{"id":200},[133,8602,8603,8606],{},[45,8604,8605],{},"编写只记录调用次数的简单装饰器。",[45,8607,8608,8609,8612],{},"删除包装函数的 ",[34,8610,8611],{},"return result","，观察调用方得到什么。",[10,8614,211],{},[14,8616,214],{"id":214},[10,8618,8619],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,8621,221],{},{"title":73,"searchDepth":86,"depth":86,"links":8623},[8624,8625,8626,8627,8628,8631,8632,8633],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8629},[8630],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8405,"description":8410},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[234,8641,5337],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8644,"title":8645,"body":8646,"category":234,"cover":235,"description":8650,"extension":236,"meta":8837,"navigation":101,"path":8838,"pinned":239,"publishedAt":240,"seo":8839,"slug":8840,"stem":8841,"summary":8842,"tags":8843,"updatedAt":240,"visible":101,"__hash__":8846},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8647,"toc":8825},[8648,8651,8653,8656,8658,8664,8667,8669,8680,8682,8684,8759,8761,8767,8769,8771,8782,8784,8787,8793,8796,8798,8806,8808,8816,8818,8820,8823],[10,8649,8650],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8652,16],{"id":16},[10,8654,8655],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8657,22],{"id":22},[10,8659,8660],{},[26,8661],{"alt":8662,"src":8663},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8665,8666],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8668,40],{"id":40},[42,8670,8671,8674,8677],{},[45,8672,8673],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,8675,8676],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,8678,8679],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8681,63],{"id":63},[10,8683,66],{},[68,8685,8687],{"className":70,"code":8686,"language":72,"meta":73,"style":73},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8688,8689,8694,8699,8703,8708,8712,8717,8722,8727,8731,8736,8741,8746,8750,8754],{"__ignoreMap":73},[77,8690,8691],{"class":79,"line":80},[77,8692,8693],{},"import logging\n",[77,8695,8696],{"class":79,"line":86},[77,8697,8698],{},"import unittest\n",[77,8700,8701],{"class":79,"line":92},[77,8702,102],{"emptyLinePlaceholder":101},[77,8704,8705],{"class":79,"line":98},[77,8706,8707],{},"logging.basicConfig(level=logging.INFO)\n",[77,8709,8710],{"class":79,"line":105},[77,8711,102],{"emptyLinePlaceholder":101},[77,8713,8714],{"class":79,"line":111},[77,8715,8716],{},"def clamp_progress(value):\n",[77,8718,8719],{"class":79,"line":2494},[77,8720,8721],{},"    logging.info(\"检查进度：%s\", value)\n",[77,8723,8724],{"class":79,"line":2500},[77,8725,8726],{},"    return max(0, min(100, value))\n",[77,8728,8729],{"class":79,"line":3959},[77,8730,102],{"emptyLinePlaceholder":101},[77,8732,8733],{"class":79,"line":4171},[77,8734,8735],{},"class ProgressTest(unittest.TestCase):\n",[77,8737,8738],{"class":79,"line":5787},[77,8739,8740],{},"    def test_upper_limit(self):\n",[77,8742,8743],{"class":79,"line":5792},[77,8744,8745],{},"        self.assertEqual(clamp_progress(120), 100)\n",[77,8747,8748],{"class":79,"line":7397},[77,8749,102],{"emptyLinePlaceholder":101},[77,8751,8752],{"class":79,"line":7403},[77,8753,6154],{},[77,8755,8756],{"class":79,"line":8526},[77,8757,8758],{},"    unittest.main()\n",[10,8760,117],{},[68,8762,8765],{"className":8763,"code":8764,"language":123,"meta":73},[121],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8766,8764],{"__ignoreMap":73},[10,8768,128],{},[14,8770,131],{"id":131},[133,8772,8773,8779],{},[45,8774,8775,8778],{},[34,8776,8777],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,8780,8781],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[157,8783,159],{"id":159},[10,8785,8786],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8788,8789],{},[26,8790],{"alt":8791,"src":8792},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8794,8795],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8797,182],{"id":182},[42,8799,8800,8803],{},[45,8801,8802],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,8804,8805],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8807,200],{"id":200},[133,8809,8810,8813],{},[45,8811,8812],{},"为负数进度增加测试。",[45,8814,8815],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8817,211],{},[14,8819,214],{"id":214},[10,8821,8822],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,8824,221],{},{"title":73,"searchDepth":86,"depth":86,"links":8826},[8827,8828,8829,8830,8831,8834,8835,8836],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":8832},[8833],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8645,"description":8650},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[234,8844,8845],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8848,"title":8849,"body":8850,"category":234,"cover":235,"description":8854,"extension":236,"meta":9154,"navigation":101,"path":9155,"pinned":239,"publishedAt":240,"seo":9156,"slug":9157,"stem":9158,"summary":9159,"tags":9160,"updatedAt":240,"visible":101,"__hash__":9163},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8851,"toc":9141},[8852,8855,8857,8860,8862,8868,8871,8873,8888,8890,8892,9039,9041,9047,9049,9051,9064,9066,9069,9075,9078,9080,9083,9089,9096,9098,9109,9111,9132,9134,9136,9139],[10,8853,8854],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8856,16],{"id":16},[10,8858,8859],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8861,22],{"id":22},[10,8863,8864],{},[26,8865],{"alt":8866,"src":8867},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8869,8870],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8872,40],{"id":40},[42,8874,8875,8878,8881],{},[45,8876,8877],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,8879,8880],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,8882,8883,8884,8887],{},"实际扩展前先为 ",[34,8885,8886],{},"add()"," 和存储边界补充测试。",[14,8889,63],{"id":63},[10,8891,66],{},[68,8893,8895],{"className":70,"code":8894,"language":72,"meta":73,"style":73},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8896,8897,8901,8905,8909,8914,8919,8924,8929,8933,8938,8943,8948,8953,8958,8962,8967,8972,8978,8983,8989,8994,8999,9005,9011,9017,9022,9028,9033],{"__ignoreMap":73},[77,8898,8899],{"class":79,"line":80},[77,8900,6952],{},[77,8902,8903],{"class":79,"line":86},[77,8904,6561],{},[77,8906,8907],{"class":79,"line":92},[77,8908,102],{"emptyLinePlaceholder":101},[77,8910,8911],{"class":79,"line":98},[77,8912,8913],{},"class LearningRecords:\n",[77,8915,8916],{"class":79,"line":105},[77,8917,8918],{},"    def __init__(self, file_path):\n",[77,8920,8921],{"class":79,"line":111},[77,8922,8923],{},"        self.file_path = Path(file_path)\n",[77,8925,8926],{"class":79,"line":2494},[77,8927,8928],{},"        self.items = []\n",[77,8930,8931],{"class":79,"line":2500},[77,8932,102],{"emptyLinePlaceholder":101},[77,8934,8935],{"class":79,"line":3959},[77,8936,8937],{},"    def add(self, title):\n",[77,8939,8940],{"class":79,"line":4171},[77,8941,8942],{},"        title = title.strip()\n",[77,8944,8945],{"class":79,"line":5787},[77,8946,8947],{},"        if not title:\n",[77,8949,8950],{"class":79,"line":5792},[77,8951,8952],{},"            raise ValueError(\"课程名称不能为空\")\n",[77,8954,8955],{"class":79,"line":7397},[77,8956,8957],{},"        self.items.append({\"title\": title, \"done\": False})\n",[77,8959,8960],{"class":79,"line":7403},[77,8961,102],{"emptyLinePlaceholder":101},[77,8963,8964],{"class":79,"line":8526},[77,8965,8966],{},"    def save(self):\n",[77,8968,8969],{"class":79,"line":8531},[77,8970,8971],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[77,8973,8975],{"class":79,"line":8974},17,[77,8976,8977],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[77,8979,8981],{"class":79,"line":8980},18,[77,8982,102],{"emptyLinePlaceholder":101},[77,8984,8986],{"class":79,"line":8985},19,[77,8987,8988],{},"records = LearningRecords(\"learning-records.json\")\n",[77,8990,8992],{"class":79,"line":8991},20,[77,8993,102],{"emptyLinePlaceholder":101},[77,8995,8997],{"class":79,"line":8996},21,[77,8998,7370],{},[77,9000,9002],{"class":79,"line":9001},22,[77,9003,9004],{},"    title = input(\"输入已学习课程：\")\n",[77,9006,9008],{"class":79,"line":9007},23,[77,9009,9010],{},"    records.add(title)\n",[77,9012,9014],{"class":79,"line":9013},24,[77,9015,9016],{},"    records.save()\n",[77,9018,9020],{"class":79,"line":9019},25,[77,9021,7380],{},[77,9023,9025],{"class":79,"line":9024},26,[77,9026,9027],{},"    print(\"无法保存：\", error)\n",[77,9029,9031],{"class":79,"line":9030},27,[77,9032,1153],{},[77,9034,9036],{"class":79,"line":9035},28,[77,9037,9038],{},"    print(\"已保存 1 条学习记录\")\n",[10,9040,117],{},[68,9042,9045],{"className":9043,"code":9044,"language":123,"meta":73},[121],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9046,9044],{"__ignoreMap":73},[10,9048,128],{},[14,9050,131],{"id":131},[133,9052,9053,9059],{},[45,9054,9055,9056,9058],{},"输入层取得课程名后，",[34,9057,8886],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,9060,9061,9063],{},[34,9062,8118],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[157,9065,159],{"id":159},[10,9067,9068],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9070,9071],{},[26,9072],{"alt":9073,"src":9074},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9076,9077],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[157,9079,159],{"id":4226},[10,9081,9082],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9084,9085],{},[26,9086],{"alt":9087,"src":9088},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9090,9091,9092,9095],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9093,9094],{},"load()"," 把文件状态恢复到内存。",[14,9097,182],{"id":182},[42,9099,9100,9103],{},[45,9101,9102],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,9104,9105,9106,9108],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9107,9094],{}," 是下一项必要扩展。",[14,9110,200],{"id":200},[133,9112,9113,9119,9122],{},[45,9114,9115,9116,9118],{},"增加 ",[34,9117,9094],{},"，文件不存在时从空列表开始。",[45,9120,9121],{},"增加按序号标记完成的功能，并校验序号范围。",[45,9123,9124,9125,9128,9129,9131],{},"把输入循环放进 ",[34,9126,9127],{},"main()","，通过 ",[34,9130,6096],{}," 控制程序入口。",[10,9133,211],{},[14,9135,214],{"id":214},[10,9137,9138],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[219,9140,221],{},{"title":73,"searchDepth":86,"depth":86,"links":9142},[9143,9144,9145,9146,9147,9151,9152,9153],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":9148},[9149,9150],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8849,"description":8854},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[234,9161,9162],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9165,9268,9387,9518,9661,9786,9923,10060,10201,10370,10507,10640,10763,10892,11019,11182,11358,11499,11628,11777,11920,12041,12164,12313,12466,12631,12758,12939,13082,13239,13390,13537,13692,13910,14065,14240,14391,14558,14745,14908,15150,15390],{"id":1399,"title":1400,"body":9166,"category":234,"cover":235,"description":1405,"extension":236,"meta":9265,"navigation":101,"path":1524,"pinned":239,"publishedAt":240,"seo":9266,"slug":1526,"stem":1527,"summary":1528,"tags":9267,"updatedAt":240,"visible":101,"__hash__":1531},{"type":7,"value":9167,"toc":9255},[9168,9170,9172,9174,9176,9180,9184,9186,9196,9198,9200,9208,9210,9215,9217,9219,9229,9231,9239,9241,9247,9249,9251,9253],[10,9169,1405],{},[14,9171,16],{"id":16},[10,9173,1410],{},[14,9175,22],{"id":22},[10,9177,9178],{},[26,9179],{"alt":1417,"src":1418},[10,9181,9182,1423],{},[34,9183,1177],{},[14,9185,40],{"id":40},[42,9187,9188,9192,9194],{},[45,9189,1430,9190,1433],{},[34,9191,1177],{},[45,9193,1436],{},[45,9195,1439],{},[14,9197,63],{"id":63},[10,9199,66],{},[68,9201,9202],{"className":70,"code":1446,"language":72,"meta":73,"style":73},[34,9203,9204],{"__ignoreMap":73},[77,9205,9206],{"class":79,"line":80},[77,9207,1446],{},[10,9209,117],{},[68,9211,9213],{"className":9212,"code":1458,"language":123,"meta":73},[121],[34,9214,1458],{"__ignoreMap":73},[10,9216,128],{},[14,9218,131],{"id":131},[133,9220,9221,9225],{},[45,9222,1469,9223,1473],{},[34,9224,1472],{},[45,9226,1476,9227,1480],{},[34,9228,1479],{},[14,9230,182],{"id":182},[42,9232,9233,9235],{},[45,9234,1487],{},[45,9236,1490,9237,1493],{},[34,9238,1177],{},[14,9240,200],{"id":200},[133,9242,9243,9245],{},[45,9244,1500],{},[45,9246,1503],{},[10,9248,211],{},[14,9250,214],{"id":214},[10,9252,1510],{},[219,9254,221],{},{"title":73,"searchDepth":86,"depth":86,"links":9256},[9257,9258,9259,9260,9261,9262,9263,9264],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":1400,"description":1405},[234,1395,1530],{"id":1533,"title":1534,"body":9269,"category":234,"cover":235,"description":1539,"extension":236,"meta":9384,"navigation":101,"path":1676,"pinned":239,"publishedAt":240,"seo":9385,"slug":1678,"stem":1679,"summary":1680,"tags":9386,"updatedAt":240,"visible":101,"__hash__":1683},{"type":7,"value":9270,"toc":9374},[9271,9273,9275,9277,9279,9283,9287,9289,9299,9301,9303,9323,9325,9330,9332,9334,9344,9346,9356,9358,9366,9368,9370,9372],[10,9272,1539],{},[14,9274,16],{"id":16},[10,9276,1544],{},[14,9278,22],{"id":22},[10,9280,9281],{},[26,9282],{"alt":1551,"src":1552},[10,9284,1555,9285,1558],{},[34,9286,698],{},[14,9288,40],{"id":40},[42,9290,9291,9293,9295],{},[45,9292,1565],{},[45,9294,1568],{},[45,9296,1571,9297,1575],{},[34,9298,1574],{},[14,9300,63],{"id":63},[10,9302,1580],{},[68,9304,9305],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,9306,9307,9313],{"__ignoreMap":73},[77,9308,9309,9311],{"class":79,"line":80},[77,9310,698],{"class":607},[77,9312,611],{"class":610},[77,9314,9315,9317,9319,9321],{"class":79,"line":86},[77,9316,698],{"class":607},[77,9318,640],{"class":610},[77,9320,644],{"class":643},[77,9322,611],{"class":610},[10,9324,117],{},[68,9326,9328],{"className":9327,"code":1606,"language":123,"meta":73},[121],[34,9329,1606],{"__ignoreMap":73},[10,9331,128],{},[14,9333,131],{"id":131},[133,9335,9336,9340],{},[45,9337,9338,1620],{},[34,9339,1619],{},[45,9341,9342,1625],{},[34,9343,706],{},[14,9345,182],{"id":182},[42,9347,9348,9352],{},[45,9349,1632,9350,1635],{},[34,9351,698],{},[45,9353,1638,9354,1641],{},[34,9355,698],{},[14,9357,200],{"id":200},[133,9359,9360,9364],{},[45,9361,945,9362,1651],{},[34,9363,1650],{},[45,9365,1654],{},[10,9367,211],{},[14,9369,214],{"id":214},[10,9371,1661],{},[219,9373,1664],{},{"title":73,"searchDepth":86,"depth":86,"links":9375},[9376,9377,9378,9379,9380,9381,9382,9383],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":1534,"description":1539},[234,1682,1059],{"id":1685,"title":1686,"body":9388,"category":234,"cover":235,"description":1852,"extension":236,"meta":9515,"navigation":101,"path":1854,"pinned":239,"publishedAt":240,"seo":9516,"slug":1856,"stem":1857,"summary":1858,"tags":9517,"updatedAt":240,"visible":101,"__hash__":1862},{"type":7,"value":9389,"toc":9505},[9390,9394,9396,9398,9400,9404,9406,9408,9424,9426,9428,9448,9450,9455,9457,9459,9471,9473,9483,9485,9495,9497,9499,9503],[10,9391,1691,9392,1694],{},[34,9393,1177],{},[14,9395,16],{"id":16},[10,9397,1699],{},[14,9399,22],{"id":22},[10,9401,9402],{},[26,9403],{"alt":1706,"src":1707},[10,9405,1710],{},[14,9407,40],{"id":40},[42,9409,9410,9416,9420],{},[45,9411,1717,9412,1720,9414,60],{},[34,9413,698],{},[34,9415,1723],{},[45,9417,1726,9418,1730],{},[34,9419,1729],{},[45,9421,1733,9422,1736],{},[34,9423,1177],{},[14,9425,63],{"id":63},[10,9427,66],{},[68,9429,9430],{"className":1743,"code":1744,"language":1745,"meta":73,"style":73},[34,9431,9432,9436,9440,9444],{"__ignoreMap":73},[77,9433,9434],{"class":79,"line":80},[77,9435,1752],{},[77,9437,9438],{"class":79,"line":86},[77,9439,1757],{},[77,9441,9442],{"class":79,"line":92},[77,9443,1762],{},[77,9445,9446],{"class":79,"line":98},[77,9447,1767],{},[10,9449,117],{},[68,9451,9453],{"className":9452,"code":1773,"language":123,"meta":73},[121],[34,9454,1773],{"__ignoreMap":73},[10,9456,128],{},[14,9458,131],{"id":131},[133,9460,9461,9467],{},[45,9462,1784,9463,1788,9465,60],{},[34,9464,1787],{},[34,9466,1791],{},[45,9468,1794,9469,1797],{},[34,9470,1479],{},[14,9472,182],{"id":182},[42,9474,9475,9481],{},[45,9476,1804,9477,1807,9479,1810],{},[34,9478,1723],{},[34,9480,1177],{},[45,9482,1813],{},[14,9484,200],{"id":200},[133,9486,9487,9491],{},[45,9488,1820,9489,60],{},[34,9490,1823],{},[45,9492,1826,9493,1829],{},[34,9494,1479],{},[10,9496,211],{},[14,9498,214],{"id":214},[10,9500,1836,9501,1839],{},[34,9502,1177],{},[219,9504,221],{},{"title":73,"searchDepth":86,"depth":86,"links":9506},[9507,9508,9509,9510,9511,9512,9513,9514],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":1686,"description":1852},[234,1860,1861],{"id":1864,"title":1865,"body":9519,"category":234,"cover":235,"description":1870,"extension":236,"meta":9658,"navigation":101,"path":2042,"pinned":239,"publishedAt":240,"seo":9659,"slug":2044,"stem":2045,"summary":2046,"tags":9660,"updatedAt":240,"visible":101,"__hash__":2050},{"type":7,"value":9520,"toc":9648},[9521,9523,9525,9527,9529,9533,9537,9539,9551,9553,9555,9591,9593,9598,9600,9602,9618,9620,9630,9632,9640,9642,9644,9646],[10,9522,1870],{},[14,9524,16],{"id":16},[10,9526,1875],{},[14,9528,22],{"id":22},[10,9530,9531],{},[26,9532],{"alt":1882,"src":1883},[10,9534,9535,1889],{},[34,9536,1888],{},[14,9538,40],{"id":40},[42,9540,9541,9543,9549],{},[45,9542,1896],{},[45,9544,9545,1902,9547,1906],{},[34,9546,1901],{},[34,9548,1905],{},[45,9550,1909],{},[14,9552,63],{"id":63},[10,9554,1580],{},[68,9556,9557],{"className":598,"code":1916,"language":600,"meta":73,"style":73},[34,9558,9559,9565,9571,9575,9585],{"__ignoreMap":73},[77,9560,9561,9563],{"class":79,"line":80},[77,9562,1923],{"class":607},[77,9564,1926],{"class":643},[77,9566,9567,9569],{"class":79,"line":86},[77,9568,1931],{"class":610},[77,9570,1926],{"class":643},[77,9572,9573],{"class":79,"line":92},[77,9574,1938],{"class":610},[77,9576,9577,9579,9581,9583],{"class":79,"line":98},[77,9578,1943],{"class":610},[77,9580,1946],{"class":643},[77,9582,1950],{"class":1949},[77,9584,1221],{"class":643},[77,9586,9587,9589],{"class":79,"line":105},[77,9588,698],{"class":607},[77,9590,1221],{"class":643},[10,9592,117],{},[68,9594,9596],{"className":9595,"code":1964,"language":123,"meta":73},[121],[34,9597,1964],{"__ignoreMap":73},[10,9599,128],{},[14,9601,131],{"id":131},[133,9603,9604,9612],{},[45,9605,9606,1977,9608,1980,9610,1983],{},[34,9607,1923],{},[34,9609,1931],{},[34,9611,1901],{},[45,9613,9614,1988,9616,1992],{},[34,9615,1888],{},[34,9617,1991],{},[14,9619,182],{"id":182},[42,9621,9622,9628],{},[45,9623,1999,9624,175,9626,60],{},[34,9625,1901],{},[34,9627,1905],{},[45,9629,2006],{},[14,9631,200],{"id":200},[133,9633,9634,9638],{},[45,9635,2013,9636,2017],{},[34,9637,2016],{},[45,9639,2020],{},[10,9641,211],{},[14,9643,214],{"id":214},[10,9645,2027],{},[219,9647,2030],{},{"title":73,"searchDepth":86,"depth":86,"links":9649},[9650,9651,9652,9653,9654,9655,9656,9657],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":1865,"description":1870},[234,2048,2049],{"id":2052,"title":2053,"body":9662,"category":234,"cover":235,"description":2058,"extension":236,"meta":9783,"navigation":101,"path":2207,"pinned":239,"publishedAt":240,"seo":9784,"slug":2209,"stem":2210,"summary":2211,"tags":9785,"updatedAt":240,"visible":101,"__hash__":2215},{"type":7,"value":9663,"toc":9773},[9664,9666,9668,9670,9672,9676,9684,9686,9700,9702,9704,9720,9722,9727,9729,9731,9745,9747,9753,9755,9765,9767,9769,9771],[10,9665,2058],{},[14,9667,16],{"id":16},[10,9669,2063],{},[14,9671,22],{"id":22},[10,9673,9674],{},[26,9675],{"alt":2070,"src":2071},[10,9677,2074,9678,60,9680,2080,9682,60],{},[34,9679,1479],{},[34,9681,2079],{},[34,9683,1787],{},[14,9685,40],{"id":40},[42,9687,9688,9692,9698],{},[45,9689,9690,2092],{},[34,9691,2091],{},[45,9693,9694,2098,9696,60],{},[34,9695,2097],{},[34,9697,2101],{},[45,9699,2104],{},[14,9701,63],{"id":63},[10,9703,66],{},[68,9705,9706],{"className":70,"code":2111,"language":72,"meta":73,"style":73},[34,9707,9708,9712,9716],{"__ignoreMap":73},[77,9709,9710],{"class":79,"line":80},[77,9711,2118],{},[77,9713,9714],{"class":79,"line":86},[77,9715,2123],{},[77,9717,9718],{"class":79,"line":92},[77,9719,2128],{},[10,9721,117],{},[68,9723,9725],{"className":9724,"code":2134,"language":123,"meta":73},[121],[34,9726,2134],{"__ignoreMap":73},[10,9728,128],{},[14,9730,131],{"id":131},[133,9732,9733,9739],{},[45,9734,9735,2148,9737,60],{},[34,9736,2147],{},[34,9738,2101],{},[45,9740,9741,2155,9743,2159],{},[34,9742,1479],{},[34,9744,2158],{},[14,9746,182],{"id":182},[42,9748,9749,9751],{},[45,9750,2166],{},[45,9752,2169],{},[14,9754,200],{"id":200},[133,9756,9757,9759],{},[45,9758,2176],{},[45,9760,2179,9761,2182,9763,2186],{},[34,9762,2079],{},[34,9764,2185],{},[10,9766,211],{},[14,9768,214],{"id":214},[10,9770,2193],{},[219,9772,221],{},{"title":73,"searchDepth":86,"depth":86,"links":9774},[9775,9776,9777,9778,9779,9780,9781,9782],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":2053,"description":2058},[234,2213,2214],{"id":2217,"title":2218,"body":9787,"category":234,"cover":235,"description":2223,"extension":236,"meta":9920,"navigation":101,"path":2390,"pinned":239,"publishedAt":240,"seo":9921,"slug":2392,"stem":2393,"summary":2394,"tags":9922,"updatedAt":240,"visible":101,"__hash__":2398},{"type":7,"value":9788,"toc":9910},[9789,9791,9793,9795,9797,9801,9803,9805,9821,9823,9825,9849,9851,9856,9858,9860,9876,9878,9890,9892,9902,9904,9906,9908],[10,9790,2223],{},[14,9792,16],{"id":16},[10,9794,2228],{},[14,9796,22],{"id":22},[10,9798,9799],{},[26,9800],{"alt":2235,"src":2236},[10,9802,2239],{},[14,9804,40],{"id":40},[42,9806,9807,9809,9815],{},[45,9808,2246],{},[45,9810,2249,9811,2182,9813,2256],{},[34,9812,2252],{},[34,9814,2255],{},[45,9816,2259,9817,141,9819,2266],{},[34,9818,2262],{},[34,9820,2265],{},[14,9822,63],{"id":63},[10,9824,66],{},[68,9826,9827],{"className":70,"code":2273,"language":72,"meta":73,"style":73},[34,9828,9829,9833,9837,9841,9845],{"__ignoreMap":73},[77,9830,9831],{"class":79,"line":80},[77,9832,2280],{},[77,9834,9835],{"class":79,"line":86},[77,9836,2285],{},[77,9838,9839],{"class":79,"line":92},[77,9840,102],{"emptyLinePlaceholder":101},[77,9842,9843],{"class":79,"line":98},[77,9844,2294],{},[77,9846,9847],{"class":79,"line":105},[77,9848,2285],{},[10,9850,117],{},[68,9852,9854],{"className":9853,"code":2304,"language":123,"meta":73},[121],[34,9855,2304],{"__ignoreMap":73},[10,9857,128],{},[14,9859,131],{"id":131},[133,9861,9862,9868],{},[45,9863,945,9864,2318,9866,2321],{},[34,9865,2317],{},[34,9867,2252],{},[45,9869,945,9870,2327,9872,2331,9874,60],{},[34,9871,2326],{},[34,9873,2330],{},[34,9875,2334],{},[14,9877,182],{"id":182},[42,9879,9880,9882],{},[45,9881,2341],{},[45,9883,2344,9884,141,9886,141,9888,2352],{},[34,9885,2262],{},[34,9887,2265],{},[34,9889,2351],{},[14,9891,200],{"id":200},[133,9893,9894,9900],{},[45,9895,2359,9896,175,9898,2366],{},[34,9897,2362],{},[34,9899,2365],{},[45,9901,2369],{},[10,9903,211],{},[14,9905,214],{"id":214},[10,9907,2376],{},[219,9909,221],{},{"title":73,"searchDepth":86,"depth":86,"links":9911},[9912,9913,9914,9915,9916,9917,9918,9919],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":2218,"description":2223},[234,2396,2397],{"id":2400,"title":2401,"body":9924,"category":234,"cover":235,"description":2406,"extension":236,"meta":10057,"navigation":101,"path":2573,"pinned":239,"publishedAt":240,"seo":10058,"slug":2575,"stem":2576,"summary":2577,"tags":10059,"updatedAt":240,"visible":101,"__hash__":2581},{"type":7,"value":9925,"toc":10047},[9926,9928,9930,9932,9934,9938,9940,9942,9960,9962,9964,10000,10002,10007,10009,10011,10021,10023,10031,10033,10039,10041,10043,10045],[10,9927,2406],{},[14,9929,16],{"id":16},[10,9931,2411],{},[14,9933,22],{"id":22},[10,9935,9936],{},[26,9937],{"alt":2418,"src":2419},[10,9939,2422],{},[14,9941,40],{"id":40},[42,9943,9944,9950,9958],{},[45,9945,9946,2432,9948,2436],{},[34,9947,2431],{},[34,9949,2435],{},[45,9951,9952,2442,9954,2446,9956,2450],{},[34,9953,2441],{},[34,9955,2445],{},[34,9957,2449],{},[45,9959,2453],{},[14,9961,63],{"id":63},[10,9963,66],{},[68,9965,9966],{"className":70,"code":2460,"language":72,"meta":73,"style":73},[34,9967,9968,9972,9976,9980,9984,9988,9992,9996],{"__ignoreMap":73},[77,9969,9970],{"class":79,"line":80},[77,9971,2467],{},[77,9973,9974],{"class":79,"line":86},[77,9975,2472],{},[77,9977,9978],{"class":79,"line":92},[77,9979,2477],{},[77,9981,9982],{"class":79,"line":98},[77,9983,102],{"emptyLinePlaceholder":101},[77,9985,9986],{"class":79,"line":105},[77,9987,2486],{},[77,9989,9990],{"class":79,"line":111},[77,9991,2491],{},[77,9993,9994],{"class":79,"line":2494},[77,9995,2497],{},[77,9997,9998],{"class":79,"line":2500},[77,9999,2503],{},[10,10001,117],{},[68,10003,10005],{"className":10004,"code":2509,"language":123,"meta":73},[121],[34,10006,2509],{"__ignoreMap":73},[10,10008,128],{},[14,10010,131],{"id":131},[133,10012,10013,10017],{},[45,10014,10015,2523],{},[34,10016,2522],{},[45,10018,10019,2529],{},[34,10020,2528],{},[14,10022,182],{"id":182},[42,10024,10025,10029],{},[45,10026,2536,10027,60],{},[34,10028,2539],{},[45,10030,2542],{},[14,10032,200],{"id":200},[133,10034,10035,10037],{},[45,10036,2549],{},[45,10038,2552],{},[10,10040,211],{},[14,10042,214],{"id":214},[10,10044,2559],{},[219,10046,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10048},[10049,10050,10051,10052,10053,10054,10055,10056],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":2401,"description":2406},[234,2579,2580],{"id":2583,"title":2584,"body":10061,"category":234,"cover":235,"description":2589,"extension":236,"meta":10198,"navigation":101,"path":2765,"pinned":239,"publishedAt":240,"seo":10199,"slug":2767,"stem":2768,"summary":2769,"tags":10200,"updatedAt":240,"visible":101,"__hash__":2773},{"type":7,"value":10062,"toc":10186},[10063,10065,10067,10069,10071,10075,10081,10083,10091,10093,10095,10119,10121,10126,10128,10130,10148,10150,10152,10156,10158,10160,10166,10168,10178,10180,10182,10184],[10,10064,2589],{},[14,10066,16],{"id":16},[10,10068,2594],{},[14,10070,22],{"id":22},[10,10072,10073],{},[26,10074],{"alt":2601,"src":2602},[10,10076,2605,10077,2609,10079,60],{},[34,10078,2608],{},[34,10080,2612],{},[14,10082,40],{"id":40},[42,10084,10085,10087,10089],{},[45,10086,2619],{},[45,10088,2622],{},[45,10090,2625],{},[14,10092,63],{"id":63},[10,10094,66],{},[68,10096,10097],{"className":70,"code":2632,"language":72,"meta":73,"style":73},[34,10098,10099,10103,10107,10111,10115],{"__ignoreMap":73},[77,10100,10101],{"class":79,"line":80},[77,10102,2639],{},[77,10104,10105],{"class":79,"line":86},[77,10106,2644],{},[77,10108,10109],{"class":79,"line":92},[77,10110,2649],{},[77,10112,10113],{"class":79,"line":98},[77,10114,2654],{},[77,10116,10117],{"class":79,"line":105},[77,10118,2659],{},[10,10120,117],{},[68,10122,10124],{"className":10123,"code":2665,"language":123,"meta":73},[121],[34,10125,2665],{"__ignoreMap":73},[10,10127,128],{},[14,10129,131],{"id":131},[133,10131,10132,10140],{},[45,10133,2676,10134,2679,10136,2683,10138,2687],{},[34,10135,234],{},[34,10137,2682],{},[34,10139,2686],{},[45,10141,10142,2693,10144,2697,10146,2701],{},[34,10143,2692],{},[34,10145,2696],{},[34,10147,2700],{},[157,10149,159],{"id":159},[10,10151,2706],{},[10,10153,10154],{},[26,10155],{"alt":2711,"src":2712},[10,10157,2715],{},[14,10159,182],{"id":182},[42,10161,10162,10164],{},[45,10163,2722],{},[45,10165,2725],{},[14,10167,200],{"id":200},[133,10169,10170,10176],{},[45,10171,2732,10172,2736,10174,60],{},[34,10173,2735],{},[34,10175,2739],{},[45,10177,2742],{},[10,10179,211],{},[14,10181,214],{"id":214},[10,10183,2749],{},[219,10185,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10187},[10188,10189,10190,10191,10192,10195,10196,10197],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":10193},[10194],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":2584,"description":2589},[234,2771,2772],{"id":2775,"title":2776,"body":10202,"category":234,"cover":235,"description":2781,"extension":236,"meta":10367,"navigation":101,"path":2996,"pinned":239,"publishedAt":240,"seo":10368,"slug":2998,"stem":2999,"summary":3000,"tags":10369,"updatedAt":240,"visible":101,"__hash__":3004},{"type":7,"value":10203,"toc":10355},[10204,10206,10208,10210,10212,10216,10222,10224,10244,10246,10248,10284,10286,10291,10293,10295,10309,10311,10313,10317,10323,10325,10335,10337,10347,10349,10351,10353],[10,10205,2781],{},[14,10207,16],{"id":16},[10,10209,2786],{},[14,10211,22],{"id":22},[10,10213,10214],{},[26,10215],{"alt":2793,"src":2794},[10,10217,2797,10218,1016,10220,2804],{},[34,10219,2800],{},[34,10221,2803],{},[14,10223,40],{"id":40},[42,10225,10226,10234,10242],{},[45,10227,10228,2814,10230,2818,10232,2822],{},[34,10229,2813],{},[34,10231,2817],{},[34,10233,2821],{},[45,10235,10236,2828,10238,2832,10240,2836],{},[34,10237,2827],{},[34,10239,2831],{},[34,10241,2835],{},[45,10243,2839],{},[14,10245,63],{"id":63},[10,10247,66],{},[68,10249,10250],{"className":70,"code":2846,"language":72,"meta":73,"style":73},[34,10251,10252,10256,10260,10264,10268,10272,10276,10280],{"__ignoreMap":73},[77,10253,10254],{"class":79,"line":80},[77,10255,2853],{},[77,10257,10258],{"class":79,"line":86},[77,10259,2858],{},[77,10261,10262],{"class":79,"line":92},[77,10263,102],{"emptyLinePlaceholder":101},[77,10265,10266],{"class":79,"line":98},[77,10267,2867],{},[77,10269,10270],{"class":79,"line":105},[77,10271,2872],{},[77,10273,10274],{"class":79,"line":111},[77,10275,2877],{},[77,10277,10278],{"class":79,"line":2494},[77,10279,2882],{},[77,10281,10282],{"class":79,"line":2500},[77,10283,2887],{},[10,10285,117],{},[68,10287,10289],{"className":10288,"code":2893,"language":123,"meta":73},[121],[34,10290,2893],{"__ignoreMap":73},[10,10292,128],{},[14,10294,131],{"id":131},[133,10296,10297,10303],{},[45,10298,10299,2907,10301,2911],{},[34,10300,2906],{},[34,10302,2910],{},[45,10304,10305,2917,10307,2920],{},[34,10306,2916],{},[34,10308,2835],{},[157,10310,159],{"id":159},[10,10312,2925],{},[10,10314,10315],{},[26,10316],{"alt":2930,"src":2931},[10,10318,10319,2936,10321,2939],{},[34,10320,2827],{},[34,10322,2831],{},[14,10324,182],{"id":182},[42,10326,10327,10333],{},[45,10328,2946,10329,2949,10331,2952],{},[34,10330,2821],{},[34,10332,2813],{},[45,10334,2955],{},[14,10336,200],{"id":200},[133,10338,10339,10343],{},[45,10340,2962,10341,2966],{},[34,10342,2965],{},[45,10344,2969,10345,2973],{},[34,10346,2972],{},[10,10348,211],{},[14,10350,214],{"id":214},[10,10352,2980],{},[219,10354,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10356},[10357,10358,10359,10360,10361,10364,10365,10366],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":10362},[10363],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":2776,"description":2781},[234,3002,3003],{"id":3006,"title":3007,"body":10371,"category":234,"cover":235,"description":3012,"extension":236,"meta":10504,"navigation":101,"path":3181,"pinned":239,"publishedAt":240,"seo":10505,"slug":3183,"stem":3184,"summary":3185,"tags":10506,"updatedAt":240,"visible":101,"__hash__":3188},{"type":7,"value":10372,"toc":10494},[10373,10375,10377,10379,10381,10385,10395,10397,10407,10409,10411,10439,10441,10446,10448,10450,10464,10466,10474,10476,10486,10488,10490,10492],[10,10374,3012],{},[14,10376,16],{"id":16},[10,10378,3017],{},[14,10380,22],{"id":22},[10,10382,10383],{},[26,10384],{"alt":3024,"src":3025},[10,10386,10387,3031,10389,3035,10391,3039,10393,3043],{},[34,10388,3030],{},[34,10390,3034],{},[34,10392,3038],{},[34,10394,3042],{},[14,10396,40],{"id":40},[42,10398,10399,10401,10405],{},[45,10400,3050],{},[45,10402,10403,3055],{},[34,10404,3042],{},[45,10406,3058],{},[14,10408,63],{"id":63},[10,10410,66],{},[68,10412,10413],{"className":70,"code":3065,"language":72,"meta":73,"style":73},[34,10414,10415,10419,10423,10427,10431,10435],{"__ignoreMap":73},[77,10416,10417],{"class":79,"line":80},[77,10418,3072],{},[77,10420,10421],{"class":79,"line":86},[77,10422,3077],{},[77,10424,10425],{"class":79,"line":92},[77,10426,3082],{},[77,10428,10429],{"class":79,"line":98},[77,10430,102],{"emptyLinePlaceholder":101},[77,10432,10433],{"class":79,"line":105},[77,10434,3091],{},[77,10436,10437],{"class":79,"line":111},[77,10438,3096],{},[10,10440,117],{},[68,10442,10444],{"className":10443,"code":3102,"language":123,"meta":73},[121],[34,10445,3102],{"__ignoreMap":73},[10,10447,128],{},[14,10449,131],{"id":131},[133,10451,10452,10458],{},[45,10453,3113,10454,3116,10456,3120],{},[34,10455,3030],{},[34,10457,3119],{},[45,10459,10460,3126,10462,3130],{},[34,10461,3125],{},[34,10463,3129],{},[14,10465,182],{"id":182},[42,10467,10468,10472],{},[45,10469,3137,10470,3141],{},[34,10471,3140],{},[45,10473,3144],{},[14,10475,200],{"id":200},[133,10477,10478,10480],{},[45,10479,3151],{},[45,10481,1726,10482,3157,10484,3160],{},[34,10483,3156],{},[34,10485,3042],{},[10,10487,211],{},[14,10489,214],{"id":214},[10,10491,3167],{},[219,10493,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10495},[10496,10497,10498,10499,10500,10501,10502,10503],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3007,"description":3012},[234,2351,3187],{"id":3190,"title":3191,"body":10508,"category":234,"cover":235,"description":3196,"extension":236,"meta":10637,"navigation":101,"path":3357,"pinned":239,"publishedAt":240,"seo":10638,"slug":3359,"stem":3360,"summary":3361,"tags":10639,"updatedAt":240,"visible":101,"__hash__":3365},{"type":7,"value":10509,"toc":10627},[10510,10512,10514,10516,10518,10522,10526,10528,10538,10540,10542,10574,10576,10581,10583,10585,10597,10599,10609,10611,10619,10621,10623,10625],[10,10511,3196],{},[14,10513,16],{"id":16},[10,10515,3201],{},[14,10517,22],{"id":22},[10,10519,10520],{},[26,10521],{"alt":3208,"src":3209},[10,10523,3212,10524,3216],{},[34,10525,3215],{},[14,10527,40],{"id":40},[42,10529,10530,10532,10534],{},[45,10531,3223],{},[45,10533,3226],{},[45,10535,3229,10536,60],{},[34,10537,3232],{},[14,10539,63],{"id":63},[10,10541,66],{},[68,10543,10544],{"className":70,"code":3239,"language":72,"meta":73,"style":73},[34,10545,10546,10550,10554,10558,10562,10566,10570],{"__ignoreMap":73},[77,10547,10548],{"class":79,"line":80},[77,10549,3246],{},[77,10551,10552],{"class":79,"line":86},[77,10553,3251],{},[77,10555,10556],{"class":79,"line":92},[77,10557,102],{"emptyLinePlaceholder":101},[77,10559,10560],{"class":79,"line":98},[77,10561,3260],{},[77,10563,10564],{"class":79,"line":105},[77,10565,3265],{},[77,10567,10568],{"class":79,"line":111},[77,10569,3270],{},[77,10571,10572],{"class":79,"line":2494},[77,10573,3275],{},[10,10575,117],{},[68,10577,10579],{"className":10578,"code":3281,"language":123,"meta":73},[121],[34,10580,3281],{"__ignoreMap":73},[10,10582,128],{},[14,10584,131],{"id":131},[133,10586,10587,10589],{},[45,10588,3292],{},[45,10590,10591,3298,10593,3302,10595,3306],{},[34,10592,3297],{},[34,10594,3301],{},[34,10596,3305],{},[14,10598,182],{"id":182},[42,10600,10601,10607],{},[45,10602,3313,10603,3317,10605,60],{},[34,10604,3316],{},[34,10606,3320],{},[45,10608,3323],{},[14,10610,200],{"id":200},[133,10612,10613,10615],{},[45,10614,3330],{},[45,10616,3333,10617,3336],{},[34,10618,3305],{},[10,10620,211],{},[14,10622,214],{"id":214},[10,10624,3343],{},[219,10626,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10628},[10629,10630,10631,10632,10633,10634,10635,10636],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3191,"description":3196},[234,3363,3364],{"id":3367,"title":3368,"body":10641,"category":234,"cover":235,"description":3373,"extension":236,"meta":10760,"navigation":101,"path":3515,"pinned":239,"publishedAt":240,"seo":10761,"slug":3517,"stem":3518,"summary":3519,"tags":10762,"updatedAt":240,"visible":101,"__hash__":3522},{"type":7,"value":10642,"toc":10750},[10643,10645,10647,10649,10651,10655,10657,10659,10667,10669,10671,10699,10701,10706,10708,10710,10720,10722,10730,10732,10742,10744,10746,10748],[10,10644,3373],{},[14,10646,16],{"id":16},[10,10648,3378],{},[14,10650,22],{"id":22},[10,10652,10653],{},[26,10654],{"alt":3385,"src":3386},[10,10656,3389],{},[14,10658,40],{"id":40},[42,10660,10661,10663,10665],{},[45,10662,3396],{},[45,10664,3399],{},[45,10666,3402],{},[14,10668,63],{"id":63},[10,10670,66],{},[68,10672,10673],{"className":70,"code":3409,"language":72,"meta":73,"style":73},[34,10674,10675,10679,10683,10687,10691,10695],{"__ignoreMap":73},[77,10676,10677],{"class":79,"line":80},[77,10678,3416],{},[77,10680,10681],{"class":79,"line":86},[77,10682,3421],{},[77,10684,10685],{"class":79,"line":92},[77,10686,3426],{},[77,10688,10689],{"class":79,"line":98},[77,10690,102],{"emptyLinePlaceholder":101},[77,10692,10693],{"class":79,"line":105},[77,10694,3435],{},[77,10696,10697],{"class":79,"line":111},[77,10698,3440],{},[10,10700,117],{},[68,10702,10704],{"className":10703,"code":3446,"language":123,"meta":73},[121],[34,10705,3446],{"__ignoreMap":73},[10,10707,128],{},[14,10709,131],{"id":131},[133,10711,10712,10716],{},[45,10713,10714,3460],{},[34,10715,3459],{},[45,10717,10718,3466],{},[34,10719,3465],{},[14,10721,182],{"id":182},[42,10723,10724,10728],{},[45,10725,3473,10726,3477],{},[34,10727,3476],{},[45,10729,3480],{},[14,10731,200],{"id":200},[133,10733,10734,10736],{},[45,10735,3487],{},[45,10737,2179,10738,2182,10740,3494],{},[34,10739,3476],{},[34,10741,3465],{},[10,10743,211],{},[14,10745,214],{"id":214},[10,10747,3501],{},[219,10749,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10751},[10752,10753,10754,10755,10756,10757,10758,10759],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3368,"description":3373},[234,3521,3364],{"id":3524,"title":3525,"body":10764,"category":234,"cover":235,"description":3530,"extension":236,"meta":10889,"navigation":101,"path":3686,"pinned":239,"publishedAt":240,"seo":10890,"slug":3688,"stem":3689,"summary":3690,"tags":10891,"updatedAt":240,"visible":101,"__hash__":3693},{"type":7,"value":10765,"toc":10879},[10766,10768,10770,10772,10774,10778,10784,10786,10796,10798,10800,10828,10830,10835,10837,10839,10849,10851,10863,10865,10871,10873,10875,10877],[10,10767,3530],{},[14,10769,16],{"id":16},[10,10771,3535],{},[14,10773,22],{"id":22},[10,10775,10776],{},[26,10777],{"alt":3542,"src":3543},[10,10779,3546,10780,3550,10782,3553],{},[34,10781,3549],{},[34,10783,2252],{},[14,10785,40],{"id":40},[42,10787,10788,10790,10794],{},[45,10789,3560],{},[45,10791,2344,10792,3566],{},[34,10793,3565],{},[45,10795,3569],{},[14,10797,63],{"id":63},[10,10799,66],{},[68,10801,10802],{"className":70,"code":3576,"language":72,"meta":73,"style":73},[34,10803,10804,10808,10812,10816,10820,10824],{"__ignoreMap":73},[77,10805,10806],{"class":79,"line":80},[77,10807,3583],{},[77,10809,10810],{"class":79,"line":86},[77,10811,3588],{},[77,10813,10814],{"class":79,"line":92},[77,10815,102],{"emptyLinePlaceholder":101},[77,10817,10818],{"class":79,"line":98},[77,10819,3597],{},[77,10821,10822],{"class":79,"line":105},[77,10823,3602],{},[77,10825,10826],{"class":79,"line":111},[77,10827,3607],{},[10,10829,117],{},[68,10831,10833],{"className":10832,"code":3613,"language":123,"meta":73},[121],[34,10834,3613],{"__ignoreMap":73},[10,10836,128],{},[14,10838,131],{"id":131},[133,10840,10841,10843],{},[45,10842,3624],{},[45,10844,3627,10845,3630,10847,3634],{},[34,10846,2252],{},[34,10848,3633],{},[14,10850,182],{"id":182},[42,10852,10853,10857],{},[45,10854,3641,10855,3645],{},[34,10856,3644],{},[45,10858,3648,10859,3652,10861,60],{},[34,10860,3651],{},[34,10862,3655],{},[14,10864,200],{"id":200},[133,10866,10867,10869],{},[45,10868,3662],{},[45,10870,3665],{},[10,10872,211],{},[14,10874,214],{"id":214},[10,10876,3672],{},[219,10878,221],{},{"title":73,"searchDepth":86,"depth":86,"links":10880},[10881,10882,10883,10884,10885,10886,10887,10888],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3525,"description":3530},[234,3692,3364],{"id":3695,"title":3696,"body":10893,"category":234,"cover":235,"description":3701,"extension":236,"meta":11016,"navigation":101,"path":3851,"pinned":239,"publishedAt":240,"seo":11017,"slug":3853,"stem":3854,"summary":3855,"tags":11018,"updatedAt":240,"visible":101,"__hash__":3858},{"type":7,"value":10894,"toc":11006},[10895,10897,10899,10901,10903,10907,10909,10911,10923,10925,10927,10955,10957,10962,10964,10966,10976,10978,10988,10990,10998,11000,11002,11004],[10,10896,3701],{},[14,10898,16],{"id":16},[10,10900,3706],{},[14,10902,22],{"id":22},[10,10904,10905],{},[26,10906],{"alt":3713,"src":3714},[10,10908,3717],{},[14,10910,40],{"id":40},[42,10912,10913,10915,10917],{},[45,10914,3724],{},[45,10916,3727],{},[45,10918,3730,10919,3734,10921,3738],{},[34,10920,3733],{},[34,10922,3737],{},[14,10924,63],{"id":63},[10,10926,66],{},[68,10928,10929],{"className":70,"code":3745,"language":72,"meta":73,"style":73},[34,10930,10931,10935,10939,10943,10947,10951],{"__ignoreMap":73},[77,10932,10933],{"class":79,"line":80},[77,10934,3752],{},[77,10936,10937],{"class":79,"line":86},[77,10938,3757],{},[77,10940,10941],{"class":79,"line":92},[77,10942,102],{"emptyLinePlaceholder":101},[77,10944,10945],{"class":79,"line":98},[77,10946,3766],{},[77,10948,10949],{"class":79,"line":105},[77,10950,3771],{},[77,10952,10953],{"class":79,"line":111},[77,10954,3776],{},[10,10956,117],{},[68,10958,10960],{"className":10959,"code":3782,"language":123,"meta":73},[121],[34,10961,3782],{"__ignoreMap":73},[10,10963,128],{},[14,10965,131],{"id":131},[133,10967,10968,10970],{},[45,10969,3793],{},[45,10971,10972,3799,10974,3803],{},[34,10973,3798],{},[34,10975,3802],{},[14,10977,182],{"id":182},[42,10979,10980,10986],{},[45,10981,2344,10982,3812,10984,60],{},[34,10983,3737],{},[34,10985,3733],{},[45,10987,3817],{},[14,10989,200],{"id":200},[133,10991,10992,10996],{},[45,10993,3824,10994,3827],{},[34,10995,3733],{},[45,10997,3830],{},[10,10999,211],{},[14,11001,214],{"id":214},[10,11003,3837],{},[219,11005,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11007},[11008,11009,11010,11011,11012,11013,11014,11015],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3696,"description":3701},[234,3857,3364],{"id":3860,"title":3861,"body":11020,"category":234,"cover":235,"description":3866,"extension":236,"meta":11179,"navigation":101,"path":4065,"pinned":239,"publishedAt":240,"seo":11180,"slug":4067,"stem":4068,"summary":4069,"tags":11181,"updatedAt":240,"visible":101,"__hash__":4073},{"type":7,"value":11021,"toc":11167},[11022,11024,11026,11028,11030,11034,11040,11042,11054,11056,11058,11098,11100,11105,11107,11109,11123,11125,11127,11131,11133,11135,11145,11147,11159,11161,11163,11165],[10,11023,3866],{},[14,11025,16],{"id":16},[10,11027,3871],{},[14,11029,22],{"id":22},[10,11031,11032],{},[26,11033],{"alt":3878,"src":3879},[10,11035,11036,3885,11038,3889],{},[34,11037,3884],{},[34,11039,3888],{},[14,11041,40],{"id":40},[42,11043,11044,11050,11052],{},[45,11045,11046,3898,11048,3902],{},[34,11047,2813],{},[34,11049,3901],{},[45,11051,3905],{},[45,11053,3908],{},[14,11055,63],{"id":63},[10,11057,66],{},[68,11059,11060],{"className":70,"code":3915,"language":72,"meta":73,"style":73},[34,11061,11062,11066,11070,11074,11078,11082,11086,11090,11094],{"__ignoreMap":73},[77,11063,11064],{"class":79,"line":80},[77,11065,3922],{},[77,11067,11068],{"class":79,"line":86},[77,11069,3927],{},[77,11071,11072],{"class":79,"line":92},[77,11073,3932],{},[77,11075,11076],{"class":79,"line":98},[77,11077,102],{"emptyLinePlaceholder":101},[77,11079,11080],{"class":79,"line":105},[77,11081,3941],{},[77,11083,11084],{"class":79,"line":111},[77,11085,3946],{},[77,11087,11088],{"class":79,"line":2494},[77,11089,3951],{},[77,11091,11092],{"class":79,"line":2500},[77,11093,3956],{},[77,11095,11096],{"class":79,"line":3959},[77,11097,3962],{},[10,11099,117],{},[68,11101,11103],{"className":11102,"code":3968,"language":123,"meta":73},[121],[34,11104,3968],{"__ignoreMap":73},[10,11106,128],{},[14,11108,131],{"id":131},[133,11110,11111,11115],{},[45,11112,11113,3982],{},[34,11114,3981],{},[45,11116,11117,3988,11119,3992,11121,3996],{},[34,11118,3987],{},[34,11120,3991],{},[34,11122,3995],{},[157,11124,159],{"id":159},[10,11126,4001],{},[10,11128,11129],{},[26,11130],{"alt":4006,"src":4007},[10,11132,4010],{},[14,11134,182],{"id":182},[42,11136,11137,11143],{},[45,11138,4017,11139,4020,11141,60],{},[34,11140,2813],{},[34,11142,3901],{},[45,11144,4025],{},[14,11146,200],{"id":200},[133,11148,11149,11151],{},[45,11150,4032],{},[45,11152,2344,11153,4038,11155,175,11157,60],{},[34,11154,4037],{},[34,11156,3901],{},[34,11158,2813],{},[10,11160,211],{},[14,11162,214],{"id":214},[10,11164,4049],{},[219,11166,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11168},[11169,11170,11171,11172,11173,11176,11177,11178],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11174},[11175],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":3861,"description":3866},[234,4071,4072],{"id":4075,"title":4076,"body":11183,"category":234,"cover":235,"description":4081,"extension":236,"meta":11355,"navigation":101,"path":4295,"pinned":239,"publishedAt":240,"seo":11356,"slug":4297,"stem":4298,"summary":4299,"tags":11357,"updatedAt":240,"visible":101,"__hash__":4302},{"type":7,"value":11184,"toc":11342},[11185,11187,11189,11191,11193,11197,11205,11207,11215,11217,11219,11263,11265,11270,11272,11274,11286,11288,11290,11294,11300,11302,11304,11308,11312,11314,11326,11328,11334,11336,11338,11340],[10,11186,4081],{},[14,11188,16],{"id":16},[10,11190,4086],{},[14,11192,22],{"id":22},[10,11194,11195],{},[26,11196],{"alt":4093,"src":4094},[10,11198,11199,141,11201,141,11203,4104],{},[34,11200,1163],{},[34,11202,4101],{},[34,11204,1166],{},[14,11206,40],{"id":40},[42,11208,11209,11211,11213],{},[45,11210,4111],{},[45,11212,4114],{},[45,11214,4117],{},[14,11216,63],{"id":63},[10,11218,66],{},[68,11220,11221],{"className":70,"code":4124,"language":72,"meta":73,"style":73},[34,11222,11223,11227,11231,11235,11239,11243,11247,11251,11255,11259],{"__ignoreMap":73},[77,11224,11225],{"class":79,"line":80},[77,11226,4131],{},[77,11228,11229],{"class":79,"line":86},[77,11230,102],{"emptyLinePlaceholder":101},[77,11232,11233],{"class":79,"line":92},[77,11234,4140],{},[77,11236,11237],{"class":79,"line":98},[77,11238,4145],{},[77,11240,11241],{"class":79,"line":105},[77,11242,4150],{},[77,11244,11245],{"class":79,"line":111},[77,11246,4155],{},[77,11248,11249],{"class":79,"line":2494},[77,11250,1153],{},[77,11252,11253],{"class":79,"line":2500},[77,11254,4164],{},[77,11256,11257],{"class":79,"line":3959},[77,11258,102],{"emptyLinePlaceholder":101},[77,11260,11261],{"class":79,"line":4171},[77,11262,4174],{},[10,11264,117],{},[68,11266,11268],{"className":11267,"code":4180,"language":123,"meta":73},[121],[34,11269,4180],{"__ignoreMap":73},[10,11271,128],{},[14,11273,131],{"id":131},[133,11275,11276,11280],{},[45,11277,4191,11278,4195],{},[34,11279,4194],{},[45,11281,11282,4201,11284,4204],{},[34,11283,4200],{},[34,11285,1166],{},[157,11287,159],{"id":159},[10,11289,4209],{},[10,11291,11292],{},[26,11293],{"alt":4214,"src":4215},[10,11295,11296,4220,11298,4223],{},[34,11297,4194],{},[34,11299,4200],{},[157,11301,159],{"id":4226},[10,11303,4229],{},[10,11305,11306],{},[26,11307],{"alt":4234,"src":4235},[10,11309,4238,11310,4241],{},[34,11311,1163],{},[14,11313,182],{"id":182},[42,11315,11316,11320],{},[45,11317,4248,11318,4251],{},[34,11319,4200],{},[45,11321,4254,11322,4257,11324,4261],{},[34,11323,1163],{},[34,11325,4260],{},[14,11327,200],{"id":200},[133,11329,11330,11332],{},[45,11331,4268],{},[45,11333,4271],{},[10,11335,211],{},[14,11337,214],{"id":214},[10,11339,4278],{},[219,11341,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11343},[11344,11345,11346,11347,11348,11352,11353,11354],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11349},[11350,11351],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":4076,"description":4081},[234,1163,4301],{"id":4304,"title":4305,"body":11359,"category":234,"cover":235,"description":4310,"extension":236,"meta":11496,"navigation":101,"path":4476,"pinned":239,"publishedAt":240,"seo":11497,"slug":4478,"stem":4479,"summary":4480,"tags":11498,"updatedAt":240,"visible":101,"__hash__":4483},{"type":7,"value":11360,"toc":11484},[11361,11363,11365,11367,11369,11373,11377,11379,11389,11391,11393,11425,11427,11432,11434,11436,11446,11448,11450,11454,11458,11460,11466,11468,11476,11478,11480,11482],[10,11362,4310],{},[14,11364,16],{"id":16},[10,11366,4315],{},[14,11368,22],{"id":22},[10,11370,11371],{},[26,11372],{"alt":4322,"src":4323},[10,11374,11375,4329],{},[34,11376,4328],{},[14,11378,40],{"id":40},[42,11380,11381,11383,11385],{},[45,11382,4336],{},[45,11384,4339],{},[45,11386,4342,11387,4346],{},[34,11388,4345],{},[14,11390,63],{"id":63},[10,11392,66],{},[68,11394,11395],{"className":70,"code":4353,"language":72,"meta":73,"style":73},[34,11396,11397,11401,11405,11409,11413,11417,11421],{"__ignoreMap":73},[77,11398,11399],{"class":79,"line":80},[77,11400,4360],{},[77,11402,11403],{"class":79,"line":86},[77,11404,102],{"emptyLinePlaceholder":101},[77,11406,11407],{"class":79,"line":92},[77,11408,4369],{},[77,11410,11411],{"class":79,"line":98},[77,11412,4374],{},[77,11414,11415],{"class":79,"line":105},[77,11416,4379],{},[77,11418,11419],{"class":79,"line":111},[77,11420,102],{"emptyLinePlaceholder":101},[77,11422,11423],{"class":79,"line":2494},[77,11424,4388],{},[10,11426,117],{},[68,11428,11430],{"className":11429,"code":4394,"language":123,"meta":73},[121],[34,11431,4394],{"__ignoreMap":73},[10,11433,128],{},[14,11435,131],{"id":131},[133,11437,11438,11442],{},[45,11439,4405,11440,4408],{},[34,11441,144],{},[45,11443,4411,11444,4414],{},[34,11445,144],{},[157,11447,159],{"id":159},[10,11449,4419],{},[10,11451,11452],{},[26,11453],{"alt":4424,"src":4425},[10,11455,4428,11456,4431],{},[34,11457,144],{},[14,11459,182],{"id":182},[42,11461,11462,11464],{},[45,11463,4438],{},[45,11465,4441],{},[14,11467,200],{"id":200},[133,11469,11470,11474],{},[45,11471,2344,11472,4450],{},[34,11473,4328],{},[45,11475,4453],{},[10,11477,211],{},[14,11479,214],{"id":214},[10,11481,4460],{},[219,11483,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11485},[11486,11487,11488,11489,11490,11493,11494,11495],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11491},[11492],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":4305,"description":4310},[234,4328,4482],{"id":4485,"title":4486,"body":11500,"category":234,"cover":235,"description":4491,"extension":236,"meta":11625,"navigation":101,"path":4640,"pinned":239,"publishedAt":240,"seo":11626,"slug":4642,"stem":4643,"summary":4644,"tags":11627,"updatedAt":240,"visible":101,"__hash__":4647},{"type":7,"value":11501,"toc":11615},[11502,11504,11506,11508,11510,11514,11518,11520,11530,11532,11534,11566,11568,11573,11575,11577,11589,11591,11597,11599,11607,11609,11611,11613],[10,11503,4491],{},[14,11505,16],{"id":16},[10,11507,4496],{},[14,11509,22],{"id":22},[10,11511,11512],{},[26,11513],{"alt":4503,"src":4504},[10,11515,11516,4509],{},[34,11517,4345],{},[14,11519,40],{"id":40},[42,11521,11522,11526,11528],{},[45,11523,11524,4519],{},[34,11525,4518],{},[45,11527,4522],{},[45,11529,4525],{},[14,11531,63],{"id":63},[10,11533,66],{},[68,11535,11536],{"className":70,"code":4532,"language":72,"meta":73,"style":73},[34,11537,11538,11542,11546,11550,11554,11558,11562],{"__ignoreMap":73},[77,11539,11540],{"class":79,"line":80},[77,11541,4539],{},[77,11543,11544],{"class":79,"line":86},[77,11545,102],{"emptyLinePlaceholder":101},[77,11547,11548],{"class":79,"line":92},[77,11549,4548],{},[77,11551,11552],{"class":79,"line":98},[77,11553,4553],{},[77,11555,11556],{"class":79,"line":105},[77,11557,102],{"emptyLinePlaceholder":101},[77,11559,11560],{"class":79,"line":111},[77,11561,4562],{},[77,11563,11564],{"class":79,"line":2494},[77,11565,4567],{},[10,11567,117],{},[68,11569,11571],{"className":11570,"code":4573,"language":123,"meta":73},[121],[34,11572,4573],{"__ignoreMap":73},[10,11574,128],{},[14,11576,131],{"id":131},[133,11578,11579,11585],{},[45,11580,4584,11581,4587,11583,4591],{},[34,11582,4345],{},[34,11584,4590],{},[45,11586,11587,4596],{},[34,11588,4518],{},[14,11590,182],{"id":182},[42,11592,11593,11595],{},[45,11594,4603],{},[45,11596,4606],{},[14,11598,200],{"id":200},[133,11600,11601,11603],{},[45,11602,4613],{},[45,11604,2344,11605,4619],{},[34,11606,4618],{},[10,11608,211],{},[14,11610,214],{"id":214},[10,11612,4626],{},[219,11614,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11616},[11617,11618,11619,11620,11621,11622,11623,11624],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":4486,"description":4491},[234,4345,4646],{"id":4649,"title":4650,"body":11629,"category":234,"cover":235,"description":4655,"extension":236,"meta":11774,"navigation":101,"path":4830,"pinned":239,"publishedAt":240,"seo":11775,"slug":4832,"stem":4833,"summary":4834,"tags":11776,"updatedAt":240,"visible":101,"__hash__":4836},{"type":7,"value":11630,"toc":11764},[11631,11633,11635,11637,11639,11643,11649,11651,11665,11667,11669,11713,11715,11720,11722,11724,11734,11736,11748,11750,11756,11758,11760,11762],[10,11632,4655],{},[14,11634,16],{"id":16},[10,11636,4660],{},[14,11638,22],{"id":22},[10,11640,11641],{},[26,11642],{"alt":4667,"src":4668},[10,11644,11645,4674,11647,4678],{},[34,11646,4673],{},[34,11648,4677],{},[14,11650,40],{"id":40},[42,11652,11653,11655,11661],{},[45,11654,4685],{},[45,11656,11657,4690,11659,4693],{},[34,11658,4673],{},[34,11660,4328],{},[45,11662,4696,11663,4699],{},[34,11664,4677],{},[14,11666,63],{"id":63},[10,11668,66],{},[68,11670,11671],{"className":70,"code":4706,"language":72,"meta":73,"style":73},[34,11672,11673,11677,11681,11685,11689,11693,11697,11701,11705,11709],{"__ignoreMap":73},[77,11674,11675],{"class":79,"line":80},[77,11676,4713],{},[77,11678,11679],{"class":79,"line":86},[77,11680,102],{"emptyLinePlaceholder":101},[77,11682,11683],{"class":79,"line":92},[77,11684,4722],{},[77,11686,11687],{"class":79,"line":98},[77,11688,4727],{},[77,11690,11691],{"class":79,"line":105},[77,11692,4732],{},[77,11694,11695],{"class":79,"line":111},[77,11696,4737],{},[77,11698,11699],{"class":79,"line":2494},[77,11700,4742],{},[77,11702,11703],{"class":79,"line":2500},[77,11704,4567],{},[77,11706,11707],{"class":79,"line":3959},[77,11708,102],{"emptyLinePlaceholder":101},[77,11710,11711],{"class":79,"line":4171},[77,11712,4755],{},[10,11714,117],{},[68,11716,11718],{"className":11717,"code":4761,"language":123,"meta":73},[121],[34,11719,4761],{"__ignoreMap":73},[10,11721,128],{},[14,11723,131],{"id":131},[133,11725,11726,11730],{},[45,11727,4772,11728,4775],{},[34,11729,4673],{},[45,11731,4778,11732,4781],{},[34,11733,4677],{},[14,11735,182],{"id":182},[42,11737,11738,11742],{},[45,11739,3473,11740,4790],{},[34,11741,4673],{},[45,11743,4793,11744,4796,11746,4799],{},[34,11745,4328],{},[34,11747,4673],{},[14,11749,200],{"id":200},[133,11751,11752,11754],{},[45,11753,4806],{},[45,11755,4809],{},[10,11757,211],{},[14,11759,214],{"id":214},[10,11761,4816],{},[219,11763,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11765},[11766,11767,11768,11769,11770,11771,11772,11773],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":4650,"description":4655},[234,4677,4673],{"id":4838,"title":4839,"body":11778,"category":234,"cover":235,"description":4844,"extension":236,"meta":11917,"navigation":101,"path":5016,"pinned":239,"publishedAt":240,"seo":11918,"slug":5018,"stem":5019,"summary":5020,"tags":11919,"updatedAt":240,"visible":101,"__hash__":5024},{"type":7,"value":11779,"toc":11905},[11780,11782,11784,11786,11788,11792,11794,11796,11812,11814,11816,11844,11846,11851,11853,11855,11867,11869,11871,11875,11877,11879,11889,11891,11897,11899,11901,11903],[10,11781,4844],{},[14,11783,16],{"id":16},[10,11785,4849],{},[14,11787,22],{"id":22},[10,11789,11790],{},[26,11791],{"alt":4856,"src":4857},[10,11793,4860],{},[14,11795,40],{"id":40},[42,11797,11798,11800,11802],{},[45,11799,4867],{},[45,11801,4870],{},[45,11803,4873,11804,141,11806,4880,11808,141,11810,60],{},[34,11805,4876],{},[34,11807,4879],{},[34,11809,4883],{},[34,11811,4886],{},[14,11813,63],{"id":63},[10,11815,66],{},[68,11817,11818],{"className":70,"code":4893,"language":72,"meta":73,"style":73},[34,11819,11820,11824,11828,11832,11836,11840],{"__ignoreMap":73},[77,11821,11822],{"class":79,"line":80},[77,11823,4900],{},[77,11825,11826],{"class":79,"line":86},[77,11827,102],{"emptyLinePlaceholder":101},[77,11829,11830],{"class":79,"line":92},[77,11831,4909],{},[77,11833,11834],{"class":79,"line":98},[77,11835,4914],{},[77,11837,11838],{"class":79,"line":105},[77,11839,4919],{},[77,11841,11842],{"class":79,"line":111},[77,11843,4924],{},[10,11845,117],{},[68,11847,11849],{"className":11848,"code":4930,"language":123,"meta":73},[121],[34,11850,4930],{"__ignoreMap":73},[10,11852,128],{},[14,11854,131],{"id":131},[133,11856,11857,11865],{},[45,11858,4941,11859,4944,11861,175,11863,60],{},[34,11860,4876],{},[34,11862,4947],{},[34,11864,4950],{},[45,11866,4953],{},[157,11868,159],{"id":159},[10,11870,4958],{},[10,11872,11873],{},[26,11874],{"alt":4963,"src":4964},[10,11876,4967],{},[14,11878,182],{"id":182},[42,11880,11881,11887],{},[45,11882,4974,11883,1016,11885,4980],{},[34,11884,4977],{},[34,11886,4883],{},[45,11888,4983],{},[14,11890,200],{"id":200},[133,11892,11893,11895],{},[45,11894,4990],{},[45,11896,4993],{},[10,11898,211],{},[14,11900,214],{"id":214},[10,11902,5000],{},[219,11904,221],{},{"title":73,"searchDepth":86,"depth":86,"links":11906},[11907,11908,11909,11910,11911,11914,11915,11916],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":11912},[11913],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":4839,"description":4844},[234,5022,5023],{"id":5026,"title":5027,"body":11921,"category":234,"cover":235,"description":5032,"extension":236,"meta":12038,"navigation":101,"path":5171,"pinned":239,"publishedAt":240,"seo":12039,"slug":5173,"stem":5174,"summary":5175,"tags":12040,"updatedAt":240,"visible":101,"__hash__":5179},{"type":7,"value":11922,"toc":12028},[11923,11925,11927,11929,11931,11935,11937,11939,11947,11949,11951,11983,11985,11990,11992,11994,12002,12004,12012,12014,12020,12022,12024,12026],[10,11924,5032],{},[14,11926,16],{"id":16},[10,11928,5037],{},[14,11930,22],{"id":22},[10,11932,11933],{},[26,11934],{"alt":5044,"src":5045},[10,11936,5048],{},[14,11938,40],{"id":40},[42,11940,11941,11943,11945],{},[45,11942,5055],{},[45,11944,5058],{},[45,11946,5061],{},[14,11948,63],{"id":63},[10,11950,66],{},[68,11952,11953],{"className":70,"code":5068,"language":72,"meta":73,"style":73},[34,11954,11955,11959,11963,11967,11971,11975,11979],{"__ignoreMap":73},[77,11956,11957],{"class":79,"line":80},[77,11958,5075],{},[77,11960,11961],{"class":79,"line":86},[77,11962,102],{"emptyLinePlaceholder":101},[77,11964,11965],{"class":79,"line":92},[77,11966,5084],{},[77,11968,11969],{"class":79,"line":98},[77,11970,5089],{},[77,11972,11973],{"class":79,"line":105},[77,11974,102],{"emptyLinePlaceholder":101},[77,11976,11977],{"class":79,"line":111},[77,11978,5098],{},[77,11980,11981],{"class":79,"line":2494},[77,11982,5103],{},[10,11984,117],{},[68,11986,11988],{"className":11987,"code":5109,"language":123,"meta":73},[121],[34,11989,5109],{"__ignoreMap":73},[10,11991,128],{},[14,11993,131],{"id":131},[133,11995,11996,11998],{},[45,11997,5120],{},[45,11999,5123,12000,5127],{},[34,12001,5126],{},[14,12003,182],{"id":182},[42,12005,12006,12010],{},[45,12007,5134,12008,5137],{},[34,12009,4345],{},[45,12011,5140],{},[14,12013,200],{"id":200},[133,12015,12016,12018],{},[45,12017,5147],{},[45,12019,5150],{},[10,12021,211],{},[14,12023,214],{"id":214},[10,12025,5157],{},[219,12027,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12029},[12030,12031,12032,12033,12034,12035,12036,12037],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5027,"description":5032},[234,5177,5178],{"id":5181,"title":5182,"body":12042,"category":234,"cover":235,"description":5187,"extension":236,"meta":12161,"navigation":101,"path":5331,"pinned":239,"publishedAt":240,"seo":12162,"slug":5333,"stem":5334,"summary":5335,"tags":12163,"updatedAt":240,"visible":101,"__hash__":5339},{"type":7,"value":12043,"toc":12151},[12044,12046,12048,12050,12052,12056,12058,12060,12068,12070,12072,12104,12106,12111,12113,12115,12125,12127,12133,12135,12143,12145,12147,12149],[10,12045,5187],{},[14,12047,16],{"id":16},[10,12049,5192],{},[14,12051,22],{"id":22},[10,12053,12054],{},[26,12055],{"alt":5199,"src":5200},[10,12057,5203],{},[14,12059,40],{"id":40},[42,12061,12062,12064,12066],{},[45,12063,5210],{},[45,12065,5213],{},[45,12067,5216],{},[14,12069,63],{"id":63},[10,12071,66],{},[68,12073,12074],{"className":70,"code":5223,"language":72,"meta":73,"style":73},[34,12075,12076,12080,12084,12088,12092,12096,12100],{"__ignoreMap":73},[77,12077,12078],{"class":79,"line":80},[77,12079,5230],{},[77,12081,12082],{"class":79,"line":86},[77,12083,5235],{},[77,12085,12086],{"class":79,"line":92},[77,12087,5240],{},[77,12089,12090],{"class":79,"line":98},[77,12091,102],{"emptyLinePlaceholder":101},[77,12093,12094],{"class":79,"line":105},[77,12095,5249],{},[77,12097,12098],{"class":79,"line":111},[77,12099,5254],{},[77,12101,12102],{"class":79,"line":2494},[77,12103,5259],{},[10,12105,117],{},[68,12107,12109],{"className":12108,"code":5265,"language":123,"meta":73},[121],[34,12110,5265],{"__ignoreMap":73},[10,12112,128],{},[14,12114,131],{"id":131},[133,12116,12117,12121],{},[45,12118,945,12119,5279],{},[34,12120,5278],{},[45,12122,5282,12123,5286],{},[34,12124,5285],{},[14,12126,182],{"id":182},[42,12128,12129,12131],{},[45,12130,5293],{},[45,12132,5296],{},[14,12134,200],{"id":200},[133,12136,12137,12141],{},[45,12138,5303,12139,5307],{},[34,12140,5306],{},[45,12142,5310],{},[10,12144,211],{},[14,12146,214],{"id":214},[10,12148,5317],{},[219,12150,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12152},[12153,12154,12155,12156,12157,12158,12159,12160],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5182,"description":5187},[234,5337,5338],{"id":4,"title":5,"body":12165,"category":234,"cover":235,"description":12,"extension":236,"meta":12310,"navigation":101,"path":238,"pinned":239,"publishedAt":240,"seo":12311,"slug":242,"stem":243,"summary":244,"tags":12312,"updatedAt":240,"visible":101,"__hash__":248},{"type":7,"value":12166,"toc":12298},[12167,12169,12171,12173,12175,12179,12183,12185,12197,12199,12201,12229,12231,12236,12238,12240,12254,12256,12258,12262,12270,12272,12282,12284,12290,12292,12294,12296],[10,12168,12],{},[14,12170,16],{"id":16},[10,12172,19],{},[14,12174,22],{"id":22},[10,12176,12177],{},[26,12178],{"alt":28,"src":29},[10,12180,32,12181,37],{},[34,12182,36],{},[14,12184,40],{"id":40},[42,12186,12187,12189,12191],{},[45,12188,47],{},[45,12190,50],{},[45,12192,53,12193,56,12195,60],{},[34,12194,36],{},[34,12196,59],{},[14,12198,63],{"id":63},[10,12200,66],{},[68,12202,12203],{"className":70,"code":71,"language":72,"meta":73,"style":73},[34,12204,12205,12209,12213,12217,12221,12225],{"__ignoreMap":73},[77,12206,12207],{"class":79,"line":80},[77,12208,83],{},[77,12210,12211],{"class":79,"line":86},[77,12212,89],{},[77,12214,12215],{"class":79,"line":92},[77,12216,95],{},[77,12218,12219],{"class":79,"line":98},[77,12220,102],{"emptyLinePlaceholder":101},[77,12222,12223],{"class":79,"line":105},[77,12224,108],{},[77,12226,12227],{"class":79,"line":111},[77,12228,114],{},[10,12230,117],{},[68,12232,12234],{"className":12233,"code":122,"language":123,"meta":73},[121],[34,12235,122],{"__ignoreMap":73},[10,12237,128],{},[14,12239,131],{"id":131},[133,12241,12242,12248],{},[45,12243,137,12244,141,12246,145],{},[34,12245,140],{},[34,12247,144],{},[45,12249,12250,151,12252,155],{},[34,12251,150],{},[34,12253,154],{},[157,12255,159],{"id":159},[10,12257,162],{},[10,12259,12260],{},[26,12261],{"alt":167,"src":168},[10,12263,12264,141,12266,175,12268,179],{},[34,12265,140],{},[34,12267,144],{},[34,12269,178],{},[14,12271,182],{"id":182},[42,12273,12274,12278],{},[45,12275,187,12276,191],{},[34,12277,190],{},[45,12279,194,12280,197],{},[34,12281,178],{},[14,12283,200],{"id":200},[133,12285,12286,12288],{},[45,12287,205],{},[45,12289,208],{},[10,12291,211],{},[14,12293,214],{"id":214},[10,12295,217],{},[219,12297,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12299},[12300,12301,12302,12303,12304,12307,12308,12309],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12305},[12306],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5,"description":12},[234,246,247],{"id":5490,"title":5491,"body":12314,"category":234,"cover":235,"description":5496,"extension":236,"meta":12463,"navigation":101,"path":5677,"pinned":239,"publishedAt":240,"seo":12464,"slug":5679,"stem":5680,"summary":5681,"tags":12465,"updatedAt":240,"visible":101,"__hash__":5685},{"type":7,"value":12315,"toc":12451},[12316,12318,12320,12322,12324,12328,12330,12332,12344,12346,12348,12392,12394,12399,12401,12403,12415,12417,12419,12423,12425,12427,12435,12437,12443,12445,12447,12449],[10,12317,5496],{},[14,12319,16],{"id":16},[10,12321,5501],{},[14,12323,22],{"id":22},[10,12325,12326],{},[26,12327],{"alt":5508,"src":5509},[10,12329,5512],{},[14,12331,40],{"id":40},[42,12333,12334,12336,12340],{},[45,12335,5519],{},[45,12337,12338,5525],{},[34,12339,5524],{},[45,12341,12342,5531],{},[34,12343,5530],{},[14,12345,63],{"id":63},[10,12347,66],{},[68,12349,12350],{"className":70,"code":5538,"language":72,"meta":73,"style":73},[34,12351,12352,12356,12360,12364,12368,12372,12376,12380,12384,12388],{"__ignoreMap":73},[77,12353,12354],{"class":79,"line":80},[77,12355,5545],{},[77,12357,12358],{"class":79,"line":86},[77,12359,5550],{},[77,12361,12362],{"class":79,"line":92},[77,12363,102],{"emptyLinePlaceholder":101},[77,12365,12366],{"class":79,"line":98},[77,12367,5559],{},[77,12369,12370],{"class":79,"line":105},[77,12371,5564],{},[77,12373,12374],{"class":79,"line":111},[77,12375,102],{"emptyLinePlaceholder":101},[77,12377,12378],{"class":79,"line":2494},[77,12379,5573],{},[77,12381,12382],{"class":79,"line":2500},[77,12383,5578],{},[77,12385,12386],{"class":79,"line":3959},[77,12387,102],{"emptyLinePlaceholder":101},[77,12389,12390],{"class":79,"line":4171},[77,12391,5587],{},[10,12393,117],{},[68,12395,12397],{"className":12396,"code":5593,"language":123,"meta":73},[121],[34,12398,5593],{"__ignoreMap":73},[10,12400,128],{},[14,12402,131],{"id":131},[133,12404,12405,12409],{},[45,12406,5604,12407,5608],{},[34,12408,5607],{},[45,12410,12411,5614,12413,60],{},[34,12412,5613],{},[34,12414,5617],{},[157,12416,159],{"id":159},[10,12418,5622],{},[10,12420,12421],{},[26,12422],{"alt":5627,"src":5628},[10,12424,5631],{},[14,12426,182],{"id":182},[42,12428,12429,12433],{},[45,12430,5638,12431,5641],{},[34,12432,59],{},[45,12434,5644],{},[14,12436,200],{"id":200},[133,12438,12439,12441],{},[45,12440,5651],{},[45,12442,5654],{},[10,12444,211],{},[14,12446,214],{"id":214},[10,12448,5661],{},[219,12450,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12452},[12453,12454,12455,12456,12457,12460,12461,12462],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12458},[12459],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5491,"description":5496},[234,5683,5684],{"id":5687,"title":5688,"body":12467,"category":234,"cover":235,"description":5693,"extension":236,"meta":12628,"navigation":101,"path":5891,"pinned":239,"publishedAt":240,"seo":12629,"slug":5893,"stem":5894,"summary":5895,"tags":12630,"updatedAt":240,"visible":101,"__hash__":5899},{"type":7,"value":12468,"toc":12616},[12469,12471,12473,12475,12477,12481,12483,12485,12497,12499,12501,12553,12555,12560,12562,12564,12582,12584,12586,12590,12592,12594,12600,12602,12608,12610,12612,12614],[10,12470,5693],{},[14,12472,16],{"id":16},[10,12474,5698],{},[14,12476,22],{"id":22},[10,12478,12479],{},[26,12480],{"alt":5705,"src":5706},[10,12482,5709],{},[14,12484,40],{"id":40},[42,12486,12487,12489,12491],{},[45,12488,5716],{},[45,12490,5719],{},[45,12492,12493,2182,12495,5728],{},[34,12494,5724],{},[34,12496,5727],{},[14,12498,63],{"id":63},[10,12500,66],{},[68,12502,12503],{"className":70,"code":5735,"language":72,"meta":73,"style":73},[34,12504,12505,12509,12513,12517,12521,12525,12529,12533,12537,12541,12545,12549],{"__ignoreMap":73},[77,12506,12507],{"class":79,"line":80},[77,12508,5742],{},[77,12510,12511],{"class":79,"line":86},[77,12512,102],{"emptyLinePlaceholder":101},[77,12514,12515],{"class":79,"line":92},[77,12516,5751],{},[77,12518,12519],{"class":79,"line":98},[77,12520,5756],{},[77,12522,12523],{"class":79,"line":105},[77,12524,102],{"emptyLinePlaceholder":101},[77,12526,12527],{"class":79,"line":111},[77,12528,5765],{},[77,12530,12531],{"class":79,"line":2494},[77,12532,5770],{},[77,12534,12535],{"class":79,"line":2500},[77,12536,5775],{},[77,12538,12539],{"class":79,"line":3959},[77,12540,102],{"emptyLinePlaceholder":101},[77,12542,12543],{"class":79,"line":4171},[77,12544,5784],{},[77,12546,12547],{"class":79,"line":5787},[77,12548,102],{"emptyLinePlaceholder":101},[77,12550,12551],{"class":79,"line":5792},[77,12552,5795],{},[10,12554,117],{},[68,12556,12558],{"className":12557,"code":5801,"language":123,"meta":73},[121],[34,12559,5801],{"__ignoreMap":73},[10,12561,128],{},[14,12563,131],{"id":131},[133,12565,12566,12576],{},[45,12567,12568,5815,12570,5819,12572,5822,12574,5826],{},[34,12569,5814],{},[34,12571,5818],{},[34,12573,5607],{},[34,12575,5825],{},[45,12577,12578,5831,12580,5834],{},[34,12579,4590],{},[34,12581,2214],{},[157,12583,159],{"id":159},[10,12585,5839],{},[10,12587,12588],{},[26,12589],{"alt":5844,"src":5845},[10,12591,5848],{},[14,12593,182],{"id":182},[42,12595,12596,12598],{},[45,12597,5855],{},[45,12599,5858],{},[14,12601,200],{"id":200},[133,12603,12604,12606],{},[45,12605,5865],{},[45,12607,5868],{},[10,12609,211],{},[14,12611,214],{"id":214},[10,12613,5875],{},[219,12615,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12617},[12618,12619,12620,12621,12622,12625,12626,12627],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12623},[12624],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5688,"description":5693},[234,5897,5898],{"id":5901,"title":5902,"body":12632,"category":234,"cover":235,"description":5907,"extension":236,"meta":12755,"navigation":101,"path":6058,"pinned":239,"publishedAt":240,"seo":12756,"slug":6060,"stem":6061,"summary":6062,"tags":12757,"updatedAt":240,"visible":101,"__hash__":6066},{"type":7,"value":12633,"toc":12745},[12634,12636,12638,12640,12642,12646,12648,12650,12664,12666,12668,12696,12698,12703,12705,12707,12717,12719,12727,12729,12737,12739,12741,12743],[10,12635,5907],{},[14,12637,16],{"id":16},[10,12639,5912],{},[14,12641,22],{"id":22},[10,12643,12644],{},[26,12645],{"alt":5919,"src":5920},[10,12647,5923],{},[14,12649,40],{"id":40},[42,12651,12652,12654,12656],{},[45,12653,5930],{},[45,12655,5933],{},[45,12657,5936,12658,141,12660,141,12662,5944],{},[34,12659,2265],{},[34,12661,2431],{},[34,12663,5943],{},[14,12665,63],{"id":63},[10,12667,66],{},[68,12669,12670],{"className":70,"code":5951,"language":72,"meta":73,"style":73},[34,12671,12672,12676,12680,12684,12688,12692],{"__ignoreMap":73},[77,12673,12674],{"class":79,"line":80},[77,12675,5958],{},[77,12677,12678],{"class":79,"line":86},[77,12679,5963],{},[77,12681,12682],{"class":79,"line":92},[77,12683,5968],{},[77,12685,12686],{"class":79,"line":98},[77,12687,102],{"emptyLinePlaceholder":101},[77,12689,12690],{"class":79,"line":105},[77,12691,5977],{},[77,12693,12694],{"class":79,"line":111},[77,12695,5982],{},[10,12697,117],{},[68,12699,12701],{"className":12700,"code":5988,"language":123,"meta":73},[121],[34,12702,5988],{"__ignoreMap":73},[10,12704,128],{},[14,12706,131],{"id":131},[133,12708,12709,12715],{},[45,12710,5999,12711,6003,12713,6006],{},[34,12712,6002],{},[34,12714,2252],{},[45,12716,6009],{},[14,12718,182],{"id":182},[42,12720,12721,12725],{},[45,12722,6016,12723,6020],{},[34,12724,6019],{},[45,12726,6023],{},[14,12728,200],{"id":200},[133,12730,12731,12733],{},[45,12732,6030],{},[45,12734,6033,12735,6037],{},[34,12736,6036],{},[10,12738,211],{},[14,12740,214],{"id":214},[10,12742,6044],{},[219,12744,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12746},[12747,12748,12749,12750,12751,12752,12753,12754],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":5902,"description":5907},[234,6064,6065],{"id":6068,"title":6069,"body":12759,"category":234,"cover":235,"description":6074,"extension":236,"meta":12936,"navigation":101,"path":6302,"pinned":239,"publishedAt":240,"seo":12937,"slug":6304,"stem":6305,"summary":6306,"tags":12938,"updatedAt":240,"visible":101,"__hash__":6310},{"type":7,"value":12760,"toc":12924},[12761,12763,12765,12769,12771,12775,12781,12783,12795,12797,12801,12825,12829,12845,12851,12853,12858,12860,12862,12878,12880,12882,12886,12890,12892,12904,12906,12916,12918,12920,12922],[10,12762,6074],{},[14,12764,16],{"id":16},[10,12766,6079,12767,6082],{},[303,12768,6002],{},[14,12770,22],{"id":22},[10,12772,12773],{},[26,12774],{"alt":6089,"src":6090},[10,12776,6093,12777,6097,12779,6101],{},[34,12778,6096],{},[34,12780,6100],{},[14,12782,40],{"id":40},[42,12784,12785,12789,12791],{},[45,12786,6108,12787,6111],{},[34,12788,1177],{},[45,12790,6114],{},[45,12792,6117,12793,6121],{},[34,12794,6120],{},[14,12796,63],{"id":63},[10,12798,6126,12799,6130],{},[34,12800,6129],{},[68,12802,12803],{"className":70,"code":6133,"language":72,"meta":73,"style":73},[34,12804,12805,12809,12813,12817,12821],{"__ignoreMap":73},[77,12806,12807],{"class":79,"line":80},[77,12808,6140],{},[77,12810,12811],{"class":79,"line":86},[77,12812,6145],{},[77,12814,12815],{"class":79,"line":92},[77,12816,102],{"emptyLinePlaceholder":101},[77,12818,12819],{"class":79,"line":98},[77,12820,6154],{},[77,12822,12823],{"class":79,"line":105},[77,12824,6159],{},[10,12826,6162,12827,6166],{},[34,12828,6165],{},[68,12830,12831],{"className":70,"code":6169,"language":72,"meta":73,"style":73},[34,12832,12833,12837,12841],{"__ignoreMap":73},[77,12834,12835],{"class":79,"line":80},[77,12836,6176],{},[77,12838,12839],{"class":79,"line":86},[77,12840,102],{"emptyLinePlaceholder":101},[77,12842,12843],{"class":79,"line":92},[77,12844,6185],{},[10,12846,6188,12847,175,12849,60],{},[34,12848,6191],{},[34,12850,6194],{},[10,12852,117],{},[68,12854,12856],{"className":12855,"code":6200,"language":123,"meta":73},[121],[34,12857,6200],{"__ignoreMap":73},[10,12859,128],{},[14,12861,131],{"id":131},[133,12863,12864,12870],{},[45,12865,6211,12866,6214,12868,6218],{},[34,12867,6129],{},[34,12869,6217],{},[45,12871,12872,6223,12874,6226,12876,6229],{},[34,12873,6165],{},[34,12875,6129],{},[34,12877,6165],{},[157,12879,159],{"id":159},[10,12881,6234],{},[10,12883,12884],{},[26,12885],{"alt":6239,"src":6240},[10,12887,6243,12888,6246],{},[34,12889,6217],{},[14,12891,182],{"id":182},[42,12893,12894,12900],{},[45,12895,6253,12896,175,12898,60],{},[34,12897,6129],{},[34,12899,6165],{},[45,12901,6260,12902,6264],{},[34,12903,6263],{},[14,12905,200],{"id":200},[133,12907,12908,12912],{},[45,12909,2359,12910,6274],{},[34,12911,6273],{},[45,12913,6277,12914,60],{},[34,12915,6096],{},[10,12917,211],{},[14,12919,214],{"id":214},[10,12921,6286],{},[219,12923,221],{},{"title":73,"searchDepth":86,"depth":86,"links":12925},[12926,12927,12928,12929,12930,12933,12934,12935],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":12931},[12932],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":6069,"description":6074},[234,6308,6309],{"id":6312,"title":6313,"body":12940,"category":234,"cover":235,"description":6318,"extension":236,"meta":13079,"navigation":101,"path":6484,"pinned":239,"publishedAt":240,"seo":13080,"slug":6486,"stem":6487,"summary":6488,"tags":13081,"updatedAt":240,"visible":101,"__hash__":6491},{"type":7,"value":12941,"toc":13069},[12942,12944,12946,12948,12950,12954,12956,12958,12968,12970,12972,13012,13014,13019,13021,13023,13041,13043,13051,13053,13061,13063,13065,13067],[10,12943,6318],{},[14,12945,16],{"id":16},[10,12947,6323],{},[14,12949,22],{"id":22},[10,12951,12952],{},[26,12953],{"alt":6330,"src":6331},[10,12955,6334],{},[14,12957,40],{"id":40},[42,12959,12960,12964,12966],{},[45,12961,12962,6344],{},[34,12963,6343],{},[45,12965,6347],{},[45,12967,6350],{},[14,12969,63],{"id":63},[10,12971,1580],{},[68,12973,12974],{"className":598,"code":6357,"language":600,"meta":73,"style":73},[34,12975,12976,12986,12992,12998,13008],{"__ignoreMap":73},[77,12977,12978,12980,12982,12984],{"class":79,"line":80},[77,12979,698],{"class":607},[77,12981,640],{"class":610},[77,12983,6368],{"class":643},[77,12985,6371],{"class":643},[77,12987,12988,12990],{"class":79,"line":86},[77,12989,6376],{"class":610},[77,12991,6379],{"class":643},[77,12993,12994,12996],{"class":79,"line":92},[77,12995,72],{"class":607},[77,12997,611],{"class":610},[77,12999,13000,13002,13004,13006],{"class":79,"line":98},[77,13001,72],{"class":607},[77,13003,640],{"class":610},[77,13005,644],{"class":643},[77,13007,611],{"class":610},[77,13009,13010],{"class":79,"line":105},[77,13011,6400],{"class":607},[10,13013,117],{},[68,13015,13017],{"className":13016,"code":6406,"language":123,"meta":73},[121],[34,13018,6406],{"__ignoreMap":73},[10,13020,128],{},[14,13022,131],{"id":131},[133,13024,13025,13031],{},[45,13026,13027,6420,13029,6423],{},[34,13028,6419],{},[34,13030,698],{},[45,13032,6426,13033,2182,13035,6432,13037,3734,13039,6438],{},[34,13034,72],{},[34,13036,6431],{},[34,13038,6343],{},[34,13040,6437],{},[14,13042,182],{"id":182},[42,13044,13045,13047],{},[45,13046,6445],{},[45,13048,3473,13049,6450],{},[34,13050,6343],{},[14,13052,200],{"id":200},[133,13054,13055,13059],{},[45,13056,6457,13057,60],{},[34,13058,6460],{},[45,13060,6463],{},[10,13062,211],{},[14,13064,214],{"id":214},[10,13066,6470],{},[219,13068,1664],{},{"title":73,"searchDepth":86,"depth":86,"links":13070},[13071,13072,13073,13074,13075,13076,13077,13078],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":6313,"description":6318},[234,6490,269],{"id":6493,"title":6494,"body":13083,"category":234,"cover":235,"description":6499,"extension":236,"meta":13236,"navigation":101,"path":6688,"pinned":239,"publishedAt":240,"seo":13237,"slug":6690,"stem":6691,"summary":6692,"tags":13238,"updatedAt":240,"visible":101,"__hash__":6696},{"type":7,"value":13084,"toc":13226},[13085,13087,13089,13091,13093,13097,13103,13105,13121,13123,13125,13169,13171,13176,13178,13180,13192,13194,13208,13210,13218,13220,13222,13224],[10,13086,6499],{},[14,13088,16],{"id":16},[10,13090,6504],{},[14,13092,22],{"id":22},[10,13094,13095],{},[26,13096],{"alt":6511,"src":6512},[10,13098,13099,6518,13101,6521],{},[34,13100,6517],{},[34,13102,2441],{},[14,13104,40],{"id":40},[42,13106,13107,13109,13117],{},[45,13108,6528],{},[45,13110,13111,141,13113,141,13115,6540],{},[34,13112,6533],{},[34,13114,6536],{},[34,13116,6539],{},[45,13118,6543,13119,6547],{},[34,13120,6546],{},[14,13122,63],{"id":63},[10,13124,66],{},[68,13126,13127],{"className":70,"code":6554,"language":72,"meta":73,"style":73},[34,13128,13129,13133,13137,13141,13145,13149,13153,13157,13161,13165],{"__ignoreMap":73},[77,13130,13131],{"class":79,"line":80},[77,13132,6561],{},[77,13134,13135],{"class":79,"line":86},[77,13136,102],{"emptyLinePlaceholder":101},[77,13138,13139],{"class":79,"line":92},[77,13140,6570],{},[77,13142,13143],{"class":79,"line":98},[77,13144,6575],{},[77,13146,13147],{"class":79,"line":105},[77,13148,6580],{},[77,13150,13151],{"class":79,"line":111},[77,13152,102],{"emptyLinePlaceholder":101},[77,13154,13155],{"class":79,"line":2494},[77,13156,6589],{},[77,13158,13159],{"class":79,"line":2500},[77,13160,6594],{},[77,13162,13163],{"class":79,"line":3959},[77,13164,6599],{},[77,13166,13167],{"class":79,"line":4171},[77,13168,6604],{},[10,13170,117],{},[68,13172,13174],{"className":13173,"code":6610,"language":123,"meta":73},[121],[34,13175,6610],{"__ignoreMap":73},[10,13177,128],{},[14,13179,131],{"id":131},[133,13181,13182,13186],{},[45,13183,13184,6624],{},[34,13185,6623],{},[45,13187,2344,13188,6629,13190,6632],{},[34,13189,2441],{},[34,13191,6517],{},[14,13193,182],{"id":182},[42,13195,13196,13202],{},[45,13197,3473,13198,6641,13200,6644],{},[34,13199,6517],{},[34,13201,6533],{},[45,13203,6647,13204,1016,13206,6653],{},[34,13205,2441],{},[34,13207,6652],{},[14,13209,200],{"id":200},[133,13211,13212,13216],{},[45,13213,6660,13214,6664],{},[34,13215,6663],{},[45,13217,6667],{},[10,13219,211],{},[14,13221,214],{"id":214},[10,13223,6674],{},[219,13225,221],{},{"title":73,"searchDepth":86,"depth":86,"links":13227},[13228,13229,13230,13231,13232,13233,13234,13235],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":6494,"description":6499},[234,6694,6695],{"id":6698,"title":6699,"body":13240,"category":234,"cover":235,"description":6704,"extension":236,"meta":13387,"navigation":101,"path":6883,"pinned":239,"publishedAt":240,"seo":13388,"slug":6885,"stem":6886,"summary":6887,"tags":13389,"updatedAt":240,"visible":101,"__hash__":6891},{"type":7,"value":13241,"toc":13377},[13242,13244,13246,13248,13250,13254,13256,13258,13276,13278,13280,13328,13330,13335,13337,13339,13347,13349,13359,13361,13369,13371,13373,13375],[10,13243,6704],{},[14,13245,16],{"id":16},[10,13247,6709],{},[14,13249,22],{"id":22},[10,13251,13252],{},[26,13253],{"alt":6716,"src":6717},[10,13255,6720],{},[14,13257,40],{"id":40},[42,13259,13260,13264,13270],{},[45,13261,13262,6730],{},[34,13263,6729],{},[45,13265,13266,6736,13268,60],{},[34,13267,6735],{},[34,13269,6739],{},[45,13271,6742,13272,6746,13274,6750],{},[34,13273,6745],{},[34,13275,6749],{},[14,13277,63],{"id":63},[10,13279,66],{},[68,13281,13282],{"className":70,"code":6757,"language":72,"meta":73,"style":73},[34,13283,13284,13288,13292,13296,13300,13304,13308,13312,13316,13320,13324],{"__ignoreMap":73},[77,13285,13286],{"class":79,"line":80},[77,13287,6561],{},[77,13289,13290],{"class":79,"line":86},[77,13291,102],{"emptyLinePlaceholder":101},[77,13293,13294],{"class":79,"line":92},[77,13295,6772],{},[77,13297,13298],{"class":79,"line":98},[77,13299,6777],{},[77,13301,13302],{"class":79,"line":105},[77,13303,6782],{},[77,13305,13306],{"class":79,"line":111},[77,13307,6787],{},[77,13309,13310],{"class":79,"line":2494},[77,13311,102],{"emptyLinePlaceholder":101},[77,13313,13314],{"class":79,"line":2500},[77,13315,6796],{},[77,13317,13318],{"class":79,"line":3959},[77,13319,6801],{},[77,13321,13322],{"class":79,"line":4171},[77,13323,6806],{},[77,13325,13326],{"class":79,"line":5787},[77,13327,6811],{},[10,13329,117],{},[68,13331,13333],{"className":13332,"code":6817,"language":123,"meta":73},[121],[34,13334,6817],{"__ignoreMap":73},[10,13336,128],{},[14,13338,131],{"id":131},[133,13340,13341,13345],{},[45,13342,6828,13343,6831],{},[34,13344,6745],{},[45,13346,6834],{},[14,13348,182],{"id":182},[42,13350,13351,13355],{},[45,13352,2344,13353,6843],{},[34,13354,6729],{},[45,13356,6846,13357,60],{},[34,13358,6849],{},[14,13360,200],{"id":200},[133,13362,13363,13365],{},[45,13364,6856],{},[45,13366,6859,13367,6862],{},[34,13368,344],{},[10,13370,211],{},[14,13372,214],{"id":214},[10,13374,6869],{},[219,13376,221],{},{"title":73,"searchDepth":86,"depth":86,"links":13378},[13379,13380,13381,13382,13383,13384,13385,13386],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":6699,"description":6704},[234,6889,6890],{"id":6893,"title":6894,"body":13391,"category":234,"cover":235,"description":6899,"extension":236,"meta":13534,"navigation":101,"path":7067,"pinned":239,"publishedAt":240,"seo":13535,"slug":7069,"stem":7070,"summary":7071,"tags":13536,"updatedAt":240,"visible":101,"__hash__":7075},{"type":7,"value":13392,"toc":13524},[13393,13395,13397,13399,13401,13405,13411,13413,13423,13425,13427,13479,13481,13486,13488,13490,13500,13502,13508,13510,13516,13518,13520,13522],[10,13394,6899],{},[14,13396,16],{"id":16},[10,13398,6904],{},[14,13400,22],{"id":22},[10,13402,13403],{},[26,13404],{"alt":6911,"src":6912},[10,13406,13407,6918,13409,6922],{},[34,13408,6917],{},[34,13410,6921],{},[14,13412,40],{"id":40},[42,13414,13415,13417,13421],{},[45,13416,6929],{},[45,13418,13419,6935],{},[34,13420,6934],{},[45,13422,6938],{},[14,13424,63],{"id":63},[10,13426,66],{},[68,13428,13429],{"className":70,"code":6945,"language":72,"meta":73,"style":73},[34,13430,13431,13435,13439,13443,13447,13451,13455,13459,13463,13467,13471,13475],{"__ignoreMap":73},[77,13432,13433],{"class":79,"line":80},[77,13434,6952],{},[77,13436,13437],{"class":79,"line":86},[77,13438,102],{"emptyLinePlaceholder":101},[77,13440,13441],{"class":79,"line":92},[77,13442,6961],{},[77,13444,13445],{"class":79,"line":98},[77,13446,102],{"emptyLinePlaceholder":101},[77,13448,13449],{"class":79,"line":105},[77,13450,6970],{},[77,13452,13453],{"class":79,"line":111},[77,13454,6975],{},[77,13456,13457],{"class":79,"line":2494},[77,13458,6787],{},[77,13460,13461],{"class":79,"line":2500},[77,13462,102],{"emptyLinePlaceholder":101},[77,13464,13465],{"class":79,"line":3959},[77,13466,6988],{},[77,13468,13469],{"class":79,"line":4171},[77,13470,6993],{},[77,13472,13473],{"class":79,"line":5787},[77,13474,6806],{},[77,13476,13477],{"class":79,"line":5792},[77,13478,7002],{},[10,13480,117],{},[68,13482,13484],{"className":13483,"code":7008,"language":123,"meta":73},[121],[34,13485,7008],{"__ignoreMap":73},[10,13487,128],{},[14,13489,131],{"id":131},[133,13491,13492,13496],{},[45,13493,13494,7021],{},[34,13495,6917],{},[45,13497,13498,7026],{},[34,13499,6921],{},[14,13501,182],{"id":182},[42,13503,13504,13506],{},[45,13505,7033],{},[45,13507,7036],{},[14,13509,200],{"id":200},[133,13511,13512,13514],{},[45,13513,7043],{},[45,13515,7046],{},[10,13517,211],{},[14,13519,214],{"id":214},[10,13521,7053],{},[219,13523,221],{},{"title":73,"searchDepth":86,"depth":86,"links":13525},[13526,13527,13528,13529,13530,13531,13532,13533],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":6894,"description":6899},[234,7073,7074],{"id":7077,"title":7078,"body":13538,"category":234,"cover":235,"description":7083,"extension":236,"meta":13689,"navigation":101,"path":7268,"pinned":239,"publishedAt":240,"seo":13690,"slug":7270,"stem":7271,"summary":7272,"tags":13691,"updatedAt":240,"visible":101,"__hash__":7276},{"type":7,"value":13539,"toc":13679},[13540,13542,13544,13546,13548,13552,13556,13558,13572,13574,13576,13628,13630,13635,13637,13639,13651,13653,13663,13665,13671,13673,13675,13677],[10,13541,7083],{},[14,13543,16],{"id":16},[10,13545,7088],{},[14,13547,22],{"id":22},[10,13549,13550],{},[26,13551],{"alt":7095,"src":7096},[10,13553,13554,7102],{},[34,13555,7101],{},[14,13557,40],{"id":40},[42,13559,13560,13566,13570],{},[45,13561,2344,13562,7112,13564,7116],{},[34,13563,7111],{},[34,13565,7115],{},[45,13567,7119,13568,7123],{},[34,13569,7122],{},[45,13571,7126],{},[14,13573,63],{"id":63},[10,13575,66],{},[68,13577,13578],{"className":70,"code":7133,"language":72,"meta":73,"style":73},[34,13579,13580,13584,13588,13592,13596,13600,13604,13608,13612,13616,13620,13624],{"__ignoreMap":73},[77,13581,13582],{"class":79,"line":80},[77,13583,7140],{},[77,13585,13586],{"class":79,"line":86},[77,13587,102],{"emptyLinePlaceholder":101},[77,13589,13590],{"class":79,"line":92},[77,13591,7149],{},[77,13593,13594],{"class":79,"line":98},[77,13595,7154],{},[77,13597,13598],{"class":79,"line":105},[77,13599,7159],{},[77,13601,13602],{"class":79,"line":111},[77,13603,7164],{},[77,13605,13606],{"class":79,"line":2494},[77,13607,7169],{},[77,13609,13610],{"class":79,"line":2500},[77,13611,102],{"emptyLinePlaceholder":101},[77,13613,13614],{"class":79,"line":3959},[77,13615,7178],{},[77,13617,13618],{"class":79,"line":4171},[77,13619,7183],{},[77,13621,13622],{"class":79,"line":5787},[77,13623,7188],{},[77,13625,13626],{"class":79,"line":5792},[77,13627,7193],{},[10,13629,117],{},[68,13631,13633],{"className":13632,"code":7199,"language":123,"meta":73},[121],[34,13634,7199],{"__ignoreMap":73},[10,13636,128],{},[14,13638,131],{"id":131},[133,13640,13641,13647],{},[45,13642,13643,7213,13645,7216],{},[34,13644,7212],{},[34,13646,7122],{},[45,13648,13649,7221],{},[34,13650,7101],{},[14,13652,182],{"id":182},[42,13654,13655,13657],{},[45,13656,7228],{},[45,13658,7231,13659,7234,13661,7237],{},[34,13660,7111],{},[34,13662,7115],{},[14,13664,200],{"id":200},[133,13666,13667,13669],{},[45,13668,7244],{},[45,13670,7247],{},[10,13672,211],{},[14,13674,214],{"id":214},[10,13676,7254],{},[219,13678,221],{},{"title":73,"searchDepth":86,"depth":86,"links":13680},[13681,13682,13683,13684,13685,13686,13687,13688],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":7078,"description":7083},[234,7274,7275],{"id":7278,"title":7279,"body":13693,"category":234,"cover":235,"description":7284,"extension":236,"meta":13907,"navigation":101,"path":7558,"pinned":239,"publishedAt":240,"seo":13908,"slug":7560,"stem":7561,"summary":7562,"tags":13909,"updatedAt":240,"visible":101,"__hash__":7566},{"type":7,"value":13694,"toc":13894},[13695,13697,13699,13701,13703,13707,13713,13715,13727,13729,13731,13791,13793,13798,13800,13802,13820,13822,13830,13834,13842,13844,13848,13852,13858,13860,13870,13872,13886,13888,13890,13892],[10,13696,7284],{},[14,13698,16],{"id":16},[10,13700,7289],{},[14,13702,22],{"id":22},[10,13704,13705],{},[26,13706],{"alt":7296,"src":7297},[10,13708,7300,13709,7304,13711,7308],{},[34,13710,7303],{},[34,13712,7307],{},[14,13714,40],{"id":40},[42,13716,13717,13721,13725],{},[45,13718,7315,13719,7318],{},[34,13720,7303],{},[45,13722,13723,7324],{},[34,13724,7323],{},[45,13726,7327],{},[14,13728,63],{"id":63},[10,13730,66],{},[68,13732,13733],{"className":70,"code":7334,"language":72,"meta":73,"style":73},[34,13734,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779,13783,13787],{"__ignoreMap":73},[77,13736,13737],{"class":79,"line":80},[77,13738,7341],{},[77,13740,13741],{"class":79,"line":86},[77,13742,7346],{},[77,13744,13745],{"class":79,"line":92},[77,13746,7351],{},[77,13748,13749],{"class":79,"line":98},[77,13750,7356],{},[77,13752,13753],{"class":79,"line":105},[77,13754,7361],{},[77,13756,13757],{"class":79,"line":111},[77,13758,102],{"emptyLinePlaceholder":101},[77,13760,13761],{"class":79,"line":2494},[77,13762,7370],{},[77,13764,13765],{"class":79,"line":2500},[77,13766,7375],{},[77,13768,13769],{"class":79,"line":3959},[77,13770,7380],{},[77,13772,13773],{"class":79,"line":4171},[77,13774,7385],{},[77,13776,13777],{"class":79,"line":5787},[77,13778,1153],{},[77,13780,13781],{"class":79,"line":5792},[77,13782,7394],{},[77,13784,13785],{"class":79,"line":7397},[77,13786,7400],{},[77,13788,13789],{"class":79,"line":7403},[77,13790,7406],{},[10,13792,117],{},[68,13794,13796],{"className":13795,"code":7412,"language":123,"meta":73},[121],[34,13797,7412],{"__ignoreMap":73},[10,13799,128],{},[14,13801,131],{"id":131},[133,13803,13804,13812],{},[45,13805,13806,7425,13808,7428,13810,7432],{},[34,13807,3042],{},[34,13809,7323],{},[34,13811,7431],{},[45,13813,7435,13814,7438,13816,7441,13818,60],{},[34,13815,7303],{},[34,13817,1166],{},[34,13819,7307],{},[157,13821,159],{"id":159},[10,13823,13824,141,13826,175,13828,7454],{},[34,13825,7303],{},[34,13827,1166],{},[34,13829,7307],{},[10,13831,13832],{},[26,13833],{"alt":7459,"src":7460},[10,13835,13836,7465,13838,7468,13840,7471],{},[34,13837,7303],{},[34,13839,1166],{},[34,13841,7307],{},[157,13843,159],{"id":4226},[10,13845,13846,7479],{},[34,13847,7478],{},[10,13849,13850],{},[26,13851],{"alt":7484,"src":7485},[10,13853,7488,13854,7491,13856,7494],{},[34,13855,7478],{},[34,13857,1166],{},[14,13859,182],{"id":182},[42,13861,13862,13866],{},[45,13863,7501,13864,7505],{},[34,13865,7504],{},[45,13867,7508,13868,7511],{},[34,13869,7478],{},[14,13871,200],{"id":200},[133,13873,13874,13882],{},[45,13875,7518,13876,7522,13878,175,13880,60],{},[34,13877,7521],{},[34,13879,7525],{},[34,13881,7528],{},[45,13883,7531,13884,7534],{},[34,13885,6739],{},[10,13887,211],{},[14,13889,214],{"id":214},[10,13891,7541],{},[219,13893,221],{},{"title":73,"searchDepth":86,"depth":86,"links":13895},[13896,13897,13898,13899,13900,13904,13905,13906],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":13901},[13902,13903],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":7279,"description":7284},[234,7564,7565],{"id":7568,"title":7569,"body":13911,"category":234,"cover":235,"description":7574,"extension":236,"meta":14062,"navigation":101,"path":7751,"pinned":239,"publishedAt":240,"seo":14063,"slug":7753,"stem":7754,"summary":7755,"tags":14064,"updatedAt":240,"visible":101,"__hash__":7758},{"type":7,"value":13912,"toc":14052},[13913,13915,13917,13919,13921,13925,13929,13931,13943,13945,13947,13995,13997,14002,14004,14006,14016,14018,14028,14030,14044,14046,14048,14050],[10,13914,7574],{},[14,13916,16],{"id":16},[10,13918,7579],{},[14,13920,22],{"id":22},[10,13922,13923],{},[26,13924],{"alt":7586,"src":7587},[10,13926,7590,13927,7593],{},[34,13928,6749],{},[14,13930,40],{"id":40},[42,13932,13933,13937,13941],{},[45,13934,13935,7602],{},[34,13936,6749],{},[45,13938,13939,7608],{},[34,13940,7607],{},[45,13942,7611],{},[14,13944,63],{"id":63},[10,13946,66],{},[68,13948,13949],{"className":70,"code":7618,"language":72,"meta":73,"style":73},[34,13950,13951,13955,13959,13963,13967,13971,13975,13979,13983,13987,13991],{"__ignoreMap":73},[77,13952,13953],{"class":79,"line":80},[77,13954,6561],{},[77,13956,13957],{"class":79,"line":86},[77,13958,102],{"emptyLinePlaceholder":101},[77,13960,13961],{"class":79,"line":92},[77,13962,6772],{},[77,13964,13965],{"class":79,"line":98},[77,13966,102],{"emptyLinePlaceholder":101},[77,13968,13969],{"class":79,"line":105},[77,13970,7641],{},[77,13972,13973],{"class":79,"line":111},[77,13974,7646],{},[77,13976,13977],{"class":79,"line":2494},[77,13978,102],{"emptyLinePlaceholder":101},[77,13980,13981],{"class":79,"line":2500},[77,13982,7655],{},[77,13984,13985],{"class":79,"line":3959},[77,13986,7660],{},[77,13988,13989],{"class":79,"line":4171},[77,13990,102],{"emptyLinePlaceholder":101},[77,13992,13993],{"class":79,"line":5787},[77,13994,7669],{},[10,13996,117],{},[68,13998,14000],{"className":13999,"code":7675,"language":123,"meta":73},[121],[34,14001,7675],{"__ignoreMap":73},[10,14003,128],{},[14,14005,131],{"id":131},[133,14007,14008,14014],{},[45,14009,7590,14010,7688,14012,60],{},[34,14011,6749],{},[34,14013,7691],{},[45,14015,7694],{},[14,14017,182],{"id":182},[42,14019,14020,14024],{},[45,14021,4793,14022,7703],{},[34,14023,6749],{},[45,14025,7706,14026,7709],{},[34,14027,6749],{},[14,14029,200],{"id":200},[133,14031,14032,14038],{},[45,14033,7716,14034,7720,14036,60],{},[34,14035,7719],{},[34,14037,6749],{},[45,14039,4793,14040,7727,14042,60],{},[34,14041,6749],{},[34,14043,7730],{},[10,14045,211],{},[14,14047,214],{"id":214},[10,14049,7737],{},[219,14051,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14053},[14054,14055,14056,14057,14058,14059,14060,14061],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":7569,"description":7574},[234,6749,7757],{"id":7760,"title":7761,"body":14066,"category":234,"cover":235,"description":7766,"extension":236,"meta":14237,"navigation":101,"path":7979,"pinned":239,"publishedAt":240,"seo":14238,"slug":7981,"stem":7982,"summary":7983,"tags":14239,"updatedAt":240,"visible":101,"__hash__":7987},{"type":7,"value":14067,"toc":14225},[14068,14070,14072,14074,14076,14080,14082,14084,14096,14098,14100,14156,14158,14163,14165,14167,14183,14185,14187,14191,14197,14199,14207,14209,14217,14219,14221,14223],[10,14069,7766],{},[14,14071,16],{"id":16},[10,14073,7771],{},[14,14075,22],{"id":22},[10,14077,14078],{},[26,14079],{"alt":7778,"src":7779},[10,14081,7782],{},[14,14083,40],{"id":40},[42,14085,14086,14090,14094],{},[45,14087,14088,7792],{},[34,14089,7791],{},[45,14091,14092,7798],{},[34,14093,7797],{},[45,14095,7801],{},[14,14097,63],{"id":63},[10,14099,66],{},[68,14101,14102],{"className":70,"code":7808,"language":72,"meta":73,"style":73},[34,14103,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140,14144,14148,14152],{"__ignoreMap":73},[77,14105,14106],{"class":79,"line":80},[77,14107,7815],{},[77,14109,14110],{"class":79,"line":86},[77,14111,7820],{},[77,14113,14114],{"class":79,"line":92},[77,14115,7825],{},[77,14117,14118],{"class":79,"line":98},[77,14119,7830],{},[77,14121,14122],{"class":79,"line":105},[77,14123,102],{"emptyLinePlaceholder":101},[77,14125,14126],{"class":79,"line":111},[77,14127,7839],{},[77,14129,14130],{"class":79,"line":2494},[77,14131,7844],{},[77,14133,14134],{"class":79,"line":2500},[77,14135,7849],{},[77,14137,14138],{"class":79,"line":3959},[77,14139,7854],{},[77,14141,14142],{"class":79,"line":4171},[77,14143,102],{"emptyLinePlaceholder":101},[77,14145,14146],{"class":79,"line":5787},[77,14147,7863],{},[77,14149,14150],{"class":79,"line":5792},[77,14151,7868],{},[77,14153,14154],{"class":79,"line":7397},[77,14155,7873],{},[10,14157,117],{},[68,14159,14161],{"className":14160,"code":7879,"language":123,"meta":73},[121],[34,14162,7879],{"__ignoreMap":73},[10,14164,128],{},[14,14166,131],{"id":131},[133,14168,14169,14175],{},[45,14170,7890,14171,7894,14173,7897],{},[34,14172,7893],{},[34,14174,7797],{},[45,14176,14177,7903,14179,7907,14181,7910],{},[34,14178,7902],{},[34,14180,7906],{},[34,14182,7791],{},[157,14184,159],{"id":159},[10,14186,7915],{},[10,14188,14189],{},[26,14190],{"alt":7920,"src":7921},[10,14192,7924,14193,175,14195,7930],{},[34,14194,4590],{},[34,14196,7929],{},[14,14198,182],{"id":182},[42,14200,14201,14205],{},[45,14202,7937,14203,7940],{},[34,14204,7791],{},[45,14206,7943],{},[14,14208,200],{"id":200},[133,14210,14211,14215],{},[45,14212,5303,14213,7953],{},[34,14214,7952],{},[45,14216,7956],{},[10,14218,211],{},[14,14220,214],{"id":214},[10,14222,7963],{},[219,14224,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14226},[14227,14228,14229,14230,14231,14234,14235,14236],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14232},[14233],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":7761,"description":7766},[234,7985,7986],{"id":7989,"title":7990,"body":14241,"category":234,"cover":235,"description":7995,"extension":236,"meta":14388,"navigation":101,"path":8174,"pinned":239,"publishedAt":240,"seo":14389,"slug":8176,"stem":8177,"summary":8178,"tags":14390,"updatedAt":240,"visible":101,"__hash__":8182},{"type":7,"value":14242,"toc":14378},[14243,14245,14247,14249,14251,14255,14257,14259,14267,14269,14271,14327,14329,14334,14336,14338,14350,14352,14358,14360,14370,14372,14374,14376],[10,14244,7995],{},[14,14246,16],{"id":16},[10,14248,8000],{},[14,14250,22],{"id":22},[10,14252,14253],{},[26,14254],{"alt":8007,"src":8008},[10,14256,8011],{},[14,14258,40],{"id":40},[42,14260,14261,14263,14265],{},[45,14262,8018],{},[45,14264,8021],{},[45,14266,8024],{},[14,14268,63],{"id":63},[10,14270,66],{},[68,14272,14273],{"className":70,"code":8031,"language":72,"meta":73,"style":73},[34,14274,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311,14315,14319,14323],{"__ignoreMap":73},[77,14276,14277],{"class":79,"line":80},[77,14278,8038],{},[77,14280,14281],{"class":79,"line":86},[77,14282,8043],{},[77,14284,14285],{"class":79,"line":92},[77,14286,8048],{},[77,14288,14289],{"class":79,"line":98},[77,14290,102],{"emptyLinePlaceholder":101},[77,14292,14293],{"class":79,"line":105},[77,14294,8057],{},[77,14296,14297],{"class":79,"line":111},[77,14298,8062],{},[77,14300,14301],{"class":79,"line":2494},[77,14302,8067],{},[77,14304,14305],{"class":79,"line":2500},[77,14306,102],{"emptyLinePlaceholder":101},[77,14308,14309],{"class":79,"line":3959},[77,14310,8076],{},[77,14312,14313],{"class":79,"line":4171},[77,14314,8081],{},[77,14316,14317],{"class":79,"line":5787},[77,14318,102],{"emptyLinePlaceholder":101},[77,14320,14321],{"class":79,"line":5792},[77,14322,8090],{},[77,14324,14325],{"class":79,"line":7397},[77,14326,8095],{},[10,14328,117],{},[68,14330,14332],{"className":14331,"code":8101,"language":123,"meta":73},[121],[34,14333,8101],{"__ignoreMap":73},[10,14335,128],{},[14,14337,131],{"id":131},[133,14339,14340,14346],{},[45,14341,14342,8115,14344,8119],{},[34,14343,8114],{},[34,14345,8118],{},[45,14347,8122,14348,8126],{},[34,14349,8125],{},[14,14351,182],{"id":182},[42,14353,14354,14356],{},[45,14355,8133],{},[45,14357,8136],{},[14,14359,200],{"id":200},[133,14361,14362,14368],{},[45,14363,8143,14364,8147,14366,60],{},[34,14365,8146],{},[34,14367,8150],{},[45,14369,8153],{},[10,14371,211],{},[14,14373,214],{"id":214},[10,14375,8160],{},[219,14377,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14379},[14380,14381,14382,14383,14384,14385,14386,14387],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":7990,"description":7995},[234,8180,8181],{"id":8184,"title":8185,"body":14392,"category":234,"cover":235,"description":8190,"extension":236,"meta":14555,"navigation":101,"path":8394,"pinned":239,"publishedAt":240,"seo":14556,"slug":8396,"stem":8397,"summary":8398,"tags":14557,"updatedAt":240,"visible":101,"__hash__":8402},{"type":7,"value":14393,"toc":14543},[14394,14396,14398,14400,14402,14406,14410,14412,14428,14430,14432,14476,14478,14483,14485,14487,14501,14503,14507,14511,14515,14517,14523,14525,14535,14537,14539,14541],[10,14395,8190],{},[14,14397,16],{"id":16},[10,14399,8195],{},[14,14401,22],{"id":22},[10,14403,14404],{},[26,14405],{"alt":8202,"src":8203},[10,14407,8206,14408,8210],{},[34,14409,8209],{},[14,14411,40],{"id":40},[42,14413,14414,14420,14426],{},[45,14415,14416,8220,14418,8224],{},[34,14417,8219],{},[34,14419,8223],{},[45,14421,8227,14422,8231,14424,8234],{},[34,14423,8230],{},[34,14425,4345],{},[45,14427,8237],{},[14,14429,63],{"id":63},[10,14431,66],{},[68,14433,14434],{"className":70,"code":8244,"language":72,"meta":73,"style":73},[34,14435,14436,14440,14444,14448,14452,14456,14460,14464,14468,14472],{"__ignoreMap":73},[77,14437,14438],{"class":79,"line":80},[77,14439,8251],{},[77,14441,14442],{"class":79,"line":86},[77,14443,8256],{},[77,14445,14446],{"class":79,"line":92},[77,14447,8261],{},[77,14449,14450],{"class":79,"line":98},[77,14451,8266],{},[77,14453,14454],{"class":79,"line":105},[77,14455,8271],{},[77,14457,14458],{"class":79,"line":111},[77,14459,102],{"emptyLinePlaceholder":101},[77,14461,14462],{"class":79,"line":2494},[77,14463,8280],{},[77,14465,14466],{"class":79,"line":2500},[77,14467,8285],{},[77,14469,14470],{"class":79,"line":3959},[77,14471,8285],{},[77,14473,14474],{"class":79,"line":4171},[77,14475,8285],{},[10,14477,117],{},[68,14479,14481],{"className":14480,"code":8299,"language":123,"meta":73},[121],[34,14482,8299],{"__ignoreMap":73},[10,14484,128],{},[14,14486,131],{"id":131},[133,14488,14489,14493],{},[45,14490,7890,14491,8313],{},[34,14492,8312],{},[45,14494,8316,14495,8319,14497,8322,14499,8326],{},[34,14496,8223],{},[34,14498,8209],{},[34,14500,8325],{},[157,14502,159],{"id":159},[10,14504,8331,14505,8334],{},[34,14506,8223],{},[10,14508,14509],{},[26,14510],{"alt":8339,"src":8340},[10,14512,8343,14513,8346],{},[34,14514,8209],{},[14,14516,182],{"id":182},[42,14518,14519,14521],{},[45,14520,8353],{},[45,14522,8356],{},[14,14524,200],{"id":200},[133,14526,14527,14529],{},[45,14528,8363],{},[45,14530,4017,14531,8368,14533,8371],{},[34,14532,4345],{},[34,14534,8223],{},[10,14536,211],{},[14,14538,214],{"id":214},[10,14540,8378],{},[219,14542,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14544},[14545,14546,14547,14548,14549,14552,14553,14554],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14550},[14551],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":8185,"description":8190},[234,8400,8401],{"id":8404,"title":8405,"body":14559,"category":234,"cover":235,"description":8410,"extension":236,"meta":14742,"navigation":101,"path":8635,"pinned":239,"publishedAt":240,"seo":14743,"slug":8637,"stem":8638,"summary":8639,"tags":14744,"updatedAt":240,"visible":101,"__hash__":8642},{"type":7,"value":14560,"toc":14730},[14561,14563,14565,14567,14569,14573,14575,14577,14591,14593,14595,14663,14665,14670,14672,14674,14688,14690,14692,14696,14702,14704,14712,14714,14722,14724,14726,14728],[10,14562,8410],{},[14,14564,16],{"id":16},[10,14566,8415],{},[14,14568,22],{"id":22},[10,14570,14571],{},[26,14572],{"alt":8422,"src":8423},[10,14574,8426],{},[14,14576,40],{"id":40},[42,14578,14579,14585,14587],{},[45,14580,14581,8436,14583,60],{},[34,14582,8435],{},[34,14584,8439],{},[45,14586,8442],{},[45,14588,14589,8448],{},[34,14590,8447],{},[14,14592,63],{"id":63},[10,14594,66],{},[68,14596,14597],{"className":70,"code":8455,"language":72,"meta":73,"style":73},[34,14598,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651,14655,14659],{"__ignoreMap":73},[77,14600,14601],{"class":79,"line":80},[77,14602,8462],{},[77,14604,14605],{"class":79,"line":86},[77,14606,102],{"emptyLinePlaceholder":101},[77,14608,14609],{"class":79,"line":92},[77,14610,8471],{},[77,14612,14613],{"class":79,"line":98},[77,14614,8476],{},[77,14616,14617],{"class":79,"line":105},[77,14618,8481],{},[77,14620,14621],{"class":79,"line":111},[77,14622,8486],{},[77,14624,14625],{"class":79,"line":2494},[77,14626,8491],{},[77,14628,14629],{"class":79,"line":2500},[77,14630,8496],{},[77,14632,14633],{"class":79,"line":3959},[77,14634,8501],{},[77,14636,14637],{"class":79,"line":4171},[77,14638,8506],{},[77,14640,14641],{"class":79,"line":5787},[77,14642,102],{"emptyLinePlaceholder":101},[77,14644,14645],{"class":79,"line":5792},[77,14646,8515],{},[77,14648,14649],{"class":79,"line":7397},[77,14650,6140],{},[77,14652,14653],{"class":79,"line":7403},[77,14654,6145],{},[77,14656,14657],{"class":79,"line":8526},[77,14658,102],{"emptyLinePlaceholder":101},[77,14660,14661],{"class":79,"line":8531},[77,14662,8534],{},[10,14664,117],{},[68,14666,14668],{"className":14667,"code":8540,"language":123,"meta":73},[121],[34,14669,8540],{"__ignoreMap":73},[10,14671,128],{},[14,14673,131],{"id":131},[133,14675,14676,14686],{},[45,14677,8551,14678,8555,14680,8559,14682,8563,14684,60],{},[34,14679,8554],{},[34,14681,8558],{},[34,14683,8562],{},[34,14685,8554],{},[45,14687,8568],{},[157,14689,159],{"id":159},[10,14691,8573],{},[10,14693,14694],{},[26,14695],{"alt":8578,"src":8579},[10,14697,14698,8584,14700,60],{},[34,14699,8435],{},[34,14701,8439],{},[14,14703,182],{"id":182},[42,14705,14706,14710],{},[45,14707,8593,14708,60],{},[34,14709,59],{},[45,14711,8598],{},[14,14713,200],{"id":200},[133,14715,14716,14718],{},[45,14717,8605],{},[45,14719,8608,14720,8612],{},[34,14721,8611],{},[10,14723,211],{},[14,14725,214],{"id":214},[10,14727,8619],{},[219,14729,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14731},[14732,14733,14734,14735,14736,14739,14740,14741],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14737},[14738],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":8405,"description":8410},[234,8641,5337],{"id":8644,"title":8645,"body":14746,"category":234,"cover":235,"description":8650,"extension":236,"meta":14905,"navigation":101,"path":8838,"pinned":239,"publishedAt":240,"seo":14906,"slug":8840,"stem":8841,"summary":8842,"tags":14907,"updatedAt":240,"visible":101,"__hash__":8846},{"type":7,"value":14747,"toc":14893},[14748,14750,14752,14754,14756,14760,14762,14764,14772,14774,14776,14840,14842,14847,14849,14851,14859,14861,14863,14867,14869,14871,14877,14879,14885,14887,14889,14891],[10,14749,8650],{},[14,14751,16],{"id":16},[10,14753,8655],{},[14,14755,22],{"id":22},[10,14757,14758],{},[26,14759],{"alt":8662,"src":8663},[10,14761,8666],{},[14,14763,40],{"id":40},[42,14765,14766,14768,14770],{},[45,14767,8673],{},[45,14769,8676],{},[45,14771,8679],{},[14,14773,63],{"id":63},[10,14775,66],{},[68,14777,14778],{"className":70,"code":8686,"language":72,"meta":73,"style":73},[34,14779,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828,14832,14836],{"__ignoreMap":73},[77,14781,14782],{"class":79,"line":80},[77,14783,8693],{},[77,14785,14786],{"class":79,"line":86},[77,14787,8698],{},[77,14789,14790],{"class":79,"line":92},[77,14791,102],{"emptyLinePlaceholder":101},[77,14793,14794],{"class":79,"line":98},[77,14795,8707],{},[77,14797,14798],{"class":79,"line":105},[77,14799,102],{"emptyLinePlaceholder":101},[77,14801,14802],{"class":79,"line":111},[77,14803,8716],{},[77,14805,14806],{"class":79,"line":2494},[77,14807,8721],{},[77,14809,14810],{"class":79,"line":2500},[77,14811,8726],{},[77,14813,14814],{"class":79,"line":3959},[77,14815,102],{"emptyLinePlaceholder":101},[77,14817,14818],{"class":79,"line":4171},[77,14819,8735],{},[77,14821,14822],{"class":79,"line":5787},[77,14823,8740],{},[77,14825,14826],{"class":79,"line":5792},[77,14827,8745],{},[77,14829,14830],{"class":79,"line":7397},[77,14831,102],{"emptyLinePlaceholder":101},[77,14833,14834],{"class":79,"line":7403},[77,14835,6154],{},[77,14837,14838],{"class":79,"line":8526},[77,14839,8758],{},[10,14841,117],{},[68,14843,14845],{"className":14844,"code":8764,"language":123,"meta":73},[121],[34,14846,8764],{"__ignoreMap":73},[10,14848,128],{},[14,14850,131],{"id":131},[133,14852,14853,14857],{},[45,14854,14855,8778],{},[34,14856,8777],{},[45,14858,8781],{},[157,14860,159],{"id":159},[10,14862,8786],{},[10,14864,14865],{},[26,14866],{"alt":8791,"src":8792},[10,14868,8795],{},[14,14870,182],{"id":182},[42,14872,14873,14875],{},[45,14874,8802],{},[45,14876,8805],{},[14,14878,200],{"id":200},[133,14880,14881,14883],{},[45,14882,8812],{},[45,14884,8815],{},[10,14886,211],{},[14,14888,214],{"id":214},[10,14890,8822],{},[219,14892,221],{},{"title":73,"searchDepth":86,"depth":86,"links":14894},[14895,14896,14897,14898,14899,14902,14903,14904],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":14900},[14901],{"id":159,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":8645,"description":8650},[234,8844,8845],{"id":8848,"title":8849,"body":14909,"category":234,"cover":235,"description":8854,"extension":236,"meta":15147,"navigation":101,"path":9155,"pinned":239,"publishedAt":240,"seo":15148,"slug":9157,"stem":9158,"summary":9159,"tags":15149,"updatedAt":240,"visible":101,"__hash__":9163},{"type":7,"value":14910,"toc":15134},[14911,14913,14915,14917,14919,14923,14925,14927,14937,14939,14941,15057,15059,15064,15066,15068,15078,15080,15082,15086,15088,15090,15092,15096,15100,15102,15110,15112,15126,15128,15130,15132],[10,14912,8854],{},[14,14914,16],{"id":16},[10,14916,8859],{},[14,14918,22],{"id":22},[10,14920,14921],{},[26,14922],{"alt":8866,"src":8867},[10,14924,8870],{},[14,14926,40],{"id":40},[42,14928,14929,14931,14933],{},[45,14930,8877],{},[45,14932,8880],{},[45,14934,8883,14935,8887],{},[34,14936,8886],{},[14,14938,63],{"id":63},[10,14940,66],{},[68,14942,14943],{"className":70,"code":8894,"language":72,"meta":73,"style":73},[34,14944,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,15049,15053],{"__ignoreMap":73},[77,14946,14947],{"class":79,"line":80},[77,14948,6952],{},[77,14950,14951],{"class":79,"line":86},[77,14952,6561],{},[77,14954,14955],{"class":79,"line":92},[77,14956,102],{"emptyLinePlaceholder":101},[77,14958,14959],{"class":79,"line":98},[77,14960,8913],{},[77,14962,14963],{"class":79,"line":105},[77,14964,8918],{},[77,14966,14967],{"class":79,"line":111},[77,14968,8923],{},[77,14970,14971],{"class":79,"line":2494},[77,14972,8928],{},[77,14974,14975],{"class":79,"line":2500},[77,14976,102],{"emptyLinePlaceholder":101},[77,14978,14979],{"class":79,"line":3959},[77,14980,8937],{},[77,14982,14983],{"class":79,"line":4171},[77,14984,8942],{},[77,14986,14987],{"class":79,"line":5787},[77,14988,8947],{},[77,14990,14991],{"class":79,"line":5792},[77,14992,8952],{},[77,14994,14995],{"class":79,"line":7397},[77,14996,8957],{},[77,14998,14999],{"class":79,"line":7403},[77,15000,102],{"emptyLinePlaceholder":101},[77,15002,15003],{"class":79,"line":8526},[77,15004,8966],{},[77,15006,15007],{"class":79,"line":8531},[77,15008,8971],{},[77,15010,15011],{"class":79,"line":8974},[77,15012,8977],{},[77,15014,15015],{"class":79,"line":8980},[77,15016,102],{"emptyLinePlaceholder":101},[77,15018,15019],{"class":79,"line":8985},[77,15020,8988],{},[77,15022,15023],{"class":79,"line":8991},[77,15024,102],{"emptyLinePlaceholder":101},[77,15026,15027],{"class":79,"line":8996},[77,15028,7370],{},[77,15030,15031],{"class":79,"line":9001},[77,15032,9004],{},[77,15034,15035],{"class":79,"line":9007},[77,15036,9010],{},[77,15038,15039],{"class":79,"line":9013},[77,15040,9016],{},[77,15042,15043],{"class":79,"line":9019},[77,15044,7380],{},[77,15046,15047],{"class":79,"line":9024},[77,15048,9027],{},[77,15050,15051],{"class":79,"line":9030},[77,15052,1153],{},[77,15054,15055],{"class":79,"line":9035},[77,15056,9038],{},[10,15058,117],{},[68,15060,15062],{"className":15061,"code":9044,"language":123,"meta":73},[121],[34,15063,9044],{"__ignoreMap":73},[10,15065,128],{},[14,15067,131],{"id":131},[133,15069,15070,15074],{},[45,15071,9055,15072,9058],{},[34,15073,8886],{},[45,15075,15076,9063],{},[34,15077,8118],{},[157,15079,159],{"id":159},[10,15081,9068],{},[10,15083,15084],{},[26,15085],{"alt":9073,"src":9074},[10,15087,9077],{},[157,15089,159],{"id":4226},[10,15091,9082],{},[10,15093,15094],{},[26,15095],{"alt":9087,"src":9088},[10,15097,9091,15098,9095],{},[34,15099,9094],{},[14,15101,182],{"id":182},[42,15103,15104,15106],{},[45,15105,9102],{},[45,15107,9105,15108,9108],{},[34,15109,9094],{},[14,15111,200],{"id":200},[133,15113,15114,15118,15120],{},[45,15115,9115,15116,9118],{},[34,15117,9094],{},[45,15119,9121],{},[45,15121,9124,15122,9128,15124,9131],{},[34,15123,9127],{},[34,15125,6096],{},[10,15127,211],{},[14,15129,214],{"id":214},[10,15131,9138],{},[219,15133,221],{},{"title":73,"searchDepth":86,"depth":86,"links":15135},[15136,15137,15138,15139,15140,15144,15145,15146],{"id":16,"depth":86,"text":16},{"id":22,"depth":86,"text":22},{"id":40,"depth":86,"text":40},{"id":63,"depth":86,"text":63},{"id":131,"depth":86,"text":131,"children":15141},[15142,15143],{"id":159,"depth":92,"text":159},{"id":4226,"depth":92,"text":159},{"id":182,"depth":86,"text":182},{"id":200,"depth":86,"text":200},{"id":214,"depth":86,"text":214},{},{"title":8849,"description":8854},[234,9161,9162],{"id":1063,"title":1064,"body":15151,"category":234,"cover":1072,"description":73,"extension":236,"meta":15387,"navigation":101,"path":1388,"pinned":239,"publishedAt":1389,"seo":15388,"slug":1391,"stem":1392,"summary":1393,"tags":15389,"updatedAt":1389,"visible":101,"__hash__":1397},{"type":7,"value":15152,"toc":15372},[15153,15157,15159,15161,15163,15165,15185,15187,15192,15194,15196,15224,15230,15232,15236,15238,15258,15260,15270,15272,15274,15276,15278,15280,15282,15284,15286,15288,15308,15310,15312,15316,15318,15320,15322,15324,15328,15330,15348,15350,15352,15354,15356,15358,15360,15362,15364,15366,15368,15370],[10,15154,15155],{},[26,15156],{"alt":1071,"src":1072},[10,15158,1075],{},[10,15160,1078],{},[14,15162,1082],{"id":1081},[10,15164,1085],{},[68,15166,15167],{"className":70,"code":1088,"language":72,"meta":73,"style":73},[34,15168,15169,15173,15177,15181],{"__ignoreMap":73},[77,15170,15171],{"class":79,"line":80},[77,15172,1095],{},[77,15174,15175],{"class":79,"line":86},[77,15176,1100],{},[77,15178,15179],{"class":79,"line":92},[77,15180,102],{"emptyLinePlaceholder":101},[77,15182,15183],{"class":79,"line":98},[77,15184,1109],{},[10,15186,1112],{},[68,15188,15190],{"className":15189,"code":1116,"language":123,"meta":73},[121],[34,15191,1116],{"__ignoreMap":73},[10,15193,1121],{},[10,15195,1124],{},[68,15197,15198],{"className":70,"code":1127,"language":72,"meta":73,"style":73},[34,15199,15200,15204,15208,15212,15216,15220],{"__ignoreMap":73},[77,15201,15202],{"class":79,"line":80},[77,15203,1134],{},[77,15205,15206],{"class":79,"line":86},[77,15207,102],{"emptyLinePlaceholder":101},[77,15209,15210],{"class":79,"line":92},[77,15211,1143],{},[77,15213,15214],{"class":79,"line":98},[77,15215,1148],{},[77,15217,15218],{"class":79,"line":105},[77,15219,1153],{},[77,15221,15222],{"class":79,"line":111},[77,15223,1158],{},[10,15225,15226,175,15228,1167],{},[34,15227,1163],{},[34,15229,1166],{},[14,15231,1171],{"id":1170},[10,15233,1174,15234,1178],{},[34,15235,1177],{},[10,15237,1181],{},[68,15239,15240],{"className":70,"code":1184,"language":72,"meta":73,"style":73},[34,15241,15242,15246,15250,15254],{"__ignoreMap":73},[77,15243,15244],{"class":79,"line":80},[77,15245,1191],{},[77,15247,15248],{"class":79,"line":86},[77,15249,1196],{},[77,15251,15252],{"class":79,"line":92},[77,15253,1201],{},[77,15255,15256],{"class":79,"line":98},[77,15257,1206],{},[10,15259,1209],{},[68,15261,15262],{"className":598,"code":1212,"language":600,"meta":73,"style":73},[34,15263,15264],{"__ignoreMap":73},[77,15265,15266,15268],{"class":79,"line":80},[77,15267,698],{"class":607},[77,15269,1221],{"class":643},[10,15271,1224],{},[14,15273,1228],{"id":1227},[157,15275,1231],{"id":1231},[10,15277,1234],{},[157,15279,1237],{"id":1237},[10,15281,1240],{},[157,15283,1243],{"id":1243},[10,15285,1246],{},[10,15287,1249],{},[68,15289,15290],{"className":70,"code":1252,"language":72,"meta":73,"style":73},[34,15291,15292,15296,15300,15304],{"__ignoreMap":73},[77,15293,15294],{"class":79,"line":80},[77,15295,1259],{},[77,15297,15298],{"class":79,"line":86},[77,15299,102],{"emptyLinePlaceholder":101},[77,15301,15302],{"class":79,"line":92},[77,15303,1268],{},[77,15305,15306],{"class":79,"line":98},[77,15307,1273],{},[10,15309,1276],{},[157,15311,1279],{"id":1279},[10,15313,1282,15314,1285],{},[34,15315,269],{},[10,15317,1288],{},[157,15319,1291],{"id":1291},[10,15321,1294],{},[14,15323,1298],{"id":1297},[10,15325,15326],{},[26,15327],{"alt":1303,"src":1304},[10,15329,1307],{},[42,15331,15332,15334,15336,15338,15340,15342,15344,15346],{},[45,15333,1312],{},[45,15335,1315],{},[45,15337,1318],{},[45,15339,1321],{},[45,15341,1324],{},[45,15343,1327],{},[45,15345,1330],{},[45,15347,1333],{},[10,15349,1336],{},[14,15351,1340],{"id":1339},[10,15353,1343],{},[10,15355,1346],{},[14,15357,1350],{"id":1349},[10,15359,1353],{},[10,15361,1356],{},[10,15363,1359],{},[14,15365,1362],{"id":1362},[10,15367,1365],{},[10,15369,1368],{},[219,15371,1371],{},{"title":73,"searchDepth":86,"depth":86,"links":15373},[15374,15375,15376,15383,15384,15385,15386],{"id":1081,"depth":86,"text":1082},{"id":1170,"depth":86,"text":1171},{"id":1227,"depth":86,"text":1228,"children":15377},[15378,15379,15380,15381,15382],{"id":1231,"depth":92,"text":1231},{"id":1237,"depth":92,"text":1237},{"id":1243,"depth":92,"text":1243},{"id":1279,"depth":92,"text":1279},{"id":1291,"depth":92,"text":1291},{"id":1297,"depth":86,"text":1298},{"id":1339,"depth":86,"text":1340},{"id":1349,"depth":86,"text":1350},{"id":1362,"depth":86,"text":1362},{},{"title":1064,"description":73},[234,1395,1396],{"id":251,"title":252,"body":15391,"category":234,"cover":235,"description":73,"extension":236,"meta":15970,"navigation":101,"path":1052,"pinned":239,"publishedAt":1053,"seo":15971,"slug":1055,"stem":1056,"summary":1057,"tags":15972,"updatedAt":1053,"visible":101,"__hash__":1061},{"type":7,"value":15392,"toc":15946},[15393,15395,15397,15399,15403,15405,15407,15431,15443,15445,15447,15452,15456,15460,15472,15476,15480,15484,15486,15520,15522,15526,15530,15532,15554,15584,15596,15606,15614,15616,15622,15632,15634,15639,15643,15645,15659,15665,15685,15687,15689,15691,15701,15705,15707,15716,15720,15722,15724,15744,15748,15750,15752,15754,15756,15776,15778,15780,15782,15808,15810,15826,15828,15844,15848,15850,15852,15872,15874,15876,15878,15882,15892,15894,15896,15898,15908,15916,15918,15920,15934,15944],[14,15394,257],{"id":257},[10,15396,260],{},[10,15398,263],{},[10,15400,266,15401,270],{},[34,15402,269],{},[14,15404,273],{"id":273},[10,15406,276],{},[278,15408,15409,15411],{},[10,15410,282],{},[278,15412,15413,15419,15421,15425,15427],{},[10,15414,287,15415,291,15417,295],{},[34,15416,290],{},[34,15418,294],{},[10,15420,298],{},[10,15422,301,15423,306],{},[303,15424,305],{},[10,15426,309],{},[10,15428,15429],{},[26,15430],{"alt":314,"src":315},[278,15432,15433,15435],{},[10,15434,320],{},[278,15436,15437,15439],{},[10,15438,325],{},[10,15440,15441],{},[26,15442],{"alt":330,"src":331},[14,15444,335],{"id":334},[157,15446,339],{"id":338},[10,15448,342,15449,350],{},[344,15450,349],{"href":346,"rel":15451},[348],[278,15453,15454],{},[10,15455,355],{},[10,15457,15458],{},[26,15459],{"alt":360,"src":361},[42,15461,15462,15466,15470],{},[45,15463,366,15464,60],{},[303,15465,369],{},[45,15467,372,15468,60],{},[303,15469,375],{},[45,15471,378],{},[10,15473,15474],{},[26,15475],{"alt":383,"src":384},[278,15477,15478],{},[10,15479,389],{},[10,15481,15482],{},[26,15483],{"alt":394,"src":395},[157,15485,399],{"id":398},[278,15487,15488,15492,15496,15516],{},[278,15489,15490],{},[10,15491,406],{},[10,15493,409,15494,413],{},[303,15495,412],{},[68,15497,15498],{"className":70,"code":416,"language":72,"meta":73,"style":73},[34,15499,15500,15504,15508,15512],{"__ignoreMap":73},[77,15501,15502],{"class":79,"line":80},[77,15503,423],{},[77,15505,15506],{"class":79,"line":86},[77,15507,428],{},[77,15509,15510],{"class":79,"line":92},[77,15511,433],{},[77,15513,15514],{"class":79,"line":98},[77,15515,438],{},[10,15517,441,15518,445],{},[303,15519,444],{},[10,15521,448],{},[10,15523,451,15524,454],{},[34,15525,72],{},[10,15527,15528],{},[26,15529],{"alt":459,"src":460},[10,15531,463],{},[278,15533,15534,15536,15540],{},[10,15535,468],{},[10,15537,15538],{},[303,15539,473],{},[278,15541,15542,15546,15550],{},[10,15543,478,15544,481],{},[34,15545,72],{},[10,15547,484,15548,487],{},[34,15549,72],{},[10,15551,490,15552,494],{},[303,15553,493],{},[278,15555,15556,15558,15562],{},[10,15557,499],{},[10,15559,15560],{},[303,15561,504],{},[278,15563,15564,15570,15578,15580],{},[10,15565,15566,512,15568,516],{},[34,15567,511],{},[34,15569,515],{},[10,15571,519,15572,522,15574,526,15576,530],{},[34,15573,511],{},[303,15575,525],{},[303,15577,529],{},[10,15579,533],{},[10,15581,15582,539],{},[303,15583,538],{},[278,15585,15586,15588],{},[10,15587,544],{},[278,15589,15590,15594],{},[10,15591,549,15592,553],{},[303,15593,552],{},[10,15595,556],{},[278,15597,15598,15602],{},[10,15599,561,15600],{},[303,15601,564],{},[10,15603,15604],{},[26,15605],{"alt":569,"src":570},[278,15607,15608,15610],{},[10,15609,575],{},[10,15611,15612],{},[26,15613],{"alt":569,"src":580},[157,15615,584],{"id":583},[10,15617,587,15618,591,15620,595],{},[34,15619,590],{},[34,15621,594],{},[68,15623,15624],{"className":598,"code":599,"language":600,"meta":73,"style":73},[34,15625,15626],{"__ignoreMap":73},[77,15627,15628,15630],{"class":79,"line":80},[77,15629,72],{"class":607},[77,15631,611],{"class":610},[10,15633,614],{},[68,15635,15637],{"className":15636,"code":618,"language":123,"meta":73},[121],[34,15638,618],{"__ignoreMap":73},[10,15640,15641],{},[26,15642],{"alt":569,"src":625},[10,15644,628],{},[68,15646,15647],{"className":598,"code":631,"language":600,"meta":73,"style":73},[34,15648,15649],{"__ignoreMap":73},[77,15650,15651,15653,15655,15657],{"class":79,"line":80},[77,15652,72],{"class":607},[77,15654,640],{"class":610},[77,15656,644],{"class":643},[77,15658,611],{"class":610},[10,15660,649,15661,652,15663,656],{},[34,15662,72],{},[34,15664,655],{},[68,15666,15667],{"className":598,"code":659,"language":600,"meta":73,"style":73},[34,15668,15669,15675],{"__ignoreMap":73},[77,15670,15671,15673],{"class":79,"line":80},[77,15672,515],{"class":607},[77,15674,611],{"class":610},[77,15676,15677,15679,15681,15683],{"class":79,"line":86},[77,15678,515],{"class":607},[77,15680,640],{"class":610},[77,15682,644],{"class":643},[77,15684,611],{"class":610},[14,15686,681],{"id":680},[157,15688,685],{"id":684},[10,15690,688],{},[68,15692,15693],{"className":598,"code":691,"language":600,"meta":73,"style":73},[34,15694,15695],{"__ignoreMap":73},[77,15696,15697,15699],{"class":79,"line":80},[77,15698,698],{"class":607},[77,15700,611],{"class":610},[10,15702,703,15703,707],{},[34,15704,706],{},[157,15706,711],{"id":710},[10,15708,342,15709,719,15712,60,15714,726],{},[344,15710,718],{"href":716,"rel":15711},[348],[303,15713,722],{},[34,15715,725],{},[10,15717,729,15718,733],{},[34,15719,732],{},[157,15721,737],{"id":736},[10,15723,740],{},[68,15725,15726],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,15727,15728,15734],{"__ignoreMap":73},[77,15729,15730,15732],{"class":79,"line":80},[77,15731,698],{"class":607},[77,15733,611],{"class":610},[77,15735,15736,15738,15740,15742],{"class":79,"line":86},[77,15737,698],{"class":607},[77,15739,640],{"class":610},[77,15741,644],{"class":643},[77,15743,611],{"class":610},[10,15745,764,15746,767],{},[34,15747,698],{},[14,15749,771],{"id":770},[10,15751,774],{},[157,15753,778],{"id":777},[10,15755,781],{},[68,15757,15758],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,15759,15760,15766],{"__ignoreMap":73},[77,15761,15762,15764],{"class":79,"line":80},[77,15763,698],{"class":607},[77,15765,611],{"class":610},[77,15767,15768,15770,15772,15774],{"class":79,"line":86},[77,15769,698],{"class":607},[77,15771,640],{"class":610},[77,15773,644],{"class":643},[77,15775,611],{"class":610},[10,15777,804],{},[157,15779,808],{"id":807},[10,15781,811],{},[68,15783,15784],{"className":598,"code":814,"language":600,"meta":73,"style":73},[34,15785,15786,15794],{"__ignoreMap":73},[77,15787,15788,15790,15792],{"class":79,"line":80},[77,15789,821],{"class":607},[77,15791,824],{"class":643},[77,15793,827],{"class":643},[77,15795,15796,15798,15800,15802,15804,15806],{"class":79,"line":86},[77,15797,821],{"class":607},[77,15799,824],{"class":643},[77,15801,836],{"class":643},[77,15803,839],{"class":643},[77,15805,842],{"class":643},[77,15807,845],{"class":643},[10,15809,848],{},[68,15811,15812],{"className":598,"code":851,"language":600,"meta":73,"style":73},[34,15813,15814],{"__ignoreMap":73},[77,15815,15816,15818,15820,15822,15824],{"class":79,"line":80},[77,15817,821],{"class":607},[77,15819,860],{"class":643},[77,15821,836],{"class":643},[77,15823,839],{"class":643},[77,15825,867],{"class":643},[10,15827,870],{},[68,15829,15830],{"className":598,"code":873,"language":600,"meta":73,"style":73},[34,15831,15832],{"__ignoreMap":73},[77,15833,15834,15836,15838,15840,15842],{"class":79,"line":80},[77,15835,821],{"class":607},[77,15837,882],{"class":643},[77,15839,885],{"class":610},[77,15841,888],{"class":643},[77,15843,891],{"class":643},[10,15845,15846,896],{},[34,15847,821],{},[157,15849,900],{"id":899},[10,15851,903],{},[68,15853,15854],{"className":598,"code":743,"language":600,"meta":73,"style":73},[34,15855,15856,15862],{"__ignoreMap":73},[77,15857,15858,15860],{"class":79,"line":80},[77,15859,698],{"class":607},[77,15861,611],{"class":610},[77,15863,15864,15866,15868,15870],{"class":79,"line":86},[77,15865,698],{"class":607},[77,15867,640],{"class":610},[77,15869,644],{"class":643},[77,15871,611],{"class":610},[10,15873,926],{},[14,15875,929],{"id":929},[157,15877,933],{"id":932},[10,15879,936,15880,940],{},[34,15881,939],{},[133,15883,15884,15888,15890],{},[45,15885,945,15886,948],{},[34,15887,655],{},[45,15889,951],{},[45,15891,954],{},[10,15893,957],{},[157,15895,961],{"id":960},[10,15897,964],{},[68,15899,15900],{"className":598,"code":691,"language":600,"meta":73,"style":73},[34,15901,15902],{"__ignoreMap":73},[77,15903,15904,15906],{"class":79,"line":80},[77,15905,698],{"class":607},[77,15907,611],{"class":610},[10,15909,977,15910,980,15912,983,15914,60],{},[34,15911,698],{},[34,15913,72],{},[34,15915,698],{},[157,15917,989],{"id":988},[10,15919,992],{},[68,15921,15922],{"className":598,"code":995,"language":600,"meta":73,"style":73},[34,15923,15924],{"__ignoreMap":73},[77,15925,15926,15928,15930,15932],{"class":79,"line":80},[77,15927,698],{"class":607},[77,15929,640],{"class":610},[77,15931,644],{"class":643},[77,15933,611],{"class":610},[10,15935,1010,15936,1013,15938,1016,15940,1019,15942,1023],{},[34,15937,698],{},[34,15939,72],{},[34,15941,515],{},[34,15943,1022],{},[219,15945,1026],{},{"title":73,"searchDepth":86,"depth":86,"links":15947},[15948,15949,15950,15955,15960,15965],{"id":257,"depth":86,"text":257},{"id":273,"depth":86,"text":273},{"id":334,"depth":86,"text":335,"children":15951},[15952,15953,15954],{"id":338,"depth":92,"text":339},{"id":398,"depth":92,"text":399},{"id":583,"depth":92,"text":584},{"id":680,"depth":86,"text":681,"children":15956},[15957,15958,15959],{"id":684,"depth":92,"text":685},{"id":710,"depth":92,"text":711},{"id":736,"depth":92,"text":737},{"id":770,"depth":86,"text":771,"children":15961},[15962,15963,15964],{"id":777,"depth":92,"text":778},{"id":807,"depth":92,"text":808},{"id":899,"depth":92,"text":900},{"id":929,"depth":86,"text":929,"children":15966},[15967,15968,15969],{"id":932,"depth":92,"text":933},{"id":960,"depth":92,"text":961},{"id":988,"depth":92,"text":989},{},{"title":252,"description":73},[234,1059,1060],1786973365381]