[{"data":1,"prerenderedAt":15967},["ShallowReactive",2],{"post-python-first-project-directory":3,"sidebar-posts":238,"post-related-source":9158},{"id":4,"title":5,"body":6,"category":222,"cover":223,"description":12,"extension":224,"meta":225,"navigation":226,"path":227,"pinned":228,"publishedAt":229,"seo":230,"slug":231,"stem":232,"summary":233,"tags":234,"updatedAt":229,"visible":226,"__hash__":237},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":8,"toc":212},"minimark",[9,13,17,20,23,30,37,40,60,63,66,127,130,138,141,144,167,170,184,187,199,202,205,208],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 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\u002F04-working-directory.svg",[10,31,32,36],{},[33,34,35],"code",{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,38,39],{"id":39},"核心概念",[41,42,43,47,57],"ul",{},[44,45,46],"li",{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[44,48,49,52,53,56],{},[33,50,51],{},"pwd"," 显示当前目录，",[33,54,55],{},"ls"," 显示目录里的文件。",[44,58,59],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,61,62],{"id":62},"跟着示例运行",[10,64,65],{},"在 macOS 终端执行：",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-bash shiki shiki-themes github-dark","mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n","bash","",[33,74,75,88,97,103,119],{"__ignoreMap":72},[76,77,80,84],"span",{"class":78,"line":79},"line",1,[76,81,83],{"class":82},"svObZ","mkdir",[76,85,87],{"class":86},"sU2Wk"," python-study\n",[76,89,91,95],{"class":78,"line":90},2,[76,92,94],{"class":93},"sDLfK","cd",[76,96,87],{"class":86},[76,98,100],{"class":78,"line":99},3,[76,101,102],{"class":93},"pwd\n",[76,104,106,109,112,116],{"class":78,"line":105},4,[76,107,108],{"class":93},"printf",[76,110,111],{"class":86}," 'print(\"项目已经运行\")\\n'",[76,113,115],{"class":114},"snl16"," >",[76,117,118],{"class":86}," hello.py\n",[76,120,122,125],{"class":78,"line":121},5,[76,123,124],{"class":82},"python3",[76,126,118],{"class":86},[10,128,129],{},"预期结果：",[67,131,136],{"className":132,"code":134,"language":135,"meta":72},[133],"language-text","项目已经运行\n","text",[33,137,134],{"__ignoreMap":72},[10,139,140],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,142,143],{"id":143},"按执行顺序拆开看",[145,146,147,158],"ol",{},[44,148,149,151,152,154,155,157],{},[33,150,83],{}," 创建目录，",[33,153,94],{}," 改变终端当前目录，",[33,156,51],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[44,159,160,162,163,166],{},[33,161,35],{}," 会在当前目录寻找 ",[33,164,165],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,168,169],{"id":169},"初学者容易混淆的地方",[41,171,172,181],{},[44,173,174,175,177,178,180],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,176,51],{}," 和 ",[33,179,55],{},"。",[44,182,183],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,185,186],{"id":186},"练习",[145,188,189,196],{},[44,190,191,192,195],{},"新建 ",[33,193,194],{},"lesson01.py"," 并输出课程编号。",[44,197,198],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,200,201],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,203,204],{"id":204},"本篇边界",[10,206,207],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,210,211],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":72,"searchDepth":90,"depth":90,"links":213},[214,215,216,217,218,219,220,221],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},"Python",null,"md",{},true,"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",false,"2026-08-17",{"title":5,"description":12},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[222,235,236],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",[239,1048,1385,1521,1672,1851,1994,2159,2343,2526,2719,2950,3134,3311,3468,3639,3804,4019,4248,4430,4594,4783,4971,5126,5286,5483,5680,5894,6061,6305,6486,6691,6886,7070,7271,7561,7753,7982,8177,8397,8637,8841],{"id":240,"title":241,"body":242,"category":222,"cover":223,"description":72,"extension":224,"meta":1037,"navigation":226,"path":1038,"pinned":228,"publishedAt":1039,"seo":1040,"slug":1041,"stem":1042,"summary":1043,"tags":1044,"updatedAt":1039,"visible":226,"__hash__":1047},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":243,"toc":1013},[244,247,250,253,260,263,266,305,321,325,330,341,346,352,369,375,380,386,390,438,441,447,453,456,487,532,549,563,573,577,588,600,603,609,614,617,634,644,665,669,673,676,687,694,698,713,720,724,727,748,754,758,761,765,768,788,791,795,798,832,835,854,857,878,883,887,890,910,913,916,920,927,941,944,948,951,961,972,976,979,994,1010],[14,245,246],{"id":246},"引言",[10,248,249],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,251,252],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,254,255,256,259],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,257,258],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,261,262],{"id":262},"扫盲",[10,264,265],{},"那么这里有几个概念：",[267,268,269,272],"blockquote",{},[10,270,271],{},"为什么需要安装python解释器？",[267,273,274,285,288,296,299],{},[10,275,276,277,280,281,284],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,278,279],{},"0","和",[33,282,283],{},"1","组成的机器指令。",[10,286,287],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,289,290,291,295],{},"这样，我们就能用",[292,293,294],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,297,298],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,300,301],{},[26,302],{"alt":303,"src":304},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[267,306,307,310],{},[10,308,309],{},"pip又是什么？",[267,311,312,315],{},[10,313,314],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,316,317],{},[26,318],{"alt":319,"src":320},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,322,324],{"id":323},"windows-安装","Windows 安装",[326,327,329],"h3",{"id":328},"_1-下载官方安装程序","1. 下载官方安装程序",[10,331,332,333,340],{},"打开 ",[334,335,339],"a",{"href":336,"rel":337},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[338],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[267,342,343],{},[10,344,345],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,347,348],{},[26,349],{"alt":350,"src":351},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[41,353,354,360,366],{},[44,355,356,357,180],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[292,358,359],{},"Windows installer (64-bit)",[44,361,362,363,180],{},"搭载 ARM 处理器的 Windows 设备选择 ",[292,364,365],{},"Windows installer (ARM64)",[44,367,368],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,370,371],{},[26,372],{"alt":373,"src":374},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[267,376,377],{},[10,378,379],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,381,382],{},[26,383],{"alt":384,"src":385},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[326,387,389],{"id":388},"_2-安装并加入-path","2. 安装并加入 PATH",[267,391,392,397,404,431],{},[267,393,394],{},[10,395,396],{},"PATH 环境变量",[10,398,399,400,403],{},"Windows 有一个特殊的变量叫 ",[292,401,402],{},"PATH","，它里面存了一串文件夹路径，比如：",[67,405,409],{"className":406,"code":407,"language":408,"meta":72,"style":72},"language-python shiki shiki-themes github-dark","D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n","python",[33,410,411,416,421,426],{"__ignoreMap":72},[76,412,413],{"class":78,"line":79},[76,414,415],{},"D:\\Python313\\\n",[76,417,418],{"class":78,"line":90},[76,419,420],{},"D:\\Python313\\Scripts\\\n",[76,422,423],{"class":78,"line":99},[76,424,425],{},"C:\\Windows\\System32\\\n",[76,427,428],{"class":78,"line":105},[76,429,430],{},"...\n",[10,432,433,434,437],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[292,435,436],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,439,440],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,442,443,444,446],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,445,408],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,448,449],{},[26,450],{"alt":451,"src":452},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,454,455],{},"对安装界面最底部的两个勾选项分别解释 :",[267,457,458,461,466],{},[10,459,460],{},"Add python.exe to PATH",[10,462,463],{},[292,464,465],{},"把 Python 添加到系统环境变量",[267,467,468,474,480],{},[10,469,470,471,473],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,472,408],{}," 就能运行",[10,475,476,477,479],{},"不勾选的话，命令行输入 ",[33,478,408],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,481,482,483,486],{},"必须",[292,484,485],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[267,488,489,492,497],{},[10,490,491],{},"Use admin privileges when installing py.exe",[10,493,494],{},[292,495,496],{},"使用管理员权限安装 py.exe（Python 启动器）",[267,498,499,509,523,526],{},[10,500,501,504,505,508],{},[33,502,503],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,506,507],{},"py"," 来启动 Python。",[10,510,511,512,514,515,518,519,522],{},"勾选后，",[33,513,503],{}," 会安装到",[292,516,517],{},"系统级目录","，电脑上",[292,520,521],{},"所有用户账户","都能用",[10,524,525],{},"不勾选，只有当前用户能用",[10,527,528,531],{},[292,529,530],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[267,533,534,537],{},[10,535,536],{},"操作建议",[267,538,539,546],{},[10,540,541,542,545],{},"两个都勾上之后，再点 ",[292,543,544],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,547,548],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[267,550,551,557],{},[10,552,553,554],{},"Python 安装的",[292,555,556],{},"可选功能页",[10,558,559],{},[26,560],{"alt":561,"src":562},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[267,564,565,568],{},[10,566,567],{},"高级选项页",[10,569,570],{},[26,571],{"alt":561,"src":572},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[326,574,576],{"id":575},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,578,579,580,583,584,587],{},"按 ",[33,581,582],{},"Win + R","，输入 ",[33,585,586],{},"cmd"," 并回车，然后执行：",[67,589,591],{"className":69,"code":590,"language":71,"meta":72,"style":72},"python --version\n",[33,592,593],{"__ignoreMap":72},[76,594,595,597],{"class":78,"line":79},[76,596,408],{"class":82},[76,598,599],{"class":93}," --version\n",[10,601,602],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[67,604,607],{"className":605,"code":606,"language":135,"meta":72},[133],"Python 3.x.x\n",[33,608,606],{"__ignoreMap":72},[10,610,611],{},[26,612],{"alt":561,"src":613},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,615,616],{},"继续检查 pip：",[67,618,620],{"className":69,"code":619,"language":71,"meta":72,"style":72},"python -m pip --version\n",[33,621,622],{"__ignoreMap":72},[76,623,624,626,629,632],{"class":78,"line":79},[76,625,408],{"class":82},[76,627,628],{"class":93}," -m",[76,630,631],{"class":86}," pip",[76,633,599],{"class":93},[10,635,636,637,639,640,643],{},"如果 ",[33,638,408],{}," 无法识别，但 ",[33,641,642],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[67,645,647],{"className":69,"code":646,"language":71,"meta":72,"style":72},"py --version\npy -m pip --version\n",[33,648,649,655],{"__ignoreMap":72},[76,650,651,653],{"class":78,"line":79},[76,652,507],{"class":82},[76,654,599],{"class":93},[76,656,657,659,661,663],{"class":78,"line":90},[76,658,507],{"class":82},[76,660,628],{"class":93},[76,662,631],{"class":86},[76,664,599],{"class":93},[14,666,668],{"id":667},"macos-安装","macOS 安装",[326,670,672],{"id":671},"_1-先检查现有环境","1. 先检查现有环境",[10,674,675],{},"打开“终端”应用，执行：",[67,677,679],{"className":69,"code":678,"language":71,"meta":72,"style":72},"python3 --version\n",[33,680,681],{"__ignoreMap":72},[76,682,683,685],{"class":78,"line":79},[76,684,124],{"class":82},[76,686,599],{"class":93},[10,688,689,690,693],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,691,692],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[326,695,697],{"id":696},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,699,332,700,705,706,180,709,712],{},[334,701,704],{"href":702,"rel":703},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[338],"Python macOS 下载页","，下载当前稳定版的 ",[292,707,708],{},"macOS 64-bit universal2 installer",[33,710,711],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,714,715,716,719],{},"下载完成后打开 ",[33,717,718],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[326,721,723],{"id":722},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,725,726],{},"安装完成后重新打开终端，执行：",[67,728,730],{"className":69,"code":729,"language":71,"meta":72,"style":72},"python3 --version\npython3 -m pip --version\n",[33,731,732,738],{"__ignoreMap":72},[76,733,734,736],{"class":78,"line":79},[76,735,124],{"class":82},[76,737,599],{"class":93},[76,739,740,742,744,746],{"class":78,"line":90},[76,741,124],{"class":82},[76,743,628],{"class":93},[76,745,631],{"class":86},[76,747,599],{"class":93},[10,749,750,751,753],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,752,124],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,755,757],{"id":756},"linux-安装","Linux 安装",[10,759,760],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[326,762,764],{"id":763},"_1-检查是否已经安装","1. 检查是否已经安装",[10,766,767],{},"打开终端，执行：",[67,769,770],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,771,772,778],{"__ignoreMap":72},[76,773,774,776],{"class":78,"line":79},[76,775,124],{"class":82},[76,777,599],{"class":93},[76,779,780,782,784,786],{"class":78,"line":90},[76,781,124],{"class":82},[76,783,628],{"class":93},[76,785,631],{"class":86},[76,787,599],{"class":93},[10,789,790],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[326,792,794],{"id":793},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,796,797],{},"Ubuntu 或 Debian：",[67,799,801],{"className":69,"code":800,"language":71,"meta":72,"style":72},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,802,803,814],{"__ignoreMap":72},[76,804,805,808,811],{"class":78,"line":79},[76,806,807],{"class":82},"sudo",[76,809,810],{"class":86}," apt",[76,812,813],{"class":86}," update\n",[76,815,816,818,820,823,826,829],{"class":78,"line":90},[76,817,807],{"class":82},[76,819,810],{"class":86},[76,821,822],{"class":86}," install",[76,824,825],{"class":86}," python3",[76,827,828],{"class":86}," python3-pip",[76,830,831],{"class":86}," python3-venv\n",[10,833,834],{},"Fedora：",[67,836,838],{"className":69,"code":837,"language":71,"meta":72,"style":72},"sudo dnf install python3 python3-pip\n",[33,839,840],{"__ignoreMap":72},[76,841,842,844,847,849,851],{"class":78,"line":79},[76,843,807],{"class":82},[76,845,846],{"class":86}," dnf",[76,848,822],{"class":86},[76,850,825],{"class":86},[76,852,853],{"class":86}," python3-pip\n",[10,855,856],{},"Arch Linux：",[67,858,860],{"className":69,"code":859,"language":71,"meta":72,"style":72},"sudo pacman -S python python-pip\n",[33,861,862],{"__ignoreMap":72},[76,863,864,866,869,872,875],{"class":78,"line":79},[76,865,807],{"class":82},[76,867,868],{"class":86}," pacman",[76,870,871],{"class":93}," -S",[76,873,874],{"class":86}," python",[76,876,877],{"class":86}," python-pip\n",[10,879,880,882],{},[33,881,807],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[326,884,886],{"id":885},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,888,889],{},"安装结束后执行：",[67,891,892],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,893,894,900],{"__ignoreMap":72},[76,895,896,898],{"class":78,"line":79},[76,897,124],{"class":82},[76,899,599],{"class":93},[76,901,902,904,906,908],{"class":78,"line":90},[76,903,124],{"class":82},[76,905,628],{"class":93},[76,907,631],{"class":86},[76,909,599],{"class":93},[10,911,912],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,914,915],{"id":915},"常见问题",[326,917,919],{"id":918},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,921,922,923,926],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,924,925],{},"python --version","。如果仍然失败，按下面的顺序检查：",[145,928,929,935,938],{},[44,930,931,932,934],{},"执行 ",[33,933,642],{},"，确认 Python Launcher 是否可用。",[44,936,937],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[44,939,940],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,942,943],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[326,945,947],{"id":946},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,949,950],{},"先尝试：",[67,952,953],{"className":69,"code":678,"language":71,"meta":72,"style":72},[33,954,955],{"__ignoreMap":72},[76,956,957,959],{"class":78,"line":79},[76,958,124],{"class":82},[76,960,599],{"class":93},[10,962,963,964,966,967,969,970,180],{},"在这两个系统中，只有 ",[33,965,124],{}," 命令而没有 ",[33,968,408],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,971,124],{},[326,973,975],{"id":974},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,977,978],{},"先使用模块方式检查：",[67,980,982],{"className":69,"code":981,"language":71,"meta":72,"style":72},"python3 -m pip --version\n",[33,983,984],{"__ignoreMap":72},[76,985,986,988,990,992],{"class":78,"line":79},[76,987,124],{"class":82},[76,989,628],{"class":93},[76,991,631],{"class":86},[76,993,599],{"class":93},[10,995,996,997,999,1000,1002,1003,1005,1006,1009],{},"Windows 用户将命令中的 ",[33,998,124],{}," 换成 ",[33,1001,408],{}," 或 ",[33,1004,507],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1007,1008],{},"python3-pip","；不要直接使用其他系统的安装命令。",[209,1011,1012],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":72,"searchDepth":90,"depth":90,"links":1014},[1015,1016,1017,1022,1027,1032],{"id":246,"depth":90,"text":246},{"id":262,"depth":90,"text":262},{"id":323,"depth":90,"text":324,"children":1018},[1019,1020,1021],{"id":328,"depth":99,"text":329},{"id":388,"depth":99,"text":389},{"id":575,"depth":99,"text":576},{"id":667,"depth":90,"text":668,"children":1023},[1024,1025,1026],{"id":671,"depth":99,"text":672},{"id":696,"depth":99,"text":697},{"id":722,"depth":99,"text":723},{"id":756,"depth":90,"text":757,"children":1028},[1029,1030,1031],{"id":763,"depth":99,"text":764},{"id":793,"depth":99,"text":794},{"id":885,"depth":99,"text":886},{"id":915,"depth":90,"text":915,"children":1033},[1034,1035,1036],{"id":918,"depth":99,"text":919},{"id":946,"depth":99,"text":947},{"id":974,"depth":99,"text":975},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":241,"description":72},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[222,1045,1046],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1049,"title":1050,"body":1051,"category":222,"cover":1058,"description":72,"extension":224,"meta":1374,"navigation":226,"path":1375,"pinned":228,"publishedAt":1376,"seo":1377,"slug":1378,"stem":1379,"summary":1380,"tags":1381,"updatedAt":1376,"visible":226,"__hash__":1384},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1052,"toc":1359},[1053,1059,1062,1065,1069,1072,1097,1100,1106,1109,1112,1147,1156,1160,1167,1170,1195,1198,1209,1212,1216,1219,1222,1225,1228,1231,1234,1237,1261,1264,1267,1273,1276,1279,1282,1286,1292,1295,1321,1324,1328,1331,1334,1338,1341,1344,1347,1350,1353,1356],[10,1054,1055],{},[26,1056],{"alt":1057,"src":1058},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1060,1061],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1063,1064],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1066,1068],{"id":1067},"python-代码是什么样的","Python 代码是什么样的",[10,1070,1071],{},"下面是一段简单的 Python 代码：",[67,1073,1075],{"className":406,"code":1074,"language":408,"meta":72,"style":72},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1076,1077,1082,1087,1092],{"__ignoreMap":72},[76,1078,1079],{"class":78,"line":79},[76,1080,1081],{},"name = \"Python\"\n",[76,1083,1084],{"class":78,"line":90},[76,1085,1086],{},"year = 2026\n",[76,1088,1089],{"class":78,"line":99},[76,1090,1091],{"emptyLinePlaceholder":226},"\n",[76,1093,1094],{"class":78,"line":105},[76,1095,1096],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1098,1099],{},"运行结果：",[67,1101,1104],{"className":1102,"code":1103,"language":135,"meta":72},[133],"正在学习 Python，当前年份是 2026\n",[33,1105,1103],{"__ignoreMap":72},[10,1107,1108],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1110,1111],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[67,1113,1115],{"className":406,"code":1114,"language":408,"meta":72,"style":72},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1116,1117,1122,1126,1131,1136,1141],{"__ignoreMap":72},[76,1118,1119],{"class":78,"line":79},[76,1120,1121],{},"score = 85\n",[76,1123,1124],{"class":78,"line":90},[76,1125,1091],{"emptyLinePlaceholder":226},[76,1127,1128],{"class":78,"line":99},[76,1129,1130],{},"if score >= 60:\n",[76,1132,1133],{"class":78,"line":105},[76,1134,1135],{},"    print(\"成绩合格\")\n",[76,1137,1138],{"class":78,"line":121},[76,1139,1140],{},"else:\n",[76,1142,1144],{"class":78,"line":1143},6,[76,1145,1146],{},"    print(\"需要继续学习\")\n",[10,1148,1149,177,1152,1155],{},[33,1150,1151],{},"if",[33,1153,1154],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1157,1159],{"id":1158},"python-如何运行代码","Python 如何运行代码",[10,1161,1162,1163,1166],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1164,1165],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1168,1169],{},"交互式环境适合快速验证一个表达式：",[67,1171,1173],{"className":406,"code":1172,"language":408,"meta":72,"style":72},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1174,1175,1180,1185,1190],{"__ignoreMap":72},[76,1176,1177],{"class":78,"line":79},[76,1178,1179],{},">>> 10 + 20\n",[76,1181,1182],{"class":78,"line":90},[76,1183,1184],{},"30\n",[76,1186,1187],{"class":78,"line":99},[76,1188,1189],{},">>> \"Python\".lower()\n",[76,1191,1192],{"class":78,"line":105},[76,1193,1194],{},"'python'\n",[10,1196,1197],{},"需要保存和重复运行的程序，则可以写入文件：",[67,1199,1201],{"className":69,"code":1200,"language":71,"meta":72,"style":72},"python3 hello.py\n",[33,1202,1203],{"__ignoreMap":72},[76,1204,1205,1207],{"class":78,"line":79},[76,1206,124],{"class":82},[76,1208,118],{"class":86},[10,1210,1211],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1213,1215],{"id":1214},"python-的特点","Python 的特点",[326,1217,1218],{"id":1218},"语法相对简洁",[10,1220,1221],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[326,1223,1224],{"id":1224},"支持多种编程方式",[10,1226,1227],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[326,1229,1230],{"id":1230},"标准库比较完整",[10,1232,1233],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1235,1236],{},"例如，获取当前时间：",[67,1238,1240],{"className":406,"code":1239,"language":408,"meta":72,"style":72},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1241,1242,1247,1251,1256],{"__ignoreMap":72},[76,1243,1244],{"class":78,"line":79},[76,1245,1246],{},"from datetime import datetime\n",[76,1248,1249],{"class":78,"line":90},[76,1250,1091],{"emptyLinePlaceholder":226},[76,1252,1253],{"class":78,"line":99},[76,1254,1255],{},"now = datetime.now()\n",[76,1257,1258],{"class":78,"line":105},[76,1259,1260],{},"print(now)\n",[10,1262,1263],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[326,1265,1266],{"id":1266},"第三方工具丰富",[10,1268,1269,1270,1272],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1271,258],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1274,1275],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[326,1277,1278],{"id":1278},"支持多个操作系统",[10,1280,1281],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1283,1285],{"id":1284},"python-可以做什么","Python 可以做什么",[10,1287,1288],{},[26,1289],{"alt":1290,"src":1291},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1293,1294],{},"Python 的应用范围比较广，常见方向包括：",[41,1296,1297,1300,1303,1306,1309,1312,1315,1318],{},[44,1298,1299],{},"编写自动化脚本，批量处理文件和重复任务；",[44,1301,1302],{},"开发网站后端和 API 服务；",[44,1304,1305],{},"进行数据清洗、统计分析和图表展示；",[44,1307,1308],{},"编写网络爬虫和信息采集工具；",[44,1310,1311],{},"开发自动化测试程序；",[44,1313,1314],{},"进行机器学习和人工智能开发；",[44,1316,1317],{},"编写运维、监控和辅助开发工具；",[44,1319,1320],{},"开发部分桌面应用和插件。",[10,1322,1323],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1325,1327],{"id":1326},"python-的发展","Python 的发展",[10,1329,1330],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1332,1333],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1335,1337],{"id":1336},"python-也有局限","Python 也有局限",[10,1339,1340],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1342,1343],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1345,1346],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1348,1349],{"id":1349},"写在最后",[10,1351,1352],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1354,1355],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[209,1357,1358],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":72,"searchDepth":90,"depth":90,"links":1360},[1361,1362,1363,1370,1371,1372,1373],{"id":1067,"depth":90,"text":1068},{"id":1158,"depth":90,"text":1159},{"id":1214,"depth":90,"text":1215,"children":1364},[1365,1366,1367,1368,1369],{"id":1218,"depth":99,"text":1218},{"id":1224,"depth":99,"text":1224},{"id":1230,"depth":99,"text":1230},{"id":1266,"depth":99,"text":1266},{"id":1278,"depth":99,"text":1278},{"id":1284,"depth":90,"text":1285},{"id":1326,"depth":90,"text":1327},{"id":1336,"depth":90,"text":1337},{"id":1349,"depth":90,"text":1349},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1050,"description":72},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[222,1382,1383],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1386,"title":1387,"body":1388,"category":222,"cover":223,"description":1392,"extension":224,"meta":1512,"navigation":226,"path":1513,"pinned":228,"publishedAt":229,"seo":1514,"slug":1515,"stem":1516,"summary":1517,"tags":1518,"updatedAt":229,"visible":226,"__hash__":1520},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1389,"toc":1502},[1390,1393,1395,1398,1400,1406,1411,1413,1427,1429,1432,1441,1443,1449,1451,1453,1469,1471,1482,1484,1492,1494,1496,1499],[10,1391,1392],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1394,16],{"id":16},[10,1396,1397],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1399,22],{"id":22},[10,1401,1402],{},[26,1403],{"alt":1404,"src":1405},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1407,1408,1410],{},[33,1409,1165],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1412,39],{"id":39},[41,1414,1415,1421,1424],{},[44,1416,1417,1418,1420],{},"源代码是人编写的文本，通常保存在 ",[33,1419,1165],{}," 文件中。",[44,1422,1423],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[44,1425,1426],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1428,62],{"id":62},[10,1430,1431],{},"把下面代码保存到本课脚本并运行：",[67,1433,1435],{"className":406,"code":1434,"language":408,"meta":72,"style":72},"print(\"你好，Python\")\n",[33,1436,1437],{"__ignoreMap":72},[76,1438,1439],{"class":78,"line":79},[76,1440,1434],{},[10,1442,129],{},[67,1444,1447],{"className":1445,"code":1446,"language":135,"meta":72},[133],"你好，Python\n",[33,1448,1446],{"__ignoreMap":72},[10,1450,140],{},[14,1452,143],{"id":143},[145,1454,1455,1462],{},[44,1456,1457,1458,1461],{},"终端启动解释器后，解释器读取 ",[33,1459,1460],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[44,1463,1464,1465,1468],{},"字符串对象先准备好，再交给 ",[33,1466,1467],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1470,169],{"id":169},[41,1472,1473,1476],{},[44,1474,1475],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[44,1477,1478,1479,1481],{},"认为 ",[33,1480,1165],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1483,186],{"id":186},[145,1485,1486,1489],{},[44,1487,1488],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[44,1490,1491],{},"把示例文字改成自己的学习目标并重新运行。",[10,1493,201],{},[14,1495,204],{"id":204},[10,1497,1498],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1500,1501],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":72,"searchDepth":90,"depth":90,"links":1503},[1504,1505,1506,1507,1508,1509,1510,1511],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1387,"description":1392},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[222,1382,1519],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1522,"title":1523,"body":1524,"category":222,"cover":223,"description":1528,"extension":224,"meta":1663,"navigation":226,"path":1664,"pinned":228,"publishedAt":229,"seo":1665,"slug":1666,"stem":1667,"summary":1668,"tags":1669,"updatedAt":229,"visible":226,"__hash__":1671},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1525,"toc":1653},[1526,1529,1531,1534,1536,1542,1548,1550,1565,1567,1569,1589,1591,1597,1599,1601,1614,1616,1630,1632,1643,1645,1647,1650],[10,1527,1528],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1530,16],{"id":16},[10,1532,1533],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1535,22],{"id":22},[10,1537,1538],{},[26,1539],{"alt":1540,"src":1541},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1543,1544,1545,1547],{},"终端收到 ",[33,1546,124],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1549,39],{"id":39},[41,1551,1552,1555,1558],{},[44,1553,1554],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[44,1556,1557],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[44,1559,1560,1561,1564],{},"检查 pip 时使用 ",[33,1562,1563],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1566,62],{"id":62},[10,1568,65],{},[67,1570,1571],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,1572,1573,1579],{"__ignoreMap":72},[76,1574,1575,1577],{"class":78,"line":79},[76,1576,124],{"class":82},[76,1578,599],{"class":93},[76,1580,1581,1583,1585,1587],{"class":78,"line":90},[76,1582,124],{"class":82},[76,1584,628],{"class":93},[76,1586,631],{"class":86},[76,1588,599],{"class":93},[10,1590,129],{},[67,1592,1595],{"className":1593,"code":1594,"language":135,"meta":72},[133],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1596,1594],{"__ignoreMap":72},[10,1598,140],{},[14,1600,143],{"id":143},[145,1602,1603,1609],{},[44,1604,1605,1608],{},[33,1606,1607],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[44,1610,1611,1613],{},[33,1612,692],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1615,169],{"id":169},[41,1617,1618,1624],{},[44,1619,1620,1621,1623],{},"看到系统已有 ",[33,1622,124],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[44,1625,1626,1627,1629],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1628,124],{},"，不修改系统自带工具。",[14,1631,186],{"id":186},[145,1633,1634,1640],{},[44,1635,931,1636,1639],{},[33,1637,1638],{},"which python3","，记录当前解释器路径。",[44,1641,1642],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1644,201],{},[14,1646,204],{"id":204},[10,1648,1649],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1651,1652],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":72,"searchDepth":90,"depth":90,"links":1654},[1655,1656,1657,1658,1659,1660,1661,1662],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1523,"description":1528},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[222,1670,1045],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1673,"title":1674,"body":1675,"category":222,"cover":223,"description":1840,"extension":224,"meta":1841,"navigation":226,"path":1842,"pinned":228,"publishedAt":229,"seo":1843,"slug":1844,"stem":1845,"summary":1846,"tags":1847,"updatedAt":229,"visible":226,"__hash__":1850},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1676,"toc":1830},[1677,1683,1685,1688,1690,1696,1699,1701,1725,1727,1729,1756,1758,1764,1766,1768,1786,1788,1802,1804,1818,1820,1822,1828],[10,1678,1679,1680,1682],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1681,1165],{}," 脚本。",[14,1684,16],{"id":16},[10,1686,1687],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1689,22],{"id":22},[10,1691,1692],{},[26,1693],{"alt":1694,"src":1695},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1697,1698],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1700,39],{"id":39},[41,1702,1703,1712,1719],{},[44,1704,1705,1706,1708,1709,180],{},"在终端输入 ",[33,1707,124],{}," 进入 REPL，提示符通常是 ",[33,1710,1711],{},">>>",[44,1713,1714,1715,1718],{},"输入 ",[33,1716,1717],{},"exit()"," 或按 Control-D 退出 REPL。",[44,1720,1721,1722,1724],{},"需要保存、复查或多次运行的代码应写入 ",[33,1723,1165],{}," 文件。",[14,1726,62],{"id":62},[10,1728,1431],{},[67,1730,1734],{"className":1731,"code":1732,"language":1733,"meta":72,"style":72},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1735,1736,1741,1746,1751],{"__ignoreMap":72},[76,1737,1738],{"class":78,"line":79},[76,1739,1740],{},">>> 2 + 3\n",[76,1742,1743],{"class":78,"line":90},[76,1744,1745],{},"5\n",[76,1747,1748],{"class":78,"line":99},[76,1749,1750],{},">>> \"python\".upper()\n",[76,1752,1753],{"class":78,"line":105},[76,1754,1755],{},"'PYTHON'\n",[10,1757,129],{},[67,1759,1762],{"className":1760,"code":1761,"language":135,"meta":72},[133],"REPL 会直接显示表达式结果\n",[33,1763,1761],{"__ignoreMap":72},[10,1765,140],{},[14,1767,143],{"id":143},[145,1769,1770,1780],{},[44,1771,1772,1773,1776,1777,180],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1774,1775],{},"2 + 3"," 能直接看到 ",[33,1778,1779],{},"5",[44,1781,1782,1783,1785],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1784,1467],{}," 才会写到标准输出。",[14,1787,169],{"id":169},[41,1789,1790,1799],{},[44,1791,1792,1793,1795,1796,1798],{},"把提示符 ",[33,1794,1711],{}," 复制进 ",[33,1797,1165],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[44,1800,1801],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1803,186],{"id":186},[145,1805,1806,1812],{},[44,1807,1808,1809,180],{},"在 REPL 计算 ",[33,1810,1811],{},"12 * 8",[44,1813,1814,1815,1817],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1816,1467],{}," 时是否显示结果。",[10,1819,201],{},[14,1821,204],{"id":204},[10,1823,1824,1825,1827],{},"本篇目标是根据任务选择 REPL 或 ",[33,1826,1165],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,1829,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":1831},[1832,1833,1834,1835,1836,1837,1838,1839],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1674,"description":1840},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[222,1848,1849],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":4,"title":5,"body":1852,"category":222,"cover":223,"description":12,"extension":224,"meta":1991,"navigation":226,"path":227,"pinned":228,"publishedAt":229,"seo":1992,"slug":231,"stem":232,"summary":233,"tags":1993,"updatedAt":229,"visible":226,"__hash__":237},{"type":7,"value":1853,"toc":1981},[1854,1856,1858,1860,1862,1866,1870,1872,1884,1886,1888,1924,1926,1931,1933,1935,1951,1953,1963,1965,1973,1975,1977,1979],[10,1855,12],{},[14,1857,16],{"id":16},[10,1859,19],{},[14,1861,22],{"id":22},[10,1863,1864],{},[26,1865],{"alt":28,"src":29},[10,1867,1868,36],{},[33,1869,35],{},[14,1871,39],{"id":39},[41,1873,1874,1876,1882],{},[44,1875,46],{},[44,1877,1878,52,1880,56],{},[33,1879,51],{},[33,1881,55],{},[44,1883,59],{},[14,1885,62],{"id":62},[10,1887,65],{},[67,1889,1890],{"className":69,"code":70,"language":71,"meta":72,"style":72},[33,1891,1892,1898,1904,1908,1918],{"__ignoreMap":72},[76,1893,1894,1896],{"class":78,"line":79},[76,1895,83],{"class":82},[76,1897,87],{"class":86},[76,1899,1900,1902],{"class":78,"line":90},[76,1901,94],{"class":93},[76,1903,87],{"class":86},[76,1905,1906],{"class":78,"line":99},[76,1907,102],{"class":93},[76,1909,1910,1912,1914,1916],{"class":78,"line":105},[76,1911,108],{"class":93},[76,1913,111],{"class":86},[76,1915,115],{"class":114},[76,1917,118],{"class":86},[76,1919,1920,1922],{"class":78,"line":121},[76,1921,124],{"class":82},[76,1923,118],{"class":86},[10,1925,129],{},[67,1927,1929],{"className":1928,"code":134,"language":135,"meta":72},[133],[33,1930,134],{"__ignoreMap":72},[10,1932,140],{},[14,1934,143],{"id":143},[145,1936,1937,1945],{},[44,1938,1939,151,1941,154,1943,157],{},[33,1940,83],{},[33,1942,94],{},[33,1944,51],{},[44,1946,1947,162,1949,166],{},[33,1948,35],{},[33,1950,165],{},[14,1952,169],{"id":169},[41,1954,1955,1961],{},[44,1956,174,1957,177,1959,180],{},[33,1958,51],{},[33,1960,55],{},[44,1962,183],{},[14,1964,186],{"id":186},[145,1966,1967,1971],{},[44,1968,191,1969,195],{},[33,1970,194],{},[44,1972,198],{},[10,1974,201],{},[14,1976,204],{"id":204},[10,1978,207],{},[209,1980,211],{},{"title":72,"searchDepth":90,"depth":90,"links":1982},[1983,1984,1985,1986,1987,1988,1989,1990],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5,"description":12},[222,235,236],{"id":1995,"title":1996,"body":1997,"category":222,"cover":223,"description":2001,"extension":224,"meta":2149,"navigation":226,"path":2150,"pinned":228,"publishedAt":229,"seo":2151,"slug":2152,"stem":2153,"summary":2154,"tags":2155,"updatedAt":229,"visible":226,"__hash__":2158},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":1998,"toc":2139},[1999,2002,2004,2007,2009,2015,2026,2028,2048,2050,2052,2072,2074,2080,2082,2084,2103,2105,2113,2115,2130,2132,2134,2137],[10,2000,2001],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2003,16],{"id":16},[10,2005,2006],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2008,22],{"id":22},[10,2010,2011],{},[26,2012],{"alt":2013,"src":2014},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2016,2017,2018,180,2020,2023,2024,180],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2019,1467],{},[33,2021,2022],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2025,1775],{},[14,2027,39],{"id":39},[41,2029,2030,2036,2045],{},[44,2031,2032,2035],{},[33,2033,2034],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[44,2037,2038,2041,2042,180],{},[33,2039,2040],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2043,2044],{},"12",[44,2046,2047],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2049,62],{"id":62},[10,2051,1431],{},[67,2053,2055],{"className":406,"code":2054,"language":408,"meta":72,"style":72},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2056,2057,2062,2067],{"__ignoreMap":72},[76,2058,2059],{"class":78,"line":79},[76,2060,2061],{},"print(42)\n",[76,2063,2064],{"class":78,"line":90},[76,2065,2066],{},"print(7 + 5)\n",[76,2068,2069],{"class":78,"line":99},[76,2070,2071],{},"print(\"Python 基础课\")\n",[10,2073,129],{},[67,2075,2078],{"className":2076,"code":2077,"language":135,"meta":72},[133],"42\n12\nPython 基础课\n",[33,2079,2077],{"__ignoreMap":72},[10,2081,140],{},[14,2083,143],{"id":143},[145,2085,2086,2094],{},[44,2087,2088,2091,2092,180],{},[33,2089,2090],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2093,2044],{},[44,2095,2096,2098,2099,2102],{},[33,2097,1467],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2100,2101],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2104,169],{"id":169},[41,2106,2107,2110],{},[44,2108,2109],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[44,2111,2112],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2114,186],{"id":186},[145,2116,2117,2120],{},[44,2118,2119],{},"分别输出一个整数、一个小数和一段文本。",[44,2121,2122,2123,2125,2126,2129],{},"比较 ",[33,2124,2022],{}," 与 ",[33,2127,2128],{},"print(\"2 + 3\")"," 的结果。",[10,2131,201],{},[14,2133,204],{"id":204},[10,2135,2136],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2138,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":2140},[2141,2142,2143,2144,2145,2146,2147,2148],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":1996,"description":2001},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[222,2156,2157],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2160,"title":2161,"body":2162,"category":222,"cover":223,"description":2166,"extension":224,"meta":2333,"navigation":226,"path":2334,"pinned":228,"publishedAt":229,"seo":2335,"slug":2336,"stem":2337,"summary":2338,"tags":2339,"updatedAt":229,"visible":226,"__hash__":2342},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2163,"toc":2323},[2164,2167,2169,2172,2174,2180,2183,2185,2211,2213,2215,2243,2245,2251,2253,2255,2279,2281,2297,2299,2314,2316,2318,2321],[10,2165,2166],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2168,16],{"id":16},[10,2170,2171],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2173,22],{"id":22},[10,2175,2176],{},[26,2177],{"alt":2178,"src":2179},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2181,2182],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2184,39],{"id":39},[41,2186,2187,2190,2200],{},[44,2188,2189],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[44,2191,2192,2193,2125,2196,2199],{},"变量名区分大小写，",[33,2194,2195],{},"score",[33,2197,2198],{},"Score"," 是两个名字。",[44,2201,2202,2203,2206,2207,2210],{},"使用能表达含义的名称；不要用 ",[33,2204,2205],{},"list","、",[33,2208,2209],{},"str"," 等内置名称作为普通变量名。",[14,2212,62],{"id":62},[10,2214,1431],{},[67,2216,2218],{"className":406,"code":2217,"language":408,"meta":72,"style":72},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2219,2220,2225,2230,2234,2239],{"__ignoreMap":72},[76,2221,2222],{"class":78,"line":79},[76,2223,2224],{},"score = 90\n",[76,2226,2227],{"class":78,"line":90},[76,2228,2229],{},"print(score)\n",[76,2231,2232],{"class":78,"line":99},[76,2233,1091],{"emptyLinePlaceholder":226},[76,2235,2236],{"class":78,"line":105},[76,2237,2238],{},"score = 95\n",[76,2240,2241],{"class":78,"line":121},[76,2242,2229],{},[10,2244,129],{},[67,2246,2249],{"className":2247,"code":2248,"language":135,"meta":72},[133],"90\n95\n",[33,2250,2248],{"__ignoreMap":72},[10,2252,140],{},[14,2254,143],{"id":143},[145,2256,2257,2266],{},[44,2258,931,2259,2262,2263,2265],{},[33,2260,2261],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2264,2195],{}," 再绑定到它。",[44,2267,931,2268,2271,2272,2275,2276,180],{},[33,2269,2270],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2273,2274],{},"90"," 没有被改造成 ",[33,2277,2278],{},"95",[14,2280,169],{"id":169},[41,2282,2283,2286],{},[44,2284,2285],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[44,2287,2288,2289,2206,2291,2206,2293,2296],{},"使用 ",[33,2290,2205],{},[33,2292,2209],{},[33,2294,2295],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2298,186],{"id":186},[145,2300,2301,2311],{},[44,2302,2303,2304,177,2307,2310],{},"创建 ",[33,2305,2306],{},"course_name",[33,2308,2309],{},"lesson_count"," 两个变量并输出。",[44,2312,2313],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2315,201],{},[14,2317,204],{"id":204},[10,2319,2320],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2322,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":2324},[2325,2326,2327,2328,2329,2330,2331,2332],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2161,"description":2166},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[222,2340,2341],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2344,"title":2345,"body":2346,"category":222,"cover":223,"description":2350,"extension":224,"meta":2516,"navigation":226,"path":2517,"pinned":228,"publishedAt":229,"seo":2518,"slug":2519,"stem":2520,"summary":2521,"tags":2522,"updatedAt":229,"visible":226,"__hash__":2525},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2347,"toc":2506},[2348,2351,2353,2356,2358,2364,2367,2369,2398,2400,2402,2448,2450,2456,2458,2460,2474,2476,2487,2489,2497,2499,2501,2504],[10,2349,2350],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2352,16],{"id":16},[10,2354,2355],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2357,22],{"id":22},[10,2359,2360],{},[26,2361],{"alt":2362,"src":2363},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2365,2366],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2368,39],{"id":39},[41,2370,2371,2381,2395],{},[44,2372,2373,2376,2377,2380],{},[33,2374,2375],{},"int"," 表示整数，",[33,2378,2379],{},"float"," 表示浮点数。",[44,2382,2383,2386,2387,2390,2391,2394],{},[33,2384,2385],{},"\u002F"," 总是进行真除法；",[33,2388,2389],{},"\u002F\u002F"," 是向下取整除法，",[33,2392,2393],{},"%"," 得到余数。",[44,2396,2397],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2399,62],{"id":62},[10,2401,1431],{},[67,2403,2405],{"className":406,"code":2404,"language":408,"meta":72,"style":72},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2406,2407,2412,2417,2422,2426,2431,2436,2442],{"__ignoreMap":72},[76,2408,2409],{"class":78,"line":79},[76,2410,2411],{},"price = 25\n",[76,2413,2414],{"class":78,"line":90},[76,2415,2416],{},"count = 4\n",[76,2418,2419],{"class":78,"line":99},[76,2420,2421],{},"discount = 0.9\n",[76,2423,2424],{"class":78,"line":105},[76,2425,1091],{"emptyLinePlaceholder":226},[76,2427,2428],{"class":78,"line":121},[76,2429,2430],{},"total = price * count * discount\n",[76,2432,2433],{"class":78,"line":1143},[76,2434,2435],{},"average = total \u002F count\n",[76,2437,2439],{"class":78,"line":2438},7,[76,2440,2441],{},"print(total)\n",[76,2443,2445],{"class":78,"line":2444},8,[76,2446,2447],{},"print(average)\n",[10,2449,129],{},[67,2451,2454],{"className":2452,"code":2453,"language":135,"meta":72},[133],"90.0\n22.5\n",[33,2455,2453],{"__ignoreMap":72},[10,2457,140],{},[14,2459,143],{"id":143},[145,2461,2462,2468],{},[44,2463,2464,2467],{},[33,2465,2466],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[44,2469,2470,2473],{},[33,2471,2472],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2475,169],{"id":169},[41,2477,2478,2484],{},[44,2479,2480,2481,180],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2482,2483],{},"decimal.Decimal",[44,2485,2486],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2488,186],{"id":186},[145,2490,2491,2494],{},[44,2492,2493],{},"计算 137 除以 10 的商和余数。",[44,2495,2496],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2498,201],{},[14,2500,204],{"id":204},[10,2502,2503],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2505,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":2507},[2508,2509,2510,2511,2512,2513,2514,2515],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2345,"description":2350},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[222,2523,2524],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2527,"title":2528,"body":2529,"category":222,"cover":223,"description":2533,"extension":224,"meta":2709,"navigation":226,"path":2710,"pinned":228,"publishedAt":229,"seo":2711,"slug":2712,"stem":2713,"summary":2714,"tags":2715,"updatedAt":229,"visible":226,"__hash__":2718},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2530,"toc":2697},[2531,2534,2536,2539,2541,2547,2557,2559,2570,2572,2574,2604,2606,2612,2614,2616,2646,2649,2652,2658,2661,2663,2671,2673,2688,2690,2692,2695],[10,2532,2533],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2535,16],{"id":16},[10,2537,2538],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2540,22],{"id":22},[10,2542,2543],{},[26,2544],{"alt":2545,"src":2546},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2548,2549,2550,2553,2554,180],{},"切片 ",[33,2551,2552],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2555,2556],{},"stop - start",[14,2558,39],{"id":39},[41,2560,2561,2564,2567],{},[44,2562,2563],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[44,2565,2566],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[44,2568,2569],{},"切片会创建新的字符串，不会修改原字符串。",[14,2571,62],{"id":62},[10,2573,1431],{},[67,2575,2577],{"className":406,"code":2576,"language":408,"meta":72,"style":72},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2578,2579,2584,2589,2594,2599],{"__ignoreMap":72},[76,2580,2581],{"class":78,"line":79},[76,2582,2583],{},"language = \"Python\"\n",[76,2585,2586],{"class":78,"line":90},[76,2587,2588],{},"print(language[0])\n",[76,2590,2591],{"class":78,"line":99},[76,2592,2593],{},"print(language[-1])\n",[76,2595,2596],{"class":78,"line":105},[76,2597,2598],{},"print(language[0:3])\n",[76,2600,2601],{"class":78,"line":121},[76,2602,2603],{},"print(language + \" 3.14\")\n",[10,2605,129],{},[67,2607,2610],{"className":2608,"code":2609,"language":135,"meta":72},[133],"P\nn\nPyt\nPython 3.14\n",[33,2611,2609],{"__ignoreMap":72},[10,2613,140],{},[14,2615,143],{"id":143},[145,2617,2618,2632],{},[44,2619,2620,2621,2623,2624,2627,2628,2631],{},"字符串 ",[33,2622,222],{}," 的正索引从 ",[33,2625,2626],{},"P"," 的 0 开始，负索引从末尾 ",[33,2629,2630],{},"n"," 的 -1 开始。",[44,2633,2634,2637,2638,2641,2642,2645],{},[33,2635,2636],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2639,2640],{},"Pyt","；索引 3 的 ",[33,2643,2644],{},"h"," 不在结果中。",[326,2647,2648],{"id":2648},"再看一个具体细节",[10,2650,2651],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2653,2654],{},[26,2655],{"alt":2656,"src":2657},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2659,2660],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2662,169],{"id":169},[41,2664,2665,2668],{},[44,2666,2667],{},"把第一个字符写成索引 1，造成整体偏移一位。",[44,2669,2670],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2672,186],{"id":186},[145,2674,2675,2685],{},[44,2676,2677,2678,2681,2682,180],{},"从 ",[33,2679,2680],{},"\"programming\""," 中切出 ",[33,2683,2684],{},"\"gram\"",[44,2686,2687],{},"使用负索引取得字符串倒数第二个字符。",[10,2689,201],{},[14,2691,204],{"id":204},[10,2693,2694],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2696,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":2698},[2699,2700,2701,2702,2703,2706,2707,2708],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":2704},[2705],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2528,"description":2533},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[222,2716,2717],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2720,"title":2721,"body":2722,"category":222,"cover":223,"description":2726,"extension":224,"meta":2940,"navigation":226,"path":2941,"pinned":228,"publishedAt":229,"seo":2942,"slug":2943,"stem":2944,"summary":2945,"tags":2946,"updatedAt":229,"visible":226,"__hash__":2949},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2723,"toc":2928},[2724,2727,2729,2732,2734,2740,2750,2752,2785,2787,2789,2833,2835,2841,2843,2845,2866,2868,2871,2877,2885,2887,2901,2903,2919,2921,2923,2926],[10,2725,2726],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2728,16],{"id":16},[10,2730,2731],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2733,22],{"id":22},[10,2735,2736],{},[26,2737],{"alt":2738,"src":2739},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2741,2742,2743,1002,2746,2749],{},"比较表达式先产生 ",[33,2744,2745],{},"True",[33,2747,2748],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2751,39],{"id":39},[41,2753,2754,2768,2782],{},[44,2755,2756,2759,2760,2763,2764,2767],{},[33,2757,2758],{},"=="," 判断是否相等，",[33,2761,2762],{},"!="," 判断是否不等；单个 ",[33,2765,2766],{},"="," 是赋值。",[44,2769,2770,2773,2774,2777,2778,2781],{},[33,2771,2772],{},"and"," 要求两侧都为真，",[33,2775,2776],{},"or"," 只需一侧为真，",[33,2779,2780],{},"not"," 取反。",[44,2783,2784],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2786,62],{"id":62},[10,2788,1431],{},[67,2790,2792],{"className":406,"code":2791,"language":408,"meta":72,"style":72},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[33,2793,2794,2799,2804,2808,2813,2818,2823,2828],{"__ignoreMap":72},[76,2795,2796],{"class":78,"line":79},[76,2797,2798],{},"age = 20\n",[76,2800,2801],{"class":78,"line":90},[76,2802,2803],{},"has_ticket = True\n",[76,2805,2806],{"class":78,"line":99},[76,2807,1091],{"emptyLinePlaceholder":226},[76,2809,2810],{"class":78,"line":105},[76,2811,2812],{},"is_adult = age >= 18\n",[76,2814,2815],{"class":78,"line":121},[76,2816,2817],{},"can_enter = is_adult and has_ticket\n",[76,2819,2820],{"class":78,"line":1143},[76,2821,2822],{},"print(is_adult)\n",[76,2824,2825],{"class":78,"line":2438},[76,2826,2827],{},"print(can_enter)\n",[76,2829,2830],{"class":78,"line":2444},[76,2831,2832],{},"print(not has_ticket)\n",[10,2834,129],{},[67,2836,2839],{"className":2837,"code":2838,"language":135,"meta":72},[133],"True\nTrue\nFalse\n",[33,2840,2838],{"__ignoreMap":72},[10,2842,140],{},[14,2844,143],{"id":143},[145,2846,2847,2857],{},[44,2848,2849,2852,2853,2856],{},[33,2850,2851],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2854,2855],{},"is_adult","，这一步没有任何分支跳转。",[44,2858,2859,2862,2863,2865],{},[33,2860,2861],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2864,2780],{}," 只对紧随其后的值取反。",[326,2867,2648],{"id":2648},[10,2869,2870],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2872,2873],{},[26,2874],{"alt":2875,"src":2876},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2878,2879,2881,2882,2884],{},[33,2880,2772],{}," 只有“真、真”得到真；",[33,2883,2776],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2886,169],{"id":169},[41,2888,2889,2898],{},[44,2890,2891,2892,2894,2895,2897],{},"用单个等号判断相等。",[33,2893,2766],{}," 是赋值，",[33,2896,2758],{}," 才是相等比较。",[44,2899,2900],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2902,186],{"id":186},[145,2904,2905,2912],{},[44,2906,2907,2908,2911],{},"判断数字 ",[33,2909,2910],{},"15"," 是否同时大于 10 且小于 20。",[44,2913,2914,2915,2918],{},"分别修改年龄和票据状态，记录 ",[33,2916,2917],{},"can_enter"," 的四种组合结果。",[10,2920,201],{},[14,2922,204],{"id":204},[10,2924,2925],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,2927,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":2929},[2930,2931,2932,2933,2934,2937,2938,2939],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":2935},[2936],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2721,"description":2726},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[222,2947,2948],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2951,"title":2952,"body":2953,"category":222,"cover":223,"description":2957,"extension":224,"meta":3125,"navigation":226,"path":3126,"pinned":228,"publishedAt":229,"seo":3127,"slug":3128,"stem":3129,"summary":3130,"tags":3131,"updatedAt":229,"visible":226,"__hash__":3133},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2954,"toc":3115},[2955,2958,2960,2963,2965,2971,2989,2991,3004,3006,3008,3042,3044,3050,3052,3054,3076,3078,3090,3092,3106,3108,3110,3113],[10,2956,2957],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2959,16],{"id":16},[10,2961,2962],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2964,22],{"id":22},[10,2966,2967],{},[26,2968],{"alt":2969,"src":2970},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2972,2973,2976,2977,2980,2981,2984,2985,2988],{},[33,2974,2975],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,2978,2979],{},"18","，程序首先得到的也是 ",[33,2982,2983],{},"\"18\"","，需要 ",[33,2986,2987],{},"int()"," 后才能按整数参与计算。",[14,2990,39],{"id":39},[41,2992,2993,2996,3001],{},[44,2994,2995],{},"提示文字应告诉用户需要输入什么。",[44,2997,2998,3000],{},[33,2999,2987],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[44,3002,3003],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3005,62],{"id":62},[10,3007,1431],{},[67,3009,3011],{"className":406,"code":3010,"language":408,"meta":72,"style":72},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3012,3013,3018,3023,3028,3032,3037],{"__ignoreMap":72},[76,3014,3015],{"class":78,"line":79},[76,3016,3017],{},"name = input(\"请输入姓名：\")\n",[76,3019,3020],{"class":78,"line":90},[76,3021,3022],{},"age_text = input(\"请输入年龄：\")\n",[76,3024,3025],{"class":78,"line":99},[76,3026,3027],{},"age = int(age_text)\n",[76,3029,3030],{"class":78,"line":105},[76,3031,1091],{"emptyLinePlaceholder":226},[76,3033,3034],{"class":78,"line":121},[76,3035,3036],{},"print(\"你好，\" + name)\n",[76,3038,3039],{"class":78,"line":1143},[76,3040,3041],{},"print(age + 1)\n",[10,3043,129],{},[67,3045,3048],{"className":3046,"code":3047,"language":135,"meta":72},[133],"根据输入显示姓名，并输出下一年的年龄\n",[33,3049,3047],{"__ignoreMap":72},[10,3051,140],{},[14,3053,143],{"id":143},[145,3055,3056,3066],{},[44,3057,3058,3059,3061,3062,3065],{},"两次 ",[33,3060,2975],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3063,3064],{},"age_text"," 用来提醒这仍是文本。",[44,3067,3068,3071,3072,3075],{},[33,3069,3070],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3073,3074],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3077,169],{"id":169},[41,3079,3080,3087],{},[44,3081,3082,3083,3086],{},"直接计算 ",[33,3084,3085],{},"input(...) + 1","，忽略输入结果是字符串。",[44,3088,3089],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3091,186],{"id":186},[145,3093,3094,3097],{},[44,3095,3096],{},"接收两个整数并输出它们的和。",[44,3098,1714,3099,3102,3103,3105],{},[33,3100,3101],{},"18.5"," 给 ",[33,3104,2987],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3107,201],{},[14,3109,204],{"id":204},[10,3111,3112],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3114,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3116},[3117,3118,3119,3120,3121,3122,3123,3124],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2952,"description":2957},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[222,2295,3132],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3135,"title":3136,"body":3137,"category":222,"cover":223,"description":3141,"extension":224,"meta":3301,"navigation":226,"path":3302,"pinned":228,"publishedAt":229,"seo":3303,"slug":3304,"stem":3305,"summary":3306,"tags":3307,"updatedAt":229,"visible":226,"__hash__":3310},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3138,"toc":3291},[3139,3142,3144,3147,3149,3155,3162,3164,3178,3180,3182,3221,3223,3229,3231,3233,3252,3254,3269,3271,3282,3284,3286,3289],[10,3140,3141],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3143,16],{"id":16},[10,3145,3146],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3148,22],{"id":22},[10,3150,3151],{},[26,3152],{"alt":3153,"src":3154},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3156,3157,3158,3161],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3159,3160],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3163,39],{"id":39},[41,3165,3166,3169,3172],{},[44,3167,3168],{},"列表使用方括号，元素之间用逗号分隔。",[44,3170,3171],{},"列表可变，可以替换、追加和删除元素。",[44,3173,3174,3175,180],{},"访问不存在的索引会产生 ",[33,3176,3177],{},"IndexError",[14,3179,62],{"id":62},[10,3181,1431],{},[67,3183,3185],{"className":406,"code":3184,"language":408,"meta":72,"style":72},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3186,3187,3192,3197,3201,3206,3211,3216],{"__ignoreMap":72},[76,3188,3189],{"class":78,"line":79},[76,3190,3191],{},"scores = [82, 90, 76]\n",[76,3193,3194],{"class":78,"line":90},[76,3195,3196],{},"print(scores[0])\n",[76,3198,3199],{"class":78,"line":99},[76,3200,1091],{"emptyLinePlaceholder":226},[76,3202,3203],{"class":78,"line":105},[76,3204,3205],{},"scores[1] = 95\n",[76,3207,3208],{"class":78,"line":121},[76,3209,3210],{},"scores.append(88)\n",[76,3212,3213],{"class":78,"line":1143},[76,3214,3215],{},"print(scores)\n",[76,3217,3218],{"class":78,"line":2438},[76,3219,3220],{},"print(len(scores))\n",[10,3222,129],{},[67,3224,3227],{"className":3225,"code":3226,"language":135,"meta":72},[133],"82\n[82, 95, 76, 88]\n4\n",[33,3228,3226],{"__ignoreMap":72},[10,3230,140],{},[14,3232,143],{"id":143},[145,3234,3235,3238],{},[44,3236,3237],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[44,3239,3240,3243,3244,3247,3248,3251],{},[33,3241,3242],{},"scores[1] = 95"," 替换第二个位置，",[33,3245,3246],{},"append(88)"," 在末尾增加新位置，",[33,3249,3250],{},"len()"," 因而从 3 变为 4。",[14,3253,169],{"id":169},[41,3255,3256,3266],{},[44,3257,3258,3259,3262,3263,180],{},"访问 ",[33,3260,3261],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3264,3265],{},"len(scores) - 1",[44,3267,3268],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3270,186],{"id":186},[145,3272,3273,3276],{},[44,3274,3275],{},"建立三项学习任务列表，再追加第四项。",[44,3277,3278,3279,3281],{},"修改第二项，并用 ",[33,3280,3250],{}," 检查元素数量。",[10,3283,201],{},[14,3285,204],{"id":204},[10,3287,3288],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3290,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3292},[3293,3294,3295,3296,3297,3298,3299,3300],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3136,"description":3141},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[222,3308,3309],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3312,"title":3313,"body":3314,"category":222,"cover":223,"description":3318,"extension":224,"meta":3459,"navigation":226,"path":3460,"pinned":228,"publishedAt":229,"seo":3461,"slug":3462,"stem":3463,"summary":3464,"tags":3465,"updatedAt":229,"visible":226,"__hash__":3467},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3315,"toc":3449},[3316,3319,3321,3324,3326,3332,3335,3337,3348,3350,3352,3386,3388,3394,3396,3398,3412,3414,3426,3428,3440,3442,3444,3447],[10,3317,3318],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3320,16],{"id":16},[10,3322,3323],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3325,22],{"id":22},[10,3327,3328],{},[26,3329],{"alt":3330,"src":3331},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3333,3334],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3336,39],{"id":39},[41,3338,3339,3342,3345],{},[44,3340,3341],{},"元组常用来表达固定数量、固定含义的一组值。",[44,3343,3344],{},"只有一个元素的元组必须保留尾随逗号。",[44,3346,3347],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3349,62],{"id":62},[10,3351,1431],{},[67,3353,3355],{"className":406,"code":3354,"language":408,"meta":72,"style":72},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3356,3357,3362,3367,3372,3376,3381],{"__ignoreMap":72},[76,3358,3359],{"class":78,"line":79},[76,3360,3361],{},"point = (120, 80)\n",[76,3363,3364],{"class":78,"line":90},[76,3365,3366],{},"print(point[0])\n",[76,3368,3369],{"class":78,"line":99},[76,3370,3371],{},"print(point[1])\n",[76,3373,3374],{"class":78,"line":105},[76,3375,1091],{"emptyLinePlaceholder":226},[76,3377,3378],{"class":78,"line":121},[76,3379,3380],{},"single = (5,)\n",[76,3382,3383],{"class":78,"line":1143},[76,3384,3385],{},"print(single)\n",[10,3387,129],{},[67,3389,3392],{"className":3390,"code":3391,"language":135,"meta":72},[133],"120\n80\n(5,)\n",[33,3393,3391],{"__ignoreMap":72},[10,3395,140],{},[14,3397,143],{"id":143},[145,3399,3400,3406],{},[44,3401,3402,3405],{},[33,3403,3404],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[44,3407,3408,3411],{},[33,3409,3410],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3413,169],{"id":169},[41,3415,3416,3423],{},[44,3417,3418,3419,3422],{},"把 ",[33,3420,3421],{},"(5)"," 当作元组，实际它仍是整数。",[44,3424,3425],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3427,186],{"id":186},[145,3429,3430,3433],{},[44,3431,3432],{},"用元组表示宽度和高度。",[44,3434,2122,3435,2125,3437,3439],{},[33,3436,3421],{},[33,3438,3410],{}," 的类型。",[10,3441,201],{},[14,3443,204],{"id":204},[10,3445,3446],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3448,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3450},[3451,3452,3453,3454,3455,3456,3457,3458],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3313,"description":3318},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[222,3466,3309],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3469,"title":3470,"body":3471,"category":222,"cover":223,"description":3475,"extension":224,"meta":3630,"navigation":226,"path":3631,"pinned":228,"publishedAt":229,"seo":3632,"slug":3633,"stem":3634,"summary":3635,"tags":3636,"updatedAt":229,"visible":226,"__hash__":3638},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3472,"toc":3620},[3473,3476,3478,3481,3483,3489,3499,3501,3515,3517,3519,3553,3555,3561,3563,3565,3580,3582,3601,3603,3611,3613,3615,3618],[10,3474,3475],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3477,16],{"id":16},[10,3479,3480],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3482,22],{"id":22},[10,3484,3485],{},[26,3486],{"alt":3487,"src":3488},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3490,3491,3492,3495,3496,3498],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3493,3494],{},"student[\"score\"]"," 读取的是键 ",[33,3497,2195],{}," 对应的值，而不是“第几个元素”。",[14,3500,39],{"id":39},[41,3502,3503,3506,3512],{},[44,3504,3505],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[44,3507,2288,3508,3511],{},[33,3509,3510],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[44,3513,3514],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3516,62],{"id":62},[10,3518,1431],{},[67,3520,3522],{"className":406,"code":3521,"language":408,"meta":72,"style":72},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3523,3524,3529,3534,3538,3543,3548],{"__ignoreMap":72},[76,3525,3526],{"class":78,"line":79},[76,3527,3528],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[76,3530,3531],{"class":78,"line":90},[76,3532,3533],{},"print(student[\"name\"])\n",[76,3535,3536],{"class":78,"line":99},[76,3537,1091],{"emptyLinePlaceholder":226},[76,3539,3540],{"class":78,"line":105},[76,3541,3542],{},"student[\"score\"] = 95\n",[76,3544,3545],{"class":78,"line":121},[76,3546,3547],{},"student[\"city\"] = \"郑州\"\n",[76,3549,3550],{"class":78,"line":1143},[76,3551,3552],{},"print(student)\n",[10,3554,129],{},[67,3556,3559],{"className":3557,"code":3558,"language":135,"meta":72},[133],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3560,3558],{"__ignoreMap":72},[10,3562,140],{},[14,3564,143],{"id":143},[145,3566,3567,3570],{},[44,3568,3569],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[44,3571,3572,3573,3575,3576,3579],{},"给已有键 ",[33,3574,2195],{}," 赋值会更新映射，给新键 ",[33,3577,3578],{},"city"," 赋值会增加映射。",[14,3581,169],{"id":169},[41,3583,3584,3591],{},[44,3585,3586,3587,3590],{},"按位置理解字典并尝试 ",[33,3588,3589],{},"student[0]","，而实际键是字符串。",[44,3592,3593,3594,3597,3598,180],{},"直接读取不确定存在的键并忽略 ",[33,3595,3596],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3599,3600],{},"get()",[14,3602,186],{"id":186},[145,3604,3605,3608],{},[44,3606,3607],{},"建立一本书的标题、作者和页数字典。",[44,3609,3610],{},"添加分类键，再修改页数。",[10,3612,201],{},[14,3614,204],{"id":204},[10,3616,3617],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3619,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3621},[3622,3623,3624,3625,3626,3627,3628,3629],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3470,"description":3475},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[222,3637,3309],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3640,"title":3641,"body":3642,"category":222,"cover":223,"description":3646,"extension":224,"meta":3795,"navigation":226,"path":3796,"pinned":228,"publishedAt":229,"seo":3797,"slug":3798,"stem":3799,"summary":3800,"tags":3801,"updatedAt":229,"visible":226,"__hash__":3803},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3643,"toc":3785},[3644,3647,3649,3652,3654,3660,3663,3665,3684,3686,3688,3722,3724,3730,3732,3734,3749,3751,3763,3765,3776,3778,3780,3783],[10,3645,3646],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3648,16],{"id":16},[10,3650,3651],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3653,22],{"id":22},[10,3655,3656],{},[26,3657],{"alt":3658,"src":3659},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3661,3662],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3664,39],{"id":39},[41,3666,3667,3670,3673],{},[44,3668,3669],{},"集合中的元素不重复。",[44,3671,3672],{},"集合是无序容器，不要依赖打印顺序或索引。",[44,3674,3675,3676,3679,3680,3683],{},"创建空集合必须写 ",[33,3677,3678],{},"set()","；",[33,3681,3682],{},"{}"," 创建的是空字典。",[14,3685,62],{"id":62},[10,3687,1431],{},[67,3689,3691],{"className":406,"code":3690,"language":408,"meta":72,"style":72},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3692,3693,3698,3703,3707,3712,3717],{"__ignoreMap":72},[76,3694,3695],{"class":78,"line":79},[76,3696,3697],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[76,3699,3700],{"class":78,"line":90},[76,3701,3702],{},"right = {\"Python\", \"Docker\"}\n",[76,3704,3705],{"class":78,"line":99},[76,3706,1091],{"emptyLinePlaceholder":226},[76,3708,3709],{"class":78,"line":105},[76,3710,3711],{},"print(left & right)\n",[76,3713,3714],{"class":78,"line":121},[76,3715,3716],{},"print(left | right)\n",[76,3718,3719],{"class":78,"line":1143},[76,3720,3721],{},"print(\"Git\" in left)\n",[10,3723,129],{},[67,3725,3728],{"className":3726,"code":3727,"language":135,"meta":72},[133],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3729,3727],{"__ignoreMap":72},[10,3731,140],{},[14,3733,143],{"id":143},[145,3735,3736,3739],{},[44,3737,3738],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[44,3740,3741,3744,3745,3748],{},[33,3742,3743],{},"&"," 计算交集，",[33,3746,3747],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3750,169],{"id":169},[41,3752,3753,3760],{},[44,3754,2288,3755,3757,3758,180],{},[33,3756,3682],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3759,3678],{},[44,3761,3762],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3764,186],{"id":186},[145,3766,3767,3773],{},[44,3768,3769,3770,3772],{},"把包含重复标签的列表交给 ",[33,3771,3678],{}," 去重。",[44,3774,3775],{},"计算两组课程标签的交集和差集。",[10,3777,201],{},[14,3779,204],{"id":204},[10,3781,3782],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3784,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3786},[3787,3788,3789,3790,3791,3792,3793,3794],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3641,"description":3646},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[222,3802,3309],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3805,"title":3806,"body":3807,"category":222,"cover":223,"description":3811,"extension":224,"meta":4009,"navigation":226,"path":4010,"pinned":228,"publishedAt":229,"seo":4011,"slug":4012,"stem":4013,"summary":4014,"tags":4015,"updatedAt":229,"visible":226,"__hash__":4018},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3808,"toc":3997},[3809,3812,3814,3817,3819,3825,3835,3837,3854,3856,3858,3908,3910,3916,3918,3920,3942,3944,3947,3953,3956,3958,3971,3973,3988,3990,3992,3995],[10,3810,3811],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3813,16],{"id":16},[10,3815,3816],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3818,22],{"id":22},[10,3820,3821],{},[26,3822],{"alt":3823,"src":3824},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3826,3827,3830,3831,3834],{},[33,3828,3829],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3832,3833],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3836,39],{"id":39},[41,3838,3839,3848,3851],{},[44,3840,3841,3843,3844,3847],{},[33,3842,2758],{}," 比较内容是否相等，",[33,3845,3846],{},"is"," 比较是否为同一个对象。",[44,3849,3850],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[44,3852,3853],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3855,62],{"id":62},[10,3857,1431],{},[67,3859,3861],{"className":406,"code":3860,"language":408,"meta":72,"style":72},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3862,3863,3868,3873,3878,3882,3887,3892,3897,3902],{"__ignoreMap":72},[76,3864,3865],{"class":78,"line":79},[76,3866,3867],{},"tasks = [\"变量\", \"字符串\"]\n",[76,3869,3870],{"class":78,"line":90},[76,3871,3872],{},"shared = tasks\n",[76,3874,3875],{"class":78,"line":99},[76,3876,3877],{},"backup = tasks.copy()\n",[76,3879,3880],{"class":78,"line":105},[76,3881,1091],{"emptyLinePlaceholder":226},[76,3883,3884],{"class":78,"line":121},[76,3885,3886],{},"tasks.append(\"列表\")\n",[76,3888,3889],{"class":78,"line":1143},[76,3890,3891],{},"print(shared)\n",[76,3893,3894],{"class":78,"line":2438},[76,3895,3896],{},"print(backup)\n",[76,3898,3899],{"class":78,"line":2444},[76,3900,3901],{},"print(tasks is shared)\n",[76,3903,3905],{"class":78,"line":3904},9,[76,3906,3907],{},"print(tasks is backup)\n",[10,3909,129],{},[67,3911,3914],{"className":3912,"code":3913,"language":135,"meta":72},[133],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3915,3913],{"__ignoreMap":72},[10,3917,140],{},[14,3919,143],{"id":143},[145,3921,3922,3928],{},[44,3923,3924,3927],{},[33,3925,3926],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[44,3929,3930,3933,3934,3937,3938,3941],{},[33,3931,3932],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3935,3936],{},"shared"," 能观察到变化，",[33,3939,3940],{},"backup"," 不会。",[326,3943,2648],{"id":2648},[10,3945,3946],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3948,3949],{},[26,3950],{"alt":3951,"src":3952},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3954,3955],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3957,169],{"id":169},[41,3959,3960,3968],{},[44,3961,3962,3963,3965,3966,180],{},"用 ",[33,3964,2758],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,3967,3846],{},[44,3969,3970],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3972,186],{"id":186},[145,3974,3975,3978],{},[44,3976,3977],{},"让两个变量引用同一个字典并修改其中一个。",[44,3979,2288,3980,3983,3984,177,3986,180],{},[33,3981,3982],{},"copy()"," 创建外层副本，再比较 ",[33,3985,3846],{},[33,3987,2758],{},[10,3989,201],{},[14,3991,204],{"id":204},[10,3993,3994],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,3996,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":3998},[3999,4000,4001,4002,4003,4006,4007,4008],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":4004},[4005],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3806,"description":3811},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[222,4016,4017],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4020,"title":4021,"body":4022,"category":222,"cover":223,"description":4026,"extension":224,"meta":4239,"navigation":226,"path":4240,"pinned":228,"publishedAt":229,"seo":4241,"slug":4242,"stem":4243,"summary":4244,"tags":4245,"updatedAt":229,"visible":226,"__hash__":4247},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4023,"toc":4226},[4024,4027,4029,4032,4034,4040,4050,4052,4063,4065,4067,4120,4122,4128,4130,4132,4150,4152,4155,4161,4169,4172,4175,4181,4187,4189,4207,4209,4217,4219,4221,4224],[10,4025,4026],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4028,16],{"id":16},[10,4030,4031],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4033,22],{"id":22},[10,4035,4036],{},[26,4037],{"alt":4038,"src":4039},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4041,4042,2206,4044,2206,4047,4049],{},[33,4043,1151],{},[33,4045,4046],{},"elif",[33,4048,1154],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4051,39],{"id":39},[41,4053,4054,4057,4060],{},[44,4055,4056],{},"冒号表示接下来开始一个代码块。",[44,4058,4059],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[44,4061,4062],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4064,62],{"id":62},[10,4066,1431],{},[67,4068,4070],{"className":406,"code":4069,"language":408,"meta":72,"style":72},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4071,4072,4077,4081,4086,4091,4096,4101,4105,4110,4114],{"__ignoreMap":72},[76,4073,4074],{"class":78,"line":79},[76,4075,4076],{},"score = int(input(\"请输入分数：\"))\n",[76,4078,4079],{"class":78,"line":90},[76,4080,1091],{"emptyLinePlaceholder":226},[76,4082,4083],{"class":78,"line":99},[76,4084,4085],{},"if score >= 90:\n",[76,4087,4088],{"class":78,"line":105},[76,4089,4090],{},"    level = \"优秀\"\n",[76,4092,4093],{"class":78,"line":121},[76,4094,4095],{},"elif score >= 60:\n",[76,4097,4098],{"class":78,"line":1143},[76,4099,4100],{},"    level = \"合格\"\n",[76,4102,4103],{"class":78,"line":2438},[76,4104,1140],{},[76,4106,4107],{"class":78,"line":2444},[76,4108,4109],{},"    level = \"需要继续学习\"\n",[76,4111,4112],{"class":78,"line":3904},[76,4113,1091],{"emptyLinePlaceholder":226},[76,4115,4117],{"class":78,"line":4116},10,[76,4118,4119],{},"print(level)\n",[10,4121,129],{},[67,4123,4126],{"className":4124,"code":4125,"language":135,"meta":72},[133],"输入 85 时输出：合格\n",[33,4127,4125],{"__ignoreMap":72},[10,4129,140],{},[14,4131,143],{"id":143},[145,4133,4134,4141],{},[44,4135,4136,4137,4140],{},"输入先转换为整数，程序从 ",[33,4138,4139],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[44,4142,4143,4146,4147,4149],{},[33,4144,4145],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4148,1154],{}," 被跳过；最终三个分支只会选择一个。",[326,4151,2648],{"id":2648},[10,4153,4154],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4156,4157],{},[26,4158],{"alt":4159,"src":4160},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4162,4163,4165,4166,4168],{},[33,4164,4139],{}," 必须放在 ",[33,4167,4145],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[326,4170,2648],{"id":4171},"再看一个具体细节-1",[10,4173,4174],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4176,4177],{},[26,4178],{"alt":4179,"src":4180},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4182,4183,4184,4186],{},"同一缩进层级属于同一个代码块；回到 ",[33,4185,1151],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4188,169],{"id":169},[41,4190,4191,4197],{},[44,4192,4193,4194,4196],{},"先写 ",[33,4195,4145],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[44,4198,4199,4200,4202,4203,4206],{},"混用多个独立 ",[33,4201,1151],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4204,4205],{},"if\u002Felif\u002Felse"," 链。",[14,4208,186],{"id":186},[145,4210,4211,4214],{},[44,4212,4213],{},"根据温度输出“冷、适中、热”三个等级。",[44,4215,4216],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4218,201],{},[14,4220,204],{"id":204},[10,4222,4223],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4225,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":4227},[4228,4229,4230,4231,4232,4236,4237,4238],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":4233},[4234,4235],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4021,"description":4026},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[222,1151,4246],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4249,"title":4250,"body":4251,"category":222,"cover":223,"description":4255,"extension":224,"meta":4421,"navigation":226,"path":4422,"pinned":228,"publishedAt":229,"seo":4423,"slug":4424,"stem":4425,"summary":4426,"tags":4427,"updatedAt":229,"visible":226,"__hash__":4429},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4252,"toc":4409},[4253,4256,4258,4261,4263,4269,4275,4277,4292,4294,4296,4334,4336,4342,4344,4346,4361,4363,4366,4372,4378,4380,4388,4390,4400,4402,4404,4407],[10,4254,4255],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4257,16],{"id":16},[10,4259,4260],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4262,22],{"id":22},[10,4264,4265],{},[26,4266],{"alt":4267,"src":4268},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4270,4271,4274],{},[33,4272,4273],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4276,39],{"id":39},[41,4278,4279,4282,4285],{},[44,4280,4281],{},"进入循环前先准备参与条件判断的状态。",[44,4283,4284],{},"循环体中必须有机会让条件变为假。",[44,4286,4287,4288,4291],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4289,4290],{},"for"," 通常更直接。",[14,4293,62],{"id":62},[10,4295,1431],{},[67,4297,4299],{"className":406,"code":4298,"language":408,"meta":72,"style":72},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4300,4301,4306,4310,4315,4320,4325,4329],{"__ignoreMap":72},[76,4302,4303],{"class":78,"line":79},[76,4304,4305],{},"count = 1\n",[76,4307,4308],{"class":78,"line":90},[76,4309,1091],{"emptyLinePlaceholder":226},[76,4311,4312],{"class":78,"line":99},[76,4313,4314],{},"while count \u003C= 3:\n",[76,4316,4317],{"class":78,"line":105},[76,4318,4319],{},"    print(\"第\", count, \"次练习\")\n",[76,4321,4322],{"class":78,"line":121},[76,4323,4324],{},"    count = count + 1\n",[76,4326,4327],{"class":78,"line":1143},[76,4328,1091],{"emptyLinePlaceholder":226},[76,4330,4331],{"class":78,"line":2438},[76,4332,4333],{},"print(\"练习结束\")\n",[10,4335,129],{},[67,4337,4340],{"className":4338,"code":4339,"language":135,"meta":72},[133],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4341,4339],{"__ignoreMap":72},[10,4343,140],{},[14,4345,143],{"id":143},[145,4347,4348,4355],{},[44,4349,4350,4351,4354],{},"进入循环前 ",[33,4352,4353],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[44,4356,4357,4358,4360],{},"循环体末尾把 ",[33,4359,4353],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[326,4362,2648],{"id":2648},[10,4364,4365],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4367,4368],{},[26,4369],{"alt":4370,"src":4371},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4373,4374,4375,4377],{},"第4次检查时 ",[33,4376,4353],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4379,169],{"id":169},[41,4381,4382,4385],{},[44,4383,4384],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[44,4386,4387],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4389,186],{"id":186},[145,4391,4392,4397],{},[44,4393,2288,4394,4396],{},[33,4395,4273],{}," 输出 1 到 5。",[44,4398,4399],{},"计算 1 到 10 的累加和。",[10,4401,201],{},[14,4403,204],{"id":204},[10,4405,4406],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4408,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":4410},[4411,4412,4413,4414,4415,4418,4419,4420],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":4416},[4417],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4250,"description":4255},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[222,4273,4428],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4431,"title":4432,"body":4433,"category":222,"cover":223,"description":4437,"extension":224,"meta":4585,"navigation":226,"path":4586,"pinned":228,"publishedAt":229,"seo":4587,"slug":4588,"stem":4589,"summary":4590,"tags":4591,"updatedAt":229,"visible":226,"__hash__":4593},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4434,"toc":4575},[4435,4438,4440,4443,4445,4451,4456,4458,4472,4474,4476,4514,4516,4522,4524,4526,4543,4545,4553,4555,4566,4568,4570,4573],[10,4436,4437],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4439,16],{"id":16},[10,4441,4442],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4444,22],{"id":22},[10,4446,4447],{},[26,4448],{"alt":4449,"src":4450},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4452,4453,4455],{},[33,4454,4290],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4457,39],{"id":39},[41,4459,4460,4466,4469],{},[44,4461,4462,4465],{},[33,4463,4464],{},"range(1, 4)"," 包含 1，不包含 4。",[44,4467,4468],{},"只需要元素时直接遍历元素，不必手工维护索引。",[44,4470,4471],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4473,62],{"id":62},[10,4475,1431],{},[67,4477,4479],{"className":406,"code":4478,"language":408,"meta":72,"style":72},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4480,4481,4486,4490,4495,4500,4504,4509],{"__ignoreMap":72},[76,4482,4483],{"class":78,"line":79},[76,4484,4485],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[76,4487,4488],{"class":78,"line":90},[76,4489,1091],{"emptyLinePlaceholder":226},[76,4491,4492],{"class":78,"line":99},[76,4493,4494],{},"for course in courses:\n",[76,4496,4497],{"class":78,"line":105},[76,4498,4499],{},"    print(course)\n",[76,4501,4502],{"class":78,"line":121},[76,4503,1091],{"emptyLinePlaceholder":226},[76,4505,4506],{"class":78,"line":1143},[76,4507,4508],{},"for number in range(1, 4):\n",[76,4510,4511],{"class":78,"line":2438},[76,4512,4513],{},"    print(number)\n",[10,4515,129],{},[67,4517,4520],{"className":4518,"code":4519,"language":135,"meta":72},[133],"变量\n字符串\n列表\n1\n2\n3\n",[33,4521,4519],{"__ignoreMap":72},[10,4523,140],{},[14,4525,143],{"id":143},[145,4527,4528,4538],{},[44,4529,4530,4531,4533,4534,4537],{},"第一个 ",[33,4532,4290],{}," 依次从列表取得字符串，循环变量 ",[33,4535,4536],{},"course"," 每轮重新绑定。",[44,4539,4540,4542],{},[33,4541,4464],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4544,169],{"id":169},[41,4546,4547,4550],{},[44,4548,4549],{},"只需要元素却手工维护索引，增加越界风险。",[44,4551,4552],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4554,186],{"id":186},[145,4556,4557,4560],{},[44,4558,4559],{},"逐项输出一个字符串中的字符。",[44,4561,2288,4562,4565],{},[33,4563,4564],{},"range()"," 输出 2、4、6、8。",[10,4567,201],{},[14,4569,204],{"id":204},[10,4571,4572],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4574,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":4576},[4577,4578,4579,4580,4581,4582,4583,4584],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4432,"description":4437},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[222,4290,4592],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4595,"title":4596,"body":4597,"category":222,"cover":223,"description":4601,"extension":224,"meta":4775,"navigation":226,"path":4776,"pinned":228,"publishedAt":229,"seo":4777,"slug":4778,"stem":4779,"summary":4780,"tags":4781,"updatedAt":229,"visible":226,"__hash__":4782},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4598,"toc":4765},[4599,4602,4604,4607,4609,4615,4625,4627,4646,4648,4650,4702,4704,4710,4712,4714,4728,4730,4746,4748,4756,4758,4760,4763],[10,4600,4601],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4603,16],{"id":16},[10,4605,4606],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4608,22],{"id":22},[10,4610,4611],{},[26,4612],{"alt":4613,"src":4614},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4616,4617,4620,4621,4624],{},[33,4618,4619],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4622,4623],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4626,39],{"id":39},[41,4628,4629,4632,4640],{},[44,4630,4631],{},"先写普通循环，再在确有需要时加入流程控制语句。",[44,4633,4634,4636,4637,4639],{},[33,4635,4619],{}," 前要确认不会跳过 ",[33,4638,4273],{}," 循环中的状态更新。",[44,4641,4642,4643,4645],{},"多层嵌套中 ",[33,4644,4623],{}," 只结束它所在的最内层循环。",[14,4647,62],{"id":62},[10,4649,1431],{},[67,4651,4653],{"className":406,"code":4652,"language":408,"meta":72,"style":72},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[33,4654,4655,4660,4664,4669,4674,4679,4684,4689,4693,4697],{"__ignoreMap":72},[76,4656,4657],{"class":78,"line":79},[76,4658,4659],{},"numbers = [3, -1, 0, 8, 12]\n",[76,4661,4662],{"class":78,"line":90},[76,4663,1091],{"emptyLinePlaceholder":226},[76,4665,4666],{"class":78,"line":99},[76,4667,4668],{},"for number in numbers:\n",[76,4670,4671],{"class":78,"line":105},[76,4672,4673],{},"    if number \u003C 0:\n",[76,4675,4676],{"class":78,"line":121},[76,4677,4678],{},"        continue\n",[76,4680,4681],{"class":78,"line":1143},[76,4682,4683],{},"    if number == 0:\n",[76,4685,4686],{"class":78,"line":2438},[76,4687,4688],{},"        break\n",[76,4690,4691],{"class":78,"line":2444},[76,4692,4513],{},[76,4694,4695],{"class":78,"line":3904},[76,4696,1091],{"emptyLinePlaceholder":226},[76,4698,4699],{"class":78,"line":4116},[76,4700,4701],{},"print(\"循环结束\")\n",[10,4703,129],{},[67,4705,4708],{"className":4706,"code":4707,"language":135,"meta":72},[133],"3\n循环结束\n",[33,4709,4707],{"__ignoreMap":72},[10,4711,140],{},[14,4713,143],{"id":143},[145,4715,4716,4722],{},[44,4717,4718,4719,4721],{},"遇到 -1 时 ",[33,4720,4619],{}," 立即结束本轮，后面的判断和输出都不执行。",[44,4723,4724,4725,4727],{},"遇到 0 时 ",[33,4726,4623],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4729,169],{"id":169},[41,4731,4732,4737],{},[44,4733,3418,4734,4736],{},[33,4735,4619],{}," 当作结束循环，实际它只跳到下一轮。",[44,4738,4739,4740,4742,4743,4745],{},"在 ",[33,4741,4273],{}," 中把状态更新放在可能被 ",[33,4744,4619],{}," 跳过的位置，造成无限循环。",[14,4747,186],{"id":186},[145,4749,4750,4753],{},[44,4751,4752],{},"跳过列表中的空字符串并输出其他内容。",[44,4754,4755],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4757,201],{},[14,4759,204],{"id":204},[10,4761,4762],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4764,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":4766},[4767,4768,4769,4770,4771,4772,4773,4774],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4596,"description":4601},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[222,4623,4619],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4784,"title":4785,"body":4786,"category":222,"cover":223,"description":4790,"extension":224,"meta":4961,"navigation":226,"path":4962,"pinned":228,"publishedAt":229,"seo":4963,"slug":4964,"stem":4965,"summary":4966,"tags":4967,"updatedAt":229,"visible":226,"__hash__":4970},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4787,"toc":4949},[4788,4791,4793,4796,4798,4804,4807,4809,4833,4835,4837,4871,4873,4879,4881,4883,4900,4902,4905,4911,4914,4916,4930,4932,4940,4942,4944,4947],[10,4789,4790],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4792,16],{"id":16},[10,4794,4795],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4797,22],{"id":22},[10,4799,4800],{},[26,4801],{"alt":4802,"src":4803},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4805,4806],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4808,39],{"id":39},[41,4810,4811,4814,4817],{},[44,4812,4813],{},"每增加一层嵌套，阅读成本都会上升。",[44,4815,4816],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[44,4818,4819,4820,2206,4823,4826,4827,2206,4830,180],{},"变量名使用 ",[33,4821,4822],{},"row",[33,4824,4825],{},"cell"," 等层级含义，避免全部写成 ",[33,4828,4829],{},"i",[33,4831,4832],{},"j",[14,4834,62],{"id":62},[10,4836,1431],{},[67,4838,4840],{"className":406,"code":4839,"language":408,"meta":72,"style":72},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4841,4842,4847,4851,4856,4861,4866],{"__ignoreMap":72},[76,4843,4844],{"class":78,"line":79},[76,4845,4846],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[76,4848,4849],{"class":78,"line":90},[76,4850,1091],{"emptyLinePlaceholder":226},[76,4852,4853],{"class":78,"line":99},[76,4854,4855],{},"for row in table:\n",[76,4857,4858],{"class":78,"line":105},[76,4859,4860],{},"    for cell in row:\n",[76,4862,4863],{"class":78,"line":121},[76,4864,4865],{},"        print(cell)\n",[76,4867,4868],{"class":78,"line":1143},[76,4869,4870],{},"    print(\"一行结束\")\n",[10,4872,129],{},[67,4874,4877],{"className":4875,"code":4876,"language":135,"meta":72},[133],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4878,4876],{"__ignoreMap":72},[10,4880,140],{},[14,4882,143],{"id":143},[145,4884,4885,4897],{},[44,4886,4887,4888,4890,4891,177,4894,180],{},"外层变量 ",[33,4889,4822],{}," 先引用第一行列表，内层才依次处理 ",[33,4892,4893],{},"A1",[33,4895,4896],{},"A2",[44,4898,4899],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[326,4901,2648],{"id":2648},[10,4903,4904],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4906,4907],{},[26,4908],{"alt":4909,"src":4910},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4912,4913],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4915,169],{"id":169},[41,4917,4918,4927],{},[44,4919,4920,4921,1002,4924,4926],{},"把两层循环变量都叫 ",[33,4922,4923],{},"item",[33,4925,4829],{},"，难以确认当前层级。",[44,4928,4929],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4931,186],{"id":186},[145,4933,4934,4937],{},[44,4935,4936],{},"打印一个 2×3 数字表。",[44,4938,4939],{},"在内层增加条件，只输出大于 3 的元素。",[10,4941,201],{},[14,4943,204],{"id":204},[10,4945,4946],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,4948,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":4950},[4951,4952,4953,4954,4955,4958,4959,4960],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":4956},[4957],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4785,"description":4790},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[222,4968,4969],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4972,"title":4973,"body":4974,"category":222,"cover":223,"description":4978,"extension":224,"meta":5116,"navigation":226,"path":5117,"pinned":228,"publishedAt":229,"seo":5118,"slug":5119,"stem":5120,"summary":5121,"tags":5122,"updatedAt":229,"visible":226,"__hash__":5125},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4975,"toc":5106},[4976,4979,4981,4984,4986,4992,4995,4997,5008,5010,5012,5050,5052,5058,5060,5062,5074,5076,5087,5089,5097,5099,5101,5104],[10,4977,4978],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4980,16],{"id":16},[10,4982,4983],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4985,22],{"id":22},[10,4987,4988],{},[26,4989],{"alt":4990,"src":4991},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4993,4994],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4996,39],{"id":39},[41,4998,4999,5002,5005],{},[44,5000,5001],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[44,5003,5004],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[44,5006,5007],{},"推导式创建新列表，不修改输入列表。",[14,5009,62],{"id":62},[10,5011,1431],{},[67,5013,5015],{"className":406,"code":5014,"language":408,"meta":72,"style":72},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[33,5016,5017,5022,5026,5031,5036,5040,5045],{"__ignoreMap":72},[76,5018,5019],{"class":78,"line":79},[76,5020,5021],{},"numbers = [1, 2, 3, 4, 5]\n",[76,5023,5024],{"class":78,"line":90},[76,5025,1091],{"emptyLinePlaceholder":226},[76,5027,5028],{"class":78,"line":99},[76,5029,5030],{},"squares = [number * number for number in numbers]\n",[76,5032,5033],{"class":78,"line":105},[76,5034,5035],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[76,5037,5038],{"class":78,"line":121},[76,5039,1091],{"emptyLinePlaceholder":226},[76,5041,5042],{"class":78,"line":1143},[76,5043,5044],{},"print(squares)\n",[76,5046,5047],{"class":78,"line":2438},[76,5048,5049],{},"print(even_squares)\n",[10,5051,129],{},[67,5053,5056],{"className":5054,"code":5055,"language":135,"meta":72},[133],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5057,5055],{"__ignoreMap":72},[10,5059,140],{},[14,5061,143],{"id":143},[145,5063,5064,5067],{},[44,5065,5066],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[44,5068,5069,5070,5073],{},"第二条先用 ",[33,5071,5072],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5075,169],{"id":169},[41,5077,5078,5084],{},[44,5079,5080,5081,5083],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5082,4290],{}," 开始找输入。",[44,5085,5086],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5088,186],{"id":186},[145,5090,5091,5094],{},[44,5092,5093],{},"把字符串列表转换为长度列表。",[44,5095,5096],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5098,201],{},[14,5100,204],{"id":204},[10,5102,5103],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5105,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":5107},[5108,5109,5110,5111,5112,5113,5114,5115],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4973,"description":4978},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[222,5123,5124],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5127,"title":5128,"body":5129,"category":222,"cover":223,"description":5133,"extension":224,"meta":5276,"navigation":226,"path":5277,"pinned":228,"publishedAt":229,"seo":5278,"slug":5279,"stem":5280,"summary":5281,"tags":5282,"updatedAt":229,"visible":226,"__hash__":5285},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5130,"toc":5266},[5131,5134,5136,5139,5141,5147,5150,5152,5163,5165,5167,5206,5208,5214,5216,5218,5233,5235,5243,5245,5257,5259,5261,5264],[10,5132,5133],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5135,16],{"id":16},[10,5137,5138],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5140,22],{"id":22},[10,5142,5143],{},[26,5144],{"alt":5145,"src":5146},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5148,5149],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5151,39],{"id":39},[41,5153,5154,5157,5160],{},[44,5155,5156],{},"函数名描述动作，使用小写字母和下划线。",[44,5158,5159],{},"函数定义要先执行，之后才能调用。",[44,5161,5162],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5164,62],{"id":62},[10,5166,1431],{},[67,5168,5170],{"className":406,"code":5169,"language":408,"meta":72,"style":72},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5171,5172,5177,5182,5187,5191,5196,5201],{"__ignoreMap":72},[76,5173,5174],{"class":78,"line":79},[76,5175,5176],{},"def show_progress():\n",[76,5178,5179],{"class":78,"line":90},[76,5180,5181],{},"    print(\"正在学习函数\")\n",[76,5183,5184],{"class":78,"line":99},[76,5185,5186],{},"    print(\"本节完成 50%\")\n",[76,5188,5189],{"class":78,"line":105},[76,5190,1091],{"emptyLinePlaceholder":226},[76,5192,5193],{"class":78,"line":121},[76,5194,5195],{},"print(\"调用前\")\n",[76,5197,5198],{"class":78,"line":1143},[76,5199,5200],{},"show_progress()\n",[76,5202,5203],{"class":78,"line":2438},[76,5204,5205],{},"print(\"调用后\")\n",[10,5207,129],{},[67,5209,5212],{"className":5210,"code":5211,"language":135,"meta":72},[133],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5213,5211],{"__ignoreMap":72},[10,5215,140],{},[14,5217,143],{"id":143},[145,5219,5220,5226],{},[44,5221,931,5222,5225],{},[33,5223,5224],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[44,5227,5228,5229,5232],{},"运行到 ",[33,5230,5231],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5234,169],{"id":169},[41,5236,5237,5240],{},[44,5238,5239],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[44,5241,5242],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5244,186],{"id":186},[145,5246,5247,5254],{},[44,5248,5249,5250,5253],{},"定义 ",[33,5251,5252],{},"show_plan()"," 输出两行学习计划。",[44,5255,5256],{},"连续调用同一个函数两次，观察执行顺序。",[10,5258,201],{},[14,5260,204],{"id":204},[10,5262,5263],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5265,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":5267},[5268,5269,5270,5271,5272,5273,5274,5275],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5128,"description":5133},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[222,5283,5284],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5287,"title":5288,"body":5289,"category":222,"cover":223,"description":5293,"extension":224,"meta":5473,"navigation":226,"path":5474,"pinned":228,"publishedAt":229,"seo":5475,"slug":5476,"stem":5477,"summary":5478,"tags":5479,"updatedAt":229,"visible":226,"__hash__":5482},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5290,"toc":5461},[5291,5294,5296,5299,5301,5307,5314,5316,5333,5335,5337,5371,5373,5379,5381,5383,5404,5406,5409,5415,5425,5427,5442,5444,5452,5454,5456,5459],[10,5292,5293],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5295,16],{"id":16},[10,5297,5298],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5300,22],{"id":22},[10,5302,5303],{},[26,5304],{"alt":5305,"src":5306},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5308,5309,5310,5313],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5311,5312],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5315,39],{"id":39},[41,5317,5318,5321,5324],{},[44,5319,5320],{},"形参出现在函数定义中，实参出现在函数调用中。",[44,5322,5323],{},"局部变量默认只在函数内部可见。",[44,5325,5326,5327,5329,5330,180],{},"没有显式 ",[33,5328,5312],{}," 的函数会返回 ",[33,5331,5332],{},"None",[14,5334,62],{"id":62},[10,5336,1431],{},[67,5338,5340],{"className":406,"code":5339,"language":408,"meta":72,"style":72},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5341,5342,5347,5352,5357,5361,5366],{"__ignoreMap":72},[76,5343,5344],{"class":78,"line":79},[76,5345,5346],{},"def calculate_total(price, count):\n",[76,5348,5349],{"class":78,"line":90},[76,5350,5351],{},"    total = price * count\n",[76,5353,5354],{"class":78,"line":99},[76,5355,5356],{},"    return total\n",[76,5358,5359],{"class":78,"line":105},[76,5360,1091],{"emptyLinePlaceholder":226},[76,5362,5363],{"class":78,"line":121},[76,5364,5365],{},"result = calculate_total(25, 4)\n",[76,5367,5368],{"class":78,"line":1143},[76,5369,5370],{},"print(result)\n",[10,5372,129],{},[67,5374,5377],{"className":5375,"code":5376,"language":135,"meta":72},[133],"100\n",[33,5378,5376],{"__ignoreMap":72},[10,5380,140],{},[14,5382,143],{"id":143},[145,5384,5385,5394],{},[44,5386,5387,5388,2206,5391,5393],{},"调用时 25 和 4 分别绑定到 ",[33,5389,5390],{},"price",[33,5392,4353],{},"，它们只在本次函数调用的局部范围中使用。",[44,5395,5396,5399,5400,5403],{},[33,5397,5398],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5401,5402],{},"result"," 并输出。",[326,5405,2648],{"id":2648},[10,5407,5408],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5410,5411],{},[26,5412],{"alt":5413,"src":5414},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5416,5417,2206,5419,177,5421,5424],{},[33,5418,5390],{},[33,5420,4353],{},[33,5422,5423],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5426,169],{"id":169},[41,5428,5429,5436],{},[44,5430,5431,5432,5435],{},"在函数内部只 ",[33,5433,5434],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[44,5437,5438,5439,5441],{},"试图在函数外直接访问局部变量 ",[33,5440,5423],{},"，它的名字只在调用期间的局部作用域存在。",[14,5443,186],{"id":186},[145,5445,5446,5449],{},[44,5447,5448],{},"编写计算长方形面积的函数。",[44,5450,5451],{},"让函数返回结果后在调用方加上单位再输出。",[10,5453,201],{},[14,5455,204],{"id":204},[10,5457,5458],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5460,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":5462},[5463,5464,5465,5466,5467,5470,5471,5472],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":5468},[5469],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5288,"description":5293},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[222,5480,5481],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5484,"title":5485,"body":5486,"category":222,"cover":223,"description":5490,"extension":224,"meta":5670,"navigation":226,"path":5671,"pinned":228,"publishedAt":229,"seo":5672,"slug":5673,"stem":5674,"summary":5675,"tags":5676,"updatedAt":229,"visible":226,"__hash__":5679},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5487,"toc":5658},[5488,5491,5493,5496,5498,5504,5507,5509,5526,5528,5530,5582,5584,5590,5592,5594,5612,5614,5617,5623,5626,5628,5639,5641,5649,5651,5653,5656],[10,5489,5490],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5492,16],{"id":16},[10,5494,5495],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5497,22],{"id":22},[10,5499,5500],{},[26,5501],{"alt":5502,"src":5503},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5505,5506],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5508,39],{"id":39},[41,5510,5511,5514,5520],{},[44,5512,5513],{},"必需参数应放在有默认值的参数之前。",[44,5515,5516,5519],{},[33,5517,5518],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[44,5521,5522,5525],{},[33,5523,5524],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5527,62],{"id":62},[10,5529,1431],{},[67,5531,5533],{"className":406,"code":5532,"language":408,"meta":72,"style":72},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[33,5534,5535,5540,5545,5549,5554,5559,5563,5568,5573,5577],{"__ignoreMap":72},[76,5536,5537],{"class":78,"line":79},[76,5538,5539],{},"def build_title(name, level=\"基础\"):\n",[76,5541,5542],{"class":78,"line":90},[76,5543,5544],{},"    return name + \"｜\" + level\n",[76,5546,5547],{"class":78,"line":99},[76,5548,1091],{"emptyLinePlaceholder":226},[76,5550,5551],{"class":78,"line":105},[76,5552,5553],{},"print(build_title(\"Python\"))\n",[76,5555,5556],{"class":78,"line":121},[76,5557,5558],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[76,5560,5561],{"class":78,"line":1143},[76,5562,1091],{"emptyLinePlaceholder":226},[76,5564,5565],{"class":78,"line":2438},[76,5566,5567],{},"def total(*numbers):\n",[76,5569,5570],{"class":78,"line":2444},[76,5571,5572],{},"    return sum(numbers)\n",[76,5574,5575],{"class":78,"line":3904},[76,5576,1091],{"emptyLinePlaceholder":226},[76,5578,5579],{"class":78,"line":4116},[76,5580,5581],{},"print(total(10, 20, 30))\n",[10,5583,129],{},[67,5585,5588],{"className":5586,"code":5587,"language":135,"meta":72},[133],"Python｜基础\n异常处理｜进阶\n60\n",[33,5589,5587],{"__ignoreMap":72},[10,5591,140],{},[14,5593,143],{"id":143},[145,5595,5596,5603],{},[44,5597,5598,5599,5602],{},"第一次调用只提供必需参数，",[33,5600,5601],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[44,5604,5605,5608,5609,180],{},[33,5606,5607],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5610,5611],{},"sum()",[326,5613,2648],{"id":2648},[10,5615,5616],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5618,5619],{},[26,5620],{"alt":5621,"src":5622},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5624,5625],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5627,169],{"id":169},[41,5629,5630,5636],{},[44,5631,5632,5633,5635],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5634,5332],{}," 再在函数内创建。",[44,5637,5638],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5640,186],{"id":186},[145,5642,5643,5646],{},[44,5644,5645],{},"给问候函数增加默认称呼。",[44,5647,5648],{},"编写接收任意数量分数并返回总分的函数。",[10,5650,201],{},[14,5652,204],{"id":204},[10,5654,5655],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5657,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":5659},[5660,5661,5662,5663,5664,5667,5668,5669],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":5665},[5666],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5485,"description":5490},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[222,5677,5678],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5681,"title":5682,"body":5683,"category":222,"cover":223,"description":5687,"extension":224,"meta":5884,"navigation":226,"path":5885,"pinned":228,"publishedAt":229,"seo":5886,"slug":5887,"stem":5888,"summary":5889,"tags":5890,"updatedAt":229,"visible":226,"__hash__":5893},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5684,"toc":5872},[5685,5688,5690,5693,5695,5701,5704,5706,5723,5725,5727,5790,5792,5798,5800,5802,5829,5831,5834,5840,5843,5845,5853,5855,5863,5865,5867,5870],[10,5686,5687],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5689,16],{"id":16},[10,5691,5692],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5694,22],{"id":22},[10,5696,5697],{},[26,5698],{"alt":5699,"src":5700},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5702,5703],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5705,39],{"id":39},[41,5707,5708,5711,5714],{},[44,5709,5710],{},"函数内部赋值默认创建局部变量。",[44,5712,5713],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[44,5715,5716,2125,5719,5722],{},[33,5717,5718],{},"global",[33,5720,5721],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5724,62],{"id":62},[10,5726,1431],{},[67,5728,5730],{"className":406,"code":5729,"language":408,"meta":72,"style":72},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[33,5731,5732,5737,5741,5746,5751,5755,5760,5765,5770,5774,5779,5784],{"__ignoreMap":72},[76,5733,5734],{"class":78,"line":79},[76,5735,5736],{},"course = \"Python\"\n",[76,5738,5739],{"class":78,"line":90},[76,5740,1091],{"emptyLinePlaceholder":226},[76,5742,5743],{"class":78,"line":99},[76,5744,5745],{},"def outer():\n",[76,5747,5748],{"class":78,"line":105},[76,5749,5750],{},"    level = \"基础\"\n",[76,5752,5753],{"class":78,"line":121},[76,5754,1091],{"emptyLinePlaceholder":226},[76,5756,5757],{"class":78,"line":1143},[76,5758,5759],{},"    def show():\n",[76,5761,5762],{"class":78,"line":2438},[76,5763,5764],{},"        lesson = \"作用域\"\n",[76,5766,5767],{"class":78,"line":2444},[76,5768,5769],{},"        print(course, level, lesson)\n",[76,5771,5772],{"class":78,"line":3904},[76,5773,1091],{"emptyLinePlaceholder":226},[76,5775,5776],{"class":78,"line":4116},[76,5777,5778],{},"    show()\n",[76,5780,5782],{"class":78,"line":5781},11,[76,5783,1091],{"emptyLinePlaceholder":226},[76,5785,5787],{"class":78,"line":5786},12,[76,5788,5789],{},"outer()\n",[10,5791,129],{},[67,5793,5796],{"className":5794,"code":5795,"language":135,"meta":72},[133],"Python 基础 作用域\n",[33,5797,5795],{"__ignoreMap":72},[10,5799,140],{},[14,5801,143],{"id":143},[145,5803,5804,5821],{},[44,5805,5806,5809,5810,5813,5814,5816,5817,5820],{},[33,5807,5808],{},"show()"," 中查找 ",[33,5811,5812],{},"lesson"," 时先在局部找到，查找 ",[33,5815,5601],{}," 时到外层 ",[33,5818,5819],{},"outer()"," 找到。",[44,5822,5823,5825,5826,5828],{},[33,5824,4536],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5827,2157],{}," 最后在内置作用域找到。",[326,5830,2648],{"id":2648},[10,5832,5833],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5835,5836],{},[26,5837],{"alt":5838,"src":5839},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5841,5842],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5844,169],{"id":169},[41,5846,5847,5850],{},[44,5848,5849],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[44,5851,5852],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5854,186],{"id":186},[145,5856,5857,5860],{},[44,5858,5859],{},"在内外层定义同名变量，观察最近作用域优先。",[44,5861,5862],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5864,201],{},[14,5866,204],{"id":204},[10,5868,5869],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,5871,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":5873},[5874,5875,5876,5877,5878,5881,5882,5883],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":5879},[5880],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5682,"description":5687},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[222,5891,5892],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5895,"title":5896,"body":5897,"category":222,"cover":223,"description":5901,"extension":224,"meta":6051,"navigation":226,"path":6052,"pinned":228,"publishedAt":229,"seo":6053,"slug":6054,"stem":6055,"summary":6056,"tags":6057,"updatedAt":229,"visible":226,"__hash__":6060},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5898,"toc":6041},[5899,5902,5904,5907,5909,5915,5918,5920,5939,5941,5943,5977,5979,5985,5987,5989,6004,6006,6018,6020,6032,6034,6036,6039],[10,5900,5901],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5903,16],{"id":16},[10,5905,5906],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5908,22],{"id":22},[10,5910,5911],{},[26,5912],{"alt":5913,"src":5914},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5916,5917],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5919,39],{"id":39},[41,5921,5922,5925,5928],{},[44,5923,5924],{},"文档字符串紧跟在函数定义后的第一条语句。",[44,5926,5927],{},"注解表达接口意图，不代替输入校验和测试。",[44,5929,5930,5931,2206,5933,2206,5935,5938],{},"基础注解优先使用 ",[33,5932,2209],{},[33,5934,2375],{},[33,5936,5937],{},"list[str]"," 等直接写法。",[14,5940,62],{"id":62},[10,5942,1431],{},[67,5944,5946],{"className":406,"code":5945,"language":408,"meta":72,"style":72},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[33,5947,5948,5953,5958,5963,5967,5972],{"__ignoreMap":72},[76,5949,5950],{"class":78,"line":79},[76,5951,5952],{},"def format_score(name: str, score: int) -> str:\n",[76,5954,5955],{"class":78,"line":90},[76,5956,5957],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[76,5959,5960],{"class":78,"line":99},[76,5961,5962],{},"    return name + \"：\" + str(score)\n",[76,5964,5965],{"class":78,"line":105},[76,5966,1091],{"emptyLinePlaceholder":226},[76,5968,5969],{"class":78,"line":121},[76,5970,5971],{},"print(format_score(\"小郑\", 95))\n",[76,5973,5974],{"class":78,"line":1143},[76,5975,5976],{},"print(format_score.__doc__)\n",[10,5978,129],{},[67,5980,5983],{"className":5981,"code":5982,"language":135,"meta":72},[133],"小郑：95\n返回带姓名的分数文本。\n",[33,5984,5982],{"__ignoreMap":72},[10,5986,140],{},[14,5988,143],{"id":143},[145,5990,5991,6001],{},[44,5992,5993,5994,5997,5998,6000],{},"函数签名说明 ",[33,5995,5996],{},"name"," 预期为字符串、",[33,5999,2195],{}," 预期为整数，返回值预期为字符串。",[44,6002,6003],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6005,169],{"id":169},[41,6007,6008,6015],{},[44,6009,6010,6011,6014],{},"认为加了 ",[33,6012,6013],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[44,6016,6017],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6019,186],{"id":186},[145,6021,6022,6025],{},[44,6023,6024],{},"为面积函数补充参数和返回值注解。",[44,6026,6027,6028,6031],{},"通过 ",[33,6029,6030],{},"函数名.__doc__"," 查看文档字符串。",[10,6033,201],{},[14,6035,204],{"id":204},[10,6037,6038],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6040,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":6042},[6043,6044,6045,6046,6047,6048,6049,6050],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5896,"description":5901},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[222,6058,6059],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6062,"title":6063,"body":6064,"category":222,"cover":223,"description":6068,"extension":224,"meta":6295,"navigation":226,"path":6296,"pinned":228,"publishedAt":229,"seo":6297,"slug":6298,"stem":6299,"summary":6300,"tags":6301,"updatedAt":229,"visible":226,"__hash__":6304},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6065,"toc":6283},[6066,6069,6071,6077,6079,6085,6096,6098,6116,6118,6125,6154,6161,6180,6189,6191,6197,6199,6201,6224,6226,6229,6235,6241,6243,6259,6261,6274,6276,6278,6281],[10,6067,6068],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6070,16],{"id":16},[10,6072,6073,6074,6076],{},"本篇只处理“模块、import 与 ",[292,6075,5996],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6078,22],{"id":22},[10,6080,6081],{},[26,6082],{"alt":6083,"src":6084},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6086,6087,6088,6091,6092,6095],{},"同一个文件直接运行时 ",[33,6089,6090],{},"__name__"," 等于 ",[33,6093,6094],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6097,39],{"id":39},[41,6099,6100,6106,6109],{},[44,6101,6102,6103,6105],{},"一个 ",[33,6104,1165],{}," 文件就是一个模块。",[44,6107,6108],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[44,6110,6111,6112,6115],{},"避免使用 ",[33,6113,6114],{},"from module import *","，它会让名字来源不清楚。",[14,6117,62],{"id":62},[10,6119,6120,6121,6124],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6122,6123],{},"calculator.py","：",[67,6126,6128],{"className":406,"code":6127,"language":408,"meta":72,"style":72},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6129,6130,6135,6140,6144,6149],{"__ignoreMap":72},[76,6131,6132],{"class":78,"line":79},[76,6133,6134],{},"def add(left, right):\n",[76,6136,6137],{"class":78,"line":90},[76,6138,6139],{},"    return left + right\n",[76,6141,6142],{"class":78,"line":99},[76,6143,1091],{"emptyLinePlaceholder":226},[76,6145,6146],{"class":78,"line":105},[76,6147,6148],{},"if __name__ == \"__main__\":\n",[76,6150,6151],{"class":78,"line":121},[76,6152,6153],{},"    print(add(2, 3))\n",[10,6155,6156,6157,6160],{},"再创建 ",[33,6158,6159],{},"app.py","，从模块中导入函数：",[67,6162,6164],{"className":406,"code":6163,"language":408,"meta":72,"style":72},"from calculator import add\n\nprint(add(10, 20))\n",[33,6165,6166,6171,6175],{"__ignoreMap":72},[76,6167,6168],{"class":78,"line":79},[76,6169,6170],{},"from calculator import add\n",[76,6172,6173],{"class":78,"line":90},[76,6174,1091],{"emptyLinePlaceholder":226},[76,6176,6177],{"class":78,"line":99},[76,6178,6179],{},"print(add(10, 20))\n",[10,6181,6182,6183,177,6186,180],{},"分别执行 ",[33,6184,6185],{},"python3 calculator.py",[33,6187,6188],{},"python3 app.py",[10,6190,129],{},[67,6192,6195],{"className":6193,"code":6194,"language":135,"meta":72},[133],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6196,6194],{"__ignoreMap":72},[10,6198,140],{},[14,6200,143],{"id":143},[145,6202,6203,6213],{},[44,6204,6205,6206,6208,6209,6212],{},"直接运行 ",[33,6207,6123],{}," 时，模块名是 ",[33,6210,6211],{},"__main__","，入口代码输出 5。",[44,6214,6215,6217,6218,6220,6221,6223],{},[33,6216,6159],{}," 导入模块时，",[33,6219,6123],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6222,6159],{}," 调用函数输出 30。",[326,6225,2648],{"id":2648},[10,6227,6228],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6230,6231],{},[26,6232],{"alt":6233,"src":6234},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6236,6237,6238,6240],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6239,6211],{}," 保护下的演示代码。",[14,6242,169],{"id":169},[41,6244,6245,6252],{},[44,6246,6247,6248,177,6250,180],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6249,6123],{},[33,6251,6159],{},[44,6253,6254,6255,6258],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6256,6257],{},"json.py","，导致导入目标被遮蔽。",[14,6260,186],{"id":186},[145,6262,6263,6269],{},[44,6264,2303,6265,6268],{},[33,6266,6267],{},"text_tools.py"," 并导出一个格式化函数。",[44,6270,6271,6272,180],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6273,6090],{},[10,6275,201],{},[14,6277,204],{"id":204},[10,6279,6280],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6282,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":6284},[6285,6286,6287,6288,6289,6292,6293,6294],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":6290},[6291],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6063,"description":6068},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[222,6302,6303],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6306,"title":6307,"body":6308,"category":222,"cover":223,"description":6312,"extension":224,"meta":6477,"navigation":226,"path":6478,"pinned":228,"publishedAt":229,"seo":6479,"slug":6480,"stem":6481,"summary":6482,"tags":6483,"updatedAt":229,"visible":226,"__hash__":6485},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6309,"toc":6467},[6310,6313,6315,6318,6320,6326,6329,6331,6345,6347,6349,6395,6397,6403,6405,6407,6433,6435,6445,6447,6458,6460,6462,6465],[10,6311,6312],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6314,16],{"id":16},[10,6316,6317],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6319,22],{"id":22},[10,6321,6322],{},[26,6323],{"alt":6324,"src":6325},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6327,6328],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6330,39],{"id":39},[41,6332,6333,6339,6342],{},[44,6334,6335,6338],{},[33,6336,6337],{},".venv"," 是常见目录名，不应提交到 Git。",[44,6340,6341],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[44,6343,6344],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6346,62],{"id":62},[10,6348,65],{},[67,6350,6352],{"className":69,"code":6351,"language":71,"meta":72,"style":72},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6353,6354,6366,6374,6380,6390],{"__ignoreMap":72},[76,6355,6356,6358,6360,6363],{"class":78,"line":79},[76,6357,124],{"class":82},[76,6359,628],{"class":93},[76,6361,6362],{"class":86}," venv",[76,6364,6365],{"class":86}," .venv\n",[76,6367,6368,6371],{"class":78,"line":90},[76,6369,6370],{"class":93},"source",[76,6372,6373],{"class":86}," .venv\u002Fbin\u002Factivate\n",[76,6375,6376,6378],{"class":78,"line":99},[76,6377,408],{"class":82},[76,6379,599],{"class":93},[76,6381,6382,6384,6386,6388],{"class":78,"line":105},[76,6383,408],{"class":82},[76,6385,628],{"class":93},[76,6387,631],{"class":86},[76,6389,599],{"class":93},[76,6391,6392],{"class":78,"line":121},[76,6393,6394],{"class":82},"deactivate\n",[10,6396,129],{},[67,6398,6401],{"className":6399,"code":6400,"language":135,"meta":72},[133],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6402,6400],{"__ignoreMap":72},[10,6404,140],{},[14,6406,143],{"id":143},[145,6408,6409,6418],{},[44,6410,6411,6414,6415,6417],{},[33,6412,6413],{},"venv"," 根据当前 ",[33,6416,124],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[44,6419,6420,6421,2125,6423,6426,6427,3679,6429,6432],{},"激活后 ",[33,6422,408],{},[33,6424,6425],{},"python -m pip"," 优先指向 ",[33,6428,6337],{},[33,6430,6431],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6434,169],{"id":169},[41,6436,6437,6440],{},[44,6438,6439],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[44,6441,3418,6442,6444],{},[33,6443,6337],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6446,186],{"id":186},[145,6448,6449,6455],{},[44,6450,6451,6452,180],{},"创建虚拟环境并记录激活前后的 ",[33,6453,6454],{},"which python",[44,6456,6457],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6459,201],{},[14,6461,204],{"id":204},[10,6463,6464],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6466,1652],{},{"title":72,"searchDepth":90,"depth":90,"links":6468},[6469,6470,6471,6472,6473,6474,6475,6476],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6307,"description":6312},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[222,6484,258],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6487,"title":6488,"body":6489,"category":222,"cover":223,"description":6493,"extension":224,"meta":6681,"navigation":226,"path":6682,"pinned":228,"publishedAt":229,"seo":6683,"slug":6684,"stem":6685,"summary":6686,"tags":6687,"updatedAt":229,"visible":226,"__hash__":6690},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6490,"toc":6671},[6491,6494,6496,6499,6501,6507,6516,6518,6542,6544,6546,6599,6601,6607,6609,6611,6627,6629,6648,6650,6662,6664,6666,6669],[10,6492,6493],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6495,16],{"id":16},[10,6497,6498],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6500,22],{"id":22},[10,6502,6503],{},[26,6504],{"alt":6505,"src":6506},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6508,6509,6512,6513,6515],{},[33,6510,6511],{},"Path"," 使用 ",[33,6514,2385],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6517,39],{"id":39},[41,6519,6520,6523,6535],{},[44,6521,6522],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[44,6524,6525,2206,6528,2206,6531,6534],{},[33,6526,6527],{},"exists()",[33,6529,6530],{},"is_file()",[33,6532,6533],{},"is_dir()"," 检查真实文件系统状态。",[44,6536,6537,6538,6541],{},"创建目录前明确目标；",[33,6539,6540],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6543,62],{"id":62},[10,6545,1431],{},[67,6547,6549],{"className":406,"code":6548,"language":408,"meta":72,"style":72},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[33,6550,6551,6556,6560,6565,6570,6575,6579,6584,6589,6594],{"__ignoreMap":72},[76,6552,6553],{"class":78,"line":79},[76,6554,6555],{},"from pathlib import Path\n",[76,6557,6558],{"class":78,"line":90},[76,6559,1091],{"emptyLinePlaceholder":226},[76,6561,6562],{"class":78,"line":99},[76,6563,6564],{},"project = Path.cwd()\n",[76,6566,6567],{"class":78,"line":105},[76,6568,6569],{},"data_dir = project \u002F \"data\"\n",[76,6571,6572],{"class":78,"line":121},[76,6573,6574],{},"file_path = data_dir \u002F \"records.json\"\n",[76,6576,6577],{"class":78,"line":1143},[76,6578,1091],{"emptyLinePlaceholder":226},[76,6580,6581],{"class":78,"line":2438},[76,6582,6583],{},"print(project)\n",[76,6585,6586],{"class":78,"line":2444},[76,6587,6588],{},"print(file_path.name)\n",[76,6590,6591],{"class":78,"line":3904},[76,6592,6593],{},"print(file_path.suffix)\n",[76,6595,6596],{"class":78,"line":4116},[76,6597,6598],{},"print(file_path.exists())\n",[10,6600,129],{},[67,6602,6605],{"className":6603,"code":6604,"language":135,"meta":72},[133],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6606,6604],{"__ignoreMap":72},[10,6608,140],{},[14,6610,143],{"id":143},[145,6612,6613,6619],{},[44,6614,6615,6618],{},[33,6616,6617],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[44,6620,2288,6621,6623,6624,6626],{},[33,6622,2385],{}," 组合路径片段只创建新的 ",[33,6625,6511],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6628,169],{"id":169},[41,6630,6631,6639],{},[44,6632,3418,6633,6635,6636,6638],{},[33,6634,6511],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6637,6527],{}," 等方法确认。",[44,6640,6641,6642,1002,6644,6647],{},"手工拼接 ",[33,6643,2385],{},[33,6645,6646],{},"\\"," 分隔符，降低跨平台可读性。",[14,6649,186],{"id":186},[145,6651,6652,6659],{},[44,6653,6654,6655,6658],{},"组合 ",[33,6656,6657],{},"output\u002Freport.txt"," 路径但先不创建文件。",[44,6660,6661],{},"输出路径的父目录、文件名和扩展名。",[10,6663,201],{},[14,6665,204],{"id":204},[10,6667,6668],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6670,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":6672},[6673,6674,6675,6676,6677,6678,6679,6680],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6488,"description":6493},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[222,6688,6689],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6692,"title":6693,"body":6694,"category":222,"cover":223,"description":6698,"extension":224,"meta":6876,"navigation":226,"path":6877,"pinned":228,"publishedAt":229,"seo":6878,"slug":6879,"stem":6880,"summary":6881,"tags":6882,"updatedAt":229,"visible":226,"__hash__":6885},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6695,"toc":6866},[6696,6699,6701,6704,6706,6712,6715,6717,6745,6747,6749,6806,6808,6814,6816,6818,6829,6831,6844,6846,6857,6859,6861,6864],[10,6697,6698],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6700,16],{"id":16},[10,6702,6703],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6705,22],{"id":22},[10,6707,6708],{},[26,6709],{"alt":6710,"src":6711},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6713,6714],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6716,39],{"id":39},[41,6718,6719,6725,6734],{},[44,6720,6721,6724],{},[33,6722,6723],{},"w"," 模式会截断原文件，写入前必须确认目标。",[44,6726,6727,6730,6731,180],{},[33,6728,6729],{},"r"," 模式读取不存在文件会产生 ",[33,6732,6733],{},"FileNotFoundError",[44,6735,6736,6737,6740,6741,6744],{},"本篇显式调用 ",[33,6738,6739],{},"close()","；第 34 篇会用 ",[33,6742,6743],{},"with"," 更可靠地管理关闭动作。",[14,6746,62],{"id":62},[10,6748,1431],{},[67,6750,6752],{"className":406,"code":6751,"language":408,"meta":72,"style":72},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[33,6753,6754,6758,6762,6767,6772,6777,6782,6786,6791,6796,6801],{"__ignoreMap":72},[76,6755,6756],{"class":78,"line":79},[76,6757,6555],{},[76,6759,6760],{"class":78,"line":90},[76,6761,1091],{"emptyLinePlaceholder":226},[76,6763,6764],{"class":78,"line":99},[76,6765,6766],{},"file_path = Path(\"notes.txt\")\n",[76,6768,6769],{"class":78,"line":105},[76,6770,6771],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[76,6773,6774],{"class":78,"line":121},[76,6775,6776],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[76,6778,6779],{"class":78,"line":1143},[76,6780,6781],{},"writer.close()\n",[76,6783,6784],{"class":78,"line":2438},[76,6785,1091],{"emptyLinePlaceholder":226},[76,6787,6788],{"class":78,"line":2444},[76,6789,6790],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[76,6792,6793],{"class":78,"line":3904},[76,6794,6795],{},"content = reader.read()\n",[76,6797,6798],{"class":78,"line":4116},[76,6799,6800],{},"reader.close()\n",[76,6802,6803],{"class":78,"line":5781},[76,6804,6805],{},"print(content)\n",[10,6807,129],{},[67,6809,6812],{"className":6810,"code":6811,"language":135,"meta":72},[133],"变量\n循环\n函数\n",[33,6813,6811],{"__ignoreMap":72},[10,6815,140],{},[14,6817,143],{"id":143},[145,6819,6820,6826],{},[44,6821,6822,6823,6825],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6824,6739],{}," 确保缓冲内容交给文件系统。",[44,6827,6828],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6830,169],{"id":169},[41,6832,6833,6838],{},[44,6834,2288,6835,6837],{},[33,6836,6723],{}," 模式打开重要文件却未确认覆盖风险。",[44,6839,6840,6841,180],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6842,6843],{},"encoding=\"utf-8\"",[14,6845,186],{"id":186},[145,6847,6848,6851],{},[44,6849,6850],{},"写入三行学习记录并读取。",[44,6852,6853,6854,6856],{},"改用 ",[33,6855,334],{}," 模式追加一行，确认原内容仍保留。",[10,6858,201],{},[14,6860,204],{"id":204},[10,6862,6863],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,6865,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":6867},[6868,6869,6870,6871,6872,6873,6874,6875],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6693,"description":6698},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[222,6883,6884],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6887,"title":6888,"body":6889,"category":222,"cover":223,"description":6893,"extension":224,"meta":7060,"navigation":226,"path":7061,"pinned":228,"publishedAt":229,"seo":7062,"slug":7063,"stem":7064,"summary":7065,"tags":7066,"updatedAt":229,"visible":226,"__hash__":7069},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6890,"toc":7050},[6891,6894,6896,6899,6901,6907,6917,6919,6933,6935,6937,6997,6999,7005,7007,7009,7021,7023,7031,7033,7041,7043,7045,7048],[10,6892,6893],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6895,16],{"id":16},[10,6897,6898],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6900,22],{"id":22},[10,6902,6903],{},[26,6904],{"alt":6905,"src":6906},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6908,6909,6912,6913,6916],{},[33,6910,6911],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6914,6915],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6918,39],{"id":39},[41,6920,6921,6924,6930],{},[44,6922,6923],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[44,6925,6926,6929],{},[33,6927,6928],{},"ensure_ascii=False"," 让中文以可读字符写入。",[44,6931,6932],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6934,62],{"id":62},[10,6936,1431],{},[67,6938,6940],{"className":406,"code":6939,"language":408,"meta":72,"style":72},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[33,6941,6942,6947,6951,6956,6960,6965,6970,6974,6978,6983,6988,6992],{"__ignoreMap":72},[76,6943,6944],{"class":78,"line":79},[76,6945,6946],{},"import json\n",[76,6948,6949],{"class":78,"line":90},[76,6950,1091],{"emptyLinePlaceholder":226},[76,6952,6953],{"class":78,"line":99},[76,6954,6955],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[76,6957,6958],{"class":78,"line":105},[76,6959,1091],{"emptyLinePlaceholder":226},[76,6961,6962],{"class":78,"line":121},[76,6963,6964],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[76,6966,6967],{"class":78,"line":1143},[76,6968,6969],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[76,6971,6972],{"class":78,"line":2438},[76,6973,6781],{},[76,6975,6976],{"class":78,"line":2444},[76,6977,1091],{"emptyLinePlaceholder":226},[76,6979,6980],{"class":78,"line":3904},[76,6981,6982],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[76,6984,6985],{"class":78,"line":4116},[76,6986,6987],{},"loaded = json.load(reader)\n",[76,6989,6990],{"class":78,"line":5781},[76,6991,6800],{},[76,6993,6994],{"class":78,"line":5786},[76,6995,6996],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6998,129],{},[67,7000,7003],{"className":7001,"code":7002,"language":135,"meta":72},[133],"Python 60\n",[33,7004,7002],{"__ignoreMap":72},[10,7006,140],{},[14,7008,143],{"id":143},[145,7010,7011,7016],{},[44,7012,7013,7015],{},[33,7014,6911],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[44,7017,7018,7020],{},[33,7019,6915],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7022,169],{"id":169},[41,7024,7025,7028],{},[44,7026,7027],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[44,7029,7030],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7032,186],{"id":186},[145,7034,7035,7038],{},[44,7036,7037],{},"保存包含两条学习记录的列表。",[44,7039,7040],{},"读取后修改进度，再重新写回文件。",[10,7042,201],{},[14,7044,204],{"id":204},[10,7046,7047],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7049,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":7051},[7052,7053,7054,7055,7056,7057,7058,7059],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6888,"description":6893},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[222,7067,7068],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7071,"title":7072,"body":7073,"category":222,"cover":223,"description":7077,"extension":224,"meta":7261,"navigation":226,"path":7262,"pinned":228,"publishedAt":229,"seo":7263,"slug":7264,"stem":7265,"summary":7266,"tags":7267,"updatedAt":229,"visible":226,"__hash__":7270},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7074,"toc":7251},[7075,7078,7080,7083,7085,7091,7097,7099,7121,7123,7125,7188,7190,7196,7198,7200,7216,7218,7232,7234,7242,7244,7246,7249],[10,7076,7077],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7079,16],{"id":16},[10,7081,7082],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7084,22],{"id":22},[10,7086,7087],{},[26,7088],{"alt":7089,"src":7090},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7092,7093,7096],{},[33,7094,7095],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7098,39],{"id":39},[41,7100,7101,7111,7118],{},[44,7102,2288,7103,7106,7107,7110],{},[33,7104,7105],{},"newline=\"\""," 让 ",[33,7108,7109],{},"csv"," 模块正确处理换行。",[44,7112,7113,7114,7117],{},"字段顺序由 ",[33,7115,7116],{},"fieldnames"," 决定，字典键需要与字段名一致。",[44,7119,7120],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7122,62],{"id":62},[10,7124,1431],{},[67,7126,7128],{"className":406,"code":7127,"language":408,"meta":72,"style":72},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[33,7129,7130,7135,7139,7144,7149,7154,7159,7164,7168,7173,7178,7183],{"__ignoreMap":72},[76,7131,7132],{"class":78,"line":79},[76,7133,7134],{},"import csv\n",[76,7136,7137],{"class":78,"line":90},[76,7138,1091],{"emptyLinePlaceholder":226},[76,7140,7141],{"class":78,"line":99},[76,7142,7143],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[76,7145,7146],{"class":78,"line":105},[76,7147,7148],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[76,7150,7151],{"class":78,"line":121},[76,7152,7153],{},"writer.writeheader()\n",[76,7155,7156],{"class":78,"line":1143},[76,7157,7158],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[76,7160,7161],{"class":78,"line":2438},[76,7162,7163],{},"writer_file.close()\n",[76,7165,7166],{"class":78,"line":2444},[76,7167,1091],{"emptyLinePlaceholder":226},[76,7169,7170],{"class":78,"line":3904},[76,7171,7172],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[76,7174,7175],{"class":78,"line":4116},[76,7176,7177],{},"for row in csv.DictReader(reader_file):\n",[76,7179,7180],{"class":78,"line":5781},[76,7181,7182],{},"    print(row[\"name\"], row[\"score\"])\n",[76,7184,7185],{"class":78,"line":5786},[76,7186,7187],{},"reader_file.close()\n",[10,7189,129],{},[67,7191,7194],{"className":7192,"code":7193,"language":135,"meta":72},[133],"小郑 95\n",[33,7195,7193],{"__ignoreMap":72},[10,7197,140],{},[14,7199,143],{"id":143},[145,7201,7202,7211],{},[44,7203,7204,7207,7208,7210],{},[33,7205,7206],{},"DictWriter"," 按 ",[33,7209,7116],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[44,7212,7213,7215],{},[33,7214,7095],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7217,169],{"id":169},[41,7219,7220,7223],{},[44,7221,7222],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[44,7224,7225,7226,7228,7229,7231],{},"在 macOS 以外环境忽略 ",[33,7227,7105],{}," 可能出现额外空行；统一交给 ",[33,7230,7109],{}," 模块管理换行。",[14,7233,186],{"id":186},[145,7235,7236,7239],{},[44,7237,7238],{},"写入三名学习者的课程和分数。",[44,7240,7241],{},"读取 CSV 后把分数字符串转换为整数。",[10,7243,201],{},[14,7245,204],{"id":204},[10,7247,7248],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7250,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":7252},[7253,7254,7255,7256,7257,7258,7259,7260],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7072,"description":7077},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[222,7268,7269],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7272,"title":7273,"body":7274,"category":222,"cover":223,"description":7278,"extension":224,"meta":7551,"navigation":226,"path":7552,"pinned":228,"publishedAt":229,"seo":7553,"slug":7554,"stem":7555,"summary":7556,"tags":7557,"updatedAt":229,"visible":226,"__hash__":7560},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7275,"toc":7538},[7276,7279,7281,7284,7286,7292,7303,7305,7322,7324,7326,7401,7403,7409,7411,7413,7438,7440,7449,7455,7466,7468,7474,7480,7489,7491,7506,7508,7529,7531,7533,7536],[10,7277,7278],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7280,16],{"id":16},[10,7282,7283],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7285,22],{"id":22},[10,7287,7288],{},[26,7289],{"alt":7290,"src":7291},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7293,7294,7295,7298,7299,7302],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7296,7297],{},"except","；无论是否异常，",[33,7300,7301],{},"finally"," 都会在离开结构前执行。",[14,7304,39],{"id":39},[41,7306,7307,7313,7319],{},[44,7308,7309,7310,7312],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7311,7297],{}," 吞掉全部错误。",[44,7314,7315,7318],{},[33,7316,7317],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[44,7320,7321],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7323,62],{"id":62},[10,7325,1431],{},[67,7327,7329],{"className":406,"code":7328,"language":408,"meta":72,"style":72},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[33,7330,7331,7336,7341,7346,7351,7356,7360,7365,7370,7375,7380,7384,7389,7395],{"__ignoreMap":72},[76,7332,7333],{"class":78,"line":79},[76,7334,7335],{},"def parse_age(text):\n",[76,7337,7338],{"class":78,"line":90},[76,7339,7340],{},"    age = int(text)\n",[76,7342,7343],{"class":78,"line":99},[76,7344,7345],{},"    if age \u003C 0:\n",[76,7347,7348],{"class":78,"line":105},[76,7349,7350],{},"        raise ValueError(\"年龄不能为负数\")\n",[76,7352,7353],{"class":78,"line":121},[76,7354,7355],{},"    return age\n",[76,7357,7358],{"class":78,"line":1143},[76,7359,1091],{"emptyLinePlaceholder":226},[76,7361,7362],{"class":78,"line":2438},[76,7363,7364],{},"try:\n",[76,7366,7367],{"class":78,"line":2444},[76,7368,7369],{},"    age = parse_age(\"18\")\n",[76,7371,7372],{"class":78,"line":3904},[76,7373,7374],{},"except ValueError as error:\n",[76,7376,7377],{"class":78,"line":4116},[76,7378,7379],{},"    print(\"输入错误：\", error)\n",[76,7381,7382],{"class":78,"line":5781},[76,7383,1140],{},[76,7385,7386],{"class":78,"line":5786},[76,7387,7388],{},"    print(\"年龄：\", age)\n",[76,7390,7392],{"class":78,"line":7391},13,[76,7393,7394],{},"finally:\n",[76,7396,7398],{"class":78,"line":7397},14,[76,7399,7400],{},"    print(\"处理结束\")\n",[10,7402,129],{},[67,7404,7407],{"className":7405,"code":7406,"language":135,"meta":72},[133],"年龄： 18\n处理结束\n",[33,7408,7406],{"__ignoreMap":72},[10,7410,140],{},[14,7412,143],{"id":143},[145,7414,7415,7427],{},[44,7416,7417,7419,7420,7422,7423,7426],{},[33,7418,2987],{}," 或主动 ",[33,7421,7317],{}," 都可能产生 ",[33,7424,7425],{},"ValueError","，控制流立即离开当前正常路径。",[44,7428,7429,7430,7432,7433,7435,7436,180],{},"有异常时进入匹配的 ",[33,7431,7297],{},"；没有异常时执行 ",[33,7434,1154],{},"；两种情况最后都会执行 ",[33,7437,7301],{},[326,7439,2648],{"id":2648},[10,7441,7442,2206,7444,177,7446,7448],{},[33,7443,7297],{},[33,7445,1154],{},[33,7447,7301],{}," 的职责不同，不能只看它们出现的顺序。",[10,7450,7451],{},[26,7452],{"alt":7453,"src":7454},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7456,7457,7459,7460,7462,7463,7465],{},[33,7458,7297],{}," 处理匹配异常，",[33,7461,1154],{}," 只在无异常时运行，",[33,7464,7301],{}," 负责两条路径都需要的清理动作。",[326,7467,2648],{"id":4171},[10,7469,7470,7473],{},[33,7471,7472],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7475,7476],{},[26,7477],{"alt":7478,"src":7479},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7481,7482,7483,7485,7486,7488],{},"只把可能产生预期异常的操作放进 ",[33,7484,7472],{},"，后续正常业务放进 ",[33,7487,1154],{},"，错误边界会更清楚。",[14,7490,169],{"id":169},[41,7492,7493,7500],{},[44,7494,7495,7496,7499],{},"使用裸 ",[33,7497,7498],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[44,7501,7502,7503,7505],{},"把整个程序包在一个巨大 ",[33,7504,7472],{}," 中，无法判断究竟哪一步允许失败。",[14,7507,186],{"id":186},[145,7509,7510,7523],{},[44,7511,7512,7513,7516,7517,177,7520,180],{},"让 ",[33,7514,7515],{},"parse_age"," 分别处理 ",[33,7518,7519],{},"\"abc\"",[33,7521,7522],{},"\"-1\"",[44,7524,7525,7526,7528],{},"为文件读取捕获 ",[33,7527,6733],{}," 并给出清晰提示。",[10,7530,201],{},[14,7532,204],{"id":204},[10,7534,7535],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7537,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":7539},[7540,7541,7542,7543,7544,7548,7549,7550],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":7545},[7546,7547],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7273,"description":7278},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[222,7558,7559],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7562,"title":7563,"body":7564,"category":222,"cover":223,"description":7568,"extension":224,"meta":7744,"navigation":226,"path":7745,"pinned":228,"publishedAt":229,"seo":7746,"slug":7747,"stem":7748,"summary":7749,"tags":7750,"updatedAt":229,"visible":226,"__hash__":7752},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7565,"toc":7734},[7566,7569,7571,7574,7576,7582,7588,7590,7606,7608,7610,7664,7666,7672,7674,7676,7689,7691,7704,7706,7725,7727,7729,7732],[10,7567,7568],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7570,16],{"id":16},[10,7572,7573],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7575,22],{"id":22},[10,7577,7578],{},[26,7579],{"alt":7580,"src":7581},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7583,7584,7585,7587],{},"进入 ",[33,7586,6743],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7589,39],{"id":39},[41,7591,7592,7597,7603],{},[44,7593,7594,7596],{},[33,7595,6743],{}," 把资源获取和释放配成一个清晰边界。",[44,7598,7599,7602],{},[33,7600,7601],{},"as file"," 得到的是上下文返回的资源对象。",[44,7604,7605],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7607,62],{"id":62},[10,7609,1431],{},[67,7611,7613],{"className":406,"code":7612,"language":408,"meta":72,"style":72},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[33,7614,7615,7619,7623,7627,7631,7636,7641,7645,7650,7655,7659],{"__ignoreMap":72},[76,7616,7617],{"class":78,"line":79},[76,7618,6555],{},[76,7620,7621],{"class":78,"line":90},[76,7622,1091],{"emptyLinePlaceholder":226},[76,7624,7625],{"class":78,"line":99},[76,7626,6766],{},[76,7628,7629],{"class":78,"line":105},[76,7630,1091],{"emptyLinePlaceholder":226},[76,7632,7633],{"class":78,"line":121},[76,7634,7635],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[76,7637,7638],{"class":78,"line":1143},[76,7639,7640],{},"    file.write(\"上下文管理器\\n\")\n",[76,7642,7643],{"class":78,"line":2438},[76,7644,1091],{"emptyLinePlaceholder":226},[76,7646,7647],{"class":78,"line":2444},[76,7648,7649],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[76,7651,7652],{"class":78,"line":3904},[76,7653,7654],{},"    print(file.read())\n",[76,7656,7657],{"class":78,"line":4116},[76,7658,1091],{"emptyLinePlaceholder":226},[76,7660,7661],{"class":78,"line":5781},[76,7662,7663],{},"print(file.closed)\n",[10,7665,129],{},[67,7667,7670],{"className":7668,"code":7669,"language":135,"meta":72},[133],"上下文管理器\n\nTrue\n",[33,7671,7669],{"__ignoreMap":72},[10,7673,140],{},[14,7675,143],{"id":143},[145,7677,7678,7686],{},[44,7679,7584,7680,7682,7683,180],{},[33,7681,6743],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7684,7685],{},"file",[44,7687,7688],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7690,169],{"id":169},[41,7692,7693,7698],{},[44,7694,4739,7695,7697],{},[33,7696,6743],{}," 代码块外继续读写已经关闭的文件对象。",[44,7699,7700,7701,7703],{},"误以为 ",[33,7702,6743],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7705,186],{"id":186},[145,7707,7708,7717],{},[44,7709,7710,7711,7714,7715,180],{},"把第 30 篇的手动 ",[33,7712,7713],{},"open\u002Fclose"," 改写为 ",[33,7716,6743],{},[44,7718,4739,7719,7721,7722,180],{},[33,7720,6743],{}," 块后检查 ",[33,7723,7724],{},"file.closed",[10,7726,201],{},[14,7728,204],{"id":204},[10,7730,7731],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7733,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":7735},[7736,7737,7738,7739,7740,7741,7742,7743],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7563,"description":7568},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[222,6743,7751],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7754,"title":7755,"body":7756,"category":222,"cover":223,"description":7760,"extension":224,"meta":7972,"navigation":226,"path":7973,"pinned":228,"publishedAt":229,"seo":7974,"slug":7975,"stem":7976,"summary":7977,"tags":7978,"updatedAt":229,"visible":226,"__hash__":7981},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7757,"toc":7960},[7758,7761,7763,7766,7768,7774,7777,7779,7796,7798,7800,7868,7870,7876,7878,7880,7905,7907,7910,7916,7925,7927,7938,7940,7951,7953,7955,7958],[10,7759,7760],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7762,16],{"id":16},[10,7764,7765],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7767,22],{"id":22},[10,7769,7770],{},[26,7771],{"alt":7772,"src":7773},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7775,7776],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7778,39],{"id":39},[41,7780,7781,7787,7793],{},[44,7782,7783,7786],{},[33,7784,7785],{},"self"," 表示当前实例，由方法调用自动传入。",[44,7788,7789,7792],{},[33,7790,7791],{},"__init__"," 在实例创建过程中初始化属性。",[44,7794,7795],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7797,62],{"id":62},[10,7799,1431],{},[67,7801,7803],{"className":406,"code":7802,"language":408,"meta":72,"style":72},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[33,7804,7805,7810,7815,7820,7825,7829,7834,7839,7844,7849,7853,7858,7863],{"__ignoreMap":72},[76,7806,7807],{"class":78,"line":79},[76,7808,7809],{},"class LearningRecord:\n",[76,7811,7812],{"class":78,"line":90},[76,7813,7814],{},"    def __init__(self, course, progress=0):\n",[76,7816,7817],{"class":78,"line":99},[76,7818,7819],{},"        self.course = course\n",[76,7821,7822],{"class":78,"line":105},[76,7823,7824],{},"        self.progress = progress\n",[76,7826,7827],{"class":78,"line":121},[76,7828,1091],{"emptyLinePlaceholder":226},[76,7830,7831],{"class":78,"line":1143},[76,7832,7833],{},"    def advance(self, amount):\n",[76,7835,7836],{"class":78,"line":2438},[76,7837,7838],{},"        self.progress = self.progress + amount\n",[76,7840,7841],{"class":78,"line":2444},[76,7842,7843],{},"        if self.progress > 100:\n",[76,7845,7846],{"class":78,"line":3904},[76,7847,7848],{},"            self.progress = 100\n",[76,7850,7851],{"class":78,"line":4116},[76,7852,1091],{"emptyLinePlaceholder":226},[76,7854,7855],{"class":78,"line":5781},[76,7856,7857],{},"record = LearningRecord(\"Python\", 40)\n",[76,7859,7860],{"class":78,"line":5786},[76,7861,7862],{},"record.advance(15)\n",[76,7864,7865],{"class":78,"line":7391},[76,7866,7867],{},"print(record.course, record.progress)\n",[10,7869,129],{},[67,7871,7874],{"className":7872,"code":7873,"language":135,"meta":72},[133],"Python 55\n",[33,7875,7873],{"__ignoreMap":72},[10,7877,140],{},[14,7879,143],{"id":143},[145,7881,7882,7892],{},[44,7883,7884,7885,7888,7889,7891],{},"调用 ",[33,7886,7887],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7890,7791],{}," 把课程和进度保存在该实例属性中。",[44,7893,7894,7897,7898,7901,7902,7904],{},[33,7895,7896],{},"record.advance(15)"," 自动把 ",[33,7899,7900],{},"record"," 作为 ",[33,7903,7785],{},"，方法更新同一实例的进度并限制上限。",[326,7906,2648],{"id":2648},[10,7908,7909],{},"类是共同定义，实例则各自保存状态。",[10,7911,7912],{},[26,7913],{"alt":7914,"src":7915},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7917,7918,7919,177,7921,7924],{},"两个实例共享同一套方法定义，但 ",[33,7920,4536],{},[33,7922,7923],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7926,169],{"id":169},[41,7928,7929,7935],{},[44,7930,7931,7932,7934],{},"调用实例方法时手工再传一次 ",[33,7933,7785],{},"。通过实例调用时 Python 会自动绑定。",[44,7936,7937],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7939,186],{"id":186},[145,7941,7942,7948],{},[44,7943,5249,7944,7947],{},[33,7945,7946],{},"Book"," 类，保存标题和阅读页数。",[44,7949,7950],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7952,201],{},[14,7954,204],{"id":204},[10,7956,7957],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,7959,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":7961},[7962,7963,7964,7965,7966,7969,7970,7971],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":7967},[7968],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7755,"description":7760},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[222,7979,7980],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7983,"title":7984,"body":7985,"category":222,"cover":223,"description":7989,"extension":224,"meta":8167,"navigation":226,"path":8168,"pinned":228,"publishedAt":229,"seo":8169,"slug":8170,"stem":8171,"summary":8172,"tags":8173,"updatedAt":229,"visible":226,"__hash__":8176},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7986,"toc":8157},[7987,7990,7992,7995,7997,8003,8006,8008,8019,8021,8023,8090,8092,8098,8100,8102,8121,8123,8131,8133,8148,8150,8152,8155],[10,7988,7989],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7991,16],{"id":16},[10,7993,7994],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7996,22],{"id":22},[10,7998,7999],{},[26,8000],{"alt":8001,"src":8002},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8004,8005],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8007,39],{"id":39},[41,8009,8010,8013,8016],{},[44,8011,8012],{},"封装让对象通过方法维护自己的有效状态。",[44,8014,8015],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[44,8017,8018],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8020,62],{"id":62},[10,8022,1431],{},[67,8024,8026],{"className":406,"code":8025,"language":408,"meta":72,"style":72},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[33,8027,8028,8033,8038,8043,8047,8052,8057,8062,8066,8071,8076,8080,8085],{"__ignoreMap":72},[76,8029,8030],{"class":78,"line":79},[76,8031,8032],{},"class Storage:\n",[76,8034,8035],{"class":78,"line":90},[76,8036,8037],{},"    def save(self, text):\n",[76,8039,8040],{"class":78,"line":99},[76,8041,8042],{},"        print(\"保存：\", text)\n",[76,8044,8045],{"class":78,"line":105},[76,8046,1091],{"emptyLinePlaceholder":226},[76,8048,8049],{"class":78,"line":121},[76,8050,8051],{},"class LearningService:\n",[76,8053,8054],{"class":78,"line":1143},[76,8055,8056],{},"    def __init__(self, storage):\n",[76,8058,8059],{"class":78,"line":2438},[76,8060,8061],{},"        self.storage = storage\n",[76,8063,8064],{"class":78,"line":2444},[76,8065,1091],{"emptyLinePlaceholder":226},[76,8067,8068],{"class":78,"line":3904},[76,8069,8070],{},"    def finish_lesson(self, title):\n",[76,8072,8073],{"class":78,"line":4116},[76,8074,8075],{},"        self.storage.save(title)\n",[76,8077,8078],{"class":78,"line":5781},[76,8079,1091],{"emptyLinePlaceholder":226},[76,8081,8082],{"class":78,"line":5786},[76,8083,8084],{},"service = LearningService(Storage())\n",[76,8086,8087],{"class":78,"line":7391},[76,8088,8089],{},"service.finish_lesson(\"异常处理\")\n",[10,8091,129],{},[67,8093,8096],{"className":8094,"code":8095,"language":135,"meta":72},[133],"保存： 异常处理\n",[33,8097,8095],{"__ignoreMap":72},[10,8099,140],{},[14,8101,143],{"id":143},[145,8103,8104,8114],{},[44,8105,8106,8109,8110,8113],{},[33,8107,8108],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8111,8112],{},"save()"," 的协作对象。",[44,8115,8116,8117,8120],{},"调用业务方法时，服务把保存动作委托给 ",[33,8118,8119],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8122,169],{"id":169},[41,8124,8125,8128],{},[44,8126,8127],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[44,8129,8130],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8132,186],{"id":186},[145,8134,8135,8145],{},[44,8136,8137,8138,8141,8142,180],{},"用组合让 ",[33,8139,8140],{},"OrderService"," 使用一个 ",[33,8143,8144],{},"Notifier",[44,8146,8147],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8149,201],{},[14,8151,204],{"id":204},[10,8153,8154],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8156,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":8158},[8159,8160,8161,8162,8163,8164,8165,8166],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7984,"description":7989},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[222,8174,8175],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8178,"title":8179,"body":8180,"category":222,"cover":223,"description":8184,"extension":224,"meta":8387,"navigation":226,"path":8388,"pinned":228,"publishedAt":229,"seo":8389,"slug":8390,"stem":8391,"summary":8392,"tags":8393,"updatedAt":229,"visible":226,"__hash__":8396},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8181,"toc":8375},[8182,8185,8187,8190,8192,8198,8205,8207,8232,8234,8236,8288,8290,8296,8298,8300,8321,8323,8329,8335,8341,8343,8351,8353,8366,8368,8370,8373],[10,8183,8184],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8186,16],{"id":16},[10,8188,8189],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8191,22],{"id":22},[10,8193,8194],{},[26,8195],{"alt":8196,"src":8197},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8199,8200,8201,8204],{},"生成器运行到 ",[33,8202,8203],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8206,39],{"id":39},[41,8208,8209,8219,8229],{},[44,8210,8211,8214,8215,8218],{},[33,8212,8213],{},"iter()"," 从可迭代对象取得迭代器，",[33,8216,8217],{},"next()"," 请求下一个值。",[44,8220,8221,8222,8225,8226,8228],{},"没有更多值时迭代器抛出 ",[33,8223,8224],{},"StopIteration","，",[33,8227,4290],{}," 会自动处理。",[44,8230,8231],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8233,62],{"id":62},[10,8235,1431],{},[67,8237,8239],{"className":406,"code":8238,"language":408,"meta":72,"style":72},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[33,8240,8241,8246,8251,8256,8261,8266,8270,8275,8280,8284],{"__ignoreMap":72},[76,8242,8243],{"class":78,"line":79},[76,8244,8245],{},"def countdown(start):\n",[76,8247,8248],{"class":78,"line":90},[76,8249,8250],{},"    current = start\n",[76,8252,8253],{"class":78,"line":99},[76,8254,8255],{},"    while current > 0:\n",[76,8257,8258],{"class":78,"line":105},[76,8259,8260],{},"        yield current\n",[76,8262,8263],{"class":78,"line":121},[76,8264,8265],{},"        current = current - 1\n",[76,8267,8268],{"class":78,"line":1143},[76,8269,1091],{"emptyLinePlaceholder":226},[76,8271,8272],{"class":78,"line":2438},[76,8273,8274],{},"iterator = countdown(3)\n",[76,8276,8277],{"class":78,"line":2444},[76,8278,8279],{},"print(next(iterator))\n",[76,8281,8282],{"class":78,"line":3904},[76,8283,8279],{},[76,8285,8286],{"class":78,"line":4116},[76,8287,8279],{},[10,8289,129],{},[67,8291,8294],{"className":8292,"code":8293,"language":135,"meta":72},[133],"3\n2\n1\n",[33,8295,8293],{"__ignoreMap":72},[10,8297,140],{},[14,8299,143],{"id":143},[145,8301,8302,8308],{},[44,8303,7884,8304,8307],{},[33,8305,8306],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[44,8309,8310,8311,8313,8314,8316,8317,8320],{},"每次 ",[33,8312,8217],{}," 运行到下一个 ",[33,8315,8203],{}," 并暂停，局部变量 ",[33,8318,8319],{},"current"," 和执行位置被保留。",[326,8322,2648],{"id":2648},[10,8324,8325,8326,8328],{},"生成器的暂停位置可以展开成多次 ",[33,8327,8217],{}," 的时间线。",[10,8330,8331],{},[26,8332],{"alt":8333,"src":8334},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8336,8337,8338,8340],{},"每次请求只推进到下一个 ",[33,8339,8203],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8342,169],{"id":169},[41,8344,8345,8348],{},[44,8346,8347],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[44,8349,8350],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8352,186],{"id":186},[145,8354,8355,8358],{},[44,8356,8357],{},"编写产生 1 到指定上限偶数的生成器。",[44,8359,3962,8360,8362,8363,8365],{},[33,8361,4290],{}," 遍历生成器，比较手动 ",[33,8364,8217],{}," 的差异。",[10,8367,201],{},[14,8369,204],{"id":204},[10,8371,8372],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8374,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":8376},[8377,8378,8379,8380,8381,8384,8385,8386],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":8382},[8383],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8179,"description":8184},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[222,8394,8395],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8398,"title":8399,"body":8400,"category":222,"cover":223,"description":8404,"extension":224,"meta":8628,"navigation":226,"path":8629,"pinned":228,"publishedAt":229,"seo":8630,"slug":8631,"stem":8632,"summary":8633,"tags":8634,"updatedAt":229,"visible":226,"__hash__":8636},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8401,"toc":8616},[8402,8405,8407,8410,8412,8418,8421,8423,8443,8445,8447,8529,8531,8537,8539,8541,8563,8565,8568,8574,8581,8583,8593,8595,8607,8609,8611,8614],[10,8403,8404],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8406,16],{"id":16},[10,8408,8409],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8411,22],{"id":22},[10,8413,8414],{},[26,8415],{"alt":8416,"src":8417},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8419,8420],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8422,39],{"id":39},[41,8424,8425,8434,8437],{},[44,8426,8427,8430,8431,180],{},[33,8428,8429],{},"@trace"," 等价于 ",[33,8432,8433],{},"add = trace(add)",[44,8435,8436],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[44,8438,8439,8442],{},[33,8440,8441],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8444,62],{"id":62},[10,8446,1431],{},[67,8448,8450],{"className":406,"code":8449,"language":408,"meta":72,"style":72},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[33,8451,8452,8457,8461,8466,8471,8476,8481,8486,8491,8496,8501,8505,8510,8514,8518,8523],{"__ignoreMap":72},[76,8453,8454],{"class":78,"line":79},[76,8455,8456],{},"from functools import wraps\n",[76,8458,8459],{"class":78,"line":90},[76,8460,1091],{"emptyLinePlaceholder":226},[76,8462,8463],{"class":78,"line":99},[76,8464,8465],{},"def trace(function):\n",[76,8467,8468],{"class":78,"line":105},[76,8469,8470],{},"    @wraps(function)\n",[76,8472,8473],{"class":78,"line":121},[76,8474,8475],{},"    def wrapper(*args, **kwargs):\n",[76,8477,8478],{"class":78,"line":1143},[76,8479,8480],{},"        print(\"开始：\", function.__name__)\n",[76,8482,8483],{"class":78,"line":2438},[76,8484,8485],{},"        result = function(*args, **kwargs)\n",[76,8487,8488],{"class":78,"line":2444},[76,8489,8490],{},"        print(\"结束：\", function.__name__)\n",[76,8492,8493],{"class":78,"line":3904},[76,8494,8495],{},"        return result\n",[76,8497,8498],{"class":78,"line":4116},[76,8499,8500],{},"    return wrapper\n",[76,8502,8503],{"class":78,"line":5781},[76,8504,1091],{"emptyLinePlaceholder":226},[76,8506,8507],{"class":78,"line":5786},[76,8508,8509],{},"@trace\n",[76,8511,8512],{"class":78,"line":7391},[76,8513,6134],{},[76,8515,8516],{"class":78,"line":7397},[76,8517,6139],{},[76,8519,8521],{"class":78,"line":8520},15,[76,8522,1091],{"emptyLinePlaceholder":226},[76,8524,8526],{"class":78,"line":8525},16,[76,8527,8528],{},"print(add(2, 3))\n",[10,8530,129],{},[67,8532,8535],{"className":8533,"code":8534,"language":135,"meta":72},[133],"开始： add\n结束： add\n5\n",[33,8536,8534],{"__ignoreMap":72},[10,8538,140],{},[14,8540,143],{"id":143},[145,8542,8543,8560],{},[44,8544,8545,8546,8549,8550,8553,8554,8557,8558,180],{},"解释器执行定义时，把原 ",[33,8547,8548],{},"add"," 函数交给 ",[33,8551,8552],{},"trace","，返回的 ",[33,8555,8556],{},"wrapper"," 重新绑定到名字 ",[33,8559,8548],{},[44,8561,8562],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[326,8564,2648],{"id":2648},[10,8566,8567],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8569,8570],{},[26,8571],{"alt":8572,"src":8573},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8575,8576,8578,8579,180],{},[33,8577,8429],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8580,8433],{},[14,8582,169],{"id":169},[41,8584,8585,8590],{},[44,8586,8587,8588,180],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8589,5332],{},[44,8591,8592],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8594,186],{"id":186},[145,8596,8597,8600],{},[44,8598,8599],{},"编写只记录调用次数的简单装饰器。",[44,8601,8602,8603,8606],{},"删除包装函数的 ",[33,8604,8605],{},"return result","，观察调用方得到什么。",[10,8608,201],{},[14,8610,204],{"id":204},[10,8612,8613],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8615,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":8617},[8618,8619,8620,8621,8622,8625,8626,8627],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":8623},[8624],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8399,"description":8404},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[222,8635,5283],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8638,"title":8639,"body":8640,"category":222,"cover":223,"description":8644,"extension":224,"meta":8831,"navigation":226,"path":8832,"pinned":228,"publishedAt":229,"seo":8833,"slug":8834,"stem":8835,"summary":8836,"tags":8837,"updatedAt":229,"visible":226,"__hash__":8840},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8641,"toc":8819},[8642,8645,8647,8650,8652,8658,8661,8663,8674,8676,8678,8753,8755,8761,8763,8765,8776,8778,8781,8787,8790,8792,8800,8802,8810,8812,8814,8817],[10,8643,8644],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8646,16],{"id":16},[10,8648,8649],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8651,22],{"id":22},[10,8653,8654],{},[26,8655],{"alt":8656,"src":8657},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8659,8660],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8662,39],{"id":39},[41,8664,8665,8668,8671],{},[44,8666,8667],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[44,8669,8670],{},"日志记录运行状态，测试判断结果是否符合约定。",[44,8672,8673],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8675,62],{"id":62},[10,8677,1431],{},[67,8679,8681],{"className":406,"code":8680,"language":408,"meta":72,"style":72},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[33,8682,8683,8688,8693,8697,8702,8706,8711,8716,8721,8725,8730,8735,8740,8744,8748],{"__ignoreMap":72},[76,8684,8685],{"class":78,"line":79},[76,8686,8687],{},"import logging\n",[76,8689,8690],{"class":78,"line":90},[76,8691,8692],{},"import unittest\n",[76,8694,8695],{"class":78,"line":99},[76,8696,1091],{"emptyLinePlaceholder":226},[76,8698,8699],{"class":78,"line":105},[76,8700,8701],{},"logging.basicConfig(level=logging.INFO)\n",[76,8703,8704],{"class":78,"line":121},[76,8705,1091],{"emptyLinePlaceholder":226},[76,8707,8708],{"class":78,"line":1143},[76,8709,8710],{},"def clamp_progress(value):\n",[76,8712,8713],{"class":78,"line":2438},[76,8714,8715],{},"    logging.info(\"检查进度：%s\", value)\n",[76,8717,8718],{"class":78,"line":2444},[76,8719,8720],{},"    return max(0, min(100, value))\n",[76,8722,8723],{"class":78,"line":3904},[76,8724,1091],{"emptyLinePlaceholder":226},[76,8726,8727],{"class":78,"line":4116},[76,8728,8729],{},"class ProgressTest(unittest.TestCase):\n",[76,8731,8732],{"class":78,"line":5781},[76,8733,8734],{},"    def test_upper_limit(self):\n",[76,8736,8737],{"class":78,"line":5786},[76,8738,8739],{},"        self.assertEqual(clamp_progress(120), 100)\n",[76,8741,8742],{"class":78,"line":7391},[76,8743,1091],{"emptyLinePlaceholder":226},[76,8745,8746],{"class":78,"line":7397},[76,8747,6148],{},[76,8749,8750],{"class":78,"line":8520},[76,8751,8752],{},"    unittest.main()\n",[10,8754,129],{},[67,8756,8759],{"className":8757,"code":8758,"language":135,"meta":72},[133],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8760,8758],{"__ignoreMap":72},[10,8762,140],{},[14,8764,143],{"id":143},[145,8766,8767,8773],{},[44,8768,8769,8772],{},[33,8770,8771],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[44,8774,8775],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[326,8777,2648],{"id":2648},[10,8779,8780],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8782,8783],{},[26,8784],{"alt":8785,"src":8786},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8788,8789],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8791,169],{"id":169},[41,8793,8794,8797],{},[44,8795,8796],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[44,8798,8799],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8801,186],{"id":186},[145,8803,8804,8807],{},[44,8805,8806],{},"为负数进度增加测试。",[44,8808,8809],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8811,201],{},[14,8813,204],{"id":204},[10,8815,8816],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,8818,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":8820},[8821,8822,8823,8824,8825,8828,8829,8830],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":8826},[8827],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8639,"description":8644},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[222,8838,8839],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8842,"title":8843,"body":8844,"category":222,"cover":223,"description":8848,"extension":224,"meta":9148,"navigation":226,"path":9149,"pinned":228,"publishedAt":229,"seo":9150,"slug":9151,"stem":9152,"summary":9153,"tags":9154,"updatedAt":229,"visible":226,"__hash__":9157},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8845,"toc":9135},[8846,8849,8851,8854,8856,8862,8865,8867,8882,8884,8886,9033,9035,9041,9043,9045,9058,9060,9063,9069,9072,9074,9077,9083,9090,9092,9103,9105,9126,9128,9130,9133],[10,8847,8848],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8850,16],{"id":16},[10,8852,8853],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8855,22],{"id":22},[10,8857,8858],{},[26,8859],{"alt":8860,"src":8861},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8863,8864],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8866,39],{"id":39},[41,8868,8869,8872,8875],{},[44,8870,8871],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[44,8873,8874],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[44,8876,8877,8878,8881],{},"实际扩展前先为 ",[33,8879,8880],{},"add()"," 和存储边界补充测试。",[14,8883,62],{"id":62},[10,8885,1431],{},[67,8887,8889],{"className":406,"code":8888,"language":408,"meta":72,"style":72},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[33,8890,8891,8895,8899,8903,8908,8913,8918,8923,8927,8932,8937,8942,8947,8952,8956,8961,8966,8972,8977,8983,8988,8993,8999,9005,9011,9016,9022,9027],{"__ignoreMap":72},[76,8892,8893],{"class":78,"line":79},[76,8894,6946],{},[76,8896,8897],{"class":78,"line":90},[76,8898,6555],{},[76,8900,8901],{"class":78,"line":99},[76,8902,1091],{"emptyLinePlaceholder":226},[76,8904,8905],{"class":78,"line":105},[76,8906,8907],{},"class LearningRecords:\n",[76,8909,8910],{"class":78,"line":121},[76,8911,8912],{},"    def __init__(self, file_path):\n",[76,8914,8915],{"class":78,"line":1143},[76,8916,8917],{},"        self.file_path = Path(file_path)\n",[76,8919,8920],{"class":78,"line":2438},[76,8921,8922],{},"        self.items = []\n",[76,8924,8925],{"class":78,"line":2444},[76,8926,1091],{"emptyLinePlaceholder":226},[76,8928,8929],{"class":78,"line":3904},[76,8930,8931],{},"    def add(self, title):\n",[76,8933,8934],{"class":78,"line":4116},[76,8935,8936],{},"        title = title.strip()\n",[76,8938,8939],{"class":78,"line":5781},[76,8940,8941],{},"        if not title:\n",[76,8943,8944],{"class":78,"line":5786},[76,8945,8946],{},"            raise ValueError(\"课程名称不能为空\")\n",[76,8948,8949],{"class":78,"line":7391},[76,8950,8951],{},"        self.items.append({\"title\": title, \"done\": False})\n",[76,8953,8954],{"class":78,"line":7397},[76,8955,1091],{"emptyLinePlaceholder":226},[76,8957,8958],{"class":78,"line":8520},[76,8959,8960],{},"    def save(self):\n",[76,8962,8963],{"class":78,"line":8525},[76,8964,8965],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[76,8967,8969],{"class":78,"line":8968},17,[76,8970,8971],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[76,8973,8975],{"class":78,"line":8974},18,[76,8976,1091],{"emptyLinePlaceholder":226},[76,8978,8980],{"class":78,"line":8979},19,[76,8981,8982],{},"records = LearningRecords(\"learning-records.json\")\n",[76,8984,8986],{"class":78,"line":8985},20,[76,8987,1091],{"emptyLinePlaceholder":226},[76,8989,8991],{"class":78,"line":8990},21,[76,8992,7364],{},[76,8994,8996],{"class":78,"line":8995},22,[76,8997,8998],{},"    title = input(\"输入已学习课程：\")\n",[76,9000,9002],{"class":78,"line":9001},23,[76,9003,9004],{},"    records.add(title)\n",[76,9006,9008],{"class":78,"line":9007},24,[76,9009,9010],{},"    records.save()\n",[76,9012,9014],{"class":78,"line":9013},25,[76,9015,7374],{},[76,9017,9019],{"class":78,"line":9018},26,[76,9020,9021],{},"    print(\"无法保存：\", error)\n",[76,9023,9025],{"class":78,"line":9024},27,[76,9026,1140],{},[76,9028,9030],{"class":78,"line":9029},28,[76,9031,9032],{},"    print(\"已保存 1 条学习记录\")\n",[10,9034,129],{},[67,9036,9039],{"className":9037,"code":9038,"language":135,"meta":72},[133],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9040,9038],{"__ignoreMap":72},[10,9042,140],{},[14,9044,143],{"id":143},[145,9046,9047,9053],{},[44,9048,9049,9050,9052],{},"输入层取得课程名后，",[33,9051,8880],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[44,9054,9055,9057],{},[33,9056,8112],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[326,9059,2648],{"id":2648},[10,9061,9062],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9064,9065],{},[26,9066],{"alt":9067,"src":9068},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9070,9071],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[326,9073,2648],{"id":4171},[10,9075,9076],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9078,9079],{},[26,9080],{"alt":9081,"src":9082},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9084,9085,9086,9089],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9087,9088],{},"load()"," 把文件状态恢复到内存。",[14,9091,169],{"id":169},[41,9093,9094,9097],{},[44,9095,9096],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[44,9098,9099,9100,9102],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9101,9088],{}," 是下一项必要扩展。",[14,9104,186],{"id":186},[145,9106,9107,9113,9116],{},[44,9108,9109,9110,9112],{},"增加 ",[33,9111,9088],{},"，文件不存在时从空列表开始。",[44,9114,9115],{},"增加按序号标记完成的功能，并校验序号范围。",[44,9117,9118,9119,9122,9123,9125],{},"把输入循环放进 ",[33,9120,9121],{},"main()","，通过 ",[33,9124,6090],{}," 控制程序入口。",[10,9127,201],{},[14,9129,204],{"id":204},[10,9131,9132],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[209,9134,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":9136},[9137,9138,9139,9140,9141,9145,9146,9147],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":9142},[9143,9144],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8843,"description":8848},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[222,9155,9156],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9159,9262,9381,9512,9655,9780,9917,10054,10195,10364,10501,10634,10757,10886,11013,11176,11352,11493,11622,11771,11914,12035,12158,12307,12460,12625,12752,12933,13076,13233,13384,13531,13686,13904,14059,14234,14385,14552,14739,14902,15144,15384],{"id":1386,"title":1387,"body":9160,"category":222,"cover":223,"description":1392,"extension":224,"meta":9259,"navigation":226,"path":1513,"pinned":228,"publishedAt":229,"seo":9260,"slug":1515,"stem":1516,"summary":1517,"tags":9261,"updatedAt":229,"visible":226,"__hash__":1520},{"type":7,"value":9161,"toc":9249},[9162,9164,9166,9168,9170,9174,9178,9180,9190,9192,9194,9202,9204,9209,9211,9213,9223,9225,9233,9235,9241,9243,9245,9247],[10,9163,1392],{},[14,9165,16],{"id":16},[10,9167,1397],{},[14,9169,22],{"id":22},[10,9171,9172],{},[26,9173],{"alt":1404,"src":1405},[10,9175,9176,1410],{},[33,9177,1165],{},[14,9179,39],{"id":39},[41,9181,9182,9186,9188],{},[44,9183,1417,9184,1420],{},[33,9185,1165],{},[44,9187,1423],{},[44,9189,1426],{},[14,9191,62],{"id":62},[10,9193,1431],{},[67,9195,9196],{"className":406,"code":1434,"language":408,"meta":72,"style":72},[33,9197,9198],{"__ignoreMap":72},[76,9199,9200],{"class":78,"line":79},[76,9201,1434],{},[10,9203,129],{},[67,9205,9207],{"className":9206,"code":1446,"language":135,"meta":72},[133],[33,9208,1446],{"__ignoreMap":72},[10,9210,140],{},[14,9212,143],{"id":143},[145,9214,9215,9219],{},[44,9216,1457,9217,1461],{},[33,9218,1460],{},[44,9220,1464,9221,1468],{},[33,9222,1467],{},[14,9224,169],{"id":169},[41,9226,9227,9229],{},[44,9228,1475],{},[44,9230,1478,9231,1481],{},[33,9232,1165],{},[14,9234,186],{"id":186},[145,9236,9237,9239],{},[44,9238,1488],{},[44,9240,1491],{},[10,9242,201],{},[14,9244,204],{"id":204},[10,9246,1498],{},[209,9248,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":9250},[9251,9252,9253,9254,9255,9256,9257,9258],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":1387,"description":1392},[222,1382,1519],{"id":1522,"title":1523,"body":9263,"category":222,"cover":223,"description":1528,"extension":224,"meta":9378,"navigation":226,"path":1664,"pinned":228,"publishedAt":229,"seo":9379,"slug":1666,"stem":1667,"summary":1668,"tags":9380,"updatedAt":229,"visible":226,"__hash__":1671},{"type":7,"value":9264,"toc":9368},[9265,9267,9269,9271,9273,9277,9281,9283,9293,9295,9297,9317,9319,9324,9326,9328,9338,9340,9350,9352,9360,9362,9364,9366],[10,9266,1528],{},[14,9268,16],{"id":16},[10,9270,1533],{},[14,9272,22],{"id":22},[10,9274,9275],{},[26,9276],{"alt":1540,"src":1541},[10,9278,1544,9279,1547],{},[33,9280,124],{},[14,9282,39],{"id":39},[41,9284,9285,9287,9289],{},[44,9286,1554],{},[44,9288,1557],{},[44,9290,1560,9291,1564],{},[33,9292,1563],{},[14,9294,62],{"id":62},[10,9296,65],{},[67,9298,9299],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,9300,9301,9307],{"__ignoreMap":72},[76,9302,9303,9305],{"class":78,"line":79},[76,9304,124],{"class":82},[76,9306,599],{"class":93},[76,9308,9309,9311,9313,9315],{"class":78,"line":90},[76,9310,124],{"class":82},[76,9312,628],{"class":93},[76,9314,631],{"class":86},[76,9316,599],{"class":93},[10,9318,129],{},[67,9320,9322],{"className":9321,"code":1594,"language":135,"meta":72},[133],[33,9323,1594],{"__ignoreMap":72},[10,9325,140],{},[14,9327,143],{"id":143},[145,9329,9330,9334],{},[44,9331,9332,1608],{},[33,9333,1607],{},[44,9335,9336,1613],{},[33,9337,692],{},[14,9339,169],{"id":169},[41,9341,9342,9346],{},[44,9343,1620,9344,1623],{},[33,9345,124],{},[44,9347,1626,9348,1629],{},[33,9349,124],{},[14,9351,186],{"id":186},[145,9353,9354,9358],{},[44,9355,931,9356,1639],{},[33,9357,1638],{},[44,9359,1642],{},[10,9361,201],{},[14,9363,204],{"id":204},[10,9365,1649],{},[209,9367,1652],{},{"title":72,"searchDepth":90,"depth":90,"links":9369},[9370,9371,9372,9373,9374,9375,9376,9377],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":1523,"description":1528},[222,1670,1045],{"id":1673,"title":1674,"body":9382,"category":222,"cover":223,"description":1840,"extension":224,"meta":9509,"navigation":226,"path":1842,"pinned":228,"publishedAt":229,"seo":9510,"slug":1844,"stem":1845,"summary":1846,"tags":9511,"updatedAt":229,"visible":226,"__hash__":1850},{"type":7,"value":9383,"toc":9499},[9384,9388,9390,9392,9394,9398,9400,9402,9418,9420,9422,9442,9444,9449,9451,9453,9465,9467,9477,9479,9489,9491,9493,9497],[10,9385,1679,9386,1682],{},[33,9387,1165],{},[14,9389,16],{"id":16},[10,9391,1687],{},[14,9393,22],{"id":22},[10,9395,9396],{},[26,9397],{"alt":1694,"src":1695},[10,9399,1698],{},[14,9401,39],{"id":39},[41,9403,9404,9410,9414],{},[44,9405,1705,9406,1708,9408,180],{},[33,9407,124],{},[33,9409,1711],{},[44,9411,1714,9412,1718],{},[33,9413,1717],{},[44,9415,1721,9416,1724],{},[33,9417,1165],{},[14,9419,62],{"id":62},[10,9421,1431],{},[67,9423,9424],{"className":1731,"code":1732,"language":1733,"meta":72,"style":72},[33,9425,9426,9430,9434,9438],{"__ignoreMap":72},[76,9427,9428],{"class":78,"line":79},[76,9429,1740],{},[76,9431,9432],{"class":78,"line":90},[76,9433,1745],{},[76,9435,9436],{"class":78,"line":99},[76,9437,1750],{},[76,9439,9440],{"class":78,"line":105},[76,9441,1755],{},[10,9443,129],{},[67,9445,9447],{"className":9446,"code":1761,"language":135,"meta":72},[133],[33,9448,1761],{"__ignoreMap":72},[10,9450,140],{},[14,9452,143],{"id":143},[145,9454,9455,9461],{},[44,9456,1772,9457,1776,9459,180],{},[33,9458,1775],{},[33,9460,1779],{},[44,9462,1782,9463,1785],{},[33,9464,1467],{},[14,9466,169],{"id":169},[41,9468,9469,9475],{},[44,9470,1792,9471,1795,9473,1798],{},[33,9472,1711],{},[33,9474,1165],{},[44,9476,1801],{},[14,9478,186],{"id":186},[145,9480,9481,9485],{},[44,9482,1808,9483,180],{},[33,9484,1811],{},[44,9486,1814,9487,1817],{},[33,9488,1467],{},[10,9490,201],{},[14,9492,204],{"id":204},[10,9494,1824,9495,1827],{},[33,9496,1165],{},[209,9498,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":9500},[9501,9502,9503,9504,9505,9506,9507,9508],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":1674,"description":1840},[222,1848,1849],{"id":4,"title":5,"body":9513,"category":222,"cover":223,"description":12,"extension":224,"meta":9652,"navigation":226,"path":227,"pinned":228,"publishedAt":229,"seo":9653,"slug":231,"stem":232,"summary":233,"tags":9654,"updatedAt":229,"visible":226,"__hash__":237},{"type":7,"value":9514,"toc":9642},[9515,9517,9519,9521,9523,9527,9531,9533,9545,9547,9549,9585,9587,9592,9594,9596,9612,9614,9624,9626,9634,9636,9638,9640],[10,9516,12],{},[14,9518,16],{"id":16},[10,9520,19],{},[14,9522,22],{"id":22},[10,9524,9525],{},[26,9526],{"alt":28,"src":29},[10,9528,9529,36],{},[33,9530,35],{},[14,9532,39],{"id":39},[41,9534,9535,9537,9543],{},[44,9536,46],{},[44,9538,9539,52,9541,56],{},[33,9540,51],{},[33,9542,55],{},[44,9544,59],{},[14,9546,62],{"id":62},[10,9548,65],{},[67,9550,9551],{"className":69,"code":70,"language":71,"meta":72,"style":72},[33,9552,9553,9559,9565,9569,9579],{"__ignoreMap":72},[76,9554,9555,9557],{"class":78,"line":79},[76,9556,83],{"class":82},[76,9558,87],{"class":86},[76,9560,9561,9563],{"class":78,"line":90},[76,9562,94],{"class":93},[76,9564,87],{"class":86},[76,9566,9567],{"class":78,"line":99},[76,9568,102],{"class":93},[76,9570,9571,9573,9575,9577],{"class":78,"line":105},[76,9572,108],{"class":93},[76,9574,111],{"class":86},[76,9576,115],{"class":114},[76,9578,118],{"class":86},[76,9580,9581,9583],{"class":78,"line":121},[76,9582,124],{"class":82},[76,9584,118],{"class":86},[10,9586,129],{},[67,9588,9590],{"className":9589,"code":134,"language":135,"meta":72},[133],[33,9591,134],{"__ignoreMap":72},[10,9593,140],{},[14,9595,143],{"id":143},[145,9597,9598,9606],{},[44,9599,9600,151,9602,154,9604,157],{},[33,9601,83],{},[33,9603,94],{},[33,9605,51],{},[44,9607,9608,162,9610,166],{},[33,9609,35],{},[33,9611,165],{},[14,9613,169],{"id":169},[41,9615,9616,9622],{},[44,9617,174,9618,177,9620,180],{},[33,9619,51],{},[33,9621,55],{},[44,9623,183],{},[14,9625,186],{"id":186},[145,9627,9628,9632],{},[44,9629,191,9630,195],{},[33,9631,194],{},[44,9633,198],{},[10,9635,201],{},[14,9637,204],{"id":204},[10,9639,207],{},[209,9641,211],{},{"title":72,"searchDepth":90,"depth":90,"links":9643},[9644,9645,9646,9647,9648,9649,9650,9651],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5,"description":12},[222,235,236],{"id":1995,"title":1996,"body":9656,"category":222,"cover":223,"description":2001,"extension":224,"meta":9777,"navigation":226,"path":2150,"pinned":228,"publishedAt":229,"seo":9778,"slug":2152,"stem":2153,"summary":2154,"tags":9779,"updatedAt":229,"visible":226,"__hash__":2158},{"type":7,"value":9657,"toc":9767},[9658,9660,9662,9664,9666,9670,9678,9680,9694,9696,9698,9714,9716,9721,9723,9725,9739,9741,9747,9749,9759,9761,9763,9765],[10,9659,2001],{},[14,9661,16],{"id":16},[10,9663,2006],{},[14,9665,22],{"id":22},[10,9667,9668],{},[26,9669],{"alt":2013,"src":2014},[10,9671,2017,9672,180,9674,2023,9676,180],{},[33,9673,1467],{},[33,9675,2022],{},[33,9677,1775],{},[14,9679,39],{"id":39},[41,9681,9682,9686,9692],{},[44,9683,9684,2035],{},[33,9685,2034],{},[44,9687,9688,2041,9690,180],{},[33,9689,2040],{},[33,9691,2044],{},[44,9693,2047],{},[14,9695,62],{"id":62},[10,9697,1431],{},[67,9699,9700],{"className":406,"code":2054,"language":408,"meta":72,"style":72},[33,9701,9702,9706,9710],{"__ignoreMap":72},[76,9703,9704],{"class":78,"line":79},[76,9705,2061],{},[76,9707,9708],{"class":78,"line":90},[76,9709,2066],{},[76,9711,9712],{"class":78,"line":99},[76,9713,2071],{},[10,9715,129],{},[67,9717,9719],{"className":9718,"code":2077,"language":135,"meta":72},[133],[33,9720,2077],{"__ignoreMap":72},[10,9722,140],{},[14,9724,143],{"id":143},[145,9726,9727,9733],{},[44,9728,9729,2091,9731,180],{},[33,9730,2090],{},[33,9732,2044],{},[44,9734,9735,2098,9737,2102],{},[33,9736,1467],{},[33,9738,2101],{},[14,9740,169],{"id":169},[41,9742,9743,9745],{},[44,9744,2109],{},[44,9746,2112],{},[14,9748,186],{"id":186},[145,9750,9751,9753],{},[44,9752,2119],{},[44,9754,2122,9755,2125,9757,2129],{},[33,9756,2022],{},[33,9758,2128],{},[10,9760,201],{},[14,9762,204],{"id":204},[10,9764,2136],{},[209,9766,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":9768},[9769,9770,9771,9772,9773,9774,9775,9776],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":1996,"description":2001},[222,2156,2157],{"id":2160,"title":2161,"body":9781,"category":222,"cover":223,"description":2166,"extension":224,"meta":9914,"navigation":226,"path":2334,"pinned":228,"publishedAt":229,"seo":9915,"slug":2336,"stem":2337,"summary":2338,"tags":9916,"updatedAt":229,"visible":226,"__hash__":2342},{"type":7,"value":9782,"toc":9904},[9783,9785,9787,9789,9791,9795,9797,9799,9815,9817,9819,9843,9845,9850,9852,9854,9870,9872,9884,9886,9896,9898,9900,9902],[10,9784,2166],{},[14,9786,16],{"id":16},[10,9788,2171],{},[14,9790,22],{"id":22},[10,9792,9793],{},[26,9794],{"alt":2178,"src":2179},[10,9796,2182],{},[14,9798,39],{"id":39},[41,9800,9801,9803,9809],{},[44,9802,2189],{},[44,9804,2192,9805,2125,9807,2199],{},[33,9806,2195],{},[33,9808,2198],{},[44,9810,2202,9811,2206,9813,2210],{},[33,9812,2205],{},[33,9814,2209],{},[14,9816,62],{"id":62},[10,9818,1431],{},[67,9820,9821],{"className":406,"code":2217,"language":408,"meta":72,"style":72},[33,9822,9823,9827,9831,9835,9839],{"__ignoreMap":72},[76,9824,9825],{"class":78,"line":79},[76,9826,2224],{},[76,9828,9829],{"class":78,"line":90},[76,9830,2229],{},[76,9832,9833],{"class":78,"line":99},[76,9834,1091],{"emptyLinePlaceholder":226},[76,9836,9837],{"class":78,"line":105},[76,9838,2238],{},[76,9840,9841],{"class":78,"line":121},[76,9842,2229],{},[10,9844,129],{},[67,9846,9848],{"className":9847,"code":2248,"language":135,"meta":72},[133],[33,9849,2248],{"__ignoreMap":72},[10,9851,140],{},[14,9853,143],{"id":143},[145,9855,9856,9862],{},[44,9857,931,9858,2262,9860,2265],{},[33,9859,2261],{},[33,9861,2195],{},[44,9863,931,9864,2271,9866,2275,9868,180],{},[33,9865,2270],{},[33,9867,2274],{},[33,9869,2278],{},[14,9871,169],{"id":169},[41,9873,9874,9876],{},[44,9875,2285],{},[44,9877,2288,9878,2206,9880,2206,9882,2296],{},[33,9879,2205],{},[33,9881,2209],{},[33,9883,2295],{},[14,9885,186],{"id":186},[145,9887,9888,9894],{},[44,9889,2303,9890,177,9892,2310],{},[33,9891,2306],{},[33,9893,2309],{},[44,9895,2313],{},[10,9897,201],{},[14,9899,204],{"id":204},[10,9901,2320],{},[209,9903,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":9905},[9906,9907,9908,9909,9910,9911,9912,9913],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":2161,"description":2166},[222,2340,2341],{"id":2344,"title":2345,"body":9918,"category":222,"cover":223,"description":2350,"extension":224,"meta":10051,"navigation":226,"path":2517,"pinned":228,"publishedAt":229,"seo":10052,"slug":2519,"stem":2520,"summary":2521,"tags":10053,"updatedAt":229,"visible":226,"__hash__":2525},{"type":7,"value":9919,"toc":10041},[9920,9922,9924,9926,9928,9932,9934,9936,9954,9956,9958,9994,9996,10001,10003,10005,10015,10017,10025,10027,10033,10035,10037,10039],[10,9921,2350],{},[14,9923,16],{"id":16},[10,9925,2355],{},[14,9927,22],{"id":22},[10,9929,9930],{},[26,9931],{"alt":2362,"src":2363},[10,9933,2366],{},[14,9935,39],{"id":39},[41,9937,9938,9944,9952],{},[44,9939,9940,2376,9942,2380],{},[33,9941,2375],{},[33,9943,2379],{},[44,9945,9946,2386,9948,2390,9950,2394],{},[33,9947,2385],{},[33,9949,2389],{},[33,9951,2393],{},[44,9953,2397],{},[14,9955,62],{"id":62},[10,9957,1431],{},[67,9959,9960],{"className":406,"code":2404,"language":408,"meta":72,"style":72},[33,9961,9962,9966,9970,9974,9978,9982,9986,9990],{"__ignoreMap":72},[76,9963,9964],{"class":78,"line":79},[76,9965,2411],{},[76,9967,9968],{"class":78,"line":90},[76,9969,2416],{},[76,9971,9972],{"class":78,"line":99},[76,9973,2421],{},[76,9975,9976],{"class":78,"line":105},[76,9977,1091],{"emptyLinePlaceholder":226},[76,9979,9980],{"class":78,"line":121},[76,9981,2430],{},[76,9983,9984],{"class":78,"line":1143},[76,9985,2435],{},[76,9987,9988],{"class":78,"line":2438},[76,9989,2441],{},[76,9991,9992],{"class":78,"line":2444},[76,9993,2447],{},[10,9995,129],{},[67,9997,9999],{"className":9998,"code":2453,"language":135,"meta":72},[133],[33,10000,2453],{"__ignoreMap":72},[10,10002,140],{},[14,10004,143],{"id":143},[145,10006,10007,10011],{},[44,10008,10009,2467],{},[33,10010,2466],{},[44,10012,10013,2473],{},[33,10014,2472],{},[14,10016,169],{"id":169},[41,10018,10019,10023],{},[44,10020,2480,10021,180],{},[33,10022,2483],{},[44,10024,2486],{},[14,10026,186],{"id":186},[145,10028,10029,10031],{},[44,10030,2493],{},[44,10032,2496],{},[10,10034,201],{},[14,10036,204],{"id":204},[10,10038,2503],{},[209,10040,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10042},[10043,10044,10045,10046,10047,10048,10049,10050],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":2345,"description":2350},[222,2523,2524],{"id":2527,"title":2528,"body":10055,"category":222,"cover":223,"description":2533,"extension":224,"meta":10192,"navigation":226,"path":2710,"pinned":228,"publishedAt":229,"seo":10193,"slug":2712,"stem":2713,"summary":2714,"tags":10194,"updatedAt":229,"visible":226,"__hash__":2718},{"type":7,"value":10056,"toc":10180},[10057,10059,10061,10063,10065,10069,10075,10077,10085,10087,10089,10113,10115,10120,10122,10124,10142,10144,10146,10150,10152,10154,10160,10162,10172,10174,10176,10178],[10,10058,2533],{},[14,10060,16],{"id":16},[10,10062,2538],{},[14,10064,22],{"id":22},[10,10066,10067],{},[26,10068],{"alt":2545,"src":2546},[10,10070,2549,10071,2553,10073,180],{},[33,10072,2552],{},[33,10074,2556],{},[14,10076,39],{"id":39},[41,10078,10079,10081,10083],{},[44,10080,2563],{},[44,10082,2566],{},[44,10084,2569],{},[14,10086,62],{"id":62},[10,10088,1431],{},[67,10090,10091],{"className":406,"code":2576,"language":408,"meta":72,"style":72},[33,10092,10093,10097,10101,10105,10109],{"__ignoreMap":72},[76,10094,10095],{"class":78,"line":79},[76,10096,2583],{},[76,10098,10099],{"class":78,"line":90},[76,10100,2588],{},[76,10102,10103],{"class":78,"line":99},[76,10104,2593],{},[76,10106,10107],{"class":78,"line":105},[76,10108,2598],{},[76,10110,10111],{"class":78,"line":121},[76,10112,2603],{},[10,10114,129],{},[67,10116,10118],{"className":10117,"code":2609,"language":135,"meta":72},[133],[33,10119,2609],{"__ignoreMap":72},[10,10121,140],{},[14,10123,143],{"id":143},[145,10125,10126,10134],{},[44,10127,2620,10128,2623,10130,2627,10132,2631],{},[33,10129,222],{},[33,10131,2626],{},[33,10133,2630],{},[44,10135,10136,2637,10138,2641,10140,2645],{},[33,10137,2636],{},[33,10139,2640],{},[33,10141,2644],{},[326,10143,2648],{"id":2648},[10,10145,2651],{},[10,10147,10148],{},[26,10149],{"alt":2656,"src":2657},[10,10151,2660],{},[14,10153,169],{"id":169},[41,10155,10156,10158],{},[44,10157,2667],{},[44,10159,2670],{},[14,10161,186],{"id":186},[145,10163,10164,10170],{},[44,10165,2677,10166,2681,10168,180],{},[33,10167,2680],{},[33,10169,2684],{},[44,10171,2687],{},[10,10173,201],{},[14,10175,204],{"id":204},[10,10177,2694],{},[209,10179,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10181},[10182,10183,10184,10185,10186,10189,10190,10191],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":10187},[10188],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":2528,"description":2533},[222,2716,2717],{"id":2720,"title":2721,"body":10196,"category":222,"cover":223,"description":2726,"extension":224,"meta":10361,"navigation":226,"path":2941,"pinned":228,"publishedAt":229,"seo":10362,"slug":2943,"stem":2944,"summary":2945,"tags":10363,"updatedAt":229,"visible":226,"__hash__":2949},{"type":7,"value":10197,"toc":10349},[10198,10200,10202,10204,10206,10210,10216,10218,10238,10240,10242,10278,10280,10285,10287,10289,10303,10305,10307,10311,10317,10319,10329,10331,10341,10343,10345,10347],[10,10199,2726],{},[14,10201,16],{"id":16},[10,10203,2731],{},[14,10205,22],{"id":22},[10,10207,10208],{},[26,10209],{"alt":2738,"src":2739},[10,10211,2742,10212,1002,10214,2749],{},[33,10213,2745],{},[33,10215,2748],{},[14,10217,39],{"id":39},[41,10219,10220,10228,10236],{},[44,10221,10222,2759,10224,2763,10226,2767],{},[33,10223,2758],{},[33,10225,2762],{},[33,10227,2766],{},[44,10229,10230,2773,10232,2777,10234,2781],{},[33,10231,2772],{},[33,10233,2776],{},[33,10235,2780],{},[44,10237,2784],{},[14,10239,62],{"id":62},[10,10241,1431],{},[67,10243,10244],{"className":406,"code":2791,"language":408,"meta":72,"style":72},[33,10245,10246,10250,10254,10258,10262,10266,10270,10274],{"__ignoreMap":72},[76,10247,10248],{"class":78,"line":79},[76,10249,2798],{},[76,10251,10252],{"class":78,"line":90},[76,10253,2803],{},[76,10255,10256],{"class":78,"line":99},[76,10257,1091],{"emptyLinePlaceholder":226},[76,10259,10260],{"class":78,"line":105},[76,10261,2812],{},[76,10263,10264],{"class":78,"line":121},[76,10265,2817],{},[76,10267,10268],{"class":78,"line":1143},[76,10269,2822],{},[76,10271,10272],{"class":78,"line":2438},[76,10273,2827],{},[76,10275,10276],{"class":78,"line":2444},[76,10277,2832],{},[10,10279,129],{},[67,10281,10283],{"className":10282,"code":2838,"language":135,"meta":72},[133],[33,10284,2838],{"__ignoreMap":72},[10,10286,140],{},[14,10288,143],{"id":143},[145,10290,10291,10297],{},[44,10292,10293,2852,10295,2856],{},[33,10294,2851],{},[33,10296,2855],{},[44,10298,10299,2862,10301,2865],{},[33,10300,2861],{},[33,10302,2780],{},[326,10304,2648],{"id":2648},[10,10306,2870],{},[10,10308,10309],{},[26,10310],{"alt":2875,"src":2876},[10,10312,10313,2881,10315,2884],{},[33,10314,2772],{},[33,10316,2776],{},[14,10318,169],{"id":169},[41,10320,10321,10327],{},[44,10322,2891,10323,2894,10325,2897],{},[33,10324,2766],{},[33,10326,2758],{},[44,10328,2900],{},[14,10330,186],{"id":186},[145,10332,10333,10337],{},[44,10334,2907,10335,2911],{},[33,10336,2910],{},[44,10338,2914,10339,2918],{},[33,10340,2917],{},[10,10342,201],{},[14,10344,204],{"id":204},[10,10346,2925],{},[209,10348,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10350},[10351,10352,10353,10354,10355,10358,10359,10360],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":10356},[10357],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":2721,"description":2726},[222,2947,2948],{"id":2951,"title":2952,"body":10365,"category":222,"cover":223,"description":2957,"extension":224,"meta":10498,"navigation":226,"path":3126,"pinned":228,"publishedAt":229,"seo":10499,"slug":3128,"stem":3129,"summary":3130,"tags":10500,"updatedAt":229,"visible":226,"__hash__":3133},{"type":7,"value":10366,"toc":10488},[10367,10369,10371,10373,10375,10379,10389,10391,10401,10403,10405,10433,10435,10440,10442,10444,10458,10460,10468,10470,10480,10482,10484,10486],[10,10368,2957],{},[14,10370,16],{"id":16},[10,10372,2962],{},[14,10374,22],{"id":22},[10,10376,10377],{},[26,10378],{"alt":2969,"src":2970},[10,10380,10381,2976,10383,2980,10385,2984,10387,2988],{},[33,10382,2975],{},[33,10384,2979],{},[33,10386,2983],{},[33,10388,2987],{},[14,10390,39],{"id":39},[41,10392,10393,10395,10399],{},[44,10394,2995],{},[44,10396,10397,3000],{},[33,10398,2987],{},[44,10400,3003],{},[14,10402,62],{"id":62},[10,10404,1431],{},[67,10406,10407],{"className":406,"code":3010,"language":408,"meta":72,"style":72},[33,10408,10409,10413,10417,10421,10425,10429],{"__ignoreMap":72},[76,10410,10411],{"class":78,"line":79},[76,10412,3017],{},[76,10414,10415],{"class":78,"line":90},[76,10416,3022],{},[76,10418,10419],{"class":78,"line":99},[76,10420,3027],{},[76,10422,10423],{"class":78,"line":105},[76,10424,1091],{"emptyLinePlaceholder":226},[76,10426,10427],{"class":78,"line":121},[76,10428,3036],{},[76,10430,10431],{"class":78,"line":1143},[76,10432,3041],{},[10,10434,129],{},[67,10436,10438],{"className":10437,"code":3047,"language":135,"meta":72},[133],[33,10439,3047],{"__ignoreMap":72},[10,10441,140],{},[14,10443,143],{"id":143},[145,10445,10446,10452],{},[44,10447,3058,10448,3061,10450,3065],{},[33,10449,2975],{},[33,10451,3064],{},[44,10453,10454,3071,10456,3075],{},[33,10455,3070],{},[33,10457,3074],{},[14,10459,169],{"id":169},[41,10461,10462,10466],{},[44,10463,3082,10464,3086],{},[33,10465,3085],{},[44,10467,3089],{},[14,10469,186],{"id":186},[145,10471,10472,10474],{},[44,10473,3096],{},[44,10475,1714,10476,3102,10478,3105],{},[33,10477,3101],{},[33,10479,2987],{},[10,10481,201],{},[14,10483,204],{"id":204},[10,10485,3112],{},[209,10487,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10489},[10490,10491,10492,10493,10494,10495,10496,10497],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":2952,"description":2957},[222,2295,3132],{"id":3135,"title":3136,"body":10502,"category":222,"cover":223,"description":3141,"extension":224,"meta":10631,"navigation":226,"path":3302,"pinned":228,"publishedAt":229,"seo":10632,"slug":3304,"stem":3305,"summary":3306,"tags":10633,"updatedAt":229,"visible":226,"__hash__":3310},{"type":7,"value":10503,"toc":10621},[10504,10506,10508,10510,10512,10516,10520,10522,10532,10534,10536,10568,10570,10575,10577,10579,10591,10593,10603,10605,10613,10615,10617,10619],[10,10505,3141],{},[14,10507,16],{"id":16},[10,10509,3146],{},[14,10511,22],{"id":22},[10,10513,10514],{},[26,10515],{"alt":3153,"src":3154},[10,10517,3157,10518,3161],{},[33,10519,3160],{},[14,10521,39],{"id":39},[41,10523,10524,10526,10528],{},[44,10525,3168],{},[44,10527,3171],{},[44,10529,3174,10530,180],{},[33,10531,3177],{},[14,10533,62],{"id":62},[10,10535,1431],{},[67,10537,10538],{"className":406,"code":3184,"language":408,"meta":72,"style":72},[33,10539,10540,10544,10548,10552,10556,10560,10564],{"__ignoreMap":72},[76,10541,10542],{"class":78,"line":79},[76,10543,3191],{},[76,10545,10546],{"class":78,"line":90},[76,10547,3196],{},[76,10549,10550],{"class":78,"line":99},[76,10551,1091],{"emptyLinePlaceholder":226},[76,10553,10554],{"class":78,"line":105},[76,10555,3205],{},[76,10557,10558],{"class":78,"line":121},[76,10559,3210],{},[76,10561,10562],{"class":78,"line":1143},[76,10563,3215],{},[76,10565,10566],{"class":78,"line":2438},[76,10567,3220],{},[10,10569,129],{},[67,10571,10573],{"className":10572,"code":3226,"language":135,"meta":72},[133],[33,10574,3226],{"__ignoreMap":72},[10,10576,140],{},[14,10578,143],{"id":143},[145,10580,10581,10583],{},[44,10582,3237],{},[44,10584,10585,3243,10587,3247,10589,3251],{},[33,10586,3242],{},[33,10588,3246],{},[33,10590,3250],{},[14,10592,169],{"id":169},[41,10594,10595,10601],{},[44,10596,3258,10597,3262,10599,180],{},[33,10598,3261],{},[33,10600,3265],{},[44,10602,3268],{},[14,10604,186],{"id":186},[145,10606,10607,10609],{},[44,10608,3275],{},[44,10610,3278,10611,3281],{},[33,10612,3250],{},[10,10614,201],{},[14,10616,204],{"id":204},[10,10618,3288],{},[209,10620,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10622},[10623,10624,10625,10626,10627,10628,10629,10630],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":3136,"description":3141},[222,3308,3309],{"id":3312,"title":3313,"body":10635,"category":222,"cover":223,"description":3318,"extension":224,"meta":10754,"navigation":226,"path":3460,"pinned":228,"publishedAt":229,"seo":10755,"slug":3462,"stem":3463,"summary":3464,"tags":10756,"updatedAt":229,"visible":226,"__hash__":3467},{"type":7,"value":10636,"toc":10744},[10637,10639,10641,10643,10645,10649,10651,10653,10661,10663,10665,10693,10695,10700,10702,10704,10714,10716,10724,10726,10736,10738,10740,10742],[10,10638,3318],{},[14,10640,16],{"id":16},[10,10642,3323],{},[14,10644,22],{"id":22},[10,10646,10647],{},[26,10648],{"alt":3330,"src":3331},[10,10650,3334],{},[14,10652,39],{"id":39},[41,10654,10655,10657,10659],{},[44,10656,3341],{},[44,10658,3344],{},[44,10660,3347],{},[14,10662,62],{"id":62},[10,10664,1431],{},[67,10666,10667],{"className":406,"code":3354,"language":408,"meta":72,"style":72},[33,10668,10669,10673,10677,10681,10685,10689],{"__ignoreMap":72},[76,10670,10671],{"class":78,"line":79},[76,10672,3361],{},[76,10674,10675],{"class":78,"line":90},[76,10676,3366],{},[76,10678,10679],{"class":78,"line":99},[76,10680,3371],{},[76,10682,10683],{"class":78,"line":105},[76,10684,1091],{"emptyLinePlaceholder":226},[76,10686,10687],{"class":78,"line":121},[76,10688,3380],{},[76,10690,10691],{"class":78,"line":1143},[76,10692,3385],{},[10,10694,129],{},[67,10696,10698],{"className":10697,"code":3391,"language":135,"meta":72},[133],[33,10699,3391],{"__ignoreMap":72},[10,10701,140],{},[14,10703,143],{"id":143},[145,10705,10706,10710],{},[44,10707,10708,3405],{},[33,10709,3404],{},[44,10711,10712,3411],{},[33,10713,3410],{},[14,10715,169],{"id":169},[41,10717,10718,10722],{},[44,10719,3418,10720,3422],{},[33,10721,3421],{},[44,10723,3425],{},[14,10725,186],{"id":186},[145,10727,10728,10730],{},[44,10729,3432],{},[44,10731,2122,10732,2125,10734,3439],{},[33,10733,3421],{},[33,10735,3410],{},[10,10737,201],{},[14,10739,204],{"id":204},[10,10741,3446],{},[209,10743,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10745},[10746,10747,10748,10749,10750,10751,10752,10753],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":3313,"description":3318},[222,3466,3309],{"id":3469,"title":3470,"body":10758,"category":222,"cover":223,"description":3475,"extension":224,"meta":10883,"navigation":226,"path":3631,"pinned":228,"publishedAt":229,"seo":10884,"slug":3633,"stem":3634,"summary":3635,"tags":10885,"updatedAt":229,"visible":226,"__hash__":3638},{"type":7,"value":10759,"toc":10873},[10760,10762,10764,10766,10768,10772,10778,10780,10790,10792,10794,10822,10824,10829,10831,10833,10843,10845,10857,10859,10865,10867,10869,10871],[10,10761,3475],{},[14,10763,16],{"id":16},[10,10765,3480],{},[14,10767,22],{"id":22},[10,10769,10770],{},[26,10771],{"alt":3487,"src":3488},[10,10773,3491,10774,3495,10776,3498],{},[33,10775,3494],{},[33,10777,2195],{},[14,10779,39],{"id":39},[41,10781,10782,10784,10788],{},[44,10783,3505],{},[44,10785,2288,10786,3511],{},[33,10787,3510],{},[44,10789,3514],{},[14,10791,62],{"id":62},[10,10793,1431],{},[67,10795,10796],{"className":406,"code":3521,"language":408,"meta":72,"style":72},[33,10797,10798,10802,10806,10810,10814,10818],{"__ignoreMap":72},[76,10799,10800],{"class":78,"line":79},[76,10801,3528],{},[76,10803,10804],{"class":78,"line":90},[76,10805,3533],{},[76,10807,10808],{"class":78,"line":99},[76,10809,1091],{"emptyLinePlaceholder":226},[76,10811,10812],{"class":78,"line":105},[76,10813,3542],{},[76,10815,10816],{"class":78,"line":121},[76,10817,3547],{},[76,10819,10820],{"class":78,"line":1143},[76,10821,3552],{},[10,10823,129],{},[67,10825,10827],{"className":10826,"code":3558,"language":135,"meta":72},[133],[33,10828,3558],{"__ignoreMap":72},[10,10830,140],{},[14,10832,143],{"id":143},[145,10834,10835,10837],{},[44,10836,3569],{},[44,10838,3572,10839,3575,10841,3579],{},[33,10840,2195],{},[33,10842,3578],{},[14,10844,169],{"id":169},[41,10846,10847,10851],{},[44,10848,3586,10849,3590],{},[33,10850,3589],{},[44,10852,3593,10853,3597,10855,180],{},[33,10854,3596],{},[33,10856,3600],{},[14,10858,186],{"id":186},[145,10860,10861,10863],{},[44,10862,3607],{},[44,10864,3610],{},[10,10866,201],{},[14,10868,204],{"id":204},[10,10870,3617],{},[209,10872,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":10874},[10875,10876,10877,10878,10879,10880,10881,10882],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":3470,"description":3475},[222,3637,3309],{"id":3640,"title":3641,"body":10887,"category":222,"cover":223,"description":3646,"extension":224,"meta":11010,"navigation":226,"path":3796,"pinned":228,"publishedAt":229,"seo":11011,"slug":3798,"stem":3799,"summary":3800,"tags":11012,"updatedAt":229,"visible":226,"__hash__":3803},{"type":7,"value":10888,"toc":11000},[10889,10891,10893,10895,10897,10901,10903,10905,10917,10919,10921,10949,10951,10956,10958,10960,10970,10972,10982,10984,10992,10994,10996,10998],[10,10890,3646],{},[14,10892,16],{"id":16},[10,10894,3651],{},[14,10896,22],{"id":22},[10,10898,10899],{},[26,10900],{"alt":3658,"src":3659},[10,10902,3662],{},[14,10904,39],{"id":39},[41,10906,10907,10909,10911],{},[44,10908,3669],{},[44,10910,3672],{},[44,10912,3675,10913,3679,10915,3683],{},[33,10914,3678],{},[33,10916,3682],{},[14,10918,62],{"id":62},[10,10920,1431],{},[67,10922,10923],{"className":406,"code":3690,"language":408,"meta":72,"style":72},[33,10924,10925,10929,10933,10937,10941,10945],{"__ignoreMap":72},[76,10926,10927],{"class":78,"line":79},[76,10928,3697],{},[76,10930,10931],{"class":78,"line":90},[76,10932,3702],{},[76,10934,10935],{"class":78,"line":99},[76,10936,1091],{"emptyLinePlaceholder":226},[76,10938,10939],{"class":78,"line":105},[76,10940,3711],{},[76,10942,10943],{"class":78,"line":121},[76,10944,3716],{},[76,10946,10947],{"class":78,"line":1143},[76,10948,3721],{},[10,10950,129],{},[67,10952,10954],{"className":10953,"code":3727,"language":135,"meta":72},[133],[33,10955,3727],{"__ignoreMap":72},[10,10957,140],{},[14,10959,143],{"id":143},[145,10961,10962,10964],{},[44,10963,3738],{},[44,10965,10966,3744,10968,3748],{},[33,10967,3743],{},[33,10969,3747],{},[14,10971,169],{"id":169},[41,10973,10974,10980],{},[44,10975,2288,10976,3757,10978,180],{},[33,10977,3682],{},[33,10979,3678],{},[44,10981,3762],{},[14,10983,186],{"id":186},[145,10985,10986,10990],{},[44,10987,3769,10988,3772],{},[33,10989,3678],{},[44,10991,3775],{},[10,10993,201],{},[14,10995,204],{"id":204},[10,10997,3782],{},[209,10999,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11001},[11002,11003,11004,11005,11006,11007,11008,11009],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":3641,"description":3646},[222,3802,3309],{"id":3805,"title":3806,"body":11014,"category":222,"cover":223,"description":3811,"extension":224,"meta":11173,"navigation":226,"path":4010,"pinned":228,"publishedAt":229,"seo":11174,"slug":4012,"stem":4013,"summary":4014,"tags":11175,"updatedAt":229,"visible":226,"__hash__":4018},{"type":7,"value":11015,"toc":11161},[11016,11018,11020,11022,11024,11028,11034,11036,11048,11050,11052,11092,11094,11099,11101,11103,11117,11119,11121,11125,11127,11129,11139,11141,11153,11155,11157,11159],[10,11017,3811],{},[14,11019,16],{"id":16},[10,11021,3816],{},[14,11023,22],{"id":22},[10,11025,11026],{},[26,11027],{"alt":3823,"src":3824},[10,11029,11030,3830,11032,3834],{},[33,11031,3829],{},[33,11033,3833],{},[14,11035,39],{"id":39},[41,11037,11038,11044,11046],{},[44,11039,11040,3843,11042,3847],{},[33,11041,2758],{},[33,11043,3846],{},[44,11045,3850],{},[44,11047,3853],{},[14,11049,62],{"id":62},[10,11051,1431],{},[67,11053,11054],{"className":406,"code":3860,"language":408,"meta":72,"style":72},[33,11055,11056,11060,11064,11068,11072,11076,11080,11084,11088],{"__ignoreMap":72},[76,11057,11058],{"class":78,"line":79},[76,11059,3867],{},[76,11061,11062],{"class":78,"line":90},[76,11063,3872],{},[76,11065,11066],{"class":78,"line":99},[76,11067,3877],{},[76,11069,11070],{"class":78,"line":105},[76,11071,1091],{"emptyLinePlaceholder":226},[76,11073,11074],{"class":78,"line":121},[76,11075,3886],{},[76,11077,11078],{"class":78,"line":1143},[76,11079,3891],{},[76,11081,11082],{"class":78,"line":2438},[76,11083,3896],{},[76,11085,11086],{"class":78,"line":2444},[76,11087,3901],{},[76,11089,11090],{"class":78,"line":3904},[76,11091,3907],{},[10,11093,129],{},[67,11095,11097],{"className":11096,"code":3913,"language":135,"meta":72},[133],[33,11098,3913],{"__ignoreMap":72},[10,11100,140],{},[14,11102,143],{"id":143},[145,11104,11105,11109],{},[44,11106,11107,3927],{},[33,11108,3926],{},[44,11110,11111,3933,11113,3937,11115,3941],{},[33,11112,3932],{},[33,11114,3936],{},[33,11116,3940],{},[326,11118,2648],{"id":2648},[10,11120,3946],{},[10,11122,11123],{},[26,11124],{"alt":3951,"src":3952},[10,11126,3955],{},[14,11128,169],{"id":169},[41,11130,11131,11137],{},[44,11132,3962,11133,3965,11135,180],{},[33,11134,2758],{},[33,11136,3846],{},[44,11138,3970],{},[14,11140,186],{"id":186},[145,11142,11143,11145],{},[44,11144,3977],{},[44,11146,2288,11147,3983,11149,177,11151,180],{},[33,11148,3982],{},[33,11150,3846],{},[33,11152,2758],{},[10,11154,201],{},[14,11156,204],{"id":204},[10,11158,3994],{},[209,11160,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11162},[11163,11164,11165,11166,11167,11170,11171,11172],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":11168},[11169],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":3806,"description":3811},[222,4016,4017],{"id":4020,"title":4021,"body":11177,"category":222,"cover":223,"description":4026,"extension":224,"meta":11349,"navigation":226,"path":4240,"pinned":228,"publishedAt":229,"seo":11350,"slug":4242,"stem":4243,"summary":4244,"tags":11351,"updatedAt":229,"visible":226,"__hash__":4247},{"type":7,"value":11178,"toc":11336},[11179,11181,11183,11185,11187,11191,11199,11201,11209,11211,11213,11257,11259,11264,11266,11268,11280,11282,11284,11288,11294,11296,11298,11302,11306,11308,11320,11322,11328,11330,11332,11334],[10,11180,4026],{},[14,11182,16],{"id":16},[10,11184,4031],{},[14,11186,22],{"id":22},[10,11188,11189],{},[26,11190],{"alt":4038,"src":4039},[10,11192,11193,2206,11195,2206,11197,4049],{},[33,11194,1151],{},[33,11196,4046],{},[33,11198,1154],{},[14,11200,39],{"id":39},[41,11202,11203,11205,11207],{},[44,11204,4056],{},[44,11206,4059],{},[44,11208,4062],{},[14,11210,62],{"id":62},[10,11212,1431],{},[67,11214,11215],{"className":406,"code":4069,"language":408,"meta":72,"style":72},[33,11216,11217,11221,11225,11229,11233,11237,11241,11245,11249,11253],{"__ignoreMap":72},[76,11218,11219],{"class":78,"line":79},[76,11220,4076],{},[76,11222,11223],{"class":78,"line":90},[76,11224,1091],{"emptyLinePlaceholder":226},[76,11226,11227],{"class":78,"line":99},[76,11228,4085],{},[76,11230,11231],{"class":78,"line":105},[76,11232,4090],{},[76,11234,11235],{"class":78,"line":121},[76,11236,4095],{},[76,11238,11239],{"class":78,"line":1143},[76,11240,4100],{},[76,11242,11243],{"class":78,"line":2438},[76,11244,1140],{},[76,11246,11247],{"class":78,"line":2444},[76,11248,4109],{},[76,11250,11251],{"class":78,"line":3904},[76,11252,1091],{"emptyLinePlaceholder":226},[76,11254,11255],{"class":78,"line":4116},[76,11256,4119],{},[10,11258,129],{},[67,11260,11262],{"className":11261,"code":4125,"language":135,"meta":72},[133],[33,11263,4125],{"__ignoreMap":72},[10,11265,140],{},[14,11267,143],{"id":143},[145,11269,11270,11274],{},[44,11271,4136,11272,4140],{},[33,11273,4139],{},[44,11275,11276,4146,11278,4149],{},[33,11277,4145],{},[33,11279,1154],{},[326,11281,2648],{"id":2648},[10,11283,4154],{},[10,11285,11286],{},[26,11287],{"alt":4159,"src":4160},[10,11289,11290,4165,11292,4168],{},[33,11291,4139],{},[33,11293,4145],{},[326,11295,2648],{"id":4171},[10,11297,4174],{},[10,11299,11300],{},[26,11301],{"alt":4179,"src":4180},[10,11303,4183,11304,4186],{},[33,11305,1151],{},[14,11307,169],{"id":169},[41,11309,11310,11314],{},[44,11311,4193,11312,4196],{},[33,11313,4145],{},[44,11315,4199,11316,4202,11318,4206],{},[33,11317,1151],{},[33,11319,4205],{},[14,11321,186],{"id":186},[145,11323,11324,11326],{},[44,11325,4213],{},[44,11327,4216],{},[10,11329,201],{},[14,11331,204],{"id":204},[10,11333,4223],{},[209,11335,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11337},[11338,11339,11340,11341,11342,11346,11347,11348],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":11343},[11344,11345],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4021,"description":4026},[222,1151,4246],{"id":4249,"title":4250,"body":11353,"category":222,"cover":223,"description":4255,"extension":224,"meta":11490,"navigation":226,"path":4422,"pinned":228,"publishedAt":229,"seo":11491,"slug":4424,"stem":4425,"summary":4426,"tags":11492,"updatedAt":229,"visible":226,"__hash__":4429},{"type":7,"value":11354,"toc":11478},[11355,11357,11359,11361,11363,11367,11371,11373,11383,11385,11387,11419,11421,11426,11428,11430,11440,11442,11444,11448,11452,11454,11460,11462,11470,11472,11474,11476],[10,11356,4255],{},[14,11358,16],{"id":16},[10,11360,4260],{},[14,11362,22],{"id":22},[10,11364,11365],{},[26,11366],{"alt":4267,"src":4268},[10,11368,11369,4274],{},[33,11370,4273],{},[14,11372,39],{"id":39},[41,11374,11375,11377,11379],{},[44,11376,4281],{},[44,11378,4284],{},[44,11380,4287,11381,4291],{},[33,11382,4290],{},[14,11384,62],{"id":62},[10,11386,1431],{},[67,11388,11389],{"className":406,"code":4298,"language":408,"meta":72,"style":72},[33,11390,11391,11395,11399,11403,11407,11411,11415],{"__ignoreMap":72},[76,11392,11393],{"class":78,"line":79},[76,11394,4305],{},[76,11396,11397],{"class":78,"line":90},[76,11398,1091],{"emptyLinePlaceholder":226},[76,11400,11401],{"class":78,"line":99},[76,11402,4314],{},[76,11404,11405],{"class":78,"line":105},[76,11406,4319],{},[76,11408,11409],{"class":78,"line":121},[76,11410,4324],{},[76,11412,11413],{"class":78,"line":1143},[76,11414,1091],{"emptyLinePlaceholder":226},[76,11416,11417],{"class":78,"line":2438},[76,11418,4333],{},[10,11420,129],{},[67,11422,11424],{"className":11423,"code":4339,"language":135,"meta":72},[133],[33,11425,4339],{"__ignoreMap":72},[10,11427,140],{},[14,11429,143],{"id":143},[145,11431,11432,11436],{},[44,11433,4350,11434,4354],{},[33,11435,4353],{},[44,11437,4357,11438,4360],{},[33,11439,4353],{},[326,11441,2648],{"id":2648},[10,11443,4365],{},[10,11445,11446],{},[26,11447],{"alt":4370,"src":4371},[10,11449,4374,11450,4377],{},[33,11451,4353],{},[14,11453,169],{"id":169},[41,11455,11456,11458],{},[44,11457,4384],{},[44,11459,4387],{},[14,11461,186],{"id":186},[145,11463,11464,11468],{},[44,11465,2288,11466,4396],{},[33,11467,4273],{},[44,11469,4399],{},[10,11471,201],{},[14,11473,204],{"id":204},[10,11475,4406],{},[209,11477,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11479},[11480,11481,11482,11483,11484,11487,11488,11489],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":11485},[11486],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4250,"description":4255},[222,4273,4428],{"id":4431,"title":4432,"body":11494,"category":222,"cover":223,"description":4437,"extension":224,"meta":11619,"navigation":226,"path":4586,"pinned":228,"publishedAt":229,"seo":11620,"slug":4588,"stem":4589,"summary":4590,"tags":11621,"updatedAt":229,"visible":226,"__hash__":4593},{"type":7,"value":11495,"toc":11609},[11496,11498,11500,11502,11504,11508,11512,11514,11524,11526,11528,11560,11562,11567,11569,11571,11583,11585,11591,11593,11601,11603,11605,11607],[10,11497,4437],{},[14,11499,16],{"id":16},[10,11501,4442],{},[14,11503,22],{"id":22},[10,11505,11506],{},[26,11507],{"alt":4449,"src":4450},[10,11509,11510,4455],{},[33,11511,4290],{},[14,11513,39],{"id":39},[41,11515,11516,11520,11522],{},[44,11517,11518,4465],{},[33,11519,4464],{},[44,11521,4468],{},[44,11523,4471],{},[14,11525,62],{"id":62},[10,11527,1431],{},[67,11529,11530],{"className":406,"code":4478,"language":408,"meta":72,"style":72},[33,11531,11532,11536,11540,11544,11548,11552,11556],{"__ignoreMap":72},[76,11533,11534],{"class":78,"line":79},[76,11535,4485],{},[76,11537,11538],{"class":78,"line":90},[76,11539,1091],{"emptyLinePlaceholder":226},[76,11541,11542],{"class":78,"line":99},[76,11543,4494],{},[76,11545,11546],{"class":78,"line":105},[76,11547,4499],{},[76,11549,11550],{"class":78,"line":121},[76,11551,1091],{"emptyLinePlaceholder":226},[76,11553,11554],{"class":78,"line":1143},[76,11555,4508],{},[76,11557,11558],{"class":78,"line":2438},[76,11559,4513],{},[10,11561,129],{},[67,11563,11565],{"className":11564,"code":4519,"language":135,"meta":72},[133],[33,11566,4519],{"__ignoreMap":72},[10,11568,140],{},[14,11570,143],{"id":143},[145,11572,11573,11579],{},[44,11574,4530,11575,4533,11577,4537],{},[33,11576,4290],{},[33,11578,4536],{},[44,11580,11581,4542],{},[33,11582,4464],{},[14,11584,169],{"id":169},[41,11586,11587,11589],{},[44,11588,4549],{},[44,11590,4552],{},[14,11592,186],{"id":186},[145,11594,11595,11597],{},[44,11596,4559],{},[44,11598,2288,11599,4565],{},[33,11600,4564],{},[10,11602,201],{},[14,11604,204],{"id":204},[10,11606,4572],{},[209,11608,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11610},[11611,11612,11613,11614,11615,11616,11617,11618],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4432,"description":4437},[222,4290,4592],{"id":4595,"title":4596,"body":11623,"category":222,"cover":223,"description":4601,"extension":224,"meta":11768,"navigation":226,"path":4776,"pinned":228,"publishedAt":229,"seo":11769,"slug":4778,"stem":4779,"summary":4780,"tags":11770,"updatedAt":229,"visible":226,"__hash__":4782},{"type":7,"value":11624,"toc":11758},[11625,11627,11629,11631,11633,11637,11643,11645,11659,11661,11663,11707,11709,11714,11716,11718,11728,11730,11742,11744,11750,11752,11754,11756],[10,11626,4601],{},[14,11628,16],{"id":16},[10,11630,4606],{},[14,11632,22],{"id":22},[10,11634,11635],{},[26,11636],{"alt":4613,"src":4614},[10,11638,11639,4620,11641,4624],{},[33,11640,4619],{},[33,11642,4623],{},[14,11644,39],{"id":39},[41,11646,11647,11649,11655],{},[44,11648,4631],{},[44,11650,11651,4636,11653,4639],{},[33,11652,4619],{},[33,11654,4273],{},[44,11656,4642,11657,4645],{},[33,11658,4623],{},[14,11660,62],{"id":62},[10,11662,1431],{},[67,11664,11665],{"className":406,"code":4652,"language":408,"meta":72,"style":72},[33,11666,11667,11671,11675,11679,11683,11687,11691,11695,11699,11703],{"__ignoreMap":72},[76,11668,11669],{"class":78,"line":79},[76,11670,4659],{},[76,11672,11673],{"class":78,"line":90},[76,11674,1091],{"emptyLinePlaceholder":226},[76,11676,11677],{"class":78,"line":99},[76,11678,4668],{},[76,11680,11681],{"class":78,"line":105},[76,11682,4673],{},[76,11684,11685],{"class":78,"line":121},[76,11686,4678],{},[76,11688,11689],{"class":78,"line":1143},[76,11690,4683],{},[76,11692,11693],{"class":78,"line":2438},[76,11694,4688],{},[76,11696,11697],{"class":78,"line":2444},[76,11698,4513],{},[76,11700,11701],{"class":78,"line":3904},[76,11702,1091],{"emptyLinePlaceholder":226},[76,11704,11705],{"class":78,"line":4116},[76,11706,4701],{},[10,11708,129],{},[67,11710,11712],{"className":11711,"code":4707,"language":135,"meta":72},[133],[33,11713,4707],{"__ignoreMap":72},[10,11715,140],{},[14,11717,143],{"id":143},[145,11719,11720,11724],{},[44,11721,4718,11722,4721],{},[33,11723,4619],{},[44,11725,4724,11726,4727],{},[33,11727,4623],{},[14,11729,169],{"id":169},[41,11731,11732,11736],{},[44,11733,3418,11734,4736],{},[33,11735,4619],{},[44,11737,4739,11738,4742,11740,4745],{},[33,11739,4273],{},[33,11741,4619],{},[14,11743,186],{"id":186},[145,11745,11746,11748],{},[44,11747,4752],{},[44,11749,4755],{},[10,11751,201],{},[14,11753,204],{"id":204},[10,11755,4762],{},[209,11757,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11759},[11760,11761,11762,11763,11764,11765,11766,11767],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4596,"description":4601},[222,4623,4619],{"id":4784,"title":4785,"body":11772,"category":222,"cover":223,"description":4790,"extension":224,"meta":11911,"navigation":226,"path":4962,"pinned":228,"publishedAt":229,"seo":11912,"slug":4964,"stem":4965,"summary":4966,"tags":11913,"updatedAt":229,"visible":226,"__hash__":4970},{"type":7,"value":11773,"toc":11899},[11774,11776,11778,11780,11782,11786,11788,11790,11806,11808,11810,11838,11840,11845,11847,11849,11861,11863,11865,11869,11871,11873,11883,11885,11891,11893,11895,11897],[10,11775,4790],{},[14,11777,16],{"id":16},[10,11779,4795],{},[14,11781,22],{"id":22},[10,11783,11784],{},[26,11785],{"alt":4802,"src":4803},[10,11787,4806],{},[14,11789,39],{"id":39},[41,11791,11792,11794,11796],{},[44,11793,4813],{},[44,11795,4816],{},[44,11797,4819,11798,2206,11800,4826,11802,2206,11804,180],{},[33,11799,4822],{},[33,11801,4825],{},[33,11803,4829],{},[33,11805,4832],{},[14,11807,62],{"id":62},[10,11809,1431],{},[67,11811,11812],{"className":406,"code":4839,"language":408,"meta":72,"style":72},[33,11813,11814,11818,11822,11826,11830,11834],{"__ignoreMap":72},[76,11815,11816],{"class":78,"line":79},[76,11817,4846],{},[76,11819,11820],{"class":78,"line":90},[76,11821,1091],{"emptyLinePlaceholder":226},[76,11823,11824],{"class":78,"line":99},[76,11825,4855],{},[76,11827,11828],{"class":78,"line":105},[76,11829,4860],{},[76,11831,11832],{"class":78,"line":121},[76,11833,4865],{},[76,11835,11836],{"class":78,"line":1143},[76,11837,4870],{},[10,11839,129],{},[67,11841,11843],{"className":11842,"code":4876,"language":135,"meta":72},[133],[33,11844,4876],{"__ignoreMap":72},[10,11846,140],{},[14,11848,143],{"id":143},[145,11850,11851,11859],{},[44,11852,4887,11853,4890,11855,177,11857,180],{},[33,11854,4822],{},[33,11856,4893],{},[33,11858,4896],{},[44,11860,4899],{},[326,11862,2648],{"id":2648},[10,11864,4904],{},[10,11866,11867],{},[26,11868],{"alt":4909,"src":4910},[10,11870,4913],{},[14,11872,169],{"id":169},[41,11874,11875,11881],{},[44,11876,4920,11877,1002,11879,4926],{},[33,11878,4923],{},[33,11880,4829],{},[44,11882,4929],{},[14,11884,186],{"id":186},[145,11886,11887,11889],{},[44,11888,4936],{},[44,11890,4939],{},[10,11892,201],{},[14,11894,204],{"id":204},[10,11896,4946],{},[209,11898,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":11900},[11901,11902,11903,11904,11905,11908,11909,11910],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":11906},[11907],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4785,"description":4790},[222,4968,4969],{"id":4972,"title":4973,"body":11915,"category":222,"cover":223,"description":4978,"extension":224,"meta":12032,"navigation":226,"path":5117,"pinned":228,"publishedAt":229,"seo":12033,"slug":5119,"stem":5120,"summary":5121,"tags":12034,"updatedAt":229,"visible":226,"__hash__":5125},{"type":7,"value":11916,"toc":12022},[11917,11919,11921,11923,11925,11929,11931,11933,11941,11943,11945,11977,11979,11984,11986,11988,11996,11998,12006,12008,12014,12016,12018,12020],[10,11918,4978],{},[14,11920,16],{"id":16},[10,11922,4983],{},[14,11924,22],{"id":22},[10,11926,11927],{},[26,11928],{"alt":4990,"src":4991},[10,11930,4994],{},[14,11932,39],{"id":39},[41,11934,11935,11937,11939],{},[44,11936,5001],{},[44,11938,5004],{},[44,11940,5007],{},[14,11942,62],{"id":62},[10,11944,1431],{},[67,11946,11947],{"className":406,"code":5014,"language":408,"meta":72,"style":72},[33,11948,11949,11953,11957,11961,11965,11969,11973],{"__ignoreMap":72},[76,11950,11951],{"class":78,"line":79},[76,11952,5021],{},[76,11954,11955],{"class":78,"line":90},[76,11956,1091],{"emptyLinePlaceholder":226},[76,11958,11959],{"class":78,"line":99},[76,11960,5030],{},[76,11962,11963],{"class":78,"line":105},[76,11964,5035],{},[76,11966,11967],{"class":78,"line":121},[76,11968,1091],{"emptyLinePlaceholder":226},[76,11970,11971],{"class":78,"line":1143},[76,11972,5044],{},[76,11974,11975],{"class":78,"line":2438},[76,11976,5049],{},[10,11978,129],{},[67,11980,11982],{"className":11981,"code":5055,"language":135,"meta":72},[133],[33,11983,5055],{"__ignoreMap":72},[10,11985,140],{},[14,11987,143],{"id":143},[145,11989,11990,11992],{},[44,11991,5066],{},[44,11993,5069,11994,5073],{},[33,11995,5072],{},[14,11997,169],{"id":169},[41,11999,12000,12004],{},[44,12001,5080,12002,5083],{},[33,12003,4290],{},[44,12005,5086],{},[14,12007,186],{"id":186},[145,12009,12010,12012],{},[44,12011,5093],{},[44,12013,5096],{},[10,12015,201],{},[14,12017,204],{"id":204},[10,12019,5103],{},[209,12021,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12023},[12024,12025,12026,12027,12028,12029,12030,12031],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":4973,"description":4978},[222,5123,5124],{"id":5127,"title":5128,"body":12036,"category":222,"cover":223,"description":5133,"extension":224,"meta":12155,"navigation":226,"path":5277,"pinned":228,"publishedAt":229,"seo":12156,"slug":5279,"stem":5280,"summary":5281,"tags":12157,"updatedAt":229,"visible":226,"__hash__":5285},{"type":7,"value":12037,"toc":12145},[12038,12040,12042,12044,12046,12050,12052,12054,12062,12064,12066,12098,12100,12105,12107,12109,12119,12121,12127,12129,12137,12139,12141,12143],[10,12039,5133],{},[14,12041,16],{"id":16},[10,12043,5138],{},[14,12045,22],{"id":22},[10,12047,12048],{},[26,12049],{"alt":5145,"src":5146},[10,12051,5149],{},[14,12053,39],{"id":39},[41,12055,12056,12058,12060],{},[44,12057,5156],{},[44,12059,5159],{},[44,12061,5162],{},[14,12063,62],{"id":62},[10,12065,1431],{},[67,12067,12068],{"className":406,"code":5169,"language":408,"meta":72,"style":72},[33,12069,12070,12074,12078,12082,12086,12090,12094],{"__ignoreMap":72},[76,12071,12072],{"class":78,"line":79},[76,12073,5176],{},[76,12075,12076],{"class":78,"line":90},[76,12077,5181],{},[76,12079,12080],{"class":78,"line":99},[76,12081,5186],{},[76,12083,12084],{"class":78,"line":105},[76,12085,1091],{"emptyLinePlaceholder":226},[76,12087,12088],{"class":78,"line":121},[76,12089,5195],{},[76,12091,12092],{"class":78,"line":1143},[76,12093,5200],{},[76,12095,12096],{"class":78,"line":2438},[76,12097,5205],{},[10,12099,129],{},[67,12101,12103],{"className":12102,"code":5211,"language":135,"meta":72},[133],[33,12104,5211],{"__ignoreMap":72},[10,12106,140],{},[14,12108,143],{"id":143},[145,12110,12111,12115],{},[44,12112,931,12113,5225],{},[33,12114,5224],{},[44,12116,5228,12117,5232],{},[33,12118,5231],{},[14,12120,169],{"id":169},[41,12122,12123,12125],{},[44,12124,5239],{},[44,12126,5242],{},[14,12128,186],{"id":186},[145,12130,12131,12135],{},[44,12132,5249,12133,5253],{},[33,12134,5252],{},[44,12136,5256],{},[10,12138,201],{},[14,12140,204],{"id":204},[10,12142,5263],{},[209,12144,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12146},[12147,12148,12149,12150,12151,12152,12153,12154],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5128,"description":5133},[222,5283,5284],{"id":5287,"title":5288,"body":12159,"category":222,"cover":223,"description":5293,"extension":224,"meta":12304,"navigation":226,"path":5474,"pinned":228,"publishedAt":229,"seo":12305,"slug":5476,"stem":5477,"summary":5478,"tags":12306,"updatedAt":229,"visible":226,"__hash__":5482},{"type":7,"value":12160,"toc":12292},[12161,12163,12165,12167,12169,12173,12177,12179,12191,12193,12195,12223,12225,12230,12232,12234,12248,12250,12252,12256,12264,12266,12276,12278,12284,12286,12288,12290],[10,12162,5293],{},[14,12164,16],{"id":16},[10,12166,5298],{},[14,12168,22],{"id":22},[10,12170,12171],{},[26,12172],{"alt":5305,"src":5306},[10,12174,5309,12175,5313],{},[33,12176,5312],{},[14,12178,39],{"id":39},[41,12180,12181,12183,12185],{},[44,12182,5320],{},[44,12184,5323],{},[44,12186,5326,12187,5329,12189,180],{},[33,12188,5312],{},[33,12190,5332],{},[14,12192,62],{"id":62},[10,12194,1431],{},[67,12196,12197],{"className":406,"code":5339,"language":408,"meta":72,"style":72},[33,12198,12199,12203,12207,12211,12215,12219],{"__ignoreMap":72},[76,12200,12201],{"class":78,"line":79},[76,12202,5346],{},[76,12204,12205],{"class":78,"line":90},[76,12206,5351],{},[76,12208,12209],{"class":78,"line":99},[76,12210,5356],{},[76,12212,12213],{"class":78,"line":105},[76,12214,1091],{"emptyLinePlaceholder":226},[76,12216,12217],{"class":78,"line":121},[76,12218,5365],{},[76,12220,12221],{"class":78,"line":1143},[76,12222,5370],{},[10,12224,129],{},[67,12226,12228],{"className":12227,"code":5376,"language":135,"meta":72},[133],[33,12229,5376],{"__ignoreMap":72},[10,12231,140],{},[14,12233,143],{"id":143},[145,12235,12236,12242],{},[44,12237,5387,12238,2206,12240,5393],{},[33,12239,5390],{},[33,12241,4353],{},[44,12243,12244,5399,12246,5403],{},[33,12245,5398],{},[33,12247,5402],{},[326,12249,2648],{"id":2648},[10,12251,5408],{},[10,12253,12254],{},[26,12255],{"alt":5413,"src":5414},[10,12257,12258,2206,12260,177,12262,5424],{},[33,12259,5390],{},[33,12261,4353],{},[33,12263,5423],{},[14,12265,169],{"id":169},[41,12267,12268,12272],{},[44,12269,5431,12270,5435],{},[33,12271,5434],{},[44,12273,5438,12274,5441],{},[33,12275,5423],{},[14,12277,186],{"id":186},[145,12279,12280,12282],{},[44,12281,5448],{},[44,12283,5451],{},[10,12285,201],{},[14,12287,204],{"id":204},[10,12289,5458],{},[209,12291,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12293},[12294,12295,12296,12297,12298,12301,12302,12303],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":12299},[12300],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5288,"description":5293},[222,5480,5481],{"id":5484,"title":5485,"body":12308,"category":222,"cover":223,"description":5490,"extension":224,"meta":12457,"navigation":226,"path":5671,"pinned":228,"publishedAt":229,"seo":12458,"slug":5673,"stem":5674,"summary":5675,"tags":12459,"updatedAt":229,"visible":226,"__hash__":5679},{"type":7,"value":12309,"toc":12445},[12310,12312,12314,12316,12318,12322,12324,12326,12338,12340,12342,12386,12388,12393,12395,12397,12409,12411,12413,12417,12419,12421,12429,12431,12437,12439,12441,12443],[10,12311,5490],{},[14,12313,16],{"id":16},[10,12315,5495],{},[14,12317,22],{"id":22},[10,12319,12320],{},[26,12321],{"alt":5502,"src":5503},[10,12323,5506],{},[14,12325,39],{"id":39},[41,12327,12328,12330,12334],{},[44,12329,5513],{},[44,12331,12332,5519],{},[33,12333,5518],{},[44,12335,12336,5525],{},[33,12337,5524],{},[14,12339,62],{"id":62},[10,12341,1431],{},[67,12343,12344],{"className":406,"code":5532,"language":408,"meta":72,"style":72},[33,12345,12346,12350,12354,12358,12362,12366,12370,12374,12378,12382],{"__ignoreMap":72},[76,12347,12348],{"class":78,"line":79},[76,12349,5539],{},[76,12351,12352],{"class":78,"line":90},[76,12353,5544],{},[76,12355,12356],{"class":78,"line":99},[76,12357,1091],{"emptyLinePlaceholder":226},[76,12359,12360],{"class":78,"line":105},[76,12361,5553],{},[76,12363,12364],{"class":78,"line":121},[76,12365,5558],{},[76,12367,12368],{"class":78,"line":1143},[76,12369,1091],{"emptyLinePlaceholder":226},[76,12371,12372],{"class":78,"line":2438},[76,12373,5567],{},[76,12375,12376],{"class":78,"line":2444},[76,12377,5572],{},[76,12379,12380],{"class":78,"line":3904},[76,12381,1091],{"emptyLinePlaceholder":226},[76,12383,12384],{"class":78,"line":4116},[76,12385,5581],{},[10,12387,129],{},[67,12389,12391],{"className":12390,"code":5587,"language":135,"meta":72},[133],[33,12392,5587],{"__ignoreMap":72},[10,12394,140],{},[14,12396,143],{"id":143},[145,12398,12399,12403],{},[44,12400,5598,12401,5602],{},[33,12402,5601],{},[44,12404,12405,5608,12407,180],{},[33,12406,5607],{},[33,12408,5611],{},[326,12410,2648],{"id":2648},[10,12412,5616],{},[10,12414,12415],{},[26,12416],{"alt":5621,"src":5622},[10,12418,5625],{},[14,12420,169],{"id":169},[41,12422,12423,12427],{},[44,12424,5632,12425,5635],{},[33,12426,5332],{},[44,12428,5638],{},[14,12430,186],{"id":186},[145,12432,12433,12435],{},[44,12434,5645],{},[44,12436,5648],{},[10,12438,201],{},[14,12440,204],{"id":204},[10,12442,5655],{},[209,12444,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12446},[12447,12448,12449,12450,12451,12454,12455,12456],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":12452},[12453],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5485,"description":5490},[222,5677,5678],{"id":5681,"title":5682,"body":12461,"category":222,"cover":223,"description":5687,"extension":224,"meta":12622,"navigation":226,"path":5885,"pinned":228,"publishedAt":229,"seo":12623,"slug":5887,"stem":5888,"summary":5889,"tags":12624,"updatedAt":229,"visible":226,"__hash__":5893},{"type":7,"value":12462,"toc":12610},[12463,12465,12467,12469,12471,12475,12477,12479,12491,12493,12495,12547,12549,12554,12556,12558,12576,12578,12580,12584,12586,12588,12594,12596,12602,12604,12606,12608],[10,12464,5687],{},[14,12466,16],{"id":16},[10,12468,5692],{},[14,12470,22],{"id":22},[10,12472,12473],{},[26,12474],{"alt":5699,"src":5700},[10,12476,5703],{},[14,12478,39],{"id":39},[41,12480,12481,12483,12485],{},[44,12482,5710],{},[44,12484,5713],{},[44,12486,12487,2125,12489,5722],{},[33,12488,5718],{},[33,12490,5721],{},[14,12492,62],{"id":62},[10,12494,1431],{},[67,12496,12497],{"className":406,"code":5729,"language":408,"meta":72,"style":72},[33,12498,12499,12503,12507,12511,12515,12519,12523,12527,12531,12535,12539,12543],{"__ignoreMap":72},[76,12500,12501],{"class":78,"line":79},[76,12502,5736],{},[76,12504,12505],{"class":78,"line":90},[76,12506,1091],{"emptyLinePlaceholder":226},[76,12508,12509],{"class":78,"line":99},[76,12510,5745],{},[76,12512,12513],{"class":78,"line":105},[76,12514,5750],{},[76,12516,12517],{"class":78,"line":121},[76,12518,1091],{"emptyLinePlaceholder":226},[76,12520,12521],{"class":78,"line":1143},[76,12522,5759],{},[76,12524,12525],{"class":78,"line":2438},[76,12526,5764],{},[76,12528,12529],{"class":78,"line":2444},[76,12530,5769],{},[76,12532,12533],{"class":78,"line":3904},[76,12534,1091],{"emptyLinePlaceholder":226},[76,12536,12537],{"class":78,"line":4116},[76,12538,5778],{},[76,12540,12541],{"class":78,"line":5781},[76,12542,1091],{"emptyLinePlaceholder":226},[76,12544,12545],{"class":78,"line":5786},[76,12546,5789],{},[10,12548,129],{},[67,12550,12552],{"className":12551,"code":5795,"language":135,"meta":72},[133],[33,12553,5795],{"__ignoreMap":72},[10,12555,140],{},[14,12557,143],{"id":143},[145,12559,12560,12570],{},[44,12561,12562,5809,12564,5813,12566,5816,12568,5820],{},[33,12563,5808],{},[33,12565,5812],{},[33,12567,5601],{},[33,12569,5819],{},[44,12571,12572,5825,12574,5828],{},[33,12573,4536],{},[33,12575,2157],{},[326,12577,2648],{"id":2648},[10,12579,5833],{},[10,12581,12582],{},[26,12583],{"alt":5838,"src":5839},[10,12585,5842],{},[14,12587,169],{"id":169},[41,12589,12590,12592],{},[44,12591,5849],{},[44,12593,5852],{},[14,12595,186],{"id":186},[145,12597,12598,12600],{},[44,12599,5859],{},[44,12601,5862],{},[10,12603,201],{},[14,12605,204],{"id":204},[10,12607,5869],{},[209,12609,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12611},[12612,12613,12614,12615,12616,12619,12620,12621],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":12617},[12618],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5682,"description":5687},[222,5891,5892],{"id":5895,"title":5896,"body":12626,"category":222,"cover":223,"description":5901,"extension":224,"meta":12749,"navigation":226,"path":6052,"pinned":228,"publishedAt":229,"seo":12750,"slug":6054,"stem":6055,"summary":6056,"tags":12751,"updatedAt":229,"visible":226,"__hash__":6060},{"type":7,"value":12627,"toc":12739},[12628,12630,12632,12634,12636,12640,12642,12644,12658,12660,12662,12690,12692,12697,12699,12701,12711,12713,12721,12723,12731,12733,12735,12737],[10,12629,5901],{},[14,12631,16],{"id":16},[10,12633,5906],{},[14,12635,22],{"id":22},[10,12637,12638],{},[26,12639],{"alt":5913,"src":5914},[10,12641,5917],{},[14,12643,39],{"id":39},[41,12645,12646,12648,12650],{},[44,12647,5924],{},[44,12649,5927],{},[44,12651,5930,12652,2206,12654,2206,12656,5938],{},[33,12653,2209],{},[33,12655,2375],{},[33,12657,5937],{},[14,12659,62],{"id":62},[10,12661,1431],{},[67,12663,12664],{"className":406,"code":5945,"language":408,"meta":72,"style":72},[33,12665,12666,12670,12674,12678,12682,12686],{"__ignoreMap":72},[76,12667,12668],{"class":78,"line":79},[76,12669,5952],{},[76,12671,12672],{"class":78,"line":90},[76,12673,5957],{},[76,12675,12676],{"class":78,"line":99},[76,12677,5962],{},[76,12679,12680],{"class":78,"line":105},[76,12681,1091],{"emptyLinePlaceholder":226},[76,12683,12684],{"class":78,"line":121},[76,12685,5971],{},[76,12687,12688],{"class":78,"line":1143},[76,12689,5976],{},[10,12691,129],{},[67,12693,12695],{"className":12694,"code":5982,"language":135,"meta":72},[133],[33,12696,5982],{"__ignoreMap":72},[10,12698,140],{},[14,12700,143],{"id":143},[145,12702,12703,12709],{},[44,12704,5993,12705,5997,12707,6000],{},[33,12706,5996],{},[33,12708,2195],{},[44,12710,6003],{},[14,12712,169],{"id":169},[41,12714,12715,12719],{},[44,12716,6010,12717,6014],{},[33,12718,6013],{},[44,12720,6017],{},[14,12722,186],{"id":186},[145,12724,12725,12727],{},[44,12726,6024],{},[44,12728,6027,12729,6031],{},[33,12730,6030],{},[10,12732,201],{},[14,12734,204],{"id":204},[10,12736,6038],{},[209,12738,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12740},[12741,12742,12743,12744,12745,12746,12747,12748],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":5896,"description":5901},[222,6058,6059],{"id":6062,"title":6063,"body":12753,"category":222,"cover":223,"description":6068,"extension":224,"meta":12930,"navigation":226,"path":6296,"pinned":228,"publishedAt":229,"seo":12931,"slug":6298,"stem":6299,"summary":6300,"tags":12932,"updatedAt":229,"visible":226,"__hash__":6304},{"type":7,"value":12754,"toc":12918},[12755,12757,12759,12763,12765,12769,12775,12777,12789,12791,12795,12819,12823,12839,12845,12847,12852,12854,12856,12872,12874,12876,12880,12884,12886,12898,12900,12910,12912,12914,12916],[10,12756,6068],{},[14,12758,16],{"id":16},[10,12760,6073,12761,6076],{},[292,12762,5996],{},[14,12764,22],{"id":22},[10,12766,12767],{},[26,12768],{"alt":6083,"src":6084},[10,12770,6087,12771,6091,12773,6095],{},[33,12772,6090],{},[33,12774,6094],{},[14,12776,39],{"id":39},[41,12778,12779,12783,12785],{},[44,12780,6102,12781,6105],{},[33,12782,1165],{},[44,12784,6108],{},[44,12786,6111,12787,6115],{},[33,12788,6114],{},[14,12790,62],{"id":62},[10,12792,6120,12793,6124],{},[33,12794,6123],{},[67,12796,12797],{"className":406,"code":6127,"language":408,"meta":72,"style":72},[33,12798,12799,12803,12807,12811,12815],{"__ignoreMap":72},[76,12800,12801],{"class":78,"line":79},[76,12802,6134],{},[76,12804,12805],{"class":78,"line":90},[76,12806,6139],{},[76,12808,12809],{"class":78,"line":99},[76,12810,1091],{"emptyLinePlaceholder":226},[76,12812,12813],{"class":78,"line":105},[76,12814,6148],{},[76,12816,12817],{"class":78,"line":121},[76,12818,6153],{},[10,12820,6156,12821,6160],{},[33,12822,6159],{},[67,12824,12825],{"className":406,"code":6163,"language":408,"meta":72,"style":72},[33,12826,12827,12831,12835],{"__ignoreMap":72},[76,12828,12829],{"class":78,"line":79},[76,12830,6170],{},[76,12832,12833],{"class":78,"line":90},[76,12834,1091],{"emptyLinePlaceholder":226},[76,12836,12837],{"class":78,"line":99},[76,12838,6179],{},[10,12840,6182,12841,177,12843,180],{},[33,12842,6185],{},[33,12844,6188],{},[10,12846,129],{},[67,12848,12850],{"className":12849,"code":6194,"language":135,"meta":72},[133],[33,12851,6194],{"__ignoreMap":72},[10,12853,140],{},[14,12855,143],{"id":143},[145,12857,12858,12864],{},[44,12859,6205,12860,6208,12862,6212],{},[33,12861,6123],{},[33,12863,6211],{},[44,12865,12866,6217,12868,6220,12870,6223],{},[33,12867,6159],{},[33,12869,6123],{},[33,12871,6159],{},[326,12873,2648],{"id":2648},[10,12875,6228],{},[10,12877,12878],{},[26,12879],{"alt":6233,"src":6234},[10,12881,6237,12882,6240],{},[33,12883,6211],{},[14,12885,169],{"id":169},[41,12887,12888,12894],{},[44,12889,6247,12890,177,12892,180],{},[33,12891,6123],{},[33,12893,6159],{},[44,12895,6254,12896,6258],{},[33,12897,6257],{},[14,12899,186],{"id":186},[145,12901,12902,12906],{},[44,12903,2303,12904,6268],{},[33,12905,6267],{},[44,12907,6271,12908,180],{},[33,12909,6090],{},[10,12911,201],{},[14,12913,204],{"id":204},[10,12915,6280],{},[209,12917,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":12919},[12920,12921,12922,12923,12924,12927,12928,12929],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":12925},[12926],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":6063,"description":6068},[222,6302,6303],{"id":6306,"title":6307,"body":12934,"category":222,"cover":223,"description":6312,"extension":224,"meta":13073,"navigation":226,"path":6478,"pinned":228,"publishedAt":229,"seo":13074,"slug":6480,"stem":6481,"summary":6482,"tags":13075,"updatedAt":229,"visible":226,"__hash__":6485},{"type":7,"value":12935,"toc":13063},[12936,12938,12940,12942,12944,12948,12950,12952,12962,12964,12966,13006,13008,13013,13015,13017,13035,13037,13045,13047,13055,13057,13059,13061],[10,12937,6312],{},[14,12939,16],{"id":16},[10,12941,6317],{},[14,12943,22],{"id":22},[10,12945,12946],{},[26,12947],{"alt":6324,"src":6325},[10,12949,6328],{},[14,12951,39],{"id":39},[41,12953,12954,12958,12960],{},[44,12955,12956,6338],{},[33,12957,6337],{},[44,12959,6341],{},[44,12961,6344],{},[14,12963,62],{"id":62},[10,12965,65],{},[67,12967,12968],{"className":69,"code":6351,"language":71,"meta":72,"style":72},[33,12969,12970,12980,12986,12992,13002],{"__ignoreMap":72},[76,12971,12972,12974,12976,12978],{"class":78,"line":79},[76,12973,124],{"class":82},[76,12975,628],{"class":93},[76,12977,6362],{"class":86},[76,12979,6365],{"class":86},[76,12981,12982,12984],{"class":78,"line":90},[76,12983,6370],{"class":93},[76,12985,6373],{"class":86},[76,12987,12988,12990],{"class":78,"line":99},[76,12989,408],{"class":82},[76,12991,599],{"class":93},[76,12993,12994,12996,12998,13000],{"class":78,"line":105},[76,12995,408],{"class":82},[76,12997,628],{"class":93},[76,12999,631],{"class":86},[76,13001,599],{"class":93},[76,13003,13004],{"class":78,"line":121},[76,13005,6394],{"class":82},[10,13007,129],{},[67,13009,13011],{"className":13010,"code":6400,"language":135,"meta":72},[133],[33,13012,6400],{"__ignoreMap":72},[10,13014,140],{},[14,13016,143],{"id":143},[145,13018,13019,13025],{},[44,13020,13021,6414,13023,6417],{},[33,13022,6413],{},[33,13024,124],{},[44,13026,6420,13027,2125,13029,6426,13031,3679,13033,6432],{},[33,13028,408],{},[33,13030,6425],{},[33,13032,6337],{},[33,13034,6431],{},[14,13036,169],{"id":169},[41,13038,13039,13041],{},[44,13040,6439],{},[44,13042,3418,13043,6444],{},[33,13044,6337],{},[14,13046,186],{"id":186},[145,13048,13049,13053],{},[44,13050,6451,13051,180],{},[33,13052,6454],{},[44,13054,6457],{},[10,13056,201],{},[14,13058,204],{"id":204},[10,13060,6464],{},[209,13062,1652],{},{"title":72,"searchDepth":90,"depth":90,"links":13064},[13065,13066,13067,13068,13069,13070,13071,13072],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":6307,"description":6312},[222,6484,258],{"id":6487,"title":6488,"body":13077,"category":222,"cover":223,"description":6493,"extension":224,"meta":13230,"navigation":226,"path":6682,"pinned":228,"publishedAt":229,"seo":13231,"slug":6684,"stem":6685,"summary":6686,"tags":13232,"updatedAt":229,"visible":226,"__hash__":6690},{"type":7,"value":13078,"toc":13220},[13079,13081,13083,13085,13087,13091,13097,13099,13115,13117,13119,13163,13165,13170,13172,13174,13186,13188,13202,13204,13212,13214,13216,13218],[10,13080,6493],{},[14,13082,16],{"id":16},[10,13084,6498],{},[14,13086,22],{"id":22},[10,13088,13089],{},[26,13090],{"alt":6505,"src":6506},[10,13092,13093,6512,13095,6515],{},[33,13094,6511],{},[33,13096,2385],{},[14,13098,39],{"id":39},[41,13100,13101,13103,13111],{},[44,13102,6522],{},[44,13104,13105,2206,13107,2206,13109,6534],{},[33,13106,6527],{},[33,13108,6530],{},[33,13110,6533],{},[44,13112,6537,13113,6541],{},[33,13114,6540],{},[14,13116,62],{"id":62},[10,13118,1431],{},[67,13120,13121],{"className":406,"code":6548,"language":408,"meta":72,"style":72},[33,13122,13123,13127,13131,13135,13139,13143,13147,13151,13155,13159],{"__ignoreMap":72},[76,13124,13125],{"class":78,"line":79},[76,13126,6555],{},[76,13128,13129],{"class":78,"line":90},[76,13130,1091],{"emptyLinePlaceholder":226},[76,13132,13133],{"class":78,"line":99},[76,13134,6564],{},[76,13136,13137],{"class":78,"line":105},[76,13138,6569],{},[76,13140,13141],{"class":78,"line":121},[76,13142,6574],{},[76,13144,13145],{"class":78,"line":1143},[76,13146,1091],{"emptyLinePlaceholder":226},[76,13148,13149],{"class":78,"line":2438},[76,13150,6583],{},[76,13152,13153],{"class":78,"line":2444},[76,13154,6588],{},[76,13156,13157],{"class":78,"line":3904},[76,13158,6593],{},[76,13160,13161],{"class":78,"line":4116},[76,13162,6598],{},[10,13164,129],{},[67,13166,13168],{"className":13167,"code":6604,"language":135,"meta":72},[133],[33,13169,6604],{"__ignoreMap":72},[10,13171,140],{},[14,13173,143],{"id":143},[145,13175,13176,13180],{},[44,13177,13178,6618],{},[33,13179,6617],{},[44,13181,2288,13182,6623,13184,6626],{},[33,13183,2385],{},[33,13185,6511],{},[14,13187,169],{"id":169},[41,13189,13190,13196],{},[44,13191,3418,13192,6635,13194,6638],{},[33,13193,6511],{},[33,13195,6527],{},[44,13197,6641,13198,1002,13200,6647],{},[33,13199,2385],{},[33,13201,6646],{},[14,13203,186],{"id":186},[145,13205,13206,13210],{},[44,13207,6654,13208,6658],{},[33,13209,6657],{},[44,13211,6661],{},[10,13213,201],{},[14,13215,204],{"id":204},[10,13217,6668],{},[209,13219,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":13221},[13222,13223,13224,13225,13226,13227,13228,13229],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":6488,"description":6493},[222,6688,6689],{"id":6692,"title":6693,"body":13234,"category":222,"cover":223,"description":6698,"extension":224,"meta":13381,"navigation":226,"path":6877,"pinned":228,"publishedAt":229,"seo":13382,"slug":6879,"stem":6880,"summary":6881,"tags":13383,"updatedAt":229,"visible":226,"__hash__":6885},{"type":7,"value":13235,"toc":13371},[13236,13238,13240,13242,13244,13248,13250,13252,13270,13272,13274,13322,13324,13329,13331,13333,13341,13343,13353,13355,13363,13365,13367,13369],[10,13237,6698],{},[14,13239,16],{"id":16},[10,13241,6703],{},[14,13243,22],{"id":22},[10,13245,13246],{},[26,13247],{"alt":6710,"src":6711},[10,13249,6714],{},[14,13251,39],{"id":39},[41,13253,13254,13258,13264],{},[44,13255,13256,6724],{},[33,13257,6723],{},[44,13259,13260,6730,13262,180],{},[33,13261,6729],{},[33,13263,6733],{},[44,13265,6736,13266,6740,13268,6744],{},[33,13267,6739],{},[33,13269,6743],{},[14,13271,62],{"id":62},[10,13273,1431],{},[67,13275,13276],{"className":406,"code":6751,"language":408,"meta":72,"style":72},[33,13277,13278,13282,13286,13290,13294,13298,13302,13306,13310,13314,13318],{"__ignoreMap":72},[76,13279,13280],{"class":78,"line":79},[76,13281,6555],{},[76,13283,13284],{"class":78,"line":90},[76,13285,1091],{"emptyLinePlaceholder":226},[76,13287,13288],{"class":78,"line":99},[76,13289,6766],{},[76,13291,13292],{"class":78,"line":105},[76,13293,6771],{},[76,13295,13296],{"class":78,"line":121},[76,13297,6776],{},[76,13299,13300],{"class":78,"line":1143},[76,13301,6781],{},[76,13303,13304],{"class":78,"line":2438},[76,13305,1091],{"emptyLinePlaceholder":226},[76,13307,13308],{"class":78,"line":2444},[76,13309,6790],{},[76,13311,13312],{"class":78,"line":3904},[76,13313,6795],{},[76,13315,13316],{"class":78,"line":4116},[76,13317,6800],{},[76,13319,13320],{"class":78,"line":5781},[76,13321,6805],{},[10,13323,129],{},[67,13325,13327],{"className":13326,"code":6811,"language":135,"meta":72},[133],[33,13328,6811],{"__ignoreMap":72},[10,13330,140],{},[14,13332,143],{"id":143},[145,13334,13335,13339],{},[44,13336,6822,13337,6825],{},[33,13338,6739],{},[44,13340,6828],{},[14,13342,169],{"id":169},[41,13344,13345,13349],{},[44,13346,2288,13347,6837],{},[33,13348,6723],{},[44,13350,6840,13351,180],{},[33,13352,6843],{},[14,13354,186],{"id":186},[145,13356,13357,13359],{},[44,13358,6850],{},[44,13360,6853,13361,6856],{},[33,13362,334],{},[10,13364,201],{},[14,13366,204],{"id":204},[10,13368,6863],{},[209,13370,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":13372},[13373,13374,13375,13376,13377,13378,13379,13380],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":6693,"description":6698},[222,6883,6884],{"id":6887,"title":6888,"body":13385,"category":222,"cover":223,"description":6893,"extension":224,"meta":13528,"navigation":226,"path":7061,"pinned":228,"publishedAt":229,"seo":13529,"slug":7063,"stem":7064,"summary":7065,"tags":13530,"updatedAt":229,"visible":226,"__hash__":7069},{"type":7,"value":13386,"toc":13518},[13387,13389,13391,13393,13395,13399,13405,13407,13417,13419,13421,13473,13475,13480,13482,13484,13494,13496,13502,13504,13510,13512,13514,13516],[10,13388,6893],{},[14,13390,16],{"id":16},[10,13392,6898],{},[14,13394,22],{"id":22},[10,13396,13397],{},[26,13398],{"alt":6905,"src":6906},[10,13400,13401,6912,13403,6916],{},[33,13402,6911],{},[33,13404,6915],{},[14,13406,39],{"id":39},[41,13408,13409,13411,13415],{},[44,13410,6923],{},[44,13412,13413,6929],{},[33,13414,6928],{},[44,13416,6932],{},[14,13418,62],{"id":62},[10,13420,1431],{},[67,13422,13423],{"className":406,"code":6939,"language":408,"meta":72,"style":72},[33,13424,13425,13429,13433,13437,13441,13445,13449,13453,13457,13461,13465,13469],{"__ignoreMap":72},[76,13426,13427],{"class":78,"line":79},[76,13428,6946],{},[76,13430,13431],{"class":78,"line":90},[76,13432,1091],{"emptyLinePlaceholder":226},[76,13434,13435],{"class":78,"line":99},[76,13436,6955],{},[76,13438,13439],{"class":78,"line":105},[76,13440,1091],{"emptyLinePlaceholder":226},[76,13442,13443],{"class":78,"line":121},[76,13444,6964],{},[76,13446,13447],{"class":78,"line":1143},[76,13448,6969],{},[76,13450,13451],{"class":78,"line":2438},[76,13452,6781],{},[76,13454,13455],{"class":78,"line":2444},[76,13456,1091],{"emptyLinePlaceholder":226},[76,13458,13459],{"class":78,"line":3904},[76,13460,6982],{},[76,13462,13463],{"class":78,"line":4116},[76,13464,6987],{},[76,13466,13467],{"class":78,"line":5781},[76,13468,6800],{},[76,13470,13471],{"class":78,"line":5786},[76,13472,6996],{},[10,13474,129],{},[67,13476,13478],{"className":13477,"code":7002,"language":135,"meta":72},[133],[33,13479,7002],{"__ignoreMap":72},[10,13481,140],{},[14,13483,143],{"id":143},[145,13485,13486,13490],{},[44,13487,13488,7015],{},[33,13489,6911],{},[44,13491,13492,7020],{},[33,13493,6915],{},[14,13495,169],{"id":169},[41,13497,13498,13500],{},[44,13499,7027],{},[44,13501,7030],{},[14,13503,186],{"id":186},[145,13505,13506,13508],{},[44,13507,7037],{},[44,13509,7040],{},[10,13511,201],{},[14,13513,204],{"id":204},[10,13515,7047],{},[209,13517,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":13519},[13520,13521,13522,13523,13524,13525,13526,13527],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":6888,"description":6893},[222,7067,7068],{"id":7071,"title":7072,"body":13532,"category":222,"cover":223,"description":7077,"extension":224,"meta":13683,"navigation":226,"path":7262,"pinned":228,"publishedAt":229,"seo":13684,"slug":7264,"stem":7265,"summary":7266,"tags":13685,"updatedAt":229,"visible":226,"__hash__":7270},{"type":7,"value":13533,"toc":13673},[13534,13536,13538,13540,13542,13546,13550,13552,13566,13568,13570,13622,13624,13629,13631,13633,13645,13647,13657,13659,13665,13667,13669,13671],[10,13535,7077],{},[14,13537,16],{"id":16},[10,13539,7082],{},[14,13541,22],{"id":22},[10,13543,13544],{},[26,13545],{"alt":7089,"src":7090},[10,13547,13548,7096],{},[33,13549,7095],{},[14,13551,39],{"id":39},[41,13553,13554,13560,13564],{},[44,13555,2288,13556,7106,13558,7110],{},[33,13557,7105],{},[33,13559,7109],{},[44,13561,7113,13562,7117],{},[33,13563,7116],{},[44,13565,7120],{},[14,13567,62],{"id":62},[10,13569,1431],{},[67,13571,13572],{"className":406,"code":7127,"language":408,"meta":72,"style":72},[33,13573,13574,13578,13582,13586,13590,13594,13598,13602,13606,13610,13614,13618],{"__ignoreMap":72},[76,13575,13576],{"class":78,"line":79},[76,13577,7134],{},[76,13579,13580],{"class":78,"line":90},[76,13581,1091],{"emptyLinePlaceholder":226},[76,13583,13584],{"class":78,"line":99},[76,13585,7143],{},[76,13587,13588],{"class":78,"line":105},[76,13589,7148],{},[76,13591,13592],{"class":78,"line":121},[76,13593,7153],{},[76,13595,13596],{"class":78,"line":1143},[76,13597,7158],{},[76,13599,13600],{"class":78,"line":2438},[76,13601,7163],{},[76,13603,13604],{"class":78,"line":2444},[76,13605,1091],{"emptyLinePlaceholder":226},[76,13607,13608],{"class":78,"line":3904},[76,13609,7172],{},[76,13611,13612],{"class":78,"line":4116},[76,13613,7177],{},[76,13615,13616],{"class":78,"line":5781},[76,13617,7182],{},[76,13619,13620],{"class":78,"line":5786},[76,13621,7187],{},[10,13623,129],{},[67,13625,13627],{"className":13626,"code":7193,"language":135,"meta":72},[133],[33,13628,7193],{"__ignoreMap":72},[10,13630,140],{},[14,13632,143],{"id":143},[145,13634,13635,13641],{},[44,13636,13637,7207,13639,7210],{},[33,13638,7206],{},[33,13640,7116],{},[44,13642,13643,7215],{},[33,13644,7095],{},[14,13646,169],{"id":169},[41,13648,13649,13651],{},[44,13650,7222],{},[44,13652,7225,13653,7228,13655,7231],{},[33,13654,7105],{},[33,13656,7109],{},[14,13658,186],{"id":186},[145,13660,13661,13663],{},[44,13662,7238],{},[44,13664,7241],{},[10,13666,201],{},[14,13668,204],{"id":204},[10,13670,7248],{},[209,13672,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":13674},[13675,13676,13677,13678,13679,13680,13681,13682],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":7072,"description":7077},[222,7268,7269],{"id":7272,"title":7273,"body":13687,"category":222,"cover":223,"description":7278,"extension":224,"meta":13901,"navigation":226,"path":7552,"pinned":228,"publishedAt":229,"seo":13902,"slug":7554,"stem":7555,"summary":7556,"tags":13903,"updatedAt":229,"visible":226,"__hash__":7560},{"type":7,"value":13688,"toc":13888},[13689,13691,13693,13695,13697,13701,13707,13709,13721,13723,13725,13785,13787,13792,13794,13796,13814,13816,13824,13828,13836,13838,13842,13846,13852,13854,13864,13866,13880,13882,13884,13886],[10,13690,7278],{},[14,13692,16],{"id":16},[10,13694,7283],{},[14,13696,22],{"id":22},[10,13698,13699],{},[26,13700],{"alt":7290,"src":7291},[10,13702,7294,13703,7298,13705,7302],{},[33,13704,7297],{},[33,13706,7301],{},[14,13708,39],{"id":39},[41,13710,13711,13715,13719],{},[44,13712,7309,13713,7312],{},[33,13714,7297],{},[44,13716,13717,7318],{},[33,13718,7317],{},[44,13720,7321],{},[14,13722,62],{"id":62},[10,13724,1431],{},[67,13726,13727],{"className":406,"code":7328,"language":408,"meta":72,"style":72},[33,13728,13729,13733,13737,13741,13745,13749,13753,13757,13761,13765,13769,13773,13777,13781],{"__ignoreMap":72},[76,13730,13731],{"class":78,"line":79},[76,13732,7335],{},[76,13734,13735],{"class":78,"line":90},[76,13736,7340],{},[76,13738,13739],{"class":78,"line":99},[76,13740,7345],{},[76,13742,13743],{"class":78,"line":105},[76,13744,7350],{},[76,13746,13747],{"class":78,"line":121},[76,13748,7355],{},[76,13750,13751],{"class":78,"line":1143},[76,13752,1091],{"emptyLinePlaceholder":226},[76,13754,13755],{"class":78,"line":2438},[76,13756,7364],{},[76,13758,13759],{"class":78,"line":2444},[76,13760,7369],{},[76,13762,13763],{"class":78,"line":3904},[76,13764,7374],{},[76,13766,13767],{"class":78,"line":4116},[76,13768,7379],{},[76,13770,13771],{"class":78,"line":5781},[76,13772,1140],{},[76,13774,13775],{"class":78,"line":5786},[76,13776,7388],{},[76,13778,13779],{"class":78,"line":7391},[76,13780,7394],{},[76,13782,13783],{"class":78,"line":7397},[76,13784,7400],{},[10,13786,129],{},[67,13788,13790],{"className":13789,"code":7406,"language":135,"meta":72},[133],[33,13791,7406],{"__ignoreMap":72},[10,13793,140],{},[14,13795,143],{"id":143},[145,13797,13798,13806],{},[44,13799,13800,7419,13802,7422,13804,7426],{},[33,13801,2987],{},[33,13803,7317],{},[33,13805,7425],{},[44,13807,7429,13808,7432,13810,7435,13812,180],{},[33,13809,7297],{},[33,13811,1154],{},[33,13813,7301],{},[326,13815,2648],{"id":2648},[10,13817,13818,2206,13820,177,13822,7448],{},[33,13819,7297],{},[33,13821,1154],{},[33,13823,7301],{},[10,13825,13826],{},[26,13827],{"alt":7453,"src":7454},[10,13829,13830,7459,13832,7462,13834,7465],{},[33,13831,7297],{},[33,13833,1154],{},[33,13835,7301],{},[326,13837,2648],{"id":4171},[10,13839,13840,7473],{},[33,13841,7472],{},[10,13843,13844],{},[26,13845],{"alt":7478,"src":7479},[10,13847,7482,13848,7485,13850,7488],{},[33,13849,7472],{},[33,13851,1154],{},[14,13853,169],{"id":169},[41,13855,13856,13860],{},[44,13857,7495,13858,7499],{},[33,13859,7498],{},[44,13861,7502,13862,7505],{},[33,13863,7472],{},[14,13865,186],{"id":186},[145,13867,13868,13876],{},[44,13869,7512,13870,7516,13872,177,13874,180],{},[33,13871,7515],{},[33,13873,7519],{},[33,13875,7522],{},[44,13877,7525,13878,7528],{},[33,13879,6733],{},[10,13881,201],{},[14,13883,204],{"id":204},[10,13885,7535],{},[209,13887,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":13889},[13890,13891,13892,13893,13894,13898,13899,13900],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":13895},[13896,13897],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":7273,"description":7278},[222,7558,7559],{"id":7562,"title":7563,"body":13905,"category":222,"cover":223,"description":7568,"extension":224,"meta":14056,"navigation":226,"path":7745,"pinned":228,"publishedAt":229,"seo":14057,"slug":7747,"stem":7748,"summary":7749,"tags":14058,"updatedAt":229,"visible":226,"__hash__":7752},{"type":7,"value":13906,"toc":14046},[13907,13909,13911,13913,13915,13919,13923,13925,13937,13939,13941,13989,13991,13996,13998,14000,14010,14012,14022,14024,14038,14040,14042,14044],[10,13908,7568],{},[14,13910,16],{"id":16},[10,13912,7573],{},[14,13914,22],{"id":22},[10,13916,13917],{},[26,13918],{"alt":7580,"src":7581},[10,13920,7584,13921,7587],{},[33,13922,6743],{},[14,13924,39],{"id":39},[41,13926,13927,13931,13935],{},[44,13928,13929,7596],{},[33,13930,6743],{},[44,13932,13933,7602],{},[33,13934,7601],{},[44,13936,7605],{},[14,13938,62],{"id":62},[10,13940,1431],{},[67,13942,13943],{"className":406,"code":7612,"language":408,"meta":72,"style":72},[33,13944,13945,13949,13953,13957,13961,13965,13969,13973,13977,13981,13985],{"__ignoreMap":72},[76,13946,13947],{"class":78,"line":79},[76,13948,6555],{},[76,13950,13951],{"class":78,"line":90},[76,13952,1091],{"emptyLinePlaceholder":226},[76,13954,13955],{"class":78,"line":99},[76,13956,6766],{},[76,13958,13959],{"class":78,"line":105},[76,13960,1091],{"emptyLinePlaceholder":226},[76,13962,13963],{"class":78,"line":121},[76,13964,7635],{},[76,13966,13967],{"class":78,"line":1143},[76,13968,7640],{},[76,13970,13971],{"class":78,"line":2438},[76,13972,1091],{"emptyLinePlaceholder":226},[76,13974,13975],{"class":78,"line":2444},[76,13976,7649],{},[76,13978,13979],{"class":78,"line":3904},[76,13980,7654],{},[76,13982,13983],{"class":78,"line":4116},[76,13984,1091],{"emptyLinePlaceholder":226},[76,13986,13987],{"class":78,"line":5781},[76,13988,7663],{},[10,13990,129],{},[67,13992,13994],{"className":13993,"code":7669,"language":135,"meta":72},[133],[33,13995,7669],{"__ignoreMap":72},[10,13997,140],{},[14,13999,143],{"id":143},[145,14001,14002,14008],{},[44,14003,7584,14004,7682,14006,180],{},[33,14005,6743],{},[33,14007,7685],{},[44,14009,7688],{},[14,14011,169],{"id":169},[41,14013,14014,14018],{},[44,14015,4739,14016,7697],{},[33,14017,6743],{},[44,14019,7700,14020,7703],{},[33,14021,6743],{},[14,14023,186],{"id":186},[145,14025,14026,14032],{},[44,14027,7710,14028,7714,14030,180],{},[33,14029,7713],{},[33,14031,6743],{},[44,14033,4739,14034,7721,14036,180],{},[33,14035,6743],{},[33,14037,7724],{},[10,14039,201],{},[14,14041,204],{"id":204},[10,14043,7731],{},[209,14045,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14047},[14048,14049,14050,14051,14052,14053,14054,14055],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":7563,"description":7568},[222,6743,7751],{"id":7754,"title":7755,"body":14060,"category":222,"cover":223,"description":7760,"extension":224,"meta":14231,"navigation":226,"path":7973,"pinned":228,"publishedAt":229,"seo":14232,"slug":7975,"stem":7976,"summary":7977,"tags":14233,"updatedAt":229,"visible":226,"__hash__":7981},{"type":7,"value":14061,"toc":14219},[14062,14064,14066,14068,14070,14074,14076,14078,14090,14092,14094,14150,14152,14157,14159,14161,14177,14179,14181,14185,14191,14193,14201,14203,14211,14213,14215,14217],[10,14063,7760],{},[14,14065,16],{"id":16},[10,14067,7765],{},[14,14069,22],{"id":22},[10,14071,14072],{},[26,14073],{"alt":7772,"src":7773},[10,14075,7776],{},[14,14077,39],{"id":39},[41,14079,14080,14084,14088],{},[44,14081,14082,7786],{},[33,14083,7785],{},[44,14085,14086,7792],{},[33,14087,7791],{},[44,14089,7795],{},[14,14091,62],{"id":62},[10,14093,1431],{},[67,14095,14096],{"className":406,"code":7802,"language":408,"meta":72,"style":72},[33,14097,14098,14102,14106,14110,14114,14118,14122,14126,14130,14134,14138,14142,14146],{"__ignoreMap":72},[76,14099,14100],{"class":78,"line":79},[76,14101,7809],{},[76,14103,14104],{"class":78,"line":90},[76,14105,7814],{},[76,14107,14108],{"class":78,"line":99},[76,14109,7819],{},[76,14111,14112],{"class":78,"line":105},[76,14113,7824],{},[76,14115,14116],{"class":78,"line":121},[76,14117,1091],{"emptyLinePlaceholder":226},[76,14119,14120],{"class":78,"line":1143},[76,14121,7833],{},[76,14123,14124],{"class":78,"line":2438},[76,14125,7838],{},[76,14127,14128],{"class":78,"line":2444},[76,14129,7843],{},[76,14131,14132],{"class":78,"line":3904},[76,14133,7848],{},[76,14135,14136],{"class":78,"line":4116},[76,14137,1091],{"emptyLinePlaceholder":226},[76,14139,14140],{"class":78,"line":5781},[76,14141,7857],{},[76,14143,14144],{"class":78,"line":5786},[76,14145,7862],{},[76,14147,14148],{"class":78,"line":7391},[76,14149,7867],{},[10,14151,129],{},[67,14153,14155],{"className":14154,"code":7873,"language":135,"meta":72},[133],[33,14156,7873],{"__ignoreMap":72},[10,14158,140],{},[14,14160,143],{"id":143},[145,14162,14163,14169],{},[44,14164,7884,14165,7888,14167,7891],{},[33,14166,7887],{},[33,14168,7791],{},[44,14170,14171,7897,14173,7901,14175,7904],{},[33,14172,7896],{},[33,14174,7900],{},[33,14176,7785],{},[326,14178,2648],{"id":2648},[10,14180,7909],{},[10,14182,14183],{},[26,14184],{"alt":7914,"src":7915},[10,14186,7918,14187,177,14189,7924],{},[33,14188,4536],{},[33,14190,7923],{},[14,14192,169],{"id":169},[41,14194,14195,14199],{},[44,14196,7931,14197,7934],{},[33,14198,7785],{},[44,14200,7937],{},[14,14202,186],{"id":186},[145,14204,14205,14209],{},[44,14206,5249,14207,7947],{},[33,14208,7946],{},[44,14210,7950],{},[10,14212,201],{},[14,14214,204],{"id":204},[10,14216,7957],{},[209,14218,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14220},[14221,14222,14223,14224,14225,14228,14229,14230],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":14226},[14227],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":7755,"description":7760},[222,7979,7980],{"id":7983,"title":7984,"body":14235,"category":222,"cover":223,"description":7989,"extension":224,"meta":14382,"navigation":226,"path":8168,"pinned":228,"publishedAt":229,"seo":14383,"slug":8170,"stem":8171,"summary":8172,"tags":14384,"updatedAt":229,"visible":226,"__hash__":8176},{"type":7,"value":14236,"toc":14372},[14237,14239,14241,14243,14245,14249,14251,14253,14261,14263,14265,14321,14323,14328,14330,14332,14344,14346,14352,14354,14364,14366,14368,14370],[10,14238,7989],{},[14,14240,16],{"id":16},[10,14242,7994],{},[14,14244,22],{"id":22},[10,14246,14247],{},[26,14248],{"alt":8001,"src":8002},[10,14250,8005],{},[14,14252,39],{"id":39},[41,14254,14255,14257,14259],{},[44,14256,8012],{},[44,14258,8015],{},[44,14260,8018],{},[14,14262,62],{"id":62},[10,14264,1431],{},[67,14266,14267],{"className":406,"code":8025,"language":408,"meta":72,"style":72},[33,14268,14269,14273,14277,14281,14285,14289,14293,14297,14301,14305,14309,14313,14317],{"__ignoreMap":72},[76,14270,14271],{"class":78,"line":79},[76,14272,8032],{},[76,14274,14275],{"class":78,"line":90},[76,14276,8037],{},[76,14278,14279],{"class":78,"line":99},[76,14280,8042],{},[76,14282,14283],{"class":78,"line":105},[76,14284,1091],{"emptyLinePlaceholder":226},[76,14286,14287],{"class":78,"line":121},[76,14288,8051],{},[76,14290,14291],{"class":78,"line":1143},[76,14292,8056],{},[76,14294,14295],{"class":78,"line":2438},[76,14296,8061],{},[76,14298,14299],{"class":78,"line":2444},[76,14300,1091],{"emptyLinePlaceholder":226},[76,14302,14303],{"class":78,"line":3904},[76,14304,8070],{},[76,14306,14307],{"class":78,"line":4116},[76,14308,8075],{},[76,14310,14311],{"class":78,"line":5781},[76,14312,1091],{"emptyLinePlaceholder":226},[76,14314,14315],{"class":78,"line":5786},[76,14316,8084],{},[76,14318,14319],{"class":78,"line":7391},[76,14320,8089],{},[10,14322,129],{},[67,14324,14326],{"className":14325,"code":8095,"language":135,"meta":72},[133],[33,14327,8095],{"__ignoreMap":72},[10,14329,140],{},[14,14331,143],{"id":143},[145,14333,14334,14340],{},[44,14335,14336,8109,14338,8113],{},[33,14337,8108],{},[33,14339,8112],{},[44,14341,8116,14342,8120],{},[33,14343,8119],{},[14,14345,169],{"id":169},[41,14347,14348,14350],{},[44,14349,8127],{},[44,14351,8130],{},[14,14353,186],{"id":186},[145,14355,14356,14362],{},[44,14357,8137,14358,8141,14360,180],{},[33,14359,8140],{},[33,14361,8144],{},[44,14363,8147],{},[10,14365,201],{},[14,14367,204],{"id":204},[10,14369,8154],{},[209,14371,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14373},[14374,14375,14376,14377,14378,14379,14380,14381],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":7984,"description":7989},[222,8174,8175],{"id":8178,"title":8179,"body":14386,"category":222,"cover":223,"description":8184,"extension":224,"meta":14549,"navigation":226,"path":8388,"pinned":228,"publishedAt":229,"seo":14550,"slug":8390,"stem":8391,"summary":8392,"tags":14551,"updatedAt":229,"visible":226,"__hash__":8396},{"type":7,"value":14387,"toc":14537},[14388,14390,14392,14394,14396,14400,14404,14406,14422,14424,14426,14470,14472,14477,14479,14481,14495,14497,14501,14505,14509,14511,14517,14519,14529,14531,14533,14535],[10,14389,8184],{},[14,14391,16],{"id":16},[10,14393,8189],{},[14,14395,22],{"id":22},[10,14397,14398],{},[26,14399],{"alt":8196,"src":8197},[10,14401,8200,14402,8204],{},[33,14403,8203],{},[14,14405,39],{"id":39},[41,14407,14408,14414,14420],{},[44,14409,14410,8214,14412,8218],{},[33,14411,8213],{},[33,14413,8217],{},[44,14415,8221,14416,8225,14418,8228],{},[33,14417,8224],{},[33,14419,4290],{},[44,14421,8231],{},[14,14423,62],{"id":62},[10,14425,1431],{},[67,14427,14428],{"className":406,"code":8238,"language":408,"meta":72,"style":72},[33,14429,14430,14434,14438,14442,14446,14450,14454,14458,14462,14466],{"__ignoreMap":72},[76,14431,14432],{"class":78,"line":79},[76,14433,8245],{},[76,14435,14436],{"class":78,"line":90},[76,14437,8250],{},[76,14439,14440],{"class":78,"line":99},[76,14441,8255],{},[76,14443,14444],{"class":78,"line":105},[76,14445,8260],{},[76,14447,14448],{"class":78,"line":121},[76,14449,8265],{},[76,14451,14452],{"class":78,"line":1143},[76,14453,1091],{"emptyLinePlaceholder":226},[76,14455,14456],{"class":78,"line":2438},[76,14457,8274],{},[76,14459,14460],{"class":78,"line":2444},[76,14461,8279],{},[76,14463,14464],{"class":78,"line":3904},[76,14465,8279],{},[76,14467,14468],{"class":78,"line":4116},[76,14469,8279],{},[10,14471,129],{},[67,14473,14475],{"className":14474,"code":8293,"language":135,"meta":72},[133],[33,14476,8293],{"__ignoreMap":72},[10,14478,140],{},[14,14480,143],{"id":143},[145,14482,14483,14487],{},[44,14484,7884,14485,8307],{},[33,14486,8306],{},[44,14488,8310,14489,8313,14491,8316,14493,8320],{},[33,14490,8217],{},[33,14492,8203],{},[33,14494,8319],{},[326,14496,2648],{"id":2648},[10,14498,8325,14499,8328],{},[33,14500,8217],{},[10,14502,14503],{},[26,14504],{"alt":8333,"src":8334},[10,14506,8337,14507,8340],{},[33,14508,8203],{},[14,14510,169],{"id":169},[41,14512,14513,14515],{},[44,14514,8347],{},[44,14516,8350],{},[14,14518,186],{"id":186},[145,14520,14521,14523],{},[44,14522,8357],{},[44,14524,3962,14525,8362,14527,8365],{},[33,14526,4290],{},[33,14528,8217],{},[10,14530,201],{},[14,14532,204],{"id":204},[10,14534,8372],{},[209,14536,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14538},[14539,14540,14541,14542,14543,14546,14547,14548],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":14544},[14545],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":8179,"description":8184},[222,8394,8395],{"id":8398,"title":8399,"body":14553,"category":222,"cover":223,"description":8404,"extension":224,"meta":14736,"navigation":226,"path":8629,"pinned":228,"publishedAt":229,"seo":14737,"slug":8631,"stem":8632,"summary":8633,"tags":14738,"updatedAt":229,"visible":226,"__hash__":8636},{"type":7,"value":14554,"toc":14724},[14555,14557,14559,14561,14563,14567,14569,14571,14585,14587,14589,14657,14659,14664,14666,14668,14682,14684,14686,14690,14696,14698,14706,14708,14716,14718,14720,14722],[10,14556,8404],{},[14,14558,16],{"id":16},[10,14560,8409],{},[14,14562,22],{"id":22},[10,14564,14565],{},[26,14566],{"alt":8416,"src":8417},[10,14568,8420],{},[14,14570,39],{"id":39},[41,14572,14573,14579,14581],{},[44,14574,14575,8430,14577,180],{},[33,14576,8429],{},[33,14578,8433],{},[44,14580,8436],{},[44,14582,14583,8442],{},[33,14584,8441],{},[14,14586,62],{"id":62},[10,14588,1431],{},[67,14590,14591],{"className":406,"code":8449,"language":408,"meta":72,"style":72},[33,14592,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653],{"__ignoreMap":72},[76,14594,14595],{"class":78,"line":79},[76,14596,8456],{},[76,14598,14599],{"class":78,"line":90},[76,14600,1091],{"emptyLinePlaceholder":226},[76,14602,14603],{"class":78,"line":99},[76,14604,8465],{},[76,14606,14607],{"class":78,"line":105},[76,14608,8470],{},[76,14610,14611],{"class":78,"line":121},[76,14612,8475],{},[76,14614,14615],{"class":78,"line":1143},[76,14616,8480],{},[76,14618,14619],{"class":78,"line":2438},[76,14620,8485],{},[76,14622,14623],{"class":78,"line":2444},[76,14624,8490],{},[76,14626,14627],{"class":78,"line":3904},[76,14628,8495],{},[76,14630,14631],{"class":78,"line":4116},[76,14632,8500],{},[76,14634,14635],{"class":78,"line":5781},[76,14636,1091],{"emptyLinePlaceholder":226},[76,14638,14639],{"class":78,"line":5786},[76,14640,8509],{},[76,14642,14643],{"class":78,"line":7391},[76,14644,6134],{},[76,14646,14647],{"class":78,"line":7397},[76,14648,6139],{},[76,14650,14651],{"class":78,"line":8520},[76,14652,1091],{"emptyLinePlaceholder":226},[76,14654,14655],{"class":78,"line":8525},[76,14656,8528],{},[10,14658,129],{},[67,14660,14662],{"className":14661,"code":8534,"language":135,"meta":72},[133],[33,14663,8534],{"__ignoreMap":72},[10,14665,140],{},[14,14667,143],{"id":143},[145,14669,14670,14680],{},[44,14671,8545,14672,8549,14674,8553,14676,8557,14678,180],{},[33,14673,8548],{},[33,14675,8552],{},[33,14677,8556],{},[33,14679,8548],{},[44,14681,8562],{},[326,14683,2648],{"id":2648},[10,14685,8567],{},[10,14687,14688],{},[26,14689],{"alt":8572,"src":8573},[10,14691,14692,8578,14694,180],{},[33,14693,8429],{},[33,14695,8433],{},[14,14697,169],{"id":169},[41,14699,14700,14704],{},[44,14701,8587,14702,180],{},[33,14703,5332],{},[44,14705,8592],{},[14,14707,186],{"id":186},[145,14709,14710,14712],{},[44,14711,8599],{},[44,14713,8602,14714,8606],{},[33,14715,8605],{},[10,14717,201],{},[14,14719,204],{"id":204},[10,14721,8613],{},[209,14723,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14725},[14726,14727,14728,14729,14730,14733,14734,14735],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":14731},[14732],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":8399,"description":8404},[222,8635,5283],{"id":8638,"title":8639,"body":14740,"category":222,"cover":223,"description":8644,"extension":224,"meta":14899,"navigation":226,"path":8832,"pinned":228,"publishedAt":229,"seo":14900,"slug":8834,"stem":8835,"summary":8836,"tags":14901,"updatedAt":229,"visible":226,"__hash__":8840},{"type":7,"value":14741,"toc":14887},[14742,14744,14746,14748,14750,14754,14756,14758,14766,14768,14770,14834,14836,14841,14843,14845,14853,14855,14857,14861,14863,14865,14871,14873,14879,14881,14883,14885],[10,14743,8644],{},[14,14745,16],{"id":16},[10,14747,8649],{},[14,14749,22],{"id":22},[10,14751,14752],{},[26,14753],{"alt":8656,"src":8657},[10,14755,8660],{},[14,14757,39],{"id":39},[41,14759,14760,14762,14764],{},[44,14761,8667],{},[44,14763,8670],{},[44,14765,8673],{},[14,14767,62],{"id":62},[10,14769,1431],{},[67,14771,14772],{"className":406,"code":8680,"language":408,"meta":72,"style":72},[33,14773,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830],{"__ignoreMap":72},[76,14775,14776],{"class":78,"line":79},[76,14777,8687],{},[76,14779,14780],{"class":78,"line":90},[76,14781,8692],{},[76,14783,14784],{"class":78,"line":99},[76,14785,1091],{"emptyLinePlaceholder":226},[76,14787,14788],{"class":78,"line":105},[76,14789,8701],{},[76,14791,14792],{"class":78,"line":121},[76,14793,1091],{"emptyLinePlaceholder":226},[76,14795,14796],{"class":78,"line":1143},[76,14797,8710],{},[76,14799,14800],{"class":78,"line":2438},[76,14801,8715],{},[76,14803,14804],{"class":78,"line":2444},[76,14805,8720],{},[76,14807,14808],{"class":78,"line":3904},[76,14809,1091],{"emptyLinePlaceholder":226},[76,14811,14812],{"class":78,"line":4116},[76,14813,8729],{},[76,14815,14816],{"class":78,"line":5781},[76,14817,8734],{},[76,14819,14820],{"class":78,"line":5786},[76,14821,8739],{},[76,14823,14824],{"class":78,"line":7391},[76,14825,1091],{"emptyLinePlaceholder":226},[76,14827,14828],{"class":78,"line":7397},[76,14829,6148],{},[76,14831,14832],{"class":78,"line":8520},[76,14833,8752],{},[10,14835,129],{},[67,14837,14839],{"className":14838,"code":8758,"language":135,"meta":72},[133],[33,14840,8758],{"__ignoreMap":72},[10,14842,140],{},[14,14844,143],{"id":143},[145,14846,14847,14851],{},[44,14848,14849,8772],{},[33,14850,8771],{},[44,14852,8775],{},[326,14854,2648],{"id":2648},[10,14856,8780],{},[10,14858,14859],{},[26,14860],{"alt":8785,"src":8786},[10,14862,8789],{},[14,14864,169],{"id":169},[41,14866,14867,14869],{},[44,14868,8796],{},[44,14870,8799],{},[14,14872,186],{"id":186},[145,14874,14875,14877],{},[44,14876,8806],{},[44,14878,8809],{},[10,14880,201],{},[14,14882,204],{"id":204},[10,14884,8816],{},[209,14886,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":14888},[14889,14890,14891,14892,14893,14896,14897,14898],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":14894},[14895],{"id":2648,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":8639,"description":8644},[222,8838,8839],{"id":8842,"title":8843,"body":14903,"category":222,"cover":223,"description":8848,"extension":224,"meta":15141,"navigation":226,"path":9149,"pinned":228,"publishedAt":229,"seo":15142,"slug":9151,"stem":9152,"summary":9153,"tags":15143,"updatedAt":229,"visible":226,"__hash__":9157},{"type":7,"value":14904,"toc":15128},[14905,14907,14909,14911,14913,14917,14919,14921,14931,14933,14935,15051,15053,15058,15060,15062,15072,15074,15076,15080,15082,15084,15086,15090,15094,15096,15104,15106,15120,15122,15124,15126],[10,14906,8848],{},[14,14908,16],{"id":16},[10,14910,8853],{},[14,14912,22],{"id":22},[10,14914,14915],{},[26,14916],{"alt":8860,"src":8861},[10,14918,8864],{},[14,14920,39],{"id":39},[41,14922,14923,14925,14927],{},[44,14924,8871],{},[44,14926,8874],{},[44,14928,8877,14929,8881],{},[33,14930,8880],{},[14,14932,62],{"id":62},[10,14934,1431],{},[67,14936,14937],{"className":406,"code":8888,"language":408,"meta":72,"style":72},[33,14938,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047],{"__ignoreMap":72},[76,14940,14941],{"class":78,"line":79},[76,14942,6946],{},[76,14944,14945],{"class":78,"line":90},[76,14946,6555],{},[76,14948,14949],{"class":78,"line":99},[76,14950,1091],{"emptyLinePlaceholder":226},[76,14952,14953],{"class":78,"line":105},[76,14954,8907],{},[76,14956,14957],{"class":78,"line":121},[76,14958,8912],{},[76,14960,14961],{"class":78,"line":1143},[76,14962,8917],{},[76,14964,14965],{"class":78,"line":2438},[76,14966,8922],{},[76,14968,14969],{"class":78,"line":2444},[76,14970,1091],{"emptyLinePlaceholder":226},[76,14972,14973],{"class":78,"line":3904},[76,14974,8931],{},[76,14976,14977],{"class":78,"line":4116},[76,14978,8936],{},[76,14980,14981],{"class":78,"line":5781},[76,14982,8941],{},[76,14984,14985],{"class":78,"line":5786},[76,14986,8946],{},[76,14988,14989],{"class":78,"line":7391},[76,14990,8951],{},[76,14992,14993],{"class":78,"line":7397},[76,14994,1091],{"emptyLinePlaceholder":226},[76,14996,14997],{"class":78,"line":8520},[76,14998,8960],{},[76,15000,15001],{"class":78,"line":8525},[76,15002,8965],{},[76,15004,15005],{"class":78,"line":8968},[76,15006,8971],{},[76,15008,15009],{"class":78,"line":8974},[76,15010,1091],{"emptyLinePlaceholder":226},[76,15012,15013],{"class":78,"line":8979},[76,15014,8982],{},[76,15016,15017],{"class":78,"line":8985},[76,15018,1091],{"emptyLinePlaceholder":226},[76,15020,15021],{"class":78,"line":8990},[76,15022,7364],{},[76,15024,15025],{"class":78,"line":8995},[76,15026,8998],{},[76,15028,15029],{"class":78,"line":9001},[76,15030,9004],{},[76,15032,15033],{"class":78,"line":9007},[76,15034,9010],{},[76,15036,15037],{"class":78,"line":9013},[76,15038,7374],{},[76,15040,15041],{"class":78,"line":9018},[76,15042,9021],{},[76,15044,15045],{"class":78,"line":9024},[76,15046,1140],{},[76,15048,15049],{"class":78,"line":9029},[76,15050,9032],{},[10,15052,129],{},[67,15054,15056],{"className":15055,"code":9038,"language":135,"meta":72},[133],[33,15057,9038],{"__ignoreMap":72},[10,15059,140],{},[14,15061,143],{"id":143},[145,15063,15064,15068],{},[44,15065,9049,15066,9052],{},[33,15067,8880],{},[44,15069,15070,9057],{},[33,15071,8112],{},[326,15073,2648],{"id":2648},[10,15075,9062],{},[10,15077,15078],{},[26,15079],{"alt":9067,"src":9068},[10,15081,9071],{},[326,15083,2648],{"id":4171},[10,15085,9076],{},[10,15087,15088],{},[26,15089],{"alt":9081,"src":9082},[10,15091,9085,15092,9089],{},[33,15093,9088],{},[14,15095,169],{"id":169},[41,15097,15098,15100],{},[44,15099,9096],{},[44,15101,9099,15102,9102],{},[33,15103,9088],{},[14,15105,186],{"id":186},[145,15107,15108,15112,15114],{},[44,15109,9109,15110,9112],{},[33,15111,9088],{},[44,15113,9115],{},[44,15115,9118,15116,9122,15118,9125],{},[33,15117,9121],{},[33,15119,6090],{},[10,15121,201],{},[14,15123,204],{"id":204},[10,15125,9132],{},[209,15127,1501],{},{"title":72,"searchDepth":90,"depth":90,"links":15129},[15130,15131,15132,15133,15134,15138,15139,15140],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":62,"depth":90,"text":62},{"id":143,"depth":90,"text":143,"children":15135},[15136,15137],{"id":2648,"depth":99,"text":2648},{"id":4171,"depth":99,"text":2648},{"id":169,"depth":90,"text":169},{"id":186,"depth":90,"text":186},{"id":204,"depth":90,"text":204},{},{"title":8843,"description":8848},[222,9155,9156],{"id":1049,"title":1050,"body":15145,"category":222,"cover":1058,"description":72,"extension":224,"meta":15381,"navigation":226,"path":1375,"pinned":228,"publishedAt":1376,"seo":15382,"slug":1378,"stem":1379,"summary":1380,"tags":15383,"updatedAt":1376,"visible":226,"__hash__":1384},{"type":7,"value":15146,"toc":15366},[15147,15151,15153,15155,15157,15159,15179,15181,15186,15188,15190,15218,15224,15226,15230,15232,15252,15254,15264,15266,15268,15270,15272,15274,15276,15278,15280,15282,15302,15304,15306,15310,15312,15314,15316,15318,15322,15324,15342,15344,15346,15348,15350,15352,15354,15356,15358,15360,15362,15364],[10,15148,15149],{},[26,15150],{"alt":1057,"src":1058},[10,15152,1061],{},[10,15154,1064],{},[14,15156,1068],{"id":1067},[10,15158,1071],{},[67,15160,15161],{"className":406,"code":1074,"language":408,"meta":72,"style":72},[33,15162,15163,15167,15171,15175],{"__ignoreMap":72},[76,15164,15165],{"class":78,"line":79},[76,15166,1081],{},[76,15168,15169],{"class":78,"line":90},[76,15170,1086],{},[76,15172,15173],{"class":78,"line":99},[76,15174,1091],{"emptyLinePlaceholder":226},[76,15176,15177],{"class":78,"line":105},[76,15178,1096],{},[10,15180,1099],{},[67,15182,15184],{"className":15183,"code":1103,"language":135,"meta":72},[133],[33,15185,1103],{"__ignoreMap":72},[10,15187,1108],{},[10,15189,1111],{},[67,15191,15192],{"className":406,"code":1114,"language":408,"meta":72,"style":72},[33,15193,15194,15198,15202,15206,15210,15214],{"__ignoreMap":72},[76,15195,15196],{"class":78,"line":79},[76,15197,1121],{},[76,15199,15200],{"class":78,"line":90},[76,15201,1091],{"emptyLinePlaceholder":226},[76,15203,15204],{"class":78,"line":99},[76,15205,1130],{},[76,15207,15208],{"class":78,"line":105},[76,15209,1135],{},[76,15211,15212],{"class":78,"line":121},[76,15213,1140],{},[76,15215,15216],{"class":78,"line":1143},[76,15217,1146],{},[10,15219,15220,177,15222,1155],{},[33,15221,1151],{},[33,15223,1154],{},[14,15225,1159],{"id":1158},[10,15227,1162,15228,1166],{},[33,15229,1165],{},[10,15231,1169],{},[67,15233,15234],{"className":406,"code":1172,"language":408,"meta":72,"style":72},[33,15235,15236,15240,15244,15248],{"__ignoreMap":72},[76,15237,15238],{"class":78,"line":79},[76,15239,1179],{},[76,15241,15242],{"class":78,"line":90},[76,15243,1184],{},[76,15245,15246],{"class":78,"line":99},[76,15247,1189],{},[76,15249,15250],{"class":78,"line":105},[76,15251,1194],{},[10,15253,1197],{},[67,15255,15256],{"className":69,"code":1200,"language":71,"meta":72,"style":72},[33,15257,15258],{"__ignoreMap":72},[76,15259,15260,15262],{"class":78,"line":79},[76,15261,124],{"class":82},[76,15263,118],{"class":86},[10,15265,1211],{},[14,15267,1215],{"id":1214},[326,15269,1218],{"id":1218},[10,15271,1221],{},[326,15273,1224],{"id":1224},[10,15275,1227],{},[326,15277,1230],{"id":1230},[10,15279,1233],{},[10,15281,1236],{},[67,15283,15284],{"className":406,"code":1239,"language":408,"meta":72,"style":72},[33,15285,15286,15290,15294,15298],{"__ignoreMap":72},[76,15287,15288],{"class":78,"line":79},[76,15289,1246],{},[76,15291,15292],{"class":78,"line":90},[76,15293,1091],{"emptyLinePlaceholder":226},[76,15295,15296],{"class":78,"line":99},[76,15297,1255],{},[76,15299,15300],{"class":78,"line":105},[76,15301,1260],{},[10,15303,1263],{},[326,15305,1266],{"id":1266},[10,15307,1269,15308,1272],{},[33,15309,258],{},[10,15311,1275],{},[326,15313,1278],{"id":1278},[10,15315,1281],{},[14,15317,1285],{"id":1284},[10,15319,15320],{},[26,15321],{"alt":1290,"src":1291},[10,15323,1294],{},[41,15325,15326,15328,15330,15332,15334,15336,15338,15340],{},[44,15327,1299],{},[44,15329,1302],{},[44,15331,1305],{},[44,15333,1308],{},[44,15335,1311],{},[44,15337,1314],{},[44,15339,1317],{},[44,15341,1320],{},[10,15343,1323],{},[14,15345,1327],{"id":1326},[10,15347,1330],{},[10,15349,1333],{},[14,15351,1337],{"id":1336},[10,15353,1340],{},[10,15355,1343],{},[10,15357,1346],{},[14,15359,1349],{"id":1349},[10,15361,1352],{},[10,15363,1355],{},[209,15365,1358],{},{"title":72,"searchDepth":90,"depth":90,"links":15367},[15368,15369,15370,15377,15378,15379,15380],{"id":1067,"depth":90,"text":1068},{"id":1158,"depth":90,"text":1159},{"id":1214,"depth":90,"text":1215,"children":15371},[15372,15373,15374,15375,15376],{"id":1218,"depth":99,"text":1218},{"id":1224,"depth":99,"text":1224},{"id":1230,"depth":99,"text":1230},{"id":1266,"depth":99,"text":1266},{"id":1278,"depth":99,"text":1278},{"id":1284,"depth":90,"text":1285},{"id":1326,"depth":90,"text":1327},{"id":1336,"depth":90,"text":1337},{"id":1349,"depth":90,"text":1349},{},{"title":1050,"description":72},[222,1382,1383],{"id":240,"title":241,"body":15385,"category":222,"cover":223,"description":72,"extension":224,"meta":15964,"navigation":226,"path":1038,"pinned":228,"publishedAt":1039,"seo":15965,"slug":1041,"stem":1042,"summary":1043,"tags":15966,"updatedAt":1039,"visible":226,"__hash__":1047},{"type":7,"value":15386,"toc":15940},[15387,15389,15391,15393,15397,15399,15401,15425,15437,15439,15441,15446,15450,15454,15466,15470,15474,15478,15480,15514,15516,15520,15524,15526,15548,15578,15590,15600,15608,15610,15616,15626,15628,15633,15637,15639,15653,15659,15679,15681,15683,15685,15695,15699,15701,15710,15714,15716,15718,15738,15742,15744,15746,15748,15750,15770,15772,15774,15776,15802,15804,15820,15822,15838,15842,15844,15846,15866,15868,15870,15872,15876,15886,15888,15890,15892,15902,15910,15912,15914,15928,15938],[14,15388,246],{"id":246},[10,15390,249],{},[10,15392,252],{},[10,15394,255,15395,259],{},[33,15396,258],{},[14,15398,262],{"id":262},[10,15400,265],{},[267,15402,15403,15405],{},[10,15404,271],{},[267,15406,15407,15413,15415,15419,15421],{},[10,15408,276,15409,280,15411,284],{},[33,15410,279],{},[33,15412,283],{},[10,15414,287],{},[10,15416,290,15417,295],{},[292,15418,294],{},[10,15420,298],{},[10,15422,15423],{},[26,15424],{"alt":303,"src":304},[267,15426,15427,15429],{},[10,15428,309],{},[267,15430,15431,15433],{},[10,15432,314],{},[10,15434,15435],{},[26,15436],{"alt":319,"src":320},[14,15438,324],{"id":323},[326,15440,329],{"id":328},[10,15442,332,15443,340],{},[334,15444,339],{"href":336,"rel":15445},[338],[267,15447,15448],{},[10,15449,345],{},[10,15451,15452],{},[26,15453],{"alt":350,"src":351},[41,15455,15456,15460,15464],{},[44,15457,356,15458,180],{},[292,15459,359],{},[44,15461,362,15462,180],{},[292,15463,365],{},[44,15465,368],{},[10,15467,15468],{},[26,15469],{"alt":373,"src":374},[267,15471,15472],{},[10,15473,379],{},[10,15475,15476],{},[26,15477],{"alt":384,"src":385},[326,15479,389],{"id":388},[267,15481,15482,15486,15490,15510],{},[267,15483,15484],{},[10,15485,396],{},[10,15487,399,15488,403],{},[292,15489,402],{},[67,15491,15492],{"className":406,"code":407,"language":408,"meta":72,"style":72},[33,15493,15494,15498,15502,15506],{"__ignoreMap":72},[76,15495,15496],{"class":78,"line":79},[76,15497,415],{},[76,15499,15500],{"class":78,"line":90},[76,15501,420],{},[76,15503,15504],{"class":78,"line":99},[76,15505,425],{},[76,15507,15508],{"class":78,"line":105},[76,15509,430],{},[10,15511,433,15512,437],{},[292,15513,436],{},[10,15515,440],{},[10,15517,443,15518,446],{},[33,15519,408],{},[10,15521,15522],{},[26,15523],{"alt":451,"src":452},[10,15525,455],{},[267,15527,15528,15530,15534],{},[10,15529,460],{},[10,15531,15532],{},[292,15533,465],{},[267,15535,15536,15540,15544],{},[10,15537,470,15538,473],{},[33,15539,408],{},[10,15541,476,15542,479],{},[33,15543,408],{},[10,15545,482,15546,486],{},[292,15547,485],{},[267,15549,15550,15552,15556],{},[10,15551,491],{},[10,15553,15554],{},[292,15555,496],{},[267,15557,15558,15564,15572,15574],{},[10,15559,15560,504,15562,508],{},[33,15561,503],{},[33,15563,507],{},[10,15565,511,15566,514,15568,518,15570,522],{},[33,15567,503],{},[292,15569,517],{},[292,15571,521],{},[10,15573,525],{},[10,15575,15576,531],{},[292,15577,530],{},[267,15579,15580,15582],{},[10,15581,536],{},[267,15583,15584,15588],{},[10,15585,541,15586,545],{},[292,15587,544],{},[10,15589,548],{},[267,15591,15592,15596],{},[10,15593,553,15594],{},[292,15595,556],{},[10,15597,15598],{},[26,15599],{"alt":561,"src":562},[267,15601,15602,15604],{},[10,15603,567],{},[10,15605,15606],{},[26,15607],{"alt":561,"src":572},[326,15609,576],{"id":575},[10,15611,579,15612,583,15614,587],{},[33,15613,582],{},[33,15615,586],{},[67,15617,15618],{"className":69,"code":590,"language":71,"meta":72,"style":72},[33,15619,15620],{"__ignoreMap":72},[76,15621,15622,15624],{"class":78,"line":79},[76,15623,408],{"class":82},[76,15625,599],{"class":93},[10,15627,602],{},[67,15629,15631],{"className":15630,"code":606,"language":135,"meta":72},[133],[33,15632,606],{"__ignoreMap":72},[10,15634,15635],{},[26,15636],{"alt":561,"src":613},[10,15638,616],{},[67,15640,15641],{"className":69,"code":619,"language":71,"meta":72,"style":72},[33,15642,15643],{"__ignoreMap":72},[76,15644,15645,15647,15649,15651],{"class":78,"line":79},[76,15646,408],{"class":82},[76,15648,628],{"class":93},[76,15650,631],{"class":86},[76,15652,599],{"class":93},[10,15654,636,15655,639,15657,643],{},[33,15656,408],{},[33,15658,642],{},[67,15660,15661],{"className":69,"code":646,"language":71,"meta":72,"style":72},[33,15662,15663,15669],{"__ignoreMap":72},[76,15664,15665,15667],{"class":78,"line":79},[76,15666,507],{"class":82},[76,15668,599],{"class":93},[76,15670,15671,15673,15675,15677],{"class":78,"line":90},[76,15672,507],{"class":82},[76,15674,628],{"class":93},[76,15676,631],{"class":86},[76,15678,599],{"class":93},[14,15680,668],{"id":667},[326,15682,672],{"id":671},[10,15684,675],{},[67,15686,15687],{"className":69,"code":678,"language":71,"meta":72,"style":72},[33,15688,15689],{"__ignoreMap":72},[76,15690,15691,15693],{"class":78,"line":79},[76,15692,124],{"class":82},[76,15694,599],{"class":93},[10,15696,689,15697,693],{},[33,15698,692],{},[326,15700,697],{"id":696},[10,15702,332,15703,705,15706,180,15708,712],{},[334,15704,704],{"href":702,"rel":15705},[338],[292,15707,708],{},[33,15709,711],{},[10,15711,715,15712,719],{},[33,15713,718],{},[326,15715,723],{"id":722},[10,15717,726],{},[67,15719,15720],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,15721,15722,15728],{"__ignoreMap":72},[76,15723,15724,15726],{"class":78,"line":79},[76,15725,124],{"class":82},[76,15727,599],{"class":93},[76,15729,15730,15732,15734,15736],{"class":78,"line":90},[76,15731,124],{"class":82},[76,15733,628],{"class":93},[76,15735,631],{"class":86},[76,15737,599],{"class":93},[10,15739,750,15740,753],{},[33,15741,124],{},[14,15743,757],{"id":756},[10,15745,760],{},[326,15747,764],{"id":763},[10,15749,767],{},[67,15751,15752],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,15753,15754,15760],{"__ignoreMap":72},[76,15755,15756,15758],{"class":78,"line":79},[76,15757,124],{"class":82},[76,15759,599],{"class":93},[76,15761,15762,15764,15766,15768],{"class":78,"line":90},[76,15763,124],{"class":82},[76,15765,628],{"class":93},[76,15767,631],{"class":86},[76,15769,599],{"class":93},[10,15771,790],{},[326,15773,794],{"id":793},[10,15775,797],{},[67,15777,15778],{"className":69,"code":800,"language":71,"meta":72,"style":72},[33,15779,15780,15788],{"__ignoreMap":72},[76,15781,15782,15784,15786],{"class":78,"line":79},[76,15783,807],{"class":82},[76,15785,810],{"class":86},[76,15787,813],{"class":86},[76,15789,15790,15792,15794,15796,15798,15800],{"class":78,"line":90},[76,15791,807],{"class":82},[76,15793,810],{"class":86},[76,15795,822],{"class":86},[76,15797,825],{"class":86},[76,15799,828],{"class":86},[76,15801,831],{"class":86},[10,15803,834],{},[67,15805,15806],{"className":69,"code":837,"language":71,"meta":72,"style":72},[33,15807,15808],{"__ignoreMap":72},[76,15809,15810,15812,15814,15816,15818],{"class":78,"line":79},[76,15811,807],{"class":82},[76,15813,846],{"class":86},[76,15815,822],{"class":86},[76,15817,825],{"class":86},[76,15819,853],{"class":86},[10,15821,856],{},[67,15823,15824],{"className":69,"code":859,"language":71,"meta":72,"style":72},[33,15825,15826],{"__ignoreMap":72},[76,15827,15828,15830,15832,15834,15836],{"class":78,"line":79},[76,15829,807],{"class":82},[76,15831,868],{"class":86},[76,15833,871],{"class":93},[76,15835,874],{"class":86},[76,15837,877],{"class":86},[10,15839,15840,882],{},[33,15841,807],{},[326,15843,886],{"id":885},[10,15845,889],{},[67,15847,15848],{"className":69,"code":729,"language":71,"meta":72,"style":72},[33,15849,15850,15856],{"__ignoreMap":72},[76,15851,15852,15854],{"class":78,"line":79},[76,15853,124],{"class":82},[76,15855,599],{"class":93},[76,15857,15858,15860,15862,15864],{"class":78,"line":90},[76,15859,124],{"class":82},[76,15861,628],{"class":93},[76,15863,631],{"class":86},[76,15865,599],{"class":93},[10,15867,912],{},[14,15869,915],{"id":915},[326,15871,919],{"id":918},[10,15873,922,15874,926],{},[33,15875,925],{},[145,15877,15878,15882,15884],{},[44,15879,931,15880,934],{},[33,15881,642],{},[44,15883,937],{},[44,15885,940],{},[10,15887,943],{},[326,15889,947],{"id":946},[10,15891,950],{},[67,15893,15894],{"className":69,"code":678,"language":71,"meta":72,"style":72},[33,15895,15896],{"__ignoreMap":72},[76,15897,15898,15900],{"class":78,"line":79},[76,15899,124],{"class":82},[76,15901,599],{"class":93},[10,15903,963,15904,966,15906,969,15908,180],{},[33,15905,124],{},[33,15907,408],{},[33,15909,124],{},[326,15911,975],{"id":974},[10,15913,978],{},[67,15915,15916],{"className":69,"code":981,"language":71,"meta":72,"style":72},[33,15917,15918],{"__ignoreMap":72},[76,15919,15920,15922,15924,15926],{"class":78,"line":79},[76,15921,124],{"class":82},[76,15923,628],{"class":93},[76,15925,631],{"class":86},[76,15927,599],{"class":93},[10,15929,996,15930,999,15932,1002,15934,1005,15936,1009],{},[33,15931,124],{},[33,15933,408],{},[33,15935,507],{},[33,15937,1008],{},[209,15939,1012],{},{"title":72,"searchDepth":90,"depth":90,"links":15941},[15942,15943,15944,15949,15954,15959],{"id":246,"depth":90,"text":246},{"id":262,"depth":90,"text":262},{"id":323,"depth":90,"text":324,"children":15945},[15946,15947,15948],{"id":328,"depth":99,"text":329},{"id":388,"depth":99,"text":389},{"id":575,"depth":99,"text":576},{"id":667,"depth":90,"text":668,"children":15950},[15951,15952,15953],{"id":671,"depth":99,"text":672},{"id":696,"depth":99,"text":697},{"id":722,"depth":99,"text":723},{"id":756,"depth":90,"text":757,"children":15955},[15956,15957,15958],{"id":763,"depth":99,"text":764},{"id":793,"depth":99,"text":794},{"id":885,"depth":99,"text":886},{"id":915,"depth":90,"text":915,"children":15960},[15961,15962,15963],{"id":918,"depth":99,"text":919},{"id":946,"depth":99,"text":947},{"id":974,"depth":99,"text":975},{},{"title":241,"description":72},[222,1045,1046],1786973363822]