[{"data":1,"prerenderedAt":15981},["ShallowReactive",2],{"post-python-pathlib-paths":3,"sidebar-posts":260,"post-related-source":9172},{"id":4,"title":5,"body":6,"category":245,"cover":246,"description":12,"extension":247,"meta":248,"navigation":99,"path":249,"pinned":250,"publishedAt":251,"seo":252,"slug":253,"stem":254,"summary":255,"tags":256,"updatedAt":251,"visible":99,"__hash__":259},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":8,"toc":235},"minimark",[9,13,17,20,23,30,41,44,71,74,77,148,151,159,162,165,183,186,207,210,222,225,228,231],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 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\u002F29-pathlib-parts.svg",[10,31,32,36,37,40],{},[33,34,35],"code",{},"Path"," 使用 ",[33,38,39],{},"\u002F"," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,42,43],{"id":43},"核心概念",[45,46,47,51,64],"ul",{},[48,49,50],"li",{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[48,52,53,56,57,56,60,63],{},[33,54,55],{},"exists()","、",[33,58,59],{},"is_file()",[33,61,62],{},"is_dir()"," 检查真实文件系统状态。",[48,65,66,67,70],{},"创建目录前明确目标；",[33,68,69],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,72,73],{"id":73},"跟着示例运行",[10,75,76],{},"把下面代码保存到本课脚本并运行：",[78,79,84],"pre",{"className":80,"code":81,"language":82,"meta":83,"style":83},"language-python shiki shiki-themes github-dark","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","python","",[33,85,86,94,101,107,113,119,124,130,136,142],{"__ignoreMap":83},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,93],{},"from pathlib import Path\n",[87,95,97],{"class":89,"line":96},2,[87,98,100],{"emptyLinePlaceholder":99},true,"\n",[87,102,104],{"class":89,"line":103},3,[87,105,106],{},"project = Path.cwd()\n",[87,108,110],{"class":89,"line":109},4,[87,111,112],{},"data_dir = project \u002F \"data\"\n",[87,114,116],{"class":89,"line":115},5,[87,117,118],{},"file_path = data_dir \u002F \"records.json\"\n",[87,120,122],{"class":89,"line":121},6,[87,123,100],{"emptyLinePlaceholder":99},[87,125,127],{"class":89,"line":126},7,[87,128,129],{},"print(project)\n",[87,131,133],{"class":89,"line":132},8,[87,134,135],{},"print(file_path.name)\n",[87,137,139],{"class":89,"line":138},9,[87,140,141],{},"print(file_path.suffix)\n",[87,143,145],{"class":89,"line":144},10,[87,146,147],{},"print(file_path.exists())\n",[10,149,150],{},"预期结果：",[78,152,157],{"className":153,"code":155,"language":156,"meta":83},[154],"language-text","显示当前项目路径、records.json、.json 和存在状态\n","text",[33,158,155],{"__ignoreMap":83},[10,160,161],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,163,164],{"id":164},"按执行顺序拆开看",[166,167,168,174],"ol",{},[48,169,170,173],{},[33,171,172],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[48,175,176,177,179,180,182],{},"使用 ",[33,178,39],{}," 组合路径片段只创建新的 ",[33,181,35],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,184,185],{"id":185},"初学者容易混淆的地方",[45,187,188,197],{},[48,189,190,191,193,194,196],{},"把 ",[33,192,35],{}," 对象存在当成真实文件存在，仍需调用 ",[33,195,55],{}," 等方法确认。",[48,198,199,200,202,203,206],{},"手工拼接 ",[33,201,39],{}," 或 ",[33,204,205],{},"\\"," 分隔符，降低跨平台可读性。",[14,208,209],{"id":209},"练习",[166,211,212,219],{},[48,213,214,215,218],{},"组合 ",[33,216,217],{},"output\u002Freport.txt"," 路径但先不创建文件。",[48,220,221],{},"输出路径的父目录、文件名和扩展名。",[10,223,224],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,226,227],{"id":227},"本篇边界",[10,229,230],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,233,234],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":83,"searchDepth":96,"depth":96,"links":236},[237,238,239,240,241,242,243,244],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",false,"2026-08-17",{"title":5,"description":12},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[245,257,258],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",[261,1074,1411,1545,1697,1876,2064,2229,2411,2591,2784,3015,3199,3376,3532,3703,3868,4082,4310,4492,4656,4845,5033,5188,5348,5545,5742,5956,6123,6367,6548,6705,6900,7084,7285,7575,7767,7996,8191,8411,8651,8855],{"id":262,"title":263,"body":264,"category":245,"cover":246,"description":83,"extension":247,"meta":1063,"navigation":99,"path":1064,"pinned":250,"publishedAt":1065,"seo":1066,"slug":1067,"stem":1068,"summary":1069,"tags":1070,"updatedAt":1065,"visible":99,"__hash__":1073},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":265,"toc":1039},[266,269,272,275,282,285,288,327,343,347,352,363,368,374,392,398,403,409,413,459,462,468,474,477,508,553,570,584,594,598,609,625,628,634,639,642,660,670,691,695,699,702,714,721,725,740,747,751,754,775,781,785,788,792,795,815,818,822,825,859,862,881,884,905,910,914,917,937,940,943,947,954,968,971,975,978,988,999,1003,1006,1021,1036],[14,267,268],{"id":268},"引言",[10,270,271],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,273,274],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,276,277,278,281],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,279,280],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,283,284],{"id":284},"扫盲",[10,286,287],{},"那么这里有几个概念：",[289,290,291,294],"blockquote",{},[10,292,293],{},"为什么需要安装python解释器？",[289,295,296,307,310,318,321],{},[10,297,298,299,302,303,306],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,300,301],{},"0","和",[33,304,305],{},"1","组成的机器指令。",[10,308,309],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,311,312,313,317],{},"这样，我们就能用",[314,315,316],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,319,320],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,322,323],{},[26,324],{"alt":325,"src":326},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[289,328,329,332],{},[10,330,331],{},"pip又是什么？",[289,333,334,337],{},[10,335,336],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,338,339],{},[26,340],{"alt":341,"src":342},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,344,346],{"id":345},"windows-安装","Windows 安装",[348,349,351],"h3",{"id":350},"_1-下载官方安装程序","1. 下载官方安装程序",[10,353,354,355,362],{},"打开 ",[356,357,361],"a",{"href":358,"rel":359},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[360],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[289,364,365],{},[10,366,367],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,369,370],{},[26,371],{"alt":372,"src":373},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[45,375,376,383,389],{},[48,377,378,379,382],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[314,380,381],{},"Windows installer (64-bit)","。",[48,384,385,386,382],{},"搭载 ARM 处理器的 Windows 设备选择 ",[314,387,388],{},"Windows installer (ARM64)",[48,390,391],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,393,394],{},[26,395],{"alt":396,"src":397},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[289,399,400],{},[10,401,402],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,404,405],{},[26,406],{"alt":407,"src":408},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[348,410,412],{"id":411},"_2-安装并加入-path","2. 安装并加入 PATH",[289,414,415,420,427,452],{},[289,416,417],{},[10,418,419],{},"PATH 环境变量",[10,421,422,423,426],{},"Windows 有一个特殊的变量叫 ",[314,424,425],{},"PATH","，它里面存了一串文件夹路径，比如：",[78,428,430],{"className":80,"code":429,"language":82,"meta":83,"style":83},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,431,432,437,442,447],{"__ignoreMap":83},[87,433,434],{"class":89,"line":90},[87,435,436],{},"D:\\Python313\\\n",[87,438,439],{"class":89,"line":96},[87,440,441],{},"D:\\Python313\\Scripts\\\n",[87,443,444],{"class":89,"line":103},[87,445,446],{},"C:\\Windows\\System32\\\n",[87,448,449],{"class":89,"line":109},[87,450,451],{},"...\n",[10,453,454,455,458],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[314,456,457],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,460,461],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,463,464,465,467],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,466,82],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,469,470],{},[26,471],{"alt":472,"src":473},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,475,476],{},"对安装界面最底部的两个勾选项分别解释 :",[289,478,479,482,487],{},[10,480,481],{},"Add python.exe to PATH",[10,483,484],{},[314,485,486],{},"把 Python 添加到系统环境变量",[289,488,489,495,501],{},[10,490,491,492,494],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,493,82],{}," 就能运行",[10,496,497,498,500],{},"不勾选的话，命令行输入 ",[33,499,82],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,502,503,504,507],{},"必须",[314,505,506],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[289,509,510,513,518],{},[10,511,512],{},"Use admin privileges when installing py.exe",[10,514,515],{},[314,516,517],{},"使用管理员权限安装 py.exe（Python 启动器）",[289,519,520,530,544,547],{},[10,521,522,525,526,529],{},[33,523,524],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,527,528],{},"py"," 来启动 Python。",[10,531,532,533,535,536,539,540,543],{},"勾选后，",[33,534,524],{}," 会安装到",[314,537,538],{},"系统级目录","，电脑上",[314,541,542],{},"所有用户账户","都能用",[10,545,546],{},"不勾选，只有当前用户能用",[10,548,549,552],{},[314,550,551],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[289,554,555,558],{},[10,556,557],{},"操作建议",[289,559,560,567],{},[10,561,562,563,566],{},"两个都勾上之后，再点 ",[314,564,565],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,568,569],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[289,571,572,578],{},[10,573,574,575],{},"Python 安装的",[314,576,577],{},"可选功能页",[10,579,580],{},[26,581],{"alt":582,"src":583},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[289,585,586,589],{},[10,587,588],{},"高级选项页",[10,590,591],{},[26,592],{"alt":582,"src":593},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[348,595,597],{"id":596},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,599,600,601,604,605,608],{},"按 ",[33,602,603],{},"Win + R","，输入 ",[33,606,607],{},"cmd"," 并回车，然后执行：",[78,610,614],{"className":611,"code":612,"language":613,"meta":83,"style":83},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,615,616],{"__ignoreMap":83},[87,617,618,621],{"class":89,"line":90},[87,619,82],{"class":620},"svObZ",[87,622,624],{"class":623},"sDLfK"," --version\n",[10,626,627],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[78,629,632],{"className":630,"code":631,"language":156,"meta":83},[154],"Python 3.x.x\n",[33,633,631],{"__ignoreMap":83},[10,635,636],{},[26,637],{"alt":582,"src":638},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,640,641],{},"继续检查 pip：",[78,643,645],{"className":611,"code":644,"language":613,"meta":83,"style":83},"python -m pip --version\n",[33,646,647],{"__ignoreMap":83},[87,648,649,651,654,658],{"class":89,"line":90},[87,650,82],{"class":620},[87,652,653],{"class":623}," -m",[87,655,657],{"class":656},"sU2Wk"," pip",[87,659,624],{"class":623},[10,661,662,663,665,666,669],{},"如果 ",[33,664,82],{}," 无法识别，但 ",[33,667,668],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[78,671,673],{"className":611,"code":672,"language":613,"meta":83,"style":83},"py --version\npy -m pip --version\n",[33,674,675,681],{"__ignoreMap":83},[87,676,677,679],{"class":89,"line":90},[87,678,528],{"class":620},[87,680,624],{"class":623},[87,682,683,685,687,689],{"class":89,"line":96},[87,684,528],{"class":620},[87,686,653],{"class":623},[87,688,657],{"class":656},[87,690,624],{"class":623},[14,692,694],{"id":693},"macos-安装","macOS 安装",[348,696,698],{"id":697},"_1-先检查现有环境","1. 先检查现有环境",[10,700,701],{},"打开“终端”应用，执行：",[78,703,705],{"className":611,"code":704,"language":613,"meta":83,"style":83},"python3 --version\n",[33,706,707],{"__ignoreMap":83},[87,708,709,712],{"class":89,"line":90},[87,710,711],{"class":620},"python3",[87,713,624],{"class":623},[10,715,716,717,720],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,718,719],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[348,722,724],{"id":723},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,726,354,727,732,733,382,736,739],{},[356,728,731],{"href":729,"rel":730},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[360],"Python macOS 下载页","，下载当前稳定版的 ",[314,734,735],{},"macOS 64-bit universal2 installer",[33,737,738],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,741,742,743,746],{},"下载完成后打开 ",[33,744,745],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[348,748,750],{"id":749},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,752,753],{},"安装完成后重新打开终端，执行：",[78,755,757],{"className":611,"code":756,"language":613,"meta":83,"style":83},"python3 --version\npython3 -m pip --version\n",[33,758,759,765],{"__ignoreMap":83},[87,760,761,763],{"class":89,"line":90},[87,762,711],{"class":620},[87,764,624],{"class":623},[87,766,767,769,771,773],{"class":89,"line":96},[87,768,711],{"class":620},[87,770,653],{"class":623},[87,772,657],{"class":656},[87,774,624],{"class":623},[10,776,777,778,780],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,779,711],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,782,784],{"id":783},"linux-安装","Linux 安装",[10,786,787],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[348,789,791],{"id":790},"_1-检查是否已经安装","1. 检查是否已经安装",[10,793,794],{},"打开终端，执行：",[78,796,797],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,798,799,805],{"__ignoreMap":83},[87,800,801,803],{"class":89,"line":90},[87,802,711],{"class":620},[87,804,624],{"class":623},[87,806,807,809,811,813],{"class":89,"line":96},[87,808,711],{"class":620},[87,810,653],{"class":623},[87,812,657],{"class":656},[87,814,624],{"class":623},[10,816,817],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[348,819,821],{"id":820},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,823,824],{},"Ubuntu 或 Debian：",[78,826,828],{"className":611,"code":827,"language":613,"meta":83,"style":83},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,829,830,841],{"__ignoreMap":83},[87,831,832,835,838],{"class":89,"line":90},[87,833,834],{"class":620},"sudo",[87,836,837],{"class":656}," apt",[87,839,840],{"class":656}," update\n",[87,842,843,845,847,850,853,856],{"class":89,"line":96},[87,844,834],{"class":620},[87,846,837],{"class":656},[87,848,849],{"class":656}," install",[87,851,852],{"class":656}," python3",[87,854,855],{"class":656}," python3-pip",[87,857,858],{"class":656}," python3-venv\n",[10,860,861],{},"Fedora：",[78,863,865],{"className":611,"code":864,"language":613,"meta":83,"style":83},"sudo dnf install python3 python3-pip\n",[33,866,867],{"__ignoreMap":83},[87,868,869,871,874,876,878],{"class":89,"line":90},[87,870,834],{"class":620},[87,872,873],{"class":656}," dnf",[87,875,849],{"class":656},[87,877,852],{"class":656},[87,879,880],{"class":656}," python3-pip\n",[10,882,883],{},"Arch Linux：",[78,885,887],{"className":611,"code":886,"language":613,"meta":83,"style":83},"sudo pacman -S python python-pip\n",[33,888,889],{"__ignoreMap":83},[87,890,891,893,896,899,902],{"class":89,"line":90},[87,892,834],{"class":620},[87,894,895],{"class":656}," pacman",[87,897,898],{"class":623}," -S",[87,900,901],{"class":656}," python",[87,903,904],{"class":656}," python-pip\n",[10,906,907,909],{},[33,908,834],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[348,911,913],{"id":912},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,915,916],{},"安装结束后执行：",[78,918,919],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,920,921,927],{"__ignoreMap":83},[87,922,923,925],{"class":89,"line":90},[87,924,711],{"class":620},[87,926,624],{"class":623},[87,928,929,931,933,935],{"class":89,"line":96},[87,930,711],{"class":620},[87,932,653],{"class":623},[87,934,657],{"class":656},[87,936,624],{"class":623},[10,938,939],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,941,942],{"id":942},"常见问题",[348,944,946],{"id":945},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,948,949,950,953],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,951,952],{},"python --version","。如果仍然失败，按下面的顺序检查：",[166,955,956,962,965],{},[48,957,958,959,961],{},"执行 ",[33,960,668],{},"，确认 Python Launcher 是否可用。",[48,963,964],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[48,966,967],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,969,970],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[348,972,974],{"id":973},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,976,977],{},"先尝试：",[78,979,980],{"className":611,"code":704,"language":613,"meta":83,"style":83},[33,981,982],{"__ignoreMap":83},[87,983,984,986],{"class":89,"line":90},[87,985,711],{"class":620},[87,987,624],{"class":623},[10,989,990,991,993,994,996,997,382],{},"在这两个系统中，只有 ",[33,992,711],{}," 命令而没有 ",[33,995,82],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,998,711],{},[348,1000,1002],{"id":1001},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1004,1005],{},"先使用模块方式检查：",[78,1007,1009],{"className":611,"code":1008,"language":613,"meta":83,"style":83},"python3 -m pip --version\n",[33,1010,1011],{"__ignoreMap":83},[87,1012,1013,1015,1017,1019],{"class":89,"line":90},[87,1014,711],{"class":620},[87,1016,653],{"class":623},[87,1018,657],{"class":656},[87,1020,624],{"class":623},[10,1022,1023,1024,1026,1027,202,1029,1031,1032,1035],{},"Windows 用户将命令中的 ",[33,1025,711],{}," 换成 ",[33,1028,82],{},[33,1030,528],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1033,1034],{},"python3-pip","；不要直接使用其他系统的安装命令。",[232,1037,1038],{},"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":83,"searchDepth":96,"depth":96,"links":1040},[1041,1042,1043,1048,1053,1058],{"id":268,"depth":96,"text":268},{"id":284,"depth":96,"text":284},{"id":345,"depth":96,"text":346,"children":1044},[1045,1046,1047],{"id":350,"depth":103,"text":351},{"id":411,"depth":103,"text":412},{"id":596,"depth":103,"text":597},{"id":693,"depth":96,"text":694,"children":1049},[1050,1051,1052],{"id":697,"depth":103,"text":698},{"id":723,"depth":103,"text":724},{"id":749,"depth":103,"text":750},{"id":783,"depth":96,"text":784,"children":1054},[1055,1056,1057],{"id":790,"depth":103,"text":791},{"id":820,"depth":103,"text":821},{"id":912,"depth":103,"text":913},{"id":942,"depth":96,"text":942,"children":1059},[1060,1061,1062],{"id":945,"depth":103,"text":946},{"id":973,"depth":103,"text":974},{"id":1001,"depth":103,"text":1002},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":263,"description":83},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[245,1071,1072],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1075,"title":1076,"body":1077,"category":245,"cover":1084,"description":83,"extension":247,"meta":1400,"navigation":99,"path":1401,"pinned":250,"publishedAt":1402,"seo":1403,"slug":1404,"stem":1405,"summary":1406,"tags":1407,"updatedAt":1402,"visible":99,"__hash__":1410},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1078,"toc":1385},[1079,1085,1088,1091,1095,1098,1122,1125,1131,1134,1137,1171,1181,1185,1192,1195,1220,1223,1235,1238,1242,1245,1248,1251,1254,1257,1260,1263,1287,1290,1293,1299,1302,1305,1308,1312,1318,1321,1347,1350,1354,1357,1360,1364,1367,1370,1373,1376,1379,1382],[10,1080,1081],{},[26,1082],{"alt":1083,"src":1084},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1086,1087],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1089,1090],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1092,1094],{"id":1093},"python-代码是什么样的","Python 代码是什么样的",[10,1096,1097],{},"下面是一段简单的 Python 代码：",[78,1099,1101],{"className":80,"code":1100,"language":82,"meta":83,"style":83},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1102,1103,1108,1113,1117],{"__ignoreMap":83},[87,1104,1105],{"class":89,"line":90},[87,1106,1107],{},"name = \"Python\"\n",[87,1109,1110],{"class":89,"line":96},[87,1111,1112],{},"year = 2026\n",[87,1114,1115],{"class":89,"line":103},[87,1116,100],{"emptyLinePlaceholder":99},[87,1118,1119],{"class":89,"line":109},[87,1120,1121],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1123,1124],{},"运行结果：",[78,1126,1129],{"className":1127,"code":1128,"language":156,"meta":83},[154],"正在学习 Python，当前年份是 2026\n",[33,1130,1128],{"__ignoreMap":83},[10,1132,1133],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1135,1136],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[78,1138,1140],{"className":80,"code":1139,"language":82,"meta":83,"style":83},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1141,1142,1147,1151,1156,1161,1166],{"__ignoreMap":83},[87,1143,1144],{"class":89,"line":90},[87,1145,1146],{},"score = 85\n",[87,1148,1149],{"class":89,"line":96},[87,1150,100],{"emptyLinePlaceholder":99},[87,1152,1153],{"class":89,"line":103},[87,1154,1155],{},"if score >= 60:\n",[87,1157,1158],{"class":89,"line":109},[87,1159,1160],{},"    print(\"成绩合格\")\n",[87,1162,1163],{"class":89,"line":115},[87,1164,1165],{},"else:\n",[87,1167,1168],{"class":89,"line":121},[87,1169,1170],{},"    print(\"需要继续学习\")\n",[10,1172,1173,1176,1177,1180],{},[33,1174,1175],{},"if"," 和 ",[33,1178,1179],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1182,1184],{"id":1183},"python-如何运行代码","Python 如何运行代码",[10,1186,1187,1188,1191],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1189,1190],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1193,1194],{},"交互式环境适合快速验证一个表达式：",[78,1196,1198],{"className":80,"code":1197,"language":82,"meta":83,"style":83},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1199,1200,1205,1210,1215],{"__ignoreMap":83},[87,1201,1202],{"class":89,"line":90},[87,1203,1204],{},">>> 10 + 20\n",[87,1206,1207],{"class":89,"line":96},[87,1208,1209],{},"30\n",[87,1211,1212],{"class":89,"line":103},[87,1213,1214],{},">>> \"Python\".lower()\n",[87,1216,1217],{"class":89,"line":109},[87,1218,1219],{},"'python'\n",[10,1221,1222],{},"需要保存和重复运行的程序，则可以写入文件：",[78,1224,1226],{"className":611,"code":1225,"language":613,"meta":83,"style":83},"python3 hello.py\n",[33,1227,1228],{"__ignoreMap":83},[87,1229,1230,1232],{"class":89,"line":90},[87,1231,711],{"class":620},[87,1233,1234],{"class":656}," hello.py\n",[10,1236,1237],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1239,1241],{"id":1240},"python-的特点","Python 的特点",[348,1243,1244],{"id":1244},"语法相对简洁",[10,1246,1247],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[348,1249,1250],{"id":1250},"支持多种编程方式",[10,1252,1253],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[348,1255,1256],{"id":1256},"标准库比较完整",[10,1258,1259],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1261,1262],{},"例如，获取当前时间：",[78,1264,1266],{"className":80,"code":1265,"language":82,"meta":83,"style":83},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1267,1268,1273,1277,1282],{"__ignoreMap":83},[87,1269,1270],{"class":89,"line":90},[87,1271,1272],{},"from datetime import datetime\n",[87,1274,1275],{"class":89,"line":96},[87,1276,100],{"emptyLinePlaceholder":99},[87,1278,1279],{"class":89,"line":103},[87,1280,1281],{},"now = datetime.now()\n",[87,1283,1284],{"class":89,"line":109},[87,1285,1286],{},"print(now)\n",[10,1288,1289],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[348,1291,1292],{"id":1292},"第三方工具丰富",[10,1294,1295,1296,1298],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1297,280],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1300,1301],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[348,1303,1304],{"id":1304},"支持多个操作系统",[10,1306,1307],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1309,1311],{"id":1310},"python-可以做什么","Python 可以做什么",[10,1313,1314],{},[26,1315],{"alt":1316,"src":1317},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1319,1320],{},"Python 的应用范围比较广，常见方向包括：",[45,1322,1323,1326,1329,1332,1335,1338,1341,1344],{},[48,1324,1325],{},"编写自动化脚本，批量处理文件和重复任务；",[48,1327,1328],{},"开发网站后端和 API 服务；",[48,1330,1331],{},"进行数据清洗、统计分析和图表展示；",[48,1333,1334],{},"编写网络爬虫和信息采集工具；",[48,1336,1337],{},"开发自动化测试程序；",[48,1339,1340],{},"进行机器学习和人工智能开发；",[48,1342,1343],{},"编写运维、监控和辅助开发工具；",[48,1345,1346],{},"开发部分桌面应用和插件。",[10,1348,1349],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1351,1353],{"id":1352},"python-的发展","Python 的发展",[10,1355,1356],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1358,1359],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1361,1363],{"id":1362},"python-也有局限","Python 也有局限",[10,1365,1366],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1368,1369],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1371,1372],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1374,1375],{"id":1375},"写在最后",[10,1377,1378],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1380,1381],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[232,1383,1384],{},"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":83,"searchDepth":96,"depth":96,"links":1386},[1387,1388,1389,1396,1397,1398,1399],{"id":1093,"depth":96,"text":1094},{"id":1183,"depth":96,"text":1184},{"id":1240,"depth":96,"text":1241,"children":1390},[1391,1392,1393,1394,1395],{"id":1244,"depth":103,"text":1244},{"id":1250,"depth":103,"text":1250},{"id":1256,"depth":103,"text":1256},{"id":1292,"depth":103,"text":1292},{"id":1304,"depth":103,"text":1304},{"id":1310,"depth":96,"text":1311},{"id":1352,"depth":96,"text":1353},{"id":1362,"depth":96,"text":1363},{"id":1375,"depth":96,"text":1375},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1076,"description":83},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[245,1408,1409],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1412,"title":1413,"body":1414,"category":245,"cover":246,"description":1418,"extension":247,"meta":1536,"navigation":99,"path":1537,"pinned":250,"publishedAt":251,"seo":1538,"slug":1539,"stem":1540,"summary":1541,"tags":1542,"updatedAt":251,"visible":99,"__hash__":1544},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1415,"toc":1526},[1416,1419,1421,1424,1426,1432,1437,1439,1453,1455,1457,1466,1468,1474,1476,1478,1494,1496,1507,1509,1517,1519,1521,1524],[10,1417,1418],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1420,16],{"id":16},[10,1422,1423],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1425,22],{"id":22},[10,1427,1428],{},[26,1429],{"alt":1430,"src":1431},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1433,1434,1436],{},[33,1435,1190],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1438,43],{"id":43},[45,1440,1441,1447,1450],{},[48,1442,1443,1444,1446],{},"源代码是人编写的文本，通常保存在 ",[33,1445,1190],{}," 文件中。",[48,1448,1449],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[48,1451,1452],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1454,73],{"id":73},[10,1456,76],{},[78,1458,1460],{"className":80,"code":1459,"language":82,"meta":83,"style":83},"print(\"你好，Python\")\n",[33,1461,1462],{"__ignoreMap":83},[87,1463,1464],{"class":89,"line":90},[87,1465,1459],{},[10,1467,150],{},[78,1469,1472],{"className":1470,"code":1471,"language":156,"meta":83},[154],"你好，Python\n",[33,1473,1471],{"__ignoreMap":83},[10,1475,161],{},[14,1477,164],{"id":164},[166,1479,1480,1487],{},[48,1481,1482,1483,1486],{},"终端启动解释器后，解释器读取 ",[33,1484,1485],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[48,1488,1489,1490,1493],{},"字符串对象先准备好，再交给 ",[33,1491,1492],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1495,185],{"id":185},[45,1497,1498,1501],{},[48,1499,1500],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[48,1502,1503,1504,1506],{},"认为 ",[33,1505,1190],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1508,209],{"id":209},[166,1510,1511,1514],{},[48,1512,1513],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[48,1515,1516],{},"把示例文字改成自己的学习目标并重新运行。",[10,1518,224],{},[14,1520,227],{"id":227},[10,1522,1523],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,1525,234],{},{"title":83,"searchDepth":96,"depth":96,"links":1527},[1528,1529,1530,1531,1532,1533,1534,1535],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1413,"description":1418},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[245,1408,1543],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1546,"title":1547,"body":1548,"category":245,"cover":246,"description":1552,"extension":247,"meta":1688,"navigation":99,"path":1689,"pinned":250,"publishedAt":251,"seo":1690,"slug":1691,"stem":1692,"summary":1693,"tags":1694,"updatedAt":251,"visible":99,"__hash__":1696},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1549,"toc":1678},[1550,1553,1555,1558,1560,1566,1572,1574,1589,1591,1594,1614,1616,1622,1624,1626,1639,1641,1655,1657,1668,1670,1672,1675],[10,1551,1552],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1554,16],{"id":16},[10,1556,1557],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1559,22],{"id":22},[10,1561,1562],{},[26,1563],{"alt":1564,"src":1565},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1567,1568,1569,1571],{},"终端收到 ",[33,1570,711],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1573,43],{"id":43},[45,1575,1576,1579,1582],{},[48,1577,1578],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[48,1580,1581],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[48,1583,1584,1585,1588],{},"检查 pip 时使用 ",[33,1586,1587],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1590,73],{"id":73},[10,1592,1593],{},"在 macOS 终端执行：",[78,1595,1596],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,1597,1598,1604],{"__ignoreMap":83},[87,1599,1600,1602],{"class":89,"line":90},[87,1601,711],{"class":620},[87,1603,624],{"class":623},[87,1605,1606,1608,1610,1612],{"class":89,"line":96},[87,1607,711],{"class":620},[87,1609,653],{"class":623},[87,1611,657],{"class":656},[87,1613,624],{"class":623},[10,1615,150],{},[78,1617,1620],{"className":1618,"code":1619,"language":156,"meta":83},[154],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1621,1619],{"__ignoreMap":83},[10,1623,161],{},[14,1625,164],{"id":164},[166,1627,1628,1634],{},[48,1629,1630,1633],{},[33,1631,1632],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[48,1635,1636,1638],{},[33,1637,719],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1640,185],{"id":185},[45,1642,1643,1649],{},[48,1644,1645,1646,1648],{},"看到系统已有 ",[33,1647,711],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[48,1650,1651,1652,1654],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1653,711],{},"，不修改系统自带工具。",[14,1656,209],{"id":209},[166,1658,1659,1665],{},[48,1660,958,1661,1664],{},[33,1662,1663],{},"which python3","，记录当前解释器路径。",[48,1666,1667],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1669,224],{},[14,1671,227],{"id":227},[10,1673,1674],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,1676,1677],{},"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":83,"searchDepth":96,"depth":96,"links":1679},[1680,1681,1682,1683,1684,1685,1686,1687],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1547,"description":1552},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[245,1695,1071],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1698,"title":1699,"body":1700,"category":245,"cover":246,"description":1865,"extension":247,"meta":1866,"navigation":99,"path":1867,"pinned":250,"publishedAt":251,"seo":1868,"slug":1869,"stem":1870,"summary":1871,"tags":1872,"updatedAt":251,"visible":99,"__hash__":1875},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1701,"toc":1855},[1702,1708,1710,1713,1715,1721,1724,1726,1750,1752,1754,1781,1783,1789,1791,1793,1811,1813,1827,1829,1843,1845,1847,1853],[10,1703,1704,1705,1707],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1706,1190],{}," 脚本。",[14,1709,16],{"id":16},[10,1711,1712],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1714,22],{"id":22},[10,1716,1717],{},[26,1718],{"alt":1719,"src":1720},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1722,1723],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1725,43],{"id":43},[45,1727,1728,1737,1744],{},[48,1729,1730,1731,1733,1734,382],{},"在终端输入 ",[33,1732,711],{}," 进入 REPL，提示符通常是 ",[33,1735,1736],{},">>>",[48,1738,1739,1740,1743],{},"输入 ",[33,1741,1742],{},"exit()"," 或按 Control-D 退出 REPL。",[48,1745,1746,1747,1749],{},"需要保存、复查或多次运行的代码应写入 ",[33,1748,1190],{}," 文件。",[14,1751,73],{"id":73},[10,1753,76],{},[78,1755,1759],{"className":1756,"code":1757,"language":1758,"meta":83,"style":83},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1760,1761,1766,1771,1776],{"__ignoreMap":83},[87,1762,1763],{"class":89,"line":90},[87,1764,1765],{},">>> 2 + 3\n",[87,1767,1768],{"class":89,"line":96},[87,1769,1770],{},"5\n",[87,1772,1773],{"class":89,"line":103},[87,1774,1775],{},">>> \"python\".upper()\n",[87,1777,1778],{"class":89,"line":109},[87,1779,1780],{},"'PYTHON'\n",[10,1782,150],{},[78,1784,1787],{"className":1785,"code":1786,"language":156,"meta":83},[154],"REPL 会直接显示表达式结果\n",[33,1788,1786],{"__ignoreMap":83},[10,1790,161],{},[14,1792,164],{"id":164},[166,1794,1795,1805],{},[48,1796,1797,1798,1801,1802,382],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1799,1800],{},"2 + 3"," 能直接看到 ",[33,1803,1804],{},"5",[48,1806,1807,1808,1810],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1809,1492],{}," 才会写到标准输出。",[14,1812,185],{"id":185},[45,1814,1815,1824],{},[48,1816,1817,1818,1820,1821,1823],{},"把提示符 ",[33,1819,1736],{}," 复制进 ",[33,1822,1190],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[48,1825,1826],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1828,209],{"id":209},[166,1830,1831,1837],{},[48,1832,1833,1834,382],{},"在 REPL 计算 ",[33,1835,1836],{},"12 * 8",[48,1838,1839,1840,1842],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1841,1492],{}," 时是否显示结果。",[10,1844,224],{},[14,1846,227],{"id":227},[10,1848,1849,1850,1852],{},"本篇目标是根据任务选择 REPL 或 ",[33,1851,1190],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,1854,234],{},{"title":83,"searchDepth":96,"depth":96,"links":1856},[1857,1858,1859,1860,1861,1862,1863,1864],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1699,"description":1865},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[245,1873,1874],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1877,"title":1878,"body":1879,"category":245,"cover":246,"description":1883,"extension":247,"meta":2054,"navigation":99,"path":2055,"pinned":250,"publishedAt":251,"seo":2056,"slug":2057,"stem":2058,"summary":2059,"tags":2060,"updatedAt":251,"visible":99,"__hash__":2063},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1880,"toc":2044},[1881,1884,1886,1889,1891,1897,1903,1905,1923,1925,1927,1972,1974,1980,1982,1984,2006,2008,2020,2022,2034,2036,2038,2041],[10,1882,1883],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1885,16],{"id":16},[10,1887,1888],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1890,22],{"id":22},[10,1892,1893],{},[26,1894],{"alt":1895,"src":1896},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1898,1899,1902],{},[33,1900,1901],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1904,43],{"id":43},[45,1906,1907,1910,1920],{},[48,1908,1909],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[48,1911,1912,1915,1916,1919],{},[33,1913,1914],{},"pwd"," 显示当前目录，",[33,1917,1918],{},"ls"," 显示目录里的文件。",[48,1921,1922],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1924,73],{"id":73},[10,1926,1593],{},[78,1928,1930],{"className":611,"code":1929,"language":613,"meta":83,"style":83},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1931,1932,1940,1947,1952,1966],{"__ignoreMap":83},[87,1933,1934,1937],{"class":89,"line":90},[87,1935,1936],{"class":620},"mkdir",[87,1938,1939],{"class":656}," python-study\n",[87,1941,1942,1945],{"class":89,"line":96},[87,1943,1944],{"class":623},"cd",[87,1946,1939],{"class":656},[87,1948,1949],{"class":89,"line":103},[87,1950,1951],{"class":623},"pwd\n",[87,1953,1954,1957,1960,1964],{"class":89,"line":109},[87,1955,1956],{"class":623},"printf",[87,1958,1959],{"class":656}," 'print(\"项目已经运行\")\\n'",[87,1961,1963],{"class":1962},"snl16"," >",[87,1965,1234],{"class":656},[87,1967,1968,1970],{"class":89,"line":115},[87,1969,711],{"class":620},[87,1971,1234],{"class":656},[10,1973,150],{},[78,1975,1978],{"className":1976,"code":1977,"language":156,"meta":83},[154],"项目已经运行\n",[33,1979,1977],{"__ignoreMap":83},[10,1981,161],{},[14,1983,164],{"id":164},[166,1985,1986,1997],{},[48,1987,1988,1990,1991,1993,1994,1996],{},[33,1989,1936],{}," 创建目录，",[33,1992,1944],{}," 改变终端当前目录，",[33,1995,1914],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[48,1998,1999,2001,2002,2005],{},[33,2000,1901],{}," 会在当前目录寻找 ",[33,2003,2004],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2007,185],{"id":185},[45,2009,2010,2017],{},[48,2011,2012,2013,1176,2015,382],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,2014,1914],{},[33,2016,1918],{},[48,2018,2019],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2021,209],{"id":209},[166,2023,2024,2031],{},[48,2025,2026,2027,2030],{},"新建 ",[33,2028,2029],{},"lesson01.py"," 并输出课程编号。",[48,2032,2033],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2035,224],{},[14,2037,227],{"id":227},[10,2039,2040],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2042,2043],{},"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":83,"searchDepth":96,"depth":96,"links":2045},[2046,2047,2048,2049,2050,2051,2052,2053],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1878,"description":1883},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[245,2061,2062],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2065,"title":2066,"body":2067,"category":245,"cover":246,"description":2071,"extension":247,"meta":2219,"navigation":99,"path":2220,"pinned":250,"publishedAt":251,"seo":2221,"slug":2222,"stem":2223,"summary":2224,"tags":2225,"updatedAt":251,"visible":99,"__hash__":2228},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2068,"toc":2209},[2069,2072,2074,2077,2079,2085,2096,2098,2118,2120,2122,2142,2144,2150,2152,2154,2173,2175,2183,2185,2200,2202,2204,2207],[10,2070,2071],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2073,16],{"id":16},[10,2075,2076],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2078,22],{"id":22},[10,2080,2081],{},[26,2082],{"alt":2083,"src":2084},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2086,2087,2088,382,2090,2093,2094,382],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2089,1492],{},[33,2091,2092],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2095,1800],{},[14,2097,43],{"id":43},[45,2099,2100,2106,2115],{},[48,2101,2102,2105],{},[33,2103,2104],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[48,2107,2108,2111,2112,382],{},[33,2109,2110],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2113,2114],{},"12",[48,2116,2117],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2119,73],{"id":73},[10,2121,76],{},[78,2123,2125],{"className":80,"code":2124,"language":82,"meta":83,"style":83},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2126,2127,2132,2137],{"__ignoreMap":83},[87,2128,2129],{"class":89,"line":90},[87,2130,2131],{},"print(42)\n",[87,2133,2134],{"class":89,"line":96},[87,2135,2136],{},"print(7 + 5)\n",[87,2138,2139],{"class":89,"line":103},[87,2140,2141],{},"print(\"Python 基础课\")\n",[10,2143,150],{},[78,2145,2148],{"className":2146,"code":2147,"language":156,"meta":83},[154],"42\n12\nPython 基础课\n",[33,2149,2147],{"__ignoreMap":83},[10,2151,161],{},[14,2153,164],{"id":164},[166,2155,2156,2164],{},[48,2157,2158,2161,2162,382],{},[33,2159,2160],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2163,2114],{},[48,2165,2166,2168,2169,2172],{},[33,2167,1492],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2170,2171],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2174,185],{"id":185},[45,2176,2177,2180],{},[48,2178,2179],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[48,2181,2182],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2184,209],{"id":209},[166,2186,2187,2190],{},[48,2188,2189],{},"分别输出一个整数、一个小数和一段文本。",[48,2191,2192,2193,2195,2196,2199],{},"比较 ",[33,2194,2092],{}," 与 ",[33,2197,2198],{},"print(\"2 + 3\")"," 的结果。",[10,2201,224],{},[14,2203,227],{"id":227},[10,2205,2206],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2208,234],{},{"title":83,"searchDepth":96,"depth":96,"links":2210},[2211,2212,2213,2214,2215,2216,2217,2218],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2066,"description":2071},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[245,2226,2227],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2230,"title":2231,"body":2232,"category":245,"cover":246,"description":2236,"extension":247,"meta":2401,"navigation":99,"path":2402,"pinned":250,"publishedAt":251,"seo":2403,"slug":2404,"stem":2405,"summary":2406,"tags":2407,"updatedAt":251,"visible":99,"__hash__":2410},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2233,"toc":2391},[2234,2237,2239,2242,2244,2250,2253,2255,2280,2282,2284,2312,2314,2320,2322,2324,2348,2350,2365,2367,2382,2384,2386,2389],[10,2235,2236],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2238,16],{"id":16},[10,2240,2241],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2243,22],{"id":22},[10,2245,2246],{},[26,2247],{"alt":2248,"src":2249},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2251,2252],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2254,43],{"id":43},[45,2256,2257,2260,2270],{},[48,2258,2259],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[48,2261,2262,2263,2195,2266,2269],{},"变量名区分大小写，",[33,2264,2265],{},"score",[33,2267,2268],{},"Score"," 是两个名字。",[48,2271,2272,2273,56,2276,2279],{},"使用能表达含义的名称；不要用 ",[33,2274,2275],{},"list",[33,2277,2278],{},"str"," 等内置名称作为普通变量名。",[14,2281,73],{"id":73},[10,2283,76],{},[78,2285,2287],{"className":80,"code":2286,"language":82,"meta":83,"style":83},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2288,2289,2294,2299,2303,2308],{"__ignoreMap":83},[87,2290,2291],{"class":89,"line":90},[87,2292,2293],{},"score = 90\n",[87,2295,2296],{"class":89,"line":96},[87,2297,2298],{},"print(score)\n",[87,2300,2301],{"class":89,"line":103},[87,2302,100],{"emptyLinePlaceholder":99},[87,2304,2305],{"class":89,"line":109},[87,2306,2307],{},"score = 95\n",[87,2309,2310],{"class":89,"line":115},[87,2311,2298],{},[10,2313,150],{},[78,2315,2318],{"className":2316,"code":2317,"language":156,"meta":83},[154],"90\n95\n",[33,2319,2317],{"__ignoreMap":83},[10,2321,161],{},[14,2323,164],{"id":164},[166,2325,2326,2335],{},[48,2327,958,2328,2331,2332,2334],{},[33,2329,2330],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2333,2265],{}," 再绑定到它。",[48,2336,958,2337,2340,2341,2344,2345,382],{},[33,2338,2339],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2342,2343],{},"90"," 没有被改造成 ",[33,2346,2347],{},"95",[14,2349,185],{"id":185},[45,2351,2352,2355],{},[48,2353,2354],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[48,2356,176,2357,56,2359,56,2361,2364],{},[33,2358,2275],{},[33,2360,2278],{},[33,2362,2363],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2366,209],{"id":209},[166,2368,2369,2379],{},[48,2370,2371,2372,1176,2375,2378],{},"创建 ",[33,2373,2374],{},"course_name",[33,2376,2377],{},"lesson_count"," 两个变量并输出。",[48,2380,2381],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2383,224],{},[14,2385,227],{"id":227},[10,2387,2388],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2390,234],{},{"title":83,"searchDepth":96,"depth":96,"links":2392},[2393,2394,2395,2396,2397,2398,2399,2400],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2231,"description":2236},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[245,2408,2409],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2412,"title":2413,"body":2414,"category":245,"cover":246,"description":2418,"extension":247,"meta":2581,"navigation":99,"path":2582,"pinned":250,"publishedAt":251,"seo":2583,"slug":2584,"stem":2585,"summary":2586,"tags":2587,"updatedAt":251,"visible":99,"__hash__":2590},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2415,"toc":2571},[2416,2419,2421,2424,2426,2432,2435,2437,2465,2467,2469,2513,2515,2521,2523,2525,2539,2541,2552,2554,2562,2564,2566,2569],[10,2417,2418],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2420,16],{"id":16},[10,2422,2423],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2425,22],{"id":22},[10,2427,2428],{},[26,2429],{"alt":2430,"src":2431},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2433,2434],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2436,43],{"id":43},[45,2438,2439,2449,2462],{},[48,2440,2441,2444,2445,2448],{},[33,2442,2443],{},"int"," 表示整数，",[33,2446,2447],{},"float"," 表示浮点数。",[48,2450,2451,2453,2454,2457,2458,2461],{},[33,2452,39],{}," 总是进行真除法；",[33,2455,2456],{},"\u002F\u002F"," 是向下取整除法，",[33,2459,2460],{},"%"," 得到余数。",[48,2463,2464],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2466,73],{"id":73},[10,2468,76],{},[78,2470,2472],{"className":80,"code":2471,"language":82,"meta":83,"style":83},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2473,2474,2479,2484,2489,2493,2498,2503,2508],{"__ignoreMap":83},[87,2475,2476],{"class":89,"line":90},[87,2477,2478],{},"price = 25\n",[87,2480,2481],{"class":89,"line":96},[87,2482,2483],{},"count = 4\n",[87,2485,2486],{"class":89,"line":103},[87,2487,2488],{},"discount = 0.9\n",[87,2490,2491],{"class":89,"line":109},[87,2492,100],{"emptyLinePlaceholder":99},[87,2494,2495],{"class":89,"line":115},[87,2496,2497],{},"total = price * count * discount\n",[87,2499,2500],{"class":89,"line":121},[87,2501,2502],{},"average = total \u002F count\n",[87,2504,2505],{"class":89,"line":126},[87,2506,2507],{},"print(total)\n",[87,2509,2510],{"class":89,"line":132},[87,2511,2512],{},"print(average)\n",[10,2514,150],{},[78,2516,2519],{"className":2517,"code":2518,"language":156,"meta":83},[154],"90.0\n22.5\n",[33,2520,2518],{"__ignoreMap":83},[10,2522,161],{},[14,2524,164],{"id":164},[166,2526,2527,2533],{},[48,2528,2529,2532],{},[33,2530,2531],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[48,2534,2535,2538],{},[33,2536,2537],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2540,185],{"id":185},[45,2542,2543,2549],{},[48,2544,2545,2546,382],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2547,2548],{},"decimal.Decimal",[48,2550,2551],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2553,209],{"id":209},[166,2555,2556,2559],{},[48,2557,2558],{},"计算 137 除以 10 的商和余数。",[48,2560,2561],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2563,224],{},[14,2565,227],{"id":227},[10,2567,2568],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2570,234],{},{"title":83,"searchDepth":96,"depth":96,"links":2572},[2573,2574,2575,2576,2577,2578,2579,2580],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2413,"description":2418},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[245,2588,2589],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2592,"title":2593,"body":2594,"category":245,"cover":246,"description":2598,"extension":247,"meta":2774,"navigation":99,"path":2775,"pinned":250,"publishedAt":251,"seo":2776,"slug":2777,"stem":2778,"summary":2779,"tags":2780,"updatedAt":251,"visible":99,"__hash__":2783},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2595,"toc":2762},[2596,2599,2601,2604,2606,2612,2622,2624,2635,2637,2639,2669,2671,2677,2679,2681,2711,2714,2717,2723,2726,2728,2736,2738,2753,2755,2757,2760],[10,2597,2598],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2600,16],{"id":16},[10,2602,2603],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2605,22],{"id":22},[10,2607,2608],{},[26,2609],{"alt":2610,"src":2611},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2613,2614,2615,2618,2619,382],{},"切片 ",[33,2616,2617],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2620,2621],{},"stop - start",[14,2623,43],{"id":43},[45,2625,2626,2629,2632],{},[48,2627,2628],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[48,2630,2631],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[48,2633,2634],{},"切片会创建新的字符串，不会修改原字符串。",[14,2636,73],{"id":73},[10,2638,76],{},[78,2640,2642],{"className":80,"code":2641,"language":82,"meta":83,"style":83},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2643,2644,2649,2654,2659,2664],{"__ignoreMap":83},[87,2645,2646],{"class":89,"line":90},[87,2647,2648],{},"language = \"Python\"\n",[87,2650,2651],{"class":89,"line":96},[87,2652,2653],{},"print(language[0])\n",[87,2655,2656],{"class":89,"line":103},[87,2657,2658],{},"print(language[-1])\n",[87,2660,2661],{"class":89,"line":109},[87,2662,2663],{},"print(language[0:3])\n",[87,2665,2666],{"class":89,"line":115},[87,2667,2668],{},"print(language + \" 3.14\")\n",[10,2670,150],{},[78,2672,2675],{"className":2673,"code":2674,"language":156,"meta":83},[154],"P\nn\nPyt\nPython 3.14\n",[33,2676,2674],{"__ignoreMap":83},[10,2678,161],{},[14,2680,164],{"id":164},[166,2682,2683,2697],{},[48,2684,2685,2686,2688,2689,2692,2693,2696],{},"字符串 ",[33,2687,245],{}," 的正索引从 ",[33,2690,2691],{},"P"," 的 0 开始，负索引从末尾 ",[33,2694,2695],{},"n"," 的 -1 开始。",[48,2698,2699,2702,2703,2706,2707,2710],{},[33,2700,2701],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2704,2705],{},"Pyt","；索引 3 的 ",[33,2708,2709],{},"h"," 不在结果中。",[348,2712,2713],{"id":2713},"再看一个具体细节",[10,2715,2716],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2718,2719],{},[26,2720],{"alt":2721,"src":2722},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2724,2725],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2727,185],{"id":185},[45,2729,2730,2733],{},[48,2731,2732],{},"把第一个字符写成索引 1，造成整体偏移一位。",[48,2734,2735],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2737,209],{"id":209},[166,2739,2740,2750],{},[48,2741,2742,2743,2746,2747,382],{},"从 ",[33,2744,2745],{},"\"programming\""," 中切出 ",[33,2748,2749],{},"\"gram\"",[48,2751,2752],{},"使用负索引取得字符串倒数第二个字符。",[10,2754,224],{},[14,2756,227],{"id":227},[10,2758,2759],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2761,234],{},{"title":83,"searchDepth":96,"depth":96,"links":2763},[2764,2765,2766,2767,2768,2771,2772,2773],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":2769},[2770],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2593,"description":2598},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[245,2781,2782],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2785,"title":2786,"body":2787,"category":245,"cover":246,"description":2791,"extension":247,"meta":3005,"navigation":99,"path":3006,"pinned":250,"publishedAt":251,"seo":3007,"slug":3008,"stem":3009,"summary":3010,"tags":3011,"updatedAt":251,"visible":99,"__hash__":3014},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2788,"toc":2993},[2789,2792,2794,2797,2799,2805,2815,2817,2850,2852,2854,2898,2900,2906,2908,2910,2931,2933,2936,2942,2950,2952,2966,2968,2984,2986,2988,2991],[10,2790,2791],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2793,16],{"id":16},[10,2795,2796],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2798,22],{"id":22},[10,2800,2801],{},[26,2802],{"alt":2803,"src":2804},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2806,2807,2808,202,2811,2814],{},"比较表达式先产生 ",[33,2809,2810],{},"True",[33,2812,2813],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2816,43],{"id":43},[45,2818,2819,2833,2847],{},[48,2820,2821,2824,2825,2828,2829,2832],{},[33,2822,2823],{},"=="," 判断是否相等，",[33,2826,2827],{},"!="," 判断是否不等；单个 ",[33,2830,2831],{},"="," 是赋值。",[48,2834,2835,2838,2839,2842,2843,2846],{},[33,2836,2837],{},"and"," 要求两侧都为真，",[33,2840,2841],{},"or"," 只需一侧为真，",[33,2844,2845],{},"not"," 取反。",[48,2848,2849],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2851,73],{"id":73},[10,2853,76],{},[78,2855,2857],{"className":80,"code":2856,"language":82,"meta":83,"style":83},"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,2858,2859,2864,2869,2873,2878,2883,2888,2893],{"__ignoreMap":83},[87,2860,2861],{"class":89,"line":90},[87,2862,2863],{},"age = 20\n",[87,2865,2866],{"class":89,"line":96},[87,2867,2868],{},"has_ticket = True\n",[87,2870,2871],{"class":89,"line":103},[87,2872,100],{"emptyLinePlaceholder":99},[87,2874,2875],{"class":89,"line":109},[87,2876,2877],{},"is_adult = age >= 18\n",[87,2879,2880],{"class":89,"line":115},[87,2881,2882],{},"can_enter = is_adult and has_ticket\n",[87,2884,2885],{"class":89,"line":121},[87,2886,2887],{},"print(is_adult)\n",[87,2889,2890],{"class":89,"line":126},[87,2891,2892],{},"print(can_enter)\n",[87,2894,2895],{"class":89,"line":132},[87,2896,2897],{},"print(not has_ticket)\n",[10,2899,150],{},[78,2901,2904],{"className":2902,"code":2903,"language":156,"meta":83},[154],"True\nTrue\nFalse\n",[33,2905,2903],{"__ignoreMap":83},[10,2907,161],{},[14,2909,164],{"id":164},[166,2911,2912,2922],{},[48,2913,2914,2917,2918,2921],{},[33,2915,2916],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2919,2920],{},"is_adult","，这一步没有任何分支跳转。",[48,2923,2924,2927,2928,2930],{},[33,2925,2926],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2929,2845],{}," 只对紧随其后的值取反。",[348,2932,2713],{"id":2713},[10,2934,2935],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2937,2938],{},[26,2939],{"alt":2940,"src":2941},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2943,2944,2946,2947,2949],{},[33,2945,2837],{}," 只有“真、真”得到真；",[33,2948,2841],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2951,185],{"id":185},[45,2953,2954,2963],{},[48,2955,2956,2957,2959,2960,2962],{},"用单个等号判断相等。",[33,2958,2831],{}," 是赋值，",[33,2961,2823],{}," 才是相等比较。",[48,2964,2965],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2967,209],{"id":209},[166,2969,2970,2977],{},[48,2971,2972,2973,2976],{},"判断数字 ",[33,2974,2975],{},"15"," 是否同时大于 10 且小于 20。",[48,2978,2979,2980,2983],{},"分别修改年龄和票据状态，记录 ",[33,2981,2982],{},"can_enter"," 的四种组合结果。",[10,2985,224],{},[14,2987,227],{"id":227},[10,2989,2990],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,2992,234],{},{"title":83,"searchDepth":96,"depth":96,"links":2994},[2995,2996,2997,2998,2999,3002,3003,3004],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":3000},[3001],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2786,"description":2791},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[245,3012,3013],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3016,"title":3017,"body":3018,"category":245,"cover":246,"description":3022,"extension":247,"meta":3190,"navigation":99,"path":3191,"pinned":250,"publishedAt":251,"seo":3192,"slug":3193,"stem":3194,"summary":3195,"tags":3196,"updatedAt":251,"visible":99,"__hash__":3198},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3019,"toc":3180},[3020,3023,3025,3028,3030,3036,3054,3056,3069,3071,3073,3107,3109,3115,3117,3119,3141,3143,3155,3157,3171,3173,3175,3178],[10,3021,3022],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3024,16],{"id":16},[10,3026,3027],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3029,22],{"id":22},[10,3031,3032],{},[26,3033],{"alt":3034,"src":3035},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3037,3038,3041,3042,3045,3046,3049,3050,3053],{},[33,3039,3040],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3043,3044],{},"18","，程序首先得到的也是 ",[33,3047,3048],{},"\"18\"","，需要 ",[33,3051,3052],{},"int()"," 后才能按整数参与计算。",[14,3055,43],{"id":43},[45,3057,3058,3061,3066],{},[48,3059,3060],{},"提示文字应告诉用户需要输入什么。",[48,3062,3063,3065],{},[33,3064,3052],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[48,3067,3068],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3070,73],{"id":73},[10,3072,76],{},[78,3074,3076],{"className":80,"code":3075,"language":82,"meta":83,"style":83},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3077,3078,3083,3088,3093,3097,3102],{"__ignoreMap":83},[87,3079,3080],{"class":89,"line":90},[87,3081,3082],{},"name = input(\"请输入姓名：\")\n",[87,3084,3085],{"class":89,"line":96},[87,3086,3087],{},"age_text = input(\"请输入年龄：\")\n",[87,3089,3090],{"class":89,"line":103},[87,3091,3092],{},"age = int(age_text)\n",[87,3094,3095],{"class":89,"line":109},[87,3096,100],{"emptyLinePlaceholder":99},[87,3098,3099],{"class":89,"line":115},[87,3100,3101],{},"print(\"你好，\" + name)\n",[87,3103,3104],{"class":89,"line":121},[87,3105,3106],{},"print(age + 1)\n",[10,3108,150],{},[78,3110,3113],{"className":3111,"code":3112,"language":156,"meta":83},[154],"根据输入显示姓名，并输出下一年的年龄\n",[33,3114,3112],{"__ignoreMap":83},[10,3116,161],{},[14,3118,164],{"id":164},[166,3120,3121,3131],{},[48,3122,3123,3124,3126,3127,3130],{},"两次 ",[33,3125,3040],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3128,3129],{},"age_text"," 用来提醒这仍是文本。",[48,3132,3133,3136,3137,3140],{},[33,3134,3135],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3138,3139],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3142,185],{"id":185},[45,3144,3145,3152],{},[48,3146,3147,3148,3151],{},"直接计算 ",[33,3149,3150],{},"input(...) + 1","，忽略输入结果是字符串。",[48,3153,3154],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3156,209],{"id":209},[166,3158,3159,3162],{},[48,3160,3161],{},"接收两个整数并输出它们的和。",[48,3163,1739,3164,3167,3168,3170],{},[33,3165,3166],{},"18.5"," 给 ",[33,3169,3052],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3172,224],{},[14,3174,227],{"id":227},[10,3176,3177],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,3179,234],{},{"title":83,"searchDepth":96,"depth":96,"links":3181},[3182,3183,3184,3185,3186,3187,3188,3189],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3017,"description":3022},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[245,2363,3197],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3200,"title":3201,"body":3202,"category":245,"cover":246,"description":3206,"extension":247,"meta":3366,"navigation":99,"path":3367,"pinned":250,"publishedAt":251,"seo":3368,"slug":3369,"stem":3370,"summary":3371,"tags":3372,"updatedAt":251,"visible":99,"__hash__":3375},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3203,"toc":3356},[3204,3207,3209,3212,3214,3220,3227,3229,3243,3245,3247,3286,3288,3294,3296,3298,3317,3319,3334,3336,3347,3349,3351,3354],[10,3205,3206],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3208,16],{"id":16},[10,3210,3211],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3213,22],{"id":22},[10,3215,3216],{},[26,3217],{"alt":3218,"src":3219},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3221,3222,3223,3226],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3224,3225],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3228,43],{"id":43},[45,3230,3231,3234,3237],{},[48,3232,3233],{},"列表使用方括号，元素之间用逗号分隔。",[48,3235,3236],{},"列表可变，可以替换、追加和删除元素。",[48,3238,3239,3240,382],{},"访问不存在的索引会产生 ",[33,3241,3242],{},"IndexError",[14,3244,73],{"id":73},[10,3246,76],{},[78,3248,3250],{"className":80,"code":3249,"language":82,"meta":83,"style":83},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3251,3252,3257,3262,3266,3271,3276,3281],{"__ignoreMap":83},[87,3253,3254],{"class":89,"line":90},[87,3255,3256],{},"scores = [82, 90, 76]\n",[87,3258,3259],{"class":89,"line":96},[87,3260,3261],{},"print(scores[0])\n",[87,3263,3264],{"class":89,"line":103},[87,3265,100],{"emptyLinePlaceholder":99},[87,3267,3268],{"class":89,"line":109},[87,3269,3270],{},"scores[1] = 95\n",[87,3272,3273],{"class":89,"line":115},[87,3274,3275],{},"scores.append(88)\n",[87,3277,3278],{"class":89,"line":121},[87,3279,3280],{},"print(scores)\n",[87,3282,3283],{"class":89,"line":126},[87,3284,3285],{},"print(len(scores))\n",[10,3287,150],{},[78,3289,3292],{"className":3290,"code":3291,"language":156,"meta":83},[154],"82\n[82, 95, 76, 88]\n4\n",[33,3293,3291],{"__ignoreMap":83},[10,3295,161],{},[14,3297,164],{"id":164},[166,3299,3300,3303],{},[48,3301,3302],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[48,3304,3305,3308,3309,3312,3313,3316],{},[33,3306,3307],{},"scores[1] = 95"," 替换第二个位置，",[33,3310,3311],{},"append(88)"," 在末尾增加新位置，",[33,3314,3315],{},"len()"," 因而从 3 变为 4。",[14,3318,185],{"id":185},[45,3320,3321,3331],{},[48,3322,3323,3324,3327,3328,382],{},"访问 ",[33,3325,3326],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3329,3330],{},"len(scores) - 1",[48,3332,3333],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3335,209],{"id":209},[166,3337,3338,3341],{},[48,3339,3340],{},"建立三项学习任务列表，再追加第四项。",[48,3342,3343,3344,3346],{},"修改第二项，并用 ",[33,3345,3315],{}," 检查元素数量。",[10,3348,224],{},[14,3350,227],{"id":227},[10,3352,3353],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,3355,234],{},{"title":83,"searchDepth":96,"depth":96,"links":3357},[3358,3359,3360,3361,3362,3363,3364,3365],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3201,"description":3206},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[245,3373,3374],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3377,"title":3378,"body":3379,"category":245,"cover":246,"description":3383,"extension":247,"meta":3523,"navigation":99,"path":3524,"pinned":250,"publishedAt":251,"seo":3525,"slug":3526,"stem":3527,"summary":3528,"tags":3529,"updatedAt":251,"visible":99,"__hash__":3531},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3380,"toc":3513},[3381,3384,3386,3389,3391,3397,3400,3402,3413,3415,3417,3451,3453,3459,3461,3463,3477,3479,3490,3492,3504,3506,3508,3511],[10,3382,3383],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3385,16],{"id":16},[10,3387,3388],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3390,22],{"id":22},[10,3392,3393],{},[26,3394],{"alt":3395,"src":3396},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3398,3399],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3401,43],{"id":43},[45,3403,3404,3407,3410],{},[48,3405,3406],{},"元组常用来表达固定数量、固定含义的一组值。",[48,3408,3409],{},"只有一个元素的元组必须保留尾随逗号。",[48,3411,3412],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3414,73],{"id":73},[10,3416,76],{},[78,3418,3420],{"className":80,"code":3419,"language":82,"meta":83,"style":83},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3421,3422,3427,3432,3437,3441,3446],{"__ignoreMap":83},[87,3423,3424],{"class":89,"line":90},[87,3425,3426],{},"point = (120, 80)\n",[87,3428,3429],{"class":89,"line":96},[87,3430,3431],{},"print(point[0])\n",[87,3433,3434],{"class":89,"line":103},[87,3435,3436],{},"print(point[1])\n",[87,3438,3439],{"class":89,"line":109},[87,3440,100],{"emptyLinePlaceholder":99},[87,3442,3443],{"class":89,"line":115},[87,3444,3445],{},"single = (5,)\n",[87,3447,3448],{"class":89,"line":121},[87,3449,3450],{},"print(single)\n",[10,3452,150],{},[78,3454,3457],{"className":3455,"code":3456,"language":156,"meta":83},[154],"120\n80\n(5,)\n",[33,3458,3456],{"__ignoreMap":83},[10,3460,161],{},[14,3462,164],{"id":164},[166,3464,3465,3471],{},[48,3466,3467,3470],{},[33,3468,3469],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[48,3472,3473,3476],{},[33,3474,3475],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3478,185],{"id":185},[45,3480,3481,3487],{},[48,3482,190,3483,3486],{},[33,3484,3485],{},"(5)"," 当作元组，实际它仍是整数。",[48,3488,3489],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3491,209],{"id":209},[166,3493,3494,3497],{},[48,3495,3496],{},"用元组表示宽度和高度。",[48,3498,2192,3499,2195,3501,3503],{},[33,3500,3485],{},[33,3502,3475],{}," 的类型。",[10,3505,224],{},[14,3507,227],{"id":227},[10,3509,3510],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,3512,234],{},{"title":83,"searchDepth":96,"depth":96,"links":3514},[3515,3516,3517,3518,3519,3520,3521,3522],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3378,"description":3383},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[245,3530,3374],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3533,"title":3534,"body":3535,"category":245,"cover":246,"description":3539,"extension":247,"meta":3694,"navigation":99,"path":3695,"pinned":250,"publishedAt":251,"seo":3696,"slug":3697,"stem":3698,"summary":3699,"tags":3700,"updatedAt":251,"visible":99,"__hash__":3702},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3536,"toc":3684},[3537,3540,3542,3545,3547,3553,3563,3565,3579,3581,3583,3617,3619,3625,3627,3629,3644,3646,3665,3667,3675,3677,3679,3682],[10,3538,3539],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3541,16],{"id":16},[10,3543,3544],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3546,22],{"id":22},[10,3548,3549],{},[26,3550],{"alt":3551,"src":3552},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3554,3555,3556,3559,3560,3562],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3557,3558],{},"student[\"score\"]"," 读取的是键 ",[33,3561,2265],{}," 对应的值，而不是“第几个元素”。",[14,3564,43],{"id":43},[45,3566,3567,3570,3576],{},[48,3568,3569],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[48,3571,176,3572,3575],{},[33,3573,3574],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[48,3577,3578],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3580,73],{"id":73},[10,3582,76],{},[78,3584,3586],{"className":80,"code":3585,"language":82,"meta":83,"style":83},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3587,3588,3593,3598,3602,3607,3612],{"__ignoreMap":83},[87,3589,3590],{"class":89,"line":90},[87,3591,3592],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[87,3594,3595],{"class":89,"line":96},[87,3596,3597],{},"print(student[\"name\"])\n",[87,3599,3600],{"class":89,"line":103},[87,3601,100],{"emptyLinePlaceholder":99},[87,3603,3604],{"class":89,"line":109},[87,3605,3606],{},"student[\"score\"] = 95\n",[87,3608,3609],{"class":89,"line":115},[87,3610,3611],{},"student[\"city\"] = \"郑州\"\n",[87,3613,3614],{"class":89,"line":121},[87,3615,3616],{},"print(student)\n",[10,3618,150],{},[78,3620,3623],{"className":3621,"code":3622,"language":156,"meta":83},[154],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3624,3622],{"__ignoreMap":83},[10,3626,161],{},[14,3628,164],{"id":164},[166,3630,3631,3634],{},[48,3632,3633],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[48,3635,3636,3637,3639,3640,3643],{},"给已有键 ",[33,3638,2265],{}," 赋值会更新映射，给新键 ",[33,3641,3642],{},"city"," 赋值会增加映射。",[14,3645,185],{"id":185},[45,3647,3648,3655],{},[48,3649,3650,3651,3654],{},"按位置理解字典并尝试 ",[33,3652,3653],{},"student[0]","，而实际键是字符串。",[48,3656,3657,3658,3661,3662,382],{},"直接读取不确定存在的键并忽略 ",[33,3659,3660],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3663,3664],{},"get()",[14,3666,209],{"id":209},[166,3668,3669,3672],{},[48,3670,3671],{},"建立一本书的标题、作者和页数字典。",[48,3673,3674],{},"添加分类键，再修改页数。",[10,3676,224],{},[14,3678,227],{"id":227},[10,3680,3681],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,3683,234],{},{"title":83,"searchDepth":96,"depth":96,"links":3685},[3686,3687,3688,3689,3690,3691,3692,3693],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3534,"description":3539},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[245,3701,3374],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3704,"title":3705,"body":3706,"category":245,"cover":246,"description":3710,"extension":247,"meta":3859,"navigation":99,"path":3860,"pinned":250,"publishedAt":251,"seo":3861,"slug":3862,"stem":3863,"summary":3864,"tags":3865,"updatedAt":251,"visible":99,"__hash__":3867},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3707,"toc":3849},[3708,3711,3713,3716,3718,3724,3727,3729,3748,3750,3752,3786,3788,3794,3796,3798,3813,3815,3827,3829,3840,3842,3844,3847],[10,3709,3710],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3712,16],{"id":16},[10,3714,3715],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3717,22],{"id":22},[10,3719,3720],{},[26,3721],{"alt":3722,"src":3723},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3725,3726],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3728,43],{"id":43},[45,3730,3731,3734,3737],{},[48,3732,3733],{},"集合中的元素不重复。",[48,3735,3736],{},"集合是无序容器，不要依赖打印顺序或索引。",[48,3738,3739,3740,3743,3744,3747],{},"创建空集合必须写 ",[33,3741,3742],{},"set()","；",[33,3745,3746],{},"{}"," 创建的是空字典。",[14,3749,73],{"id":73},[10,3751,76],{},[78,3753,3755],{"className":80,"code":3754,"language":82,"meta":83,"style":83},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3756,3757,3762,3767,3771,3776,3781],{"__ignoreMap":83},[87,3758,3759],{"class":89,"line":90},[87,3760,3761],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[87,3763,3764],{"class":89,"line":96},[87,3765,3766],{},"right = {\"Python\", \"Docker\"}\n",[87,3768,3769],{"class":89,"line":103},[87,3770,100],{"emptyLinePlaceholder":99},[87,3772,3773],{"class":89,"line":109},[87,3774,3775],{},"print(left & right)\n",[87,3777,3778],{"class":89,"line":115},[87,3779,3780],{},"print(left | right)\n",[87,3782,3783],{"class":89,"line":121},[87,3784,3785],{},"print(\"Git\" in left)\n",[10,3787,150],{},[78,3789,3792],{"className":3790,"code":3791,"language":156,"meta":83},[154],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3793,3791],{"__ignoreMap":83},[10,3795,161],{},[14,3797,164],{"id":164},[166,3799,3800,3803],{},[48,3801,3802],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[48,3804,3805,3808,3809,3812],{},[33,3806,3807],{},"&"," 计算交集，",[33,3810,3811],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3814,185],{"id":185},[45,3816,3817,3824],{},[48,3818,176,3819,3821,3822,382],{},[33,3820,3746],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3823,3742],{},[48,3825,3826],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3828,209],{"id":209},[166,3830,3831,3837],{},[48,3832,3833,3834,3836],{},"把包含重复标签的列表交给 ",[33,3835,3742],{}," 去重。",[48,3838,3839],{},"计算两组课程标签的交集和差集。",[10,3841,224],{},[14,3843,227],{"id":227},[10,3845,3846],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,3848,234],{},{"title":83,"searchDepth":96,"depth":96,"links":3850},[3851,3852,3853,3854,3855,3856,3857,3858],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3705,"description":3710},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[245,3866,3374],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3869,"title":3870,"body":3871,"category":245,"cover":246,"description":3875,"extension":247,"meta":4072,"navigation":99,"path":4073,"pinned":250,"publishedAt":251,"seo":4074,"slug":4075,"stem":4076,"summary":4077,"tags":4078,"updatedAt":251,"visible":99,"__hash__":4081},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3872,"toc":4060},[3873,3876,3878,3881,3883,3889,3899,3901,3918,3920,3922,3971,3973,3979,3981,3983,4005,4007,4010,4016,4019,4021,4034,4036,4051,4053,4055,4058],[10,3874,3875],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3877,16],{"id":16},[10,3879,3880],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3882,22],{"id":22},[10,3884,3885],{},[26,3886],{"alt":3887,"src":3888},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3890,3891,3894,3895,3898],{},[33,3892,3893],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3896,3897],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3900,43],{"id":43},[45,3902,3903,3912,3915],{},[48,3904,3905,3907,3908,3911],{},[33,3906,2823],{}," 比较内容是否相等，",[33,3909,3910],{},"is"," 比较是否为同一个对象。",[48,3913,3914],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[48,3916,3917],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3919,73],{"id":73},[10,3921,76],{},[78,3923,3925],{"className":80,"code":3924,"language":82,"meta":83,"style":83},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3926,3927,3932,3937,3942,3946,3951,3956,3961,3966],{"__ignoreMap":83},[87,3928,3929],{"class":89,"line":90},[87,3930,3931],{},"tasks = [\"变量\", \"字符串\"]\n",[87,3933,3934],{"class":89,"line":96},[87,3935,3936],{},"shared = tasks\n",[87,3938,3939],{"class":89,"line":103},[87,3940,3941],{},"backup = tasks.copy()\n",[87,3943,3944],{"class":89,"line":109},[87,3945,100],{"emptyLinePlaceholder":99},[87,3947,3948],{"class":89,"line":115},[87,3949,3950],{},"tasks.append(\"列表\")\n",[87,3952,3953],{"class":89,"line":121},[87,3954,3955],{},"print(shared)\n",[87,3957,3958],{"class":89,"line":126},[87,3959,3960],{},"print(backup)\n",[87,3962,3963],{"class":89,"line":132},[87,3964,3965],{},"print(tasks is shared)\n",[87,3967,3968],{"class":89,"line":138},[87,3969,3970],{},"print(tasks is backup)\n",[10,3972,150],{},[78,3974,3977],{"className":3975,"code":3976,"language":156,"meta":83},[154],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3978,3976],{"__ignoreMap":83},[10,3980,161],{},[14,3982,164],{"id":164},[166,3984,3985,3991],{},[48,3986,3987,3990],{},[33,3988,3989],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[48,3992,3993,3996,3997,4000,4001,4004],{},[33,3994,3995],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3998,3999],{},"shared"," 能观察到变化，",[33,4002,4003],{},"backup"," 不会。",[348,4006,2713],{"id":2713},[10,4008,4009],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4011,4012],{},[26,4013],{"alt":4014,"src":4015},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4017,4018],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4020,185],{"id":185},[45,4022,4023,4031],{},[48,4024,4025,4026,4028,4029,382],{},"用 ",[33,4027,2823],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,4030,3910],{},[48,4032,4033],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4035,209],{"id":209},[166,4037,4038,4041],{},[48,4039,4040],{},"让两个变量引用同一个字典并修改其中一个。",[48,4042,176,4043,4046,4047,1176,4049,382],{},[33,4044,4045],{},"copy()"," 创建外层副本，再比较 ",[33,4048,3910],{},[33,4050,2823],{},[10,4052,224],{},[14,4054,227],{"id":227},[10,4056,4057],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,4059,234],{},{"title":83,"searchDepth":96,"depth":96,"links":4061},[4062,4063,4064,4065,4066,4069,4070,4071],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":4067},[4068],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3870,"description":3875},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[245,4079,4080],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4083,"title":4084,"body":4085,"category":245,"cover":246,"description":4089,"extension":247,"meta":4301,"navigation":99,"path":4302,"pinned":250,"publishedAt":251,"seo":4303,"slug":4304,"stem":4305,"summary":4306,"tags":4307,"updatedAt":251,"visible":99,"__hash__":4309},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4086,"toc":4288},[4087,4090,4092,4095,4097,4103,4113,4115,4126,4128,4130,4182,4184,4190,4192,4194,4212,4214,4217,4223,4231,4234,4237,4243,4249,4251,4269,4271,4279,4281,4283,4286],[10,4088,4089],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4091,16],{"id":16},[10,4093,4094],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4096,22],{"id":22},[10,4098,4099],{},[26,4100],{"alt":4101,"src":4102},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4104,4105,56,4107,56,4110,4112],{},[33,4106,1175],{},[33,4108,4109],{},"elif",[33,4111,1179],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4114,43],{"id":43},[45,4116,4117,4120,4123],{},[48,4118,4119],{},"冒号表示接下来开始一个代码块。",[48,4121,4122],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[48,4124,4125],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4127,73],{"id":73},[10,4129,76],{},[78,4131,4133],{"className":80,"code":4132,"language":82,"meta":83,"style":83},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4134,4135,4140,4144,4149,4154,4159,4164,4168,4173,4177],{"__ignoreMap":83},[87,4136,4137],{"class":89,"line":90},[87,4138,4139],{},"score = int(input(\"请输入分数：\"))\n",[87,4141,4142],{"class":89,"line":96},[87,4143,100],{"emptyLinePlaceholder":99},[87,4145,4146],{"class":89,"line":103},[87,4147,4148],{},"if score >= 90:\n",[87,4150,4151],{"class":89,"line":109},[87,4152,4153],{},"    level = \"优秀\"\n",[87,4155,4156],{"class":89,"line":115},[87,4157,4158],{},"elif score >= 60:\n",[87,4160,4161],{"class":89,"line":121},[87,4162,4163],{},"    level = \"合格\"\n",[87,4165,4166],{"class":89,"line":126},[87,4167,1165],{},[87,4169,4170],{"class":89,"line":132},[87,4171,4172],{},"    level = \"需要继续学习\"\n",[87,4174,4175],{"class":89,"line":138},[87,4176,100],{"emptyLinePlaceholder":99},[87,4178,4179],{"class":89,"line":144},[87,4180,4181],{},"print(level)\n",[10,4183,150],{},[78,4185,4188],{"className":4186,"code":4187,"language":156,"meta":83},[154],"输入 85 时输出：合格\n",[33,4189,4187],{"__ignoreMap":83},[10,4191,161],{},[14,4193,164],{"id":164},[166,4195,4196,4203],{},[48,4197,4198,4199,4202],{},"输入先转换为整数，程序从 ",[33,4200,4201],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[48,4204,4205,4208,4209,4211],{},[33,4206,4207],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4210,1179],{}," 被跳过；最终三个分支只会选择一个。",[348,4213,2713],{"id":2713},[10,4215,4216],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4218,4219],{},[26,4220],{"alt":4221,"src":4222},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4224,4225,4227,4228,4230],{},[33,4226,4201],{}," 必须放在 ",[33,4229,4207],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[348,4232,2713],{"id":4233},"再看一个具体细节-1",[10,4235,4236],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4238,4239],{},[26,4240],{"alt":4241,"src":4242},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4244,4245,4246,4248],{},"同一缩进层级属于同一个代码块；回到 ",[33,4247,1175],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4250,185],{"id":185},[45,4252,4253,4259],{},[48,4254,4255,4256,4258],{},"先写 ",[33,4257,4207],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[48,4260,4261,4262,4264,4265,4268],{},"混用多个独立 ",[33,4263,1175],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4266,4267],{},"if\u002Felif\u002Felse"," 链。",[14,4270,209],{"id":209},[166,4272,4273,4276],{},[48,4274,4275],{},"根据温度输出“冷、适中、热”三个等级。",[48,4277,4278],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4280,224],{},[14,4282,227],{"id":227},[10,4284,4285],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,4287,234],{},{"title":83,"searchDepth":96,"depth":96,"links":4289},[4290,4291,4292,4293,4294,4298,4299,4300],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":4295},[4296,4297],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4084,"description":4089},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[245,1175,4308],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4311,"title":4312,"body":4313,"category":245,"cover":246,"description":4317,"extension":247,"meta":4483,"navigation":99,"path":4484,"pinned":250,"publishedAt":251,"seo":4485,"slug":4486,"stem":4487,"summary":4488,"tags":4489,"updatedAt":251,"visible":99,"__hash__":4491},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4314,"toc":4471},[4315,4318,4320,4323,4325,4331,4337,4339,4354,4356,4358,4396,4398,4404,4406,4408,4423,4425,4428,4434,4440,4442,4450,4452,4462,4464,4466,4469],[10,4316,4317],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4319,16],{"id":16},[10,4321,4322],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4324,22],{"id":22},[10,4326,4327],{},[26,4328],{"alt":4329,"src":4330},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4332,4333,4336],{},[33,4334,4335],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4338,43],{"id":43},[45,4340,4341,4344,4347],{},[48,4342,4343],{},"进入循环前先准备参与条件判断的状态。",[48,4345,4346],{},"循环体中必须有机会让条件变为假。",[48,4348,4349,4350,4353],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4351,4352],{},"for"," 通常更直接。",[14,4355,73],{"id":73},[10,4357,76],{},[78,4359,4361],{"className":80,"code":4360,"language":82,"meta":83,"style":83},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4362,4363,4368,4372,4377,4382,4387,4391],{"__ignoreMap":83},[87,4364,4365],{"class":89,"line":90},[87,4366,4367],{},"count = 1\n",[87,4369,4370],{"class":89,"line":96},[87,4371,100],{"emptyLinePlaceholder":99},[87,4373,4374],{"class":89,"line":103},[87,4375,4376],{},"while count \u003C= 3:\n",[87,4378,4379],{"class":89,"line":109},[87,4380,4381],{},"    print(\"第\", count, \"次练习\")\n",[87,4383,4384],{"class":89,"line":115},[87,4385,4386],{},"    count = count + 1\n",[87,4388,4389],{"class":89,"line":121},[87,4390,100],{"emptyLinePlaceholder":99},[87,4392,4393],{"class":89,"line":126},[87,4394,4395],{},"print(\"练习结束\")\n",[10,4397,150],{},[78,4399,4402],{"className":4400,"code":4401,"language":156,"meta":83},[154],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4403,4401],{"__ignoreMap":83},[10,4405,161],{},[14,4407,164],{"id":164},[166,4409,4410,4417],{},[48,4411,4412,4413,4416],{},"进入循环前 ",[33,4414,4415],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[48,4418,4419,4420,4422],{},"循环体末尾把 ",[33,4421,4415],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[348,4424,2713],{"id":2713},[10,4426,4427],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4429,4430],{},[26,4431],{"alt":4432,"src":4433},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4435,4436,4437,4439],{},"第4次检查时 ",[33,4438,4415],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4441,185],{"id":185},[45,4443,4444,4447],{},[48,4445,4446],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[48,4448,4449],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4451,209],{"id":209},[166,4453,4454,4459],{},[48,4455,176,4456,4458],{},[33,4457,4335],{}," 输出 1 到 5。",[48,4460,4461],{},"计算 1 到 10 的累加和。",[10,4463,224],{},[14,4465,227],{"id":227},[10,4467,4468],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,4470,234],{},{"title":83,"searchDepth":96,"depth":96,"links":4472},[4473,4474,4475,4476,4477,4480,4481,4482],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":4478},[4479],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4312,"description":4317},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[245,4335,4490],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4493,"title":4494,"body":4495,"category":245,"cover":246,"description":4499,"extension":247,"meta":4647,"navigation":99,"path":4648,"pinned":250,"publishedAt":251,"seo":4649,"slug":4650,"stem":4651,"summary":4652,"tags":4653,"updatedAt":251,"visible":99,"__hash__":4655},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4496,"toc":4637},[4497,4500,4502,4505,4507,4513,4518,4520,4534,4536,4538,4576,4578,4584,4586,4588,4605,4607,4615,4617,4628,4630,4632,4635],[10,4498,4499],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4501,16],{"id":16},[10,4503,4504],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4506,22],{"id":22},[10,4508,4509],{},[26,4510],{"alt":4511,"src":4512},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4514,4515,4517],{},[33,4516,4352],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4519,43],{"id":43},[45,4521,4522,4528,4531],{},[48,4523,4524,4527],{},[33,4525,4526],{},"range(1, 4)"," 包含 1，不包含 4。",[48,4529,4530],{},"只需要元素时直接遍历元素，不必手工维护索引。",[48,4532,4533],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4535,73],{"id":73},[10,4537,76],{},[78,4539,4541],{"className":80,"code":4540,"language":82,"meta":83,"style":83},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4542,4543,4548,4552,4557,4562,4566,4571],{"__ignoreMap":83},[87,4544,4545],{"class":89,"line":90},[87,4546,4547],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[87,4549,4550],{"class":89,"line":96},[87,4551,100],{"emptyLinePlaceholder":99},[87,4553,4554],{"class":89,"line":103},[87,4555,4556],{},"for course in courses:\n",[87,4558,4559],{"class":89,"line":109},[87,4560,4561],{},"    print(course)\n",[87,4563,4564],{"class":89,"line":115},[87,4565,100],{"emptyLinePlaceholder":99},[87,4567,4568],{"class":89,"line":121},[87,4569,4570],{},"for number in range(1, 4):\n",[87,4572,4573],{"class":89,"line":126},[87,4574,4575],{},"    print(number)\n",[10,4577,150],{},[78,4579,4582],{"className":4580,"code":4581,"language":156,"meta":83},[154],"变量\n字符串\n列表\n1\n2\n3\n",[33,4583,4581],{"__ignoreMap":83},[10,4585,161],{},[14,4587,164],{"id":164},[166,4589,4590,4600],{},[48,4591,4592,4593,4595,4596,4599],{},"第一个 ",[33,4594,4352],{}," 依次从列表取得字符串，循环变量 ",[33,4597,4598],{},"course"," 每轮重新绑定。",[48,4601,4602,4604],{},[33,4603,4526],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4606,185],{"id":185},[45,4608,4609,4612],{},[48,4610,4611],{},"只需要元素却手工维护索引，增加越界风险。",[48,4613,4614],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4616,209],{"id":209},[166,4618,4619,4622],{},[48,4620,4621],{},"逐项输出一个字符串中的字符。",[48,4623,176,4624,4627],{},[33,4625,4626],{},"range()"," 输出 2、4、6、8。",[10,4629,224],{},[14,4631,227],{"id":227},[10,4633,4634],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,4636,234],{},{"title":83,"searchDepth":96,"depth":96,"links":4638},[4639,4640,4641,4642,4643,4644,4645,4646],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4494,"description":4499},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[245,4352,4654],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4657,"title":4658,"body":4659,"category":245,"cover":246,"description":4663,"extension":247,"meta":4837,"navigation":99,"path":4838,"pinned":250,"publishedAt":251,"seo":4839,"slug":4840,"stem":4841,"summary":4842,"tags":4843,"updatedAt":251,"visible":99,"__hash__":4844},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4660,"toc":4827},[4661,4664,4666,4669,4671,4677,4687,4689,4708,4710,4712,4764,4766,4772,4774,4776,4790,4792,4808,4810,4818,4820,4822,4825],[10,4662,4663],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4665,16],{"id":16},[10,4667,4668],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4670,22],{"id":22},[10,4672,4673],{},[26,4674],{"alt":4675,"src":4676},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4678,4679,4682,4683,4686],{},[33,4680,4681],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4684,4685],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4688,43],{"id":43},[45,4690,4691,4694,4702],{},[48,4692,4693],{},"先写普通循环，再在确有需要时加入流程控制语句。",[48,4695,4696,4698,4699,4701],{},[33,4697,4681],{}," 前要确认不会跳过 ",[33,4700,4335],{}," 循环中的状态更新。",[48,4703,4704,4705,4707],{},"多层嵌套中 ",[33,4706,4685],{}," 只结束它所在的最内层循环。",[14,4709,73],{"id":73},[10,4711,76],{},[78,4713,4715],{"className":80,"code":4714,"language":82,"meta":83,"style":83},"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,4716,4717,4722,4726,4731,4736,4741,4746,4751,4755,4759],{"__ignoreMap":83},[87,4718,4719],{"class":89,"line":90},[87,4720,4721],{},"numbers = [3, -1, 0, 8, 12]\n",[87,4723,4724],{"class":89,"line":96},[87,4725,100],{"emptyLinePlaceholder":99},[87,4727,4728],{"class":89,"line":103},[87,4729,4730],{},"for number in numbers:\n",[87,4732,4733],{"class":89,"line":109},[87,4734,4735],{},"    if number \u003C 0:\n",[87,4737,4738],{"class":89,"line":115},[87,4739,4740],{},"        continue\n",[87,4742,4743],{"class":89,"line":121},[87,4744,4745],{},"    if number == 0:\n",[87,4747,4748],{"class":89,"line":126},[87,4749,4750],{},"        break\n",[87,4752,4753],{"class":89,"line":132},[87,4754,4575],{},[87,4756,4757],{"class":89,"line":138},[87,4758,100],{"emptyLinePlaceholder":99},[87,4760,4761],{"class":89,"line":144},[87,4762,4763],{},"print(\"循环结束\")\n",[10,4765,150],{},[78,4767,4770],{"className":4768,"code":4769,"language":156,"meta":83},[154],"3\n循环结束\n",[33,4771,4769],{"__ignoreMap":83},[10,4773,161],{},[14,4775,164],{"id":164},[166,4777,4778,4784],{},[48,4779,4780,4781,4783],{},"遇到 -1 时 ",[33,4782,4681],{}," 立即结束本轮，后面的判断和输出都不执行。",[48,4785,4786,4787,4789],{},"遇到 0 时 ",[33,4788,4685],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4791,185],{"id":185},[45,4793,4794,4799],{},[48,4795,190,4796,4798],{},[33,4797,4681],{}," 当作结束循环，实际它只跳到下一轮。",[48,4800,4801,4802,4804,4805,4807],{},"在 ",[33,4803,4335],{}," 中把状态更新放在可能被 ",[33,4806,4681],{}," 跳过的位置，造成无限循环。",[14,4809,209],{"id":209},[166,4811,4812,4815],{},[48,4813,4814],{},"跳过列表中的空字符串并输出其他内容。",[48,4816,4817],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4819,224],{},[14,4821,227],{"id":227},[10,4823,4824],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,4826,234],{},{"title":83,"searchDepth":96,"depth":96,"links":4828},[4829,4830,4831,4832,4833,4834,4835,4836],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4658,"description":4663},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[245,4685,4681],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4846,"title":4847,"body":4848,"category":245,"cover":246,"description":4852,"extension":247,"meta":5023,"navigation":99,"path":5024,"pinned":250,"publishedAt":251,"seo":5025,"slug":5026,"stem":5027,"summary":5028,"tags":5029,"updatedAt":251,"visible":99,"__hash__":5032},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4849,"toc":5011},[4850,4853,4855,4858,4860,4866,4869,4871,4895,4897,4899,4933,4935,4941,4943,4945,4962,4964,4967,4973,4976,4978,4992,4994,5002,5004,5006,5009],[10,4851,4852],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4854,16],{"id":16},[10,4856,4857],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4859,22],{"id":22},[10,4861,4862],{},[26,4863],{"alt":4864,"src":4865},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4867,4868],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4870,43],{"id":43},[45,4872,4873,4876,4879],{},[48,4874,4875],{},"每增加一层嵌套，阅读成本都会上升。",[48,4877,4878],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[48,4880,4881,4882,56,4885,4888,4889,56,4892,382],{},"变量名使用 ",[33,4883,4884],{},"row",[33,4886,4887],{},"cell"," 等层级含义，避免全部写成 ",[33,4890,4891],{},"i",[33,4893,4894],{},"j",[14,4896,73],{"id":73},[10,4898,76],{},[78,4900,4902],{"className":80,"code":4901,"language":82,"meta":83,"style":83},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4903,4904,4909,4913,4918,4923,4928],{"__ignoreMap":83},[87,4905,4906],{"class":89,"line":90},[87,4907,4908],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[87,4910,4911],{"class":89,"line":96},[87,4912,100],{"emptyLinePlaceholder":99},[87,4914,4915],{"class":89,"line":103},[87,4916,4917],{},"for row in table:\n",[87,4919,4920],{"class":89,"line":109},[87,4921,4922],{},"    for cell in row:\n",[87,4924,4925],{"class":89,"line":115},[87,4926,4927],{},"        print(cell)\n",[87,4929,4930],{"class":89,"line":121},[87,4931,4932],{},"    print(\"一行结束\")\n",[10,4934,150],{},[78,4936,4939],{"className":4937,"code":4938,"language":156,"meta":83},[154],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4940,4938],{"__ignoreMap":83},[10,4942,161],{},[14,4944,164],{"id":164},[166,4946,4947,4959],{},[48,4948,4949,4950,4952,4953,1176,4956,382],{},"外层变量 ",[33,4951,4884],{}," 先引用第一行列表，内层才依次处理 ",[33,4954,4955],{},"A1",[33,4957,4958],{},"A2",[48,4960,4961],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[348,4963,2713],{"id":2713},[10,4965,4966],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4968,4969],{},[26,4970],{"alt":4971,"src":4972},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4974,4975],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4977,185],{"id":185},[45,4979,4980,4989],{},[48,4981,4982,4983,202,4986,4988],{},"把两层循环变量都叫 ",[33,4984,4985],{},"item",[33,4987,4891],{},"，难以确认当前层级。",[48,4990,4991],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4993,209],{"id":209},[166,4995,4996,4999],{},[48,4997,4998],{},"打印一个 2×3 数字表。",[48,5000,5001],{},"在内层增加条件，只输出大于 3 的元素。",[10,5003,224],{},[14,5005,227],{"id":227},[10,5007,5008],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5010,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5012},[5013,5014,5015,5016,5017,5020,5021,5022],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":5018},[5019],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4847,"description":4852},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[245,5030,5031],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5034,"title":5035,"body":5036,"category":245,"cover":246,"description":5040,"extension":247,"meta":5178,"navigation":99,"path":5179,"pinned":250,"publishedAt":251,"seo":5180,"slug":5181,"stem":5182,"summary":5183,"tags":5184,"updatedAt":251,"visible":99,"__hash__":5187},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5037,"toc":5168},[5038,5041,5043,5046,5048,5054,5057,5059,5070,5072,5074,5112,5114,5120,5122,5124,5136,5138,5149,5151,5159,5161,5163,5166],[10,5039,5040],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5042,16],{"id":16},[10,5044,5045],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5047,22],{"id":22},[10,5049,5050],{},[26,5051],{"alt":5052,"src":5053},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5055,5056],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5058,43],{"id":43},[45,5060,5061,5064,5067],{},[48,5062,5063],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[48,5065,5066],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[48,5068,5069],{},"推导式创建新列表，不修改输入列表。",[14,5071,73],{"id":73},[10,5073,76],{},[78,5075,5077],{"className":80,"code":5076,"language":82,"meta":83,"style":83},"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,5078,5079,5084,5088,5093,5098,5102,5107],{"__ignoreMap":83},[87,5080,5081],{"class":89,"line":90},[87,5082,5083],{},"numbers = [1, 2, 3, 4, 5]\n",[87,5085,5086],{"class":89,"line":96},[87,5087,100],{"emptyLinePlaceholder":99},[87,5089,5090],{"class":89,"line":103},[87,5091,5092],{},"squares = [number * number for number in numbers]\n",[87,5094,5095],{"class":89,"line":109},[87,5096,5097],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[87,5099,5100],{"class":89,"line":115},[87,5101,100],{"emptyLinePlaceholder":99},[87,5103,5104],{"class":89,"line":121},[87,5105,5106],{},"print(squares)\n",[87,5108,5109],{"class":89,"line":126},[87,5110,5111],{},"print(even_squares)\n",[10,5113,150],{},[78,5115,5118],{"className":5116,"code":5117,"language":156,"meta":83},[154],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5119,5117],{"__ignoreMap":83},[10,5121,161],{},[14,5123,164],{"id":164},[166,5125,5126,5129],{},[48,5127,5128],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[48,5130,5131,5132,5135],{},"第二条先用 ",[33,5133,5134],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5137,185],{"id":185},[45,5139,5140,5146],{},[48,5141,5142,5143,5145],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5144,4352],{}," 开始找输入。",[48,5147,5148],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5150,209],{"id":209},[166,5152,5153,5156],{},[48,5154,5155],{},"把字符串列表转换为长度列表。",[48,5157,5158],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5160,224],{},[14,5162,227],{"id":227},[10,5164,5165],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5167,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5169},[5170,5171,5172,5173,5174,5175,5176,5177],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5035,"description":5040},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[245,5185,5186],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5189,"title":5190,"body":5191,"category":245,"cover":246,"description":5195,"extension":247,"meta":5338,"navigation":99,"path":5339,"pinned":250,"publishedAt":251,"seo":5340,"slug":5341,"stem":5342,"summary":5343,"tags":5344,"updatedAt":251,"visible":99,"__hash__":5347},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5192,"toc":5328},[5193,5196,5198,5201,5203,5209,5212,5214,5225,5227,5229,5268,5270,5276,5278,5280,5295,5297,5305,5307,5319,5321,5323,5326],[10,5194,5195],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5197,16],{"id":16},[10,5199,5200],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5202,22],{"id":22},[10,5204,5205],{},[26,5206],{"alt":5207,"src":5208},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5210,5211],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5213,43],{"id":43},[45,5215,5216,5219,5222],{},[48,5217,5218],{},"函数名描述动作，使用小写字母和下划线。",[48,5220,5221],{},"函数定义要先执行，之后才能调用。",[48,5223,5224],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5226,73],{"id":73},[10,5228,76],{},[78,5230,5232],{"className":80,"code":5231,"language":82,"meta":83,"style":83},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5233,5234,5239,5244,5249,5253,5258,5263],{"__ignoreMap":83},[87,5235,5236],{"class":89,"line":90},[87,5237,5238],{},"def show_progress():\n",[87,5240,5241],{"class":89,"line":96},[87,5242,5243],{},"    print(\"正在学习函数\")\n",[87,5245,5246],{"class":89,"line":103},[87,5247,5248],{},"    print(\"本节完成 50%\")\n",[87,5250,5251],{"class":89,"line":109},[87,5252,100],{"emptyLinePlaceholder":99},[87,5254,5255],{"class":89,"line":115},[87,5256,5257],{},"print(\"调用前\")\n",[87,5259,5260],{"class":89,"line":121},[87,5261,5262],{},"show_progress()\n",[87,5264,5265],{"class":89,"line":126},[87,5266,5267],{},"print(\"调用后\")\n",[10,5269,150],{},[78,5271,5274],{"className":5272,"code":5273,"language":156,"meta":83},[154],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5275,5273],{"__ignoreMap":83},[10,5277,161],{},[14,5279,164],{"id":164},[166,5281,5282,5288],{},[48,5283,958,5284,5287],{},[33,5285,5286],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[48,5289,5290,5291,5294],{},"运行到 ",[33,5292,5293],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5296,185],{"id":185},[45,5298,5299,5302],{},[48,5300,5301],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[48,5303,5304],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5306,209],{"id":209},[166,5308,5309,5316],{},[48,5310,5311,5312,5315],{},"定义 ",[33,5313,5314],{},"show_plan()"," 输出两行学习计划。",[48,5317,5318],{},"连续调用同一个函数两次，观察执行顺序。",[10,5320,224],{},[14,5322,227],{"id":227},[10,5324,5325],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5327,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5329},[5330,5331,5332,5333,5334,5335,5336,5337],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5190,"description":5195},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[245,5345,5346],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5349,"title":5350,"body":5351,"category":245,"cover":246,"description":5355,"extension":247,"meta":5535,"navigation":99,"path":5536,"pinned":250,"publishedAt":251,"seo":5537,"slug":5538,"stem":5539,"summary":5540,"tags":5541,"updatedAt":251,"visible":99,"__hash__":5544},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5352,"toc":5523},[5353,5356,5358,5361,5363,5369,5376,5378,5395,5397,5399,5433,5435,5441,5443,5445,5466,5468,5471,5477,5487,5489,5504,5506,5514,5516,5518,5521],[10,5354,5355],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5357,16],{"id":16},[10,5359,5360],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5362,22],{"id":22},[10,5364,5365],{},[26,5366],{"alt":5367,"src":5368},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5370,5371,5372,5375],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5373,5374],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5377,43],{"id":43},[45,5379,5380,5383,5386],{},[48,5381,5382],{},"形参出现在函数定义中，实参出现在函数调用中。",[48,5384,5385],{},"局部变量默认只在函数内部可见。",[48,5387,5388,5389,5391,5392,382],{},"没有显式 ",[33,5390,5374],{}," 的函数会返回 ",[33,5393,5394],{},"None",[14,5396,73],{"id":73},[10,5398,76],{},[78,5400,5402],{"className":80,"code":5401,"language":82,"meta":83,"style":83},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5403,5404,5409,5414,5419,5423,5428],{"__ignoreMap":83},[87,5405,5406],{"class":89,"line":90},[87,5407,5408],{},"def calculate_total(price, count):\n",[87,5410,5411],{"class":89,"line":96},[87,5412,5413],{},"    total = price * count\n",[87,5415,5416],{"class":89,"line":103},[87,5417,5418],{},"    return total\n",[87,5420,5421],{"class":89,"line":109},[87,5422,100],{"emptyLinePlaceholder":99},[87,5424,5425],{"class":89,"line":115},[87,5426,5427],{},"result = calculate_total(25, 4)\n",[87,5429,5430],{"class":89,"line":121},[87,5431,5432],{},"print(result)\n",[10,5434,150],{},[78,5436,5439],{"className":5437,"code":5438,"language":156,"meta":83},[154],"100\n",[33,5440,5438],{"__ignoreMap":83},[10,5442,161],{},[14,5444,164],{"id":164},[166,5446,5447,5456],{},[48,5448,5449,5450,56,5453,5455],{},"调用时 25 和 4 分别绑定到 ",[33,5451,5452],{},"price",[33,5454,4415],{},"，它们只在本次函数调用的局部范围中使用。",[48,5457,5458,5461,5462,5465],{},[33,5459,5460],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5463,5464],{},"result"," 并输出。",[348,5467,2713],{"id":2713},[10,5469,5470],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5472,5473],{},[26,5474],{"alt":5475,"src":5476},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5478,5479,56,5481,1176,5483,5486],{},[33,5480,5452],{},[33,5482,4415],{},[33,5484,5485],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5488,185],{"id":185},[45,5490,5491,5498],{},[48,5492,5493,5494,5497],{},"在函数内部只 ",[33,5495,5496],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[48,5499,5500,5501,5503],{},"试图在函数外直接访问局部变量 ",[33,5502,5485],{},"，它的名字只在调用期间的局部作用域存在。",[14,5505,209],{"id":209},[166,5507,5508,5511],{},[48,5509,5510],{},"编写计算长方形面积的函数。",[48,5512,5513],{},"让函数返回结果后在调用方加上单位再输出。",[10,5515,224],{},[14,5517,227],{"id":227},[10,5519,5520],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5522,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5524},[5525,5526,5527,5528,5529,5532,5533,5534],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":5530},[5531],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5350,"description":5355},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[245,5542,5543],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5546,"title":5547,"body":5548,"category":245,"cover":246,"description":5552,"extension":247,"meta":5732,"navigation":99,"path":5733,"pinned":250,"publishedAt":251,"seo":5734,"slug":5735,"stem":5736,"summary":5737,"tags":5738,"updatedAt":251,"visible":99,"__hash__":5741},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5549,"toc":5720},[5550,5553,5555,5558,5560,5566,5569,5571,5588,5590,5592,5644,5646,5652,5654,5656,5674,5676,5679,5685,5688,5690,5701,5703,5711,5713,5715,5718],[10,5551,5552],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5554,16],{"id":16},[10,5556,5557],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5559,22],{"id":22},[10,5561,5562],{},[26,5563],{"alt":5564,"src":5565},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5567,5568],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5570,43],{"id":43},[45,5572,5573,5576,5582],{},[48,5574,5575],{},"必需参数应放在有默认值的参数之前。",[48,5577,5578,5581],{},[33,5579,5580],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[48,5583,5584,5587],{},[33,5585,5586],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5589,73],{"id":73},[10,5591,76],{},[78,5593,5595],{"className":80,"code":5594,"language":82,"meta":83,"style":83},"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,5596,5597,5602,5607,5611,5616,5621,5625,5630,5635,5639],{"__ignoreMap":83},[87,5598,5599],{"class":89,"line":90},[87,5600,5601],{},"def build_title(name, level=\"基础\"):\n",[87,5603,5604],{"class":89,"line":96},[87,5605,5606],{},"    return name + \"｜\" + level\n",[87,5608,5609],{"class":89,"line":103},[87,5610,100],{"emptyLinePlaceholder":99},[87,5612,5613],{"class":89,"line":109},[87,5614,5615],{},"print(build_title(\"Python\"))\n",[87,5617,5618],{"class":89,"line":115},[87,5619,5620],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[87,5622,5623],{"class":89,"line":121},[87,5624,100],{"emptyLinePlaceholder":99},[87,5626,5627],{"class":89,"line":126},[87,5628,5629],{},"def total(*numbers):\n",[87,5631,5632],{"class":89,"line":132},[87,5633,5634],{},"    return sum(numbers)\n",[87,5636,5637],{"class":89,"line":138},[87,5638,100],{"emptyLinePlaceholder":99},[87,5640,5641],{"class":89,"line":144},[87,5642,5643],{},"print(total(10, 20, 30))\n",[10,5645,150],{},[78,5647,5650],{"className":5648,"code":5649,"language":156,"meta":83},[154],"Python｜基础\n异常处理｜进阶\n60\n",[33,5651,5649],{"__ignoreMap":83},[10,5653,161],{},[14,5655,164],{"id":164},[166,5657,5658,5665],{},[48,5659,5660,5661,5664],{},"第一次调用只提供必需参数，",[33,5662,5663],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[48,5666,5667,5670,5671,382],{},[33,5668,5669],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5672,5673],{},"sum()",[348,5675,2713],{"id":2713},[10,5677,5678],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5680,5681],{},[26,5682],{"alt":5683,"src":5684},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5686,5687],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5689,185],{"id":185},[45,5691,5692,5698],{},[48,5693,5694,5695,5697],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5696,5394],{}," 再在函数内创建。",[48,5699,5700],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5702,209],{"id":209},[166,5704,5705,5708],{},[48,5706,5707],{},"给问候函数增加默认称呼。",[48,5709,5710],{},"编写接收任意数量分数并返回总分的函数。",[10,5712,224],{},[14,5714,227],{"id":227},[10,5716,5717],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5719,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5721},[5722,5723,5724,5725,5726,5729,5730,5731],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":5727},[5728],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5547,"description":5552},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[245,5739,5740],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5743,"title":5744,"body":5745,"category":245,"cover":246,"description":5749,"extension":247,"meta":5946,"navigation":99,"path":5947,"pinned":250,"publishedAt":251,"seo":5948,"slug":5949,"stem":5950,"summary":5951,"tags":5952,"updatedAt":251,"visible":99,"__hash__":5955},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5746,"toc":5934},[5747,5750,5752,5755,5757,5763,5766,5768,5785,5787,5789,5852,5854,5860,5862,5864,5891,5893,5896,5902,5905,5907,5915,5917,5925,5927,5929,5932],[10,5748,5749],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5751,16],{"id":16},[10,5753,5754],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5756,22],{"id":22},[10,5758,5759],{},[26,5760],{"alt":5761,"src":5762},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5764,5765],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5767,43],{"id":43},[45,5769,5770,5773,5776],{},[48,5771,5772],{},"函数内部赋值默认创建局部变量。",[48,5774,5775],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[48,5777,5778,2195,5781,5784],{},[33,5779,5780],{},"global",[33,5782,5783],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5786,73],{"id":73},[10,5788,76],{},[78,5790,5792],{"className":80,"code":5791,"language":82,"meta":83,"style":83},"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,5793,5794,5799,5803,5808,5813,5817,5822,5827,5832,5836,5841,5846],{"__ignoreMap":83},[87,5795,5796],{"class":89,"line":90},[87,5797,5798],{},"course = \"Python\"\n",[87,5800,5801],{"class":89,"line":96},[87,5802,100],{"emptyLinePlaceholder":99},[87,5804,5805],{"class":89,"line":103},[87,5806,5807],{},"def outer():\n",[87,5809,5810],{"class":89,"line":109},[87,5811,5812],{},"    level = \"基础\"\n",[87,5814,5815],{"class":89,"line":115},[87,5816,100],{"emptyLinePlaceholder":99},[87,5818,5819],{"class":89,"line":121},[87,5820,5821],{},"    def show():\n",[87,5823,5824],{"class":89,"line":126},[87,5825,5826],{},"        lesson = \"作用域\"\n",[87,5828,5829],{"class":89,"line":132},[87,5830,5831],{},"        print(course, level, lesson)\n",[87,5833,5834],{"class":89,"line":138},[87,5835,100],{"emptyLinePlaceholder":99},[87,5837,5838],{"class":89,"line":144},[87,5839,5840],{},"    show()\n",[87,5842,5844],{"class":89,"line":5843},11,[87,5845,100],{"emptyLinePlaceholder":99},[87,5847,5849],{"class":89,"line":5848},12,[87,5850,5851],{},"outer()\n",[10,5853,150],{},[78,5855,5858],{"className":5856,"code":5857,"language":156,"meta":83},[154],"Python 基础 作用域\n",[33,5859,5857],{"__ignoreMap":83},[10,5861,161],{},[14,5863,164],{"id":164},[166,5865,5866,5883],{},[48,5867,5868,5871,5872,5875,5876,5878,5879,5882],{},[33,5869,5870],{},"show()"," 中查找 ",[33,5873,5874],{},"lesson"," 时先在局部找到，查找 ",[33,5877,5663],{}," 时到外层 ",[33,5880,5881],{},"outer()"," 找到。",[48,5884,5885,5887,5888,5890],{},[33,5886,4598],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5889,2227],{}," 最后在内置作用域找到。",[348,5892,2713],{"id":2713},[10,5894,5895],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5897,5898],{},[26,5899],{"alt":5900,"src":5901},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5903,5904],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5906,185],{"id":185},[45,5908,5909,5912],{},[48,5910,5911],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[48,5913,5914],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5916,209],{"id":209},[166,5918,5919,5922],{},[48,5920,5921],{},"在内外层定义同名变量，观察最近作用域优先。",[48,5923,5924],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5926,224],{},[14,5928,227],{"id":227},[10,5930,5931],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,5933,234],{},{"title":83,"searchDepth":96,"depth":96,"links":5935},[5936,5937,5938,5939,5940,5943,5944,5945],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":5941},[5942],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5744,"description":5749},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[245,5953,5954],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5957,"title":5958,"body":5959,"category":245,"cover":246,"description":5963,"extension":247,"meta":6113,"navigation":99,"path":6114,"pinned":250,"publishedAt":251,"seo":6115,"slug":6116,"stem":6117,"summary":6118,"tags":6119,"updatedAt":251,"visible":99,"__hash__":6122},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5960,"toc":6103},[5961,5964,5966,5969,5971,5977,5980,5982,6001,6003,6005,6039,6041,6047,6049,6051,6066,6068,6080,6082,6094,6096,6098,6101],[10,5962,5963],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5965,16],{"id":16},[10,5967,5968],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5970,22],{"id":22},[10,5972,5973],{},[26,5974],{"alt":5975,"src":5976},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5978,5979],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5981,43],{"id":43},[45,5983,5984,5987,5990],{},[48,5985,5986],{},"文档字符串紧跟在函数定义后的第一条语句。",[48,5988,5989],{},"注解表达接口意图，不代替输入校验和测试。",[48,5991,5992,5993,56,5995,56,5997,6000],{},"基础注解优先使用 ",[33,5994,2278],{},[33,5996,2443],{},[33,5998,5999],{},"list[str]"," 等直接写法。",[14,6002,73],{"id":73},[10,6004,76],{},[78,6006,6008],{"className":80,"code":6007,"language":82,"meta":83,"style":83},"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,6009,6010,6015,6020,6025,6029,6034],{"__ignoreMap":83},[87,6011,6012],{"class":89,"line":90},[87,6013,6014],{},"def format_score(name: str, score: int) -> str:\n",[87,6016,6017],{"class":89,"line":96},[87,6018,6019],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[87,6021,6022],{"class":89,"line":103},[87,6023,6024],{},"    return name + \"：\" + str(score)\n",[87,6026,6027],{"class":89,"line":109},[87,6028,100],{"emptyLinePlaceholder":99},[87,6030,6031],{"class":89,"line":115},[87,6032,6033],{},"print(format_score(\"小郑\", 95))\n",[87,6035,6036],{"class":89,"line":121},[87,6037,6038],{},"print(format_score.__doc__)\n",[10,6040,150],{},[78,6042,6045],{"className":6043,"code":6044,"language":156,"meta":83},[154],"小郑：95\n返回带姓名的分数文本。\n",[33,6046,6044],{"__ignoreMap":83},[10,6048,161],{},[14,6050,164],{"id":164},[166,6052,6053,6063],{},[48,6054,6055,6056,6059,6060,6062],{},"函数签名说明 ",[33,6057,6058],{},"name"," 预期为字符串、",[33,6061,2265],{}," 预期为整数，返回值预期为字符串。",[48,6064,6065],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6067,185],{"id":185},[45,6069,6070,6077],{},[48,6071,6072,6073,6076],{},"认为加了 ",[33,6074,6075],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[48,6078,6079],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6081,209],{"id":209},[166,6083,6084,6087],{},[48,6085,6086],{},"为面积函数补充参数和返回值注解。",[48,6088,6089,6090,6093],{},"通过 ",[33,6091,6092],{},"函数名.__doc__"," 查看文档字符串。",[10,6095,224],{},[14,6097,227],{"id":227},[10,6099,6100],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,6102,234],{},{"title":83,"searchDepth":96,"depth":96,"links":6104},[6105,6106,6107,6108,6109,6110,6111,6112],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5958,"description":5963},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[245,6120,6121],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6124,"title":6125,"body":6126,"category":245,"cover":246,"description":6130,"extension":247,"meta":6357,"navigation":99,"path":6358,"pinned":250,"publishedAt":251,"seo":6359,"slug":6360,"stem":6361,"summary":6362,"tags":6363,"updatedAt":251,"visible":99,"__hash__":6366},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6127,"toc":6345},[6128,6131,6133,6139,6141,6147,6158,6160,6178,6180,6187,6216,6223,6242,6251,6253,6259,6261,6263,6286,6288,6291,6297,6303,6305,6321,6323,6336,6338,6340,6343],[10,6129,6130],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6132,16],{"id":16},[10,6134,6135,6136,6138],{},"本篇只处理“模块、import 与 ",[314,6137,6058],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6140,22],{"id":22},[10,6142,6143],{},[26,6144],{"alt":6145,"src":6146},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6148,6149,6150,6153,6154,6157],{},"同一个文件直接运行时 ",[33,6151,6152],{},"__name__"," 等于 ",[33,6155,6156],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6159,43],{"id":43},[45,6161,6162,6168,6171],{},[48,6163,6164,6165,6167],{},"一个 ",[33,6166,1190],{}," 文件就是一个模块。",[48,6169,6170],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[48,6172,6173,6174,6177],{},"避免使用 ",[33,6175,6176],{},"from module import *","，它会让名字来源不清楚。",[14,6179,73],{"id":73},[10,6181,6182,6183,6186],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6184,6185],{},"calculator.py","：",[78,6188,6190],{"className":80,"code":6189,"language":82,"meta":83,"style":83},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6191,6192,6197,6202,6206,6211],{"__ignoreMap":83},[87,6193,6194],{"class":89,"line":90},[87,6195,6196],{},"def add(left, right):\n",[87,6198,6199],{"class":89,"line":96},[87,6200,6201],{},"    return left + right\n",[87,6203,6204],{"class":89,"line":103},[87,6205,100],{"emptyLinePlaceholder":99},[87,6207,6208],{"class":89,"line":109},[87,6209,6210],{},"if __name__ == \"__main__\":\n",[87,6212,6213],{"class":89,"line":115},[87,6214,6215],{},"    print(add(2, 3))\n",[10,6217,6218,6219,6222],{},"再创建 ",[33,6220,6221],{},"app.py","，从模块中导入函数：",[78,6224,6226],{"className":80,"code":6225,"language":82,"meta":83,"style":83},"from calculator import add\n\nprint(add(10, 20))\n",[33,6227,6228,6233,6237],{"__ignoreMap":83},[87,6229,6230],{"class":89,"line":90},[87,6231,6232],{},"from calculator import add\n",[87,6234,6235],{"class":89,"line":96},[87,6236,100],{"emptyLinePlaceholder":99},[87,6238,6239],{"class":89,"line":103},[87,6240,6241],{},"print(add(10, 20))\n",[10,6243,6244,6245,1176,6248,382],{},"分别执行 ",[33,6246,6247],{},"python3 calculator.py",[33,6249,6250],{},"python3 app.py",[10,6252,150],{},[78,6254,6257],{"className":6255,"code":6256,"language":156,"meta":83},[154],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6258,6256],{"__ignoreMap":83},[10,6260,161],{},[14,6262,164],{"id":164},[166,6264,6265,6275],{},[48,6266,6267,6268,6270,6271,6274],{},"直接运行 ",[33,6269,6185],{}," 时，模块名是 ",[33,6272,6273],{},"__main__","，入口代码输出 5。",[48,6276,6277,6279,6280,6282,6283,6285],{},[33,6278,6221],{}," 导入模块时，",[33,6281,6185],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6284,6221],{}," 调用函数输出 30。",[348,6287,2713],{"id":2713},[10,6289,6290],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6292,6293],{},[26,6294],{"alt":6295,"src":6296},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6298,6299,6300,6302],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6301,6273],{}," 保护下的演示代码。",[14,6304,185],{"id":185},[45,6306,6307,6314],{},[48,6308,6309,6310,1176,6312,382],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6311,6185],{},[33,6313,6221],{},[48,6315,6316,6317,6320],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6318,6319],{},"json.py","，导致导入目标被遮蔽。",[14,6322,209],{"id":209},[166,6324,6325,6331],{},[48,6326,2371,6327,6330],{},[33,6328,6329],{},"text_tools.py"," 并导出一个格式化函数。",[48,6332,6333,6334,382],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6335,6152],{},[10,6337,224],{},[14,6339,227],{"id":227},[10,6341,6342],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,6344,234],{},{"title":83,"searchDepth":96,"depth":96,"links":6346},[6347,6348,6349,6350,6351,6354,6355,6356],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":6352},[6353],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6125,"description":6130},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[245,6364,6365],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6368,"title":6369,"body":6370,"category":245,"cover":246,"description":6374,"extension":247,"meta":6539,"navigation":99,"path":6540,"pinned":250,"publishedAt":251,"seo":6541,"slug":6542,"stem":6543,"summary":6544,"tags":6545,"updatedAt":251,"visible":99,"__hash__":6547},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6371,"toc":6529},[6372,6375,6377,6380,6382,6388,6391,6393,6407,6409,6411,6457,6459,6465,6467,6469,6495,6497,6507,6509,6520,6522,6524,6527],[10,6373,6374],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6376,16],{"id":16},[10,6378,6379],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6381,22],{"id":22},[10,6383,6384],{},[26,6385],{"alt":6386,"src":6387},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6389,6390],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6392,43],{"id":43},[45,6394,6395,6401,6404],{},[48,6396,6397,6400],{},[33,6398,6399],{},".venv"," 是常见目录名，不应提交到 Git。",[48,6402,6403],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[48,6405,6406],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6408,73],{"id":73},[10,6410,1593],{},[78,6412,6414],{"className":611,"code":6413,"language":613,"meta":83,"style":83},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6415,6416,6428,6436,6442,6452],{"__ignoreMap":83},[87,6417,6418,6420,6422,6425],{"class":89,"line":90},[87,6419,711],{"class":620},[87,6421,653],{"class":623},[87,6423,6424],{"class":656}," venv",[87,6426,6427],{"class":656}," .venv\n",[87,6429,6430,6433],{"class":89,"line":96},[87,6431,6432],{"class":623},"source",[87,6434,6435],{"class":656}," .venv\u002Fbin\u002Factivate\n",[87,6437,6438,6440],{"class":89,"line":103},[87,6439,82],{"class":620},[87,6441,624],{"class":623},[87,6443,6444,6446,6448,6450],{"class":89,"line":109},[87,6445,82],{"class":620},[87,6447,653],{"class":623},[87,6449,657],{"class":656},[87,6451,624],{"class":623},[87,6453,6454],{"class":89,"line":115},[87,6455,6456],{"class":620},"deactivate\n",[10,6458,150],{},[78,6460,6463],{"className":6461,"code":6462,"language":156,"meta":83},[154],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6464,6462],{"__ignoreMap":83},[10,6466,161],{},[14,6468,164],{"id":164},[166,6470,6471,6480],{},[48,6472,6473,6476,6477,6479],{},[33,6474,6475],{},"venv"," 根据当前 ",[33,6478,711],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[48,6481,6482,6483,2195,6485,6488,6489,3743,6491,6494],{},"激活后 ",[33,6484,82],{},[33,6486,6487],{},"python -m pip"," 优先指向 ",[33,6490,6399],{},[33,6492,6493],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6496,185],{"id":185},[45,6498,6499,6502],{},[48,6500,6501],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[48,6503,190,6504,6506],{},[33,6505,6399],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6508,209],{"id":209},[166,6510,6511,6517],{},[48,6512,6513,6514,382],{},"创建虚拟环境并记录激活前后的 ",[33,6515,6516],{},"which python",[48,6518,6519],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6521,224],{},[14,6523,227],{"id":227},[10,6525,6526],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,6528,1677],{},{"title":83,"searchDepth":96,"depth":96,"links":6530},[6531,6532,6533,6534,6535,6536,6537,6538],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6369,"description":6374},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[245,6546,280],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":4,"title":5,"body":6549,"category":245,"cover":246,"description":12,"extension":247,"meta":6702,"navigation":99,"path":249,"pinned":250,"publishedAt":251,"seo":6703,"slug":253,"stem":254,"summary":255,"tags":6704,"updatedAt":251,"visible":99,"__hash__":259},{"type":7,"value":6550,"toc":6692},[6551,6553,6555,6557,6559,6563,6569,6571,6587,6589,6591,6635,6637,6642,6644,6646,6658,6660,6674,6676,6684,6686,6688,6690],[10,6552,12],{},[14,6554,16],{"id":16},[10,6556,19],{},[14,6558,22],{"id":22},[10,6560,6561],{},[26,6562],{"alt":28,"src":29},[10,6564,6565,36,6567,40],{},[33,6566,35],{},[33,6568,39],{},[14,6570,43],{"id":43},[45,6572,6573,6575,6583],{},[48,6574,50],{},[48,6576,6577,56,6579,56,6581,63],{},[33,6578,55],{},[33,6580,59],{},[33,6582,62],{},[48,6584,66,6585,70],{},[33,6586,69],{},[14,6588,73],{"id":73},[10,6590,76],{},[78,6592,6593],{"className":80,"code":81,"language":82,"meta":83,"style":83},[33,6594,6595,6599,6603,6607,6611,6615,6619,6623,6627,6631],{"__ignoreMap":83},[87,6596,6597],{"class":89,"line":90},[87,6598,93],{},[87,6600,6601],{"class":89,"line":96},[87,6602,100],{"emptyLinePlaceholder":99},[87,6604,6605],{"class":89,"line":103},[87,6606,106],{},[87,6608,6609],{"class":89,"line":109},[87,6610,112],{},[87,6612,6613],{"class":89,"line":115},[87,6614,118],{},[87,6616,6617],{"class":89,"line":121},[87,6618,100],{"emptyLinePlaceholder":99},[87,6620,6621],{"class":89,"line":126},[87,6622,129],{},[87,6624,6625],{"class":89,"line":132},[87,6626,135],{},[87,6628,6629],{"class":89,"line":138},[87,6630,141],{},[87,6632,6633],{"class":89,"line":144},[87,6634,147],{},[10,6636,150],{},[78,6638,6640],{"className":6639,"code":155,"language":156,"meta":83},[154],[33,6641,155],{"__ignoreMap":83},[10,6643,161],{},[14,6645,164],{"id":164},[166,6647,6648,6652],{},[48,6649,6650,173],{},[33,6651,172],{},[48,6653,176,6654,179,6656,182],{},[33,6655,39],{},[33,6657,35],{},[14,6659,185],{"id":185},[45,6661,6662,6668],{},[48,6663,190,6664,193,6666,196],{},[33,6665,35],{},[33,6667,55],{},[48,6669,199,6670,202,6672,206],{},[33,6671,39],{},[33,6673,205],{},[14,6675,209],{"id":209},[166,6677,6678,6682],{},[48,6679,214,6680,218],{},[33,6681,217],{},[48,6683,221],{},[10,6685,224],{},[14,6687,227],{"id":227},[10,6689,230],{},[232,6691,234],{},{"title":83,"searchDepth":96,"depth":96,"links":6693},[6694,6695,6696,6697,6698,6699,6700,6701],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5,"description":12},[245,257,258],{"id":6706,"title":6707,"body":6708,"category":245,"cover":246,"description":6712,"extension":247,"meta":6890,"navigation":99,"path":6891,"pinned":250,"publishedAt":251,"seo":6892,"slug":6893,"stem":6894,"summary":6895,"tags":6896,"updatedAt":251,"visible":99,"__hash__":6899},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6709,"toc":6880},[6710,6713,6715,6718,6720,6726,6729,6731,6759,6761,6763,6820,6822,6828,6830,6832,6843,6845,6858,6860,6871,6873,6875,6878],[10,6711,6712],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6714,16],{"id":16},[10,6716,6717],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6719,22],{"id":22},[10,6721,6722],{},[26,6723],{"alt":6724,"src":6725},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6727,6728],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6730,43],{"id":43},[45,6732,6733,6739,6748],{},[48,6734,6735,6738],{},[33,6736,6737],{},"w"," 模式会截断原文件，写入前必须确认目标。",[48,6740,6741,6744,6745,382],{},[33,6742,6743],{},"r"," 模式读取不存在文件会产生 ",[33,6746,6747],{},"FileNotFoundError",[48,6749,6750,6751,6754,6755,6758],{},"本篇显式调用 ",[33,6752,6753],{},"close()","；第 34 篇会用 ",[33,6756,6757],{},"with"," 更可靠地管理关闭动作。",[14,6760,73],{"id":73},[10,6762,76],{},[78,6764,6766],{"className":80,"code":6765,"language":82,"meta":83,"style":83},"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,6767,6768,6772,6776,6781,6786,6791,6796,6800,6805,6810,6815],{"__ignoreMap":83},[87,6769,6770],{"class":89,"line":90},[87,6771,93],{},[87,6773,6774],{"class":89,"line":96},[87,6775,100],{"emptyLinePlaceholder":99},[87,6777,6778],{"class":89,"line":103},[87,6779,6780],{},"file_path = Path(\"notes.txt\")\n",[87,6782,6783],{"class":89,"line":109},[87,6784,6785],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[87,6787,6788],{"class":89,"line":115},[87,6789,6790],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[87,6792,6793],{"class":89,"line":121},[87,6794,6795],{},"writer.close()\n",[87,6797,6798],{"class":89,"line":126},[87,6799,100],{"emptyLinePlaceholder":99},[87,6801,6802],{"class":89,"line":132},[87,6803,6804],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[87,6806,6807],{"class":89,"line":138},[87,6808,6809],{},"content = reader.read()\n",[87,6811,6812],{"class":89,"line":144},[87,6813,6814],{},"reader.close()\n",[87,6816,6817],{"class":89,"line":5843},[87,6818,6819],{},"print(content)\n",[10,6821,150],{},[78,6823,6826],{"className":6824,"code":6825,"language":156,"meta":83},[154],"变量\n循环\n函数\n",[33,6827,6825],{"__ignoreMap":83},[10,6829,161],{},[14,6831,164],{"id":164},[166,6833,6834,6840],{},[48,6835,6836,6837,6839],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6838,6753],{}," 确保缓冲内容交给文件系统。",[48,6841,6842],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6844,185],{"id":185},[45,6846,6847,6852],{},[48,6848,176,6849,6851],{},[33,6850,6737],{}," 模式打开重要文件却未确认覆盖风险。",[48,6853,6854,6855,382],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6856,6857],{},"encoding=\"utf-8\"",[14,6859,209],{"id":209},[166,6861,6862,6865],{},[48,6863,6864],{},"写入三行学习记录并读取。",[48,6866,6867,6868,6870],{},"改用 ",[33,6869,356],{}," 模式追加一行，确认原内容仍保留。",[10,6872,224],{},[14,6874,227],{"id":227},[10,6876,6877],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,6879,234],{},{"title":83,"searchDepth":96,"depth":96,"links":6881},[6882,6883,6884,6885,6886,6887,6888,6889],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6707,"description":6712},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[245,6897,6898],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6901,"title":6902,"body":6903,"category":245,"cover":246,"description":6907,"extension":247,"meta":7074,"navigation":99,"path":7075,"pinned":250,"publishedAt":251,"seo":7076,"slug":7077,"stem":7078,"summary":7079,"tags":7080,"updatedAt":251,"visible":99,"__hash__":7083},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6904,"toc":7064},[6905,6908,6910,6913,6915,6921,6931,6933,6947,6949,6951,7011,7013,7019,7021,7023,7035,7037,7045,7047,7055,7057,7059,7062],[10,6906,6907],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6909,16],{"id":16},[10,6911,6912],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6914,22],{"id":22},[10,6916,6917],{},[26,6918],{"alt":6919,"src":6920},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6922,6923,6926,6927,6930],{},[33,6924,6925],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6928,6929],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6932,43],{"id":43},[45,6934,6935,6938,6944],{},[48,6936,6937],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[48,6939,6940,6943],{},[33,6941,6942],{},"ensure_ascii=False"," 让中文以可读字符写入。",[48,6945,6946],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6948,73],{"id":73},[10,6950,76],{},[78,6952,6954],{"className":80,"code":6953,"language":82,"meta":83,"style":83},"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,6955,6956,6961,6965,6970,6974,6979,6984,6988,6992,6997,7002,7006],{"__ignoreMap":83},[87,6957,6958],{"class":89,"line":90},[87,6959,6960],{},"import json\n",[87,6962,6963],{"class":89,"line":96},[87,6964,100],{"emptyLinePlaceholder":99},[87,6966,6967],{"class":89,"line":103},[87,6968,6969],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[87,6971,6972],{"class":89,"line":109},[87,6973,100],{"emptyLinePlaceholder":99},[87,6975,6976],{"class":89,"line":115},[87,6977,6978],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[87,6980,6981],{"class":89,"line":121},[87,6982,6983],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[87,6985,6986],{"class":89,"line":126},[87,6987,6795],{},[87,6989,6990],{"class":89,"line":132},[87,6991,100],{"emptyLinePlaceholder":99},[87,6993,6994],{"class":89,"line":138},[87,6995,6996],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[87,6998,6999],{"class":89,"line":144},[87,7000,7001],{},"loaded = json.load(reader)\n",[87,7003,7004],{"class":89,"line":5843},[87,7005,6814],{},[87,7007,7008],{"class":89,"line":5848},[87,7009,7010],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7012,150],{},[78,7014,7017],{"className":7015,"code":7016,"language":156,"meta":83},[154],"Python 60\n",[33,7018,7016],{"__ignoreMap":83},[10,7020,161],{},[14,7022,164],{"id":164},[166,7024,7025,7030],{},[48,7026,7027,7029],{},[33,7028,6925],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[48,7031,7032,7034],{},[33,7033,6929],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7036,185],{"id":185},[45,7038,7039,7042],{},[48,7040,7041],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[48,7043,7044],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7046,209],{"id":209},[166,7048,7049,7052],{},[48,7050,7051],{},"保存包含两条学习记录的列表。",[48,7053,7054],{},"读取后修改进度，再重新写回文件。",[10,7056,224],{},[14,7058,227],{"id":227},[10,7060,7061],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,7063,234],{},{"title":83,"searchDepth":96,"depth":96,"links":7065},[7066,7067,7068,7069,7070,7071,7072,7073],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6902,"description":6907},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[245,7081,7082],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7085,"title":7086,"body":7087,"category":245,"cover":246,"description":7091,"extension":247,"meta":7275,"navigation":99,"path":7276,"pinned":250,"publishedAt":251,"seo":7277,"slug":7278,"stem":7279,"summary":7280,"tags":7281,"updatedAt":251,"visible":99,"__hash__":7284},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7088,"toc":7265},[7089,7092,7094,7097,7099,7105,7111,7113,7135,7137,7139,7202,7204,7210,7212,7214,7230,7232,7246,7248,7256,7258,7260,7263],[10,7090,7091],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7093,16],{"id":16},[10,7095,7096],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7098,22],{"id":22},[10,7100,7101],{},[26,7102],{"alt":7103,"src":7104},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7106,7107,7110],{},[33,7108,7109],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7112,43],{"id":43},[45,7114,7115,7125,7132],{},[48,7116,176,7117,7120,7121,7124],{},[33,7118,7119],{},"newline=\"\""," 让 ",[33,7122,7123],{},"csv"," 模块正确处理换行。",[48,7126,7127,7128,7131],{},"字段顺序由 ",[33,7129,7130],{},"fieldnames"," 决定，字典键需要与字段名一致。",[48,7133,7134],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7136,73],{"id":73},[10,7138,76],{},[78,7140,7142],{"className":80,"code":7141,"language":82,"meta":83,"style":83},"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,7143,7144,7149,7153,7158,7163,7168,7173,7178,7182,7187,7192,7197],{"__ignoreMap":83},[87,7145,7146],{"class":89,"line":90},[87,7147,7148],{},"import csv\n",[87,7150,7151],{"class":89,"line":96},[87,7152,100],{"emptyLinePlaceholder":99},[87,7154,7155],{"class":89,"line":103},[87,7156,7157],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[87,7159,7160],{"class":89,"line":109},[87,7161,7162],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[87,7164,7165],{"class":89,"line":115},[87,7166,7167],{},"writer.writeheader()\n",[87,7169,7170],{"class":89,"line":121},[87,7171,7172],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[87,7174,7175],{"class":89,"line":126},[87,7176,7177],{},"writer_file.close()\n",[87,7179,7180],{"class":89,"line":132},[87,7181,100],{"emptyLinePlaceholder":99},[87,7183,7184],{"class":89,"line":138},[87,7185,7186],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[87,7188,7189],{"class":89,"line":144},[87,7190,7191],{},"for row in csv.DictReader(reader_file):\n",[87,7193,7194],{"class":89,"line":5843},[87,7195,7196],{},"    print(row[\"name\"], row[\"score\"])\n",[87,7198,7199],{"class":89,"line":5848},[87,7200,7201],{},"reader_file.close()\n",[10,7203,150],{},[78,7205,7208],{"className":7206,"code":7207,"language":156,"meta":83},[154],"小郑 95\n",[33,7209,7207],{"__ignoreMap":83},[10,7211,161],{},[14,7213,164],{"id":164},[166,7215,7216,7225],{},[48,7217,7218,7221,7222,7224],{},[33,7219,7220],{},"DictWriter"," 按 ",[33,7223,7130],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[48,7226,7227,7229],{},[33,7228,7109],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7231,185],{"id":185},[45,7233,7234,7237],{},[48,7235,7236],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[48,7238,7239,7240,7242,7243,7245],{},"在 macOS 以外环境忽略 ",[33,7241,7119],{}," 可能出现额外空行；统一交给 ",[33,7244,7123],{}," 模块管理换行。",[14,7247,209],{"id":209},[166,7249,7250,7253],{},[48,7251,7252],{},"写入三名学习者的课程和分数。",[48,7254,7255],{},"读取 CSV 后把分数字符串转换为整数。",[10,7257,224],{},[14,7259,227],{"id":227},[10,7261,7262],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,7264,234],{},{"title":83,"searchDepth":96,"depth":96,"links":7266},[7267,7268,7269,7270,7271,7272,7273,7274],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7086,"description":7091},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[245,7282,7283],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7286,"title":7287,"body":7288,"category":245,"cover":246,"description":7292,"extension":247,"meta":7565,"navigation":99,"path":7566,"pinned":250,"publishedAt":251,"seo":7567,"slug":7568,"stem":7569,"summary":7570,"tags":7571,"updatedAt":251,"visible":99,"__hash__":7574},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7289,"toc":7552},[7290,7293,7295,7298,7300,7306,7317,7319,7336,7338,7340,7415,7417,7423,7425,7427,7452,7454,7463,7469,7480,7482,7488,7494,7503,7505,7520,7522,7543,7545,7547,7550],[10,7291,7292],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7294,16],{"id":16},[10,7296,7297],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7299,22],{"id":22},[10,7301,7302],{},[26,7303],{"alt":7304,"src":7305},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7307,7308,7309,7312,7313,7316],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7310,7311],{},"except","；无论是否异常，",[33,7314,7315],{},"finally"," 都会在离开结构前执行。",[14,7318,43],{"id":43},[45,7320,7321,7327,7333],{},[48,7322,7323,7324,7326],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7325,7311],{}," 吞掉全部错误。",[48,7328,7329,7332],{},[33,7330,7331],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[48,7334,7335],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7337,73],{"id":73},[10,7339,76],{},[78,7341,7343],{"className":80,"code":7342,"language":82,"meta":83,"style":83},"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,7344,7345,7350,7355,7360,7365,7370,7374,7379,7384,7389,7394,7398,7403,7409],{"__ignoreMap":83},[87,7346,7347],{"class":89,"line":90},[87,7348,7349],{},"def parse_age(text):\n",[87,7351,7352],{"class":89,"line":96},[87,7353,7354],{},"    age = int(text)\n",[87,7356,7357],{"class":89,"line":103},[87,7358,7359],{},"    if age \u003C 0:\n",[87,7361,7362],{"class":89,"line":109},[87,7363,7364],{},"        raise ValueError(\"年龄不能为负数\")\n",[87,7366,7367],{"class":89,"line":115},[87,7368,7369],{},"    return age\n",[87,7371,7372],{"class":89,"line":121},[87,7373,100],{"emptyLinePlaceholder":99},[87,7375,7376],{"class":89,"line":126},[87,7377,7378],{},"try:\n",[87,7380,7381],{"class":89,"line":132},[87,7382,7383],{},"    age = parse_age(\"18\")\n",[87,7385,7386],{"class":89,"line":138},[87,7387,7388],{},"except ValueError as error:\n",[87,7390,7391],{"class":89,"line":144},[87,7392,7393],{},"    print(\"输入错误：\", error)\n",[87,7395,7396],{"class":89,"line":5843},[87,7397,1165],{},[87,7399,7400],{"class":89,"line":5848},[87,7401,7402],{},"    print(\"年龄：\", age)\n",[87,7404,7406],{"class":89,"line":7405},13,[87,7407,7408],{},"finally:\n",[87,7410,7412],{"class":89,"line":7411},14,[87,7413,7414],{},"    print(\"处理结束\")\n",[10,7416,150],{},[78,7418,7421],{"className":7419,"code":7420,"language":156,"meta":83},[154],"年龄： 18\n处理结束\n",[33,7422,7420],{"__ignoreMap":83},[10,7424,161],{},[14,7426,164],{"id":164},[166,7428,7429,7441],{},[48,7430,7431,7433,7434,7436,7437,7440],{},[33,7432,3052],{}," 或主动 ",[33,7435,7331],{}," 都可能产生 ",[33,7438,7439],{},"ValueError","，控制流立即离开当前正常路径。",[48,7442,7443,7444,7446,7447,7449,7450,382],{},"有异常时进入匹配的 ",[33,7445,7311],{},"；没有异常时执行 ",[33,7448,1179],{},"；两种情况最后都会执行 ",[33,7451,7315],{},[348,7453,2713],{"id":2713},[10,7455,7456,56,7458,1176,7460,7462],{},[33,7457,7311],{},[33,7459,1179],{},[33,7461,7315],{}," 的职责不同，不能只看它们出现的顺序。",[10,7464,7465],{},[26,7466],{"alt":7467,"src":7468},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7470,7471,7473,7474,7476,7477,7479],{},[33,7472,7311],{}," 处理匹配异常，",[33,7475,1179],{}," 只在无异常时运行，",[33,7478,7315],{}," 负责两条路径都需要的清理动作。",[348,7481,2713],{"id":4233},[10,7483,7484,7487],{},[33,7485,7486],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7489,7490],{},[26,7491],{"alt":7492,"src":7493},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7495,7496,7497,7499,7500,7502],{},"只把可能产生预期异常的操作放进 ",[33,7498,7486],{},"，后续正常业务放进 ",[33,7501,1179],{},"，错误边界会更清楚。",[14,7504,185],{"id":185},[45,7506,7507,7514],{},[48,7508,7509,7510,7513],{},"使用裸 ",[33,7511,7512],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[48,7515,7516,7517,7519],{},"把整个程序包在一个巨大 ",[33,7518,7486],{}," 中，无法判断究竟哪一步允许失败。",[14,7521,209],{"id":209},[166,7523,7524,7537],{},[48,7525,7526,7527,7530,7531,1176,7534,382],{},"让 ",[33,7528,7529],{},"parse_age"," 分别处理 ",[33,7532,7533],{},"\"abc\"",[33,7535,7536],{},"\"-1\"",[48,7538,7539,7540,7542],{},"为文件读取捕获 ",[33,7541,6747],{}," 并给出清晰提示。",[10,7544,224],{},[14,7546,227],{"id":227},[10,7548,7549],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,7551,234],{},{"title":83,"searchDepth":96,"depth":96,"links":7553},[7554,7555,7556,7557,7558,7562,7563,7564],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":7559},[7560,7561],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7287,"description":7292},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[245,7572,7573],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7576,"title":7577,"body":7578,"category":245,"cover":246,"description":7582,"extension":247,"meta":7758,"navigation":99,"path":7759,"pinned":250,"publishedAt":251,"seo":7760,"slug":7761,"stem":7762,"summary":7763,"tags":7764,"updatedAt":251,"visible":99,"__hash__":7766},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7579,"toc":7748},[7580,7583,7585,7588,7590,7596,7602,7604,7620,7622,7624,7678,7680,7686,7688,7690,7703,7705,7718,7720,7739,7741,7743,7746],[10,7581,7582],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7584,16],{"id":16},[10,7586,7587],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7589,22],{"id":22},[10,7591,7592],{},[26,7593],{"alt":7594,"src":7595},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7597,7598,7599,7601],{},"进入 ",[33,7600,6757],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7603,43],{"id":43},[45,7605,7606,7611,7617],{},[48,7607,7608,7610],{},[33,7609,6757],{}," 把资源获取和释放配成一个清晰边界。",[48,7612,7613,7616],{},[33,7614,7615],{},"as file"," 得到的是上下文返回的资源对象。",[48,7618,7619],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7621,73],{"id":73},[10,7623,76],{},[78,7625,7627],{"className":80,"code":7626,"language":82,"meta":83,"style":83},"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,7628,7629,7633,7637,7641,7645,7650,7655,7659,7664,7669,7673],{"__ignoreMap":83},[87,7630,7631],{"class":89,"line":90},[87,7632,93],{},[87,7634,7635],{"class":89,"line":96},[87,7636,100],{"emptyLinePlaceholder":99},[87,7638,7639],{"class":89,"line":103},[87,7640,6780],{},[87,7642,7643],{"class":89,"line":109},[87,7644,100],{"emptyLinePlaceholder":99},[87,7646,7647],{"class":89,"line":115},[87,7648,7649],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[87,7651,7652],{"class":89,"line":121},[87,7653,7654],{},"    file.write(\"上下文管理器\\n\")\n",[87,7656,7657],{"class":89,"line":126},[87,7658,100],{"emptyLinePlaceholder":99},[87,7660,7661],{"class":89,"line":132},[87,7662,7663],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[87,7665,7666],{"class":89,"line":138},[87,7667,7668],{},"    print(file.read())\n",[87,7670,7671],{"class":89,"line":144},[87,7672,100],{"emptyLinePlaceholder":99},[87,7674,7675],{"class":89,"line":5843},[87,7676,7677],{},"print(file.closed)\n",[10,7679,150],{},[78,7681,7684],{"className":7682,"code":7683,"language":156,"meta":83},[154],"上下文管理器\n\nTrue\n",[33,7685,7683],{"__ignoreMap":83},[10,7687,161],{},[14,7689,164],{"id":164},[166,7691,7692,7700],{},[48,7693,7598,7694,7696,7697,382],{},[33,7695,6757],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7698,7699],{},"file",[48,7701,7702],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7704,185],{"id":185},[45,7706,7707,7712],{},[48,7708,4801,7709,7711],{},[33,7710,6757],{}," 代码块外继续读写已经关闭的文件对象。",[48,7713,7714,7715,7717],{},"误以为 ",[33,7716,6757],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7719,209],{"id":209},[166,7721,7722,7731],{},[48,7723,7724,7725,7728,7729,382],{},"把第 30 篇的手动 ",[33,7726,7727],{},"open\u002Fclose"," 改写为 ",[33,7730,6757],{},[48,7732,4801,7733,7735,7736,382],{},[33,7734,6757],{}," 块后检查 ",[33,7737,7738],{},"file.closed",[10,7740,224],{},[14,7742,227],{"id":227},[10,7744,7745],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,7747,234],{},{"title":83,"searchDepth":96,"depth":96,"links":7749},[7750,7751,7752,7753,7754,7755,7756,7757],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7577,"description":7582},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[245,6757,7765],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7768,"title":7769,"body":7770,"category":245,"cover":246,"description":7774,"extension":247,"meta":7986,"navigation":99,"path":7987,"pinned":250,"publishedAt":251,"seo":7988,"slug":7989,"stem":7990,"summary":7991,"tags":7992,"updatedAt":251,"visible":99,"__hash__":7995},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7771,"toc":7974},[7772,7775,7777,7780,7782,7788,7791,7793,7810,7812,7814,7882,7884,7890,7892,7894,7919,7921,7924,7930,7939,7941,7952,7954,7965,7967,7969,7972],[10,7773,7774],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7776,16],{"id":16},[10,7778,7779],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7781,22],{"id":22},[10,7783,7784],{},[26,7785],{"alt":7786,"src":7787},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7789,7790],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7792,43],{"id":43},[45,7794,7795,7801,7807],{},[48,7796,7797,7800],{},[33,7798,7799],{},"self"," 表示当前实例，由方法调用自动传入。",[48,7802,7803,7806],{},[33,7804,7805],{},"__init__"," 在实例创建过程中初始化属性。",[48,7808,7809],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7811,73],{"id":73},[10,7813,76],{},[78,7815,7817],{"className":80,"code":7816,"language":82,"meta":83,"style":83},"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,7818,7819,7824,7829,7834,7839,7843,7848,7853,7858,7863,7867,7872,7877],{"__ignoreMap":83},[87,7820,7821],{"class":89,"line":90},[87,7822,7823],{},"class LearningRecord:\n",[87,7825,7826],{"class":89,"line":96},[87,7827,7828],{},"    def __init__(self, course, progress=0):\n",[87,7830,7831],{"class":89,"line":103},[87,7832,7833],{},"        self.course = course\n",[87,7835,7836],{"class":89,"line":109},[87,7837,7838],{},"        self.progress = progress\n",[87,7840,7841],{"class":89,"line":115},[87,7842,100],{"emptyLinePlaceholder":99},[87,7844,7845],{"class":89,"line":121},[87,7846,7847],{},"    def advance(self, amount):\n",[87,7849,7850],{"class":89,"line":126},[87,7851,7852],{},"        self.progress = self.progress + amount\n",[87,7854,7855],{"class":89,"line":132},[87,7856,7857],{},"        if self.progress > 100:\n",[87,7859,7860],{"class":89,"line":138},[87,7861,7862],{},"            self.progress = 100\n",[87,7864,7865],{"class":89,"line":144},[87,7866,100],{"emptyLinePlaceholder":99},[87,7868,7869],{"class":89,"line":5843},[87,7870,7871],{},"record = LearningRecord(\"Python\", 40)\n",[87,7873,7874],{"class":89,"line":5848},[87,7875,7876],{},"record.advance(15)\n",[87,7878,7879],{"class":89,"line":7405},[87,7880,7881],{},"print(record.course, record.progress)\n",[10,7883,150],{},[78,7885,7888],{"className":7886,"code":7887,"language":156,"meta":83},[154],"Python 55\n",[33,7889,7887],{"__ignoreMap":83},[10,7891,161],{},[14,7893,164],{"id":164},[166,7895,7896,7906],{},[48,7897,7898,7899,7902,7903,7905],{},"调用 ",[33,7900,7901],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7904,7805],{}," 把课程和进度保存在该实例属性中。",[48,7907,7908,7911,7912,7915,7916,7918],{},[33,7909,7910],{},"record.advance(15)"," 自动把 ",[33,7913,7914],{},"record"," 作为 ",[33,7917,7799],{},"，方法更新同一实例的进度并限制上限。",[348,7920,2713],{"id":2713},[10,7922,7923],{},"类是共同定义，实例则各自保存状态。",[10,7925,7926],{},[26,7927],{"alt":7928,"src":7929},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7931,7932,7933,1176,7935,7938],{},"两个实例共享同一套方法定义，但 ",[33,7934,4598],{},[33,7936,7937],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7940,185],{"id":185},[45,7942,7943,7949],{},[48,7944,7945,7946,7948],{},"调用实例方法时手工再传一次 ",[33,7947,7799],{},"。通过实例调用时 Python 会自动绑定。",[48,7950,7951],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7953,209],{"id":209},[166,7955,7956,7962],{},[48,7957,5311,7958,7961],{},[33,7959,7960],{},"Book"," 类，保存标题和阅读页数。",[48,7963,7964],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7966,224],{},[14,7968,227],{"id":227},[10,7970,7971],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,7973,234],{},{"title":83,"searchDepth":96,"depth":96,"links":7975},[7976,7977,7978,7979,7980,7983,7984,7985],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":7981},[7982],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7769,"description":7774},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[245,7993,7994],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7997,"title":7998,"body":7999,"category":245,"cover":246,"description":8003,"extension":247,"meta":8181,"navigation":99,"path":8182,"pinned":250,"publishedAt":251,"seo":8183,"slug":8184,"stem":8185,"summary":8186,"tags":8187,"updatedAt":251,"visible":99,"__hash__":8190},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8000,"toc":8171},[8001,8004,8006,8009,8011,8017,8020,8022,8033,8035,8037,8104,8106,8112,8114,8116,8135,8137,8145,8147,8162,8164,8166,8169],[10,8002,8003],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8005,16],{"id":16},[10,8007,8008],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8010,22],{"id":22},[10,8012,8013],{},[26,8014],{"alt":8015,"src":8016},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8018,8019],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8021,43],{"id":43},[45,8023,8024,8027,8030],{},[48,8025,8026],{},"封装让对象通过方法维护自己的有效状态。",[48,8028,8029],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[48,8031,8032],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8034,73],{"id":73},[10,8036,76],{},[78,8038,8040],{"className":80,"code":8039,"language":82,"meta":83,"style":83},"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,8041,8042,8047,8052,8057,8061,8066,8071,8076,8080,8085,8090,8094,8099],{"__ignoreMap":83},[87,8043,8044],{"class":89,"line":90},[87,8045,8046],{},"class Storage:\n",[87,8048,8049],{"class":89,"line":96},[87,8050,8051],{},"    def save(self, text):\n",[87,8053,8054],{"class":89,"line":103},[87,8055,8056],{},"        print(\"保存：\", text)\n",[87,8058,8059],{"class":89,"line":109},[87,8060,100],{"emptyLinePlaceholder":99},[87,8062,8063],{"class":89,"line":115},[87,8064,8065],{},"class LearningService:\n",[87,8067,8068],{"class":89,"line":121},[87,8069,8070],{},"    def __init__(self, storage):\n",[87,8072,8073],{"class":89,"line":126},[87,8074,8075],{},"        self.storage = storage\n",[87,8077,8078],{"class":89,"line":132},[87,8079,100],{"emptyLinePlaceholder":99},[87,8081,8082],{"class":89,"line":138},[87,8083,8084],{},"    def finish_lesson(self, title):\n",[87,8086,8087],{"class":89,"line":144},[87,8088,8089],{},"        self.storage.save(title)\n",[87,8091,8092],{"class":89,"line":5843},[87,8093,100],{"emptyLinePlaceholder":99},[87,8095,8096],{"class":89,"line":5848},[87,8097,8098],{},"service = LearningService(Storage())\n",[87,8100,8101],{"class":89,"line":7405},[87,8102,8103],{},"service.finish_lesson(\"异常处理\")\n",[10,8105,150],{},[78,8107,8110],{"className":8108,"code":8109,"language":156,"meta":83},[154],"保存： 异常处理\n",[33,8111,8109],{"__ignoreMap":83},[10,8113,161],{},[14,8115,164],{"id":164},[166,8117,8118,8128],{},[48,8119,8120,8123,8124,8127],{},[33,8121,8122],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8125,8126],{},"save()"," 的协作对象。",[48,8129,8130,8131,8134],{},"调用业务方法时，服务把保存动作委托给 ",[33,8132,8133],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8136,185],{"id":185},[45,8138,8139,8142],{},[48,8140,8141],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[48,8143,8144],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8146,209],{"id":209},[166,8148,8149,8159],{},[48,8150,8151,8152,8155,8156,382],{},"用组合让 ",[33,8153,8154],{},"OrderService"," 使用一个 ",[33,8157,8158],{},"Notifier",[48,8160,8161],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8163,224],{},[14,8165,227],{"id":227},[10,8167,8168],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,8170,234],{},{"title":83,"searchDepth":96,"depth":96,"links":8172},[8173,8174,8175,8176,8177,8178,8179,8180],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7998,"description":8003},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[245,8188,8189],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8192,"title":8193,"body":8194,"category":245,"cover":246,"description":8198,"extension":247,"meta":8401,"navigation":99,"path":8402,"pinned":250,"publishedAt":251,"seo":8403,"slug":8404,"stem":8405,"summary":8406,"tags":8407,"updatedAt":251,"visible":99,"__hash__":8410},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8195,"toc":8389},[8196,8199,8201,8204,8206,8212,8219,8221,8246,8248,8250,8302,8304,8310,8312,8314,8335,8337,8343,8349,8355,8357,8365,8367,8380,8382,8384,8387],[10,8197,8198],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8200,16],{"id":16},[10,8202,8203],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8205,22],{"id":22},[10,8207,8208],{},[26,8209],{"alt":8210,"src":8211},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8213,8214,8215,8218],{},"生成器运行到 ",[33,8216,8217],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8220,43],{"id":43},[45,8222,8223,8233,8243],{},[48,8224,8225,8228,8229,8232],{},[33,8226,8227],{},"iter()"," 从可迭代对象取得迭代器，",[33,8230,8231],{},"next()"," 请求下一个值。",[48,8234,8235,8236,8239,8240,8242],{},"没有更多值时迭代器抛出 ",[33,8237,8238],{},"StopIteration","，",[33,8241,4352],{}," 会自动处理。",[48,8244,8245],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8247,73],{"id":73},[10,8249,76],{},[78,8251,8253],{"className":80,"code":8252,"language":82,"meta":83,"style":83},"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,8254,8255,8260,8265,8270,8275,8280,8284,8289,8294,8298],{"__ignoreMap":83},[87,8256,8257],{"class":89,"line":90},[87,8258,8259],{},"def countdown(start):\n",[87,8261,8262],{"class":89,"line":96},[87,8263,8264],{},"    current = start\n",[87,8266,8267],{"class":89,"line":103},[87,8268,8269],{},"    while current > 0:\n",[87,8271,8272],{"class":89,"line":109},[87,8273,8274],{},"        yield current\n",[87,8276,8277],{"class":89,"line":115},[87,8278,8279],{},"        current = current - 1\n",[87,8281,8282],{"class":89,"line":121},[87,8283,100],{"emptyLinePlaceholder":99},[87,8285,8286],{"class":89,"line":126},[87,8287,8288],{},"iterator = countdown(3)\n",[87,8290,8291],{"class":89,"line":132},[87,8292,8293],{},"print(next(iterator))\n",[87,8295,8296],{"class":89,"line":138},[87,8297,8293],{},[87,8299,8300],{"class":89,"line":144},[87,8301,8293],{},[10,8303,150],{},[78,8305,8308],{"className":8306,"code":8307,"language":156,"meta":83},[154],"3\n2\n1\n",[33,8309,8307],{"__ignoreMap":83},[10,8311,161],{},[14,8313,164],{"id":164},[166,8315,8316,8322],{},[48,8317,7898,8318,8321],{},[33,8319,8320],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[48,8323,8324,8325,8327,8328,8330,8331,8334],{},"每次 ",[33,8326,8231],{}," 运行到下一个 ",[33,8329,8217],{}," 并暂停，局部变量 ",[33,8332,8333],{},"current"," 和执行位置被保留。",[348,8336,2713],{"id":2713},[10,8338,8339,8340,8342],{},"生成器的暂停位置可以展开成多次 ",[33,8341,8231],{}," 的时间线。",[10,8344,8345],{},[26,8346],{"alt":8347,"src":8348},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8350,8351,8352,8354],{},"每次请求只推进到下一个 ",[33,8353,8217],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8356,185],{"id":185},[45,8358,8359,8362],{},[48,8360,8361],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[48,8363,8364],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8366,209],{"id":209},[166,8368,8369,8372],{},[48,8370,8371],{},"编写产生 1 到指定上限偶数的生成器。",[48,8373,4025,8374,8376,8377,8379],{},[33,8375,4352],{}," 遍历生成器，比较手动 ",[33,8378,8231],{}," 的差异。",[10,8381,224],{},[14,8383,227],{"id":227},[10,8385,8386],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,8388,234],{},{"title":83,"searchDepth":96,"depth":96,"links":8390},[8391,8392,8393,8394,8395,8398,8399,8400],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":8396},[8397],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8193,"description":8198},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[245,8408,8409],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8412,"title":8413,"body":8414,"category":245,"cover":246,"description":8418,"extension":247,"meta":8642,"navigation":99,"path":8643,"pinned":250,"publishedAt":251,"seo":8644,"slug":8645,"stem":8646,"summary":8647,"tags":8648,"updatedAt":251,"visible":99,"__hash__":8650},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8415,"toc":8630},[8416,8419,8421,8424,8426,8432,8435,8437,8457,8459,8461,8543,8545,8551,8553,8555,8577,8579,8582,8588,8595,8597,8607,8609,8621,8623,8625,8628],[10,8417,8418],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8420,16],{"id":16},[10,8422,8423],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8425,22],{"id":22},[10,8427,8428],{},[26,8429],{"alt":8430,"src":8431},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8433,8434],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8436,43],{"id":43},[45,8438,8439,8448,8451],{},[48,8440,8441,8444,8445,382],{},[33,8442,8443],{},"@trace"," 等价于 ",[33,8446,8447],{},"add = trace(add)",[48,8449,8450],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[48,8452,8453,8456],{},[33,8454,8455],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8458,73],{"id":73},[10,8460,76],{},[78,8462,8464],{"className":80,"code":8463,"language":82,"meta":83,"style":83},"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,8465,8466,8471,8475,8480,8485,8490,8495,8500,8505,8510,8515,8519,8524,8528,8532,8537],{"__ignoreMap":83},[87,8467,8468],{"class":89,"line":90},[87,8469,8470],{},"from functools import wraps\n",[87,8472,8473],{"class":89,"line":96},[87,8474,100],{"emptyLinePlaceholder":99},[87,8476,8477],{"class":89,"line":103},[87,8478,8479],{},"def trace(function):\n",[87,8481,8482],{"class":89,"line":109},[87,8483,8484],{},"    @wraps(function)\n",[87,8486,8487],{"class":89,"line":115},[87,8488,8489],{},"    def wrapper(*args, **kwargs):\n",[87,8491,8492],{"class":89,"line":121},[87,8493,8494],{},"        print(\"开始：\", function.__name__)\n",[87,8496,8497],{"class":89,"line":126},[87,8498,8499],{},"        result = function(*args, **kwargs)\n",[87,8501,8502],{"class":89,"line":132},[87,8503,8504],{},"        print(\"结束：\", function.__name__)\n",[87,8506,8507],{"class":89,"line":138},[87,8508,8509],{},"        return result\n",[87,8511,8512],{"class":89,"line":144},[87,8513,8514],{},"    return wrapper\n",[87,8516,8517],{"class":89,"line":5843},[87,8518,100],{"emptyLinePlaceholder":99},[87,8520,8521],{"class":89,"line":5848},[87,8522,8523],{},"@trace\n",[87,8525,8526],{"class":89,"line":7405},[87,8527,6196],{},[87,8529,8530],{"class":89,"line":7411},[87,8531,6201],{},[87,8533,8535],{"class":89,"line":8534},15,[87,8536,100],{"emptyLinePlaceholder":99},[87,8538,8540],{"class":89,"line":8539},16,[87,8541,8542],{},"print(add(2, 3))\n",[10,8544,150],{},[78,8546,8549],{"className":8547,"code":8548,"language":156,"meta":83},[154],"开始： add\n结束： add\n5\n",[33,8550,8548],{"__ignoreMap":83},[10,8552,161],{},[14,8554,164],{"id":164},[166,8556,8557,8574],{},[48,8558,8559,8560,8563,8564,8567,8568,8571,8572,382],{},"解释器执行定义时，把原 ",[33,8561,8562],{},"add"," 函数交给 ",[33,8565,8566],{},"trace","，返回的 ",[33,8569,8570],{},"wrapper"," 重新绑定到名字 ",[33,8573,8562],{},[48,8575,8576],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[348,8578,2713],{"id":2713},[10,8580,8581],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8583,8584],{},[26,8585],{"alt":8586,"src":8587},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8589,8590,8592,8593,382],{},[33,8591,8443],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8594,8447],{},[14,8596,185],{"id":185},[45,8598,8599,8604],{},[48,8600,8601,8602,382],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8603,5394],{},[48,8605,8606],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8608,209],{"id":209},[166,8610,8611,8614],{},[48,8612,8613],{},"编写只记录调用次数的简单装饰器。",[48,8615,8616,8617,8620],{},"删除包装函数的 ",[33,8618,8619],{},"return result","，观察调用方得到什么。",[10,8622,224],{},[14,8624,227],{"id":227},[10,8626,8627],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,8629,234],{},{"title":83,"searchDepth":96,"depth":96,"links":8631},[8632,8633,8634,8635,8636,8639,8640,8641],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":8637},[8638],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8413,"description":8418},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[245,8649,5345],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8652,"title":8653,"body":8654,"category":245,"cover":246,"description":8658,"extension":247,"meta":8845,"navigation":99,"path":8846,"pinned":250,"publishedAt":251,"seo":8847,"slug":8848,"stem":8849,"summary":8850,"tags":8851,"updatedAt":251,"visible":99,"__hash__":8854},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8655,"toc":8833},[8656,8659,8661,8664,8666,8672,8675,8677,8688,8690,8692,8767,8769,8775,8777,8779,8790,8792,8795,8801,8804,8806,8814,8816,8824,8826,8828,8831],[10,8657,8658],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8660,16],{"id":16},[10,8662,8663],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8665,22],{"id":22},[10,8667,8668],{},[26,8669],{"alt":8670,"src":8671},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8673,8674],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8676,43],{"id":43},[45,8678,8679,8682,8685],{},[48,8680,8681],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[48,8683,8684],{},"日志记录运行状态，测试判断结果是否符合约定。",[48,8686,8687],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8689,73],{"id":73},[10,8691,76],{},[78,8693,8695],{"className":80,"code":8694,"language":82,"meta":83,"style":83},"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,8696,8697,8702,8707,8711,8716,8720,8725,8730,8735,8739,8744,8749,8754,8758,8762],{"__ignoreMap":83},[87,8698,8699],{"class":89,"line":90},[87,8700,8701],{},"import logging\n",[87,8703,8704],{"class":89,"line":96},[87,8705,8706],{},"import unittest\n",[87,8708,8709],{"class":89,"line":103},[87,8710,100],{"emptyLinePlaceholder":99},[87,8712,8713],{"class":89,"line":109},[87,8714,8715],{},"logging.basicConfig(level=logging.INFO)\n",[87,8717,8718],{"class":89,"line":115},[87,8719,100],{"emptyLinePlaceholder":99},[87,8721,8722],{"class":89,"line":121},[87,8723,8724],{},"def clamp_progress(value):\n",[87,8726,8727],{"class":89,"line":126},[87,8728,8729],{},"    logging.info(\"检查进度：%s\", value)\n",[87,8731,8732],{"class":89,"line":132},[87,8733,8734],{},"    return max(0, min(100, value))\n",[87,8736,8737],{"class":89,"line":138},[87,8738,100],{"emptyLinePlaceholder":99},[87,8740,8741],{"class":89,"line":144},[87,8742,8743],{},"class ProgressTest(unittest.TestCase):\n",[87,8745,8746],{"class":89,"line":5843},[87,8747,8748],{},"    def test_upper_limit(self):\n",[87,8750,8751],{"class":89,"line":5848},[87,8752,8753],{},"        self.assertEqual(clamp_progress(120), 100)\n",[87,8755,8756],{"class":89,"line":7405},[87,8757,100],{"emptyLinePlaceholder":99},[87,8759,8760],{"class":89,"line":7411},[87,8761,6210],{},[87,8763,8764],{"class":89,"line":8534},[87,8765,8766],{},"    unittest.main()\n",[10,8768,150],{},[78,8770,8773],{"className":8771,"code":8772,"language":156,"meta":83},[154],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8774,8772],{"__ignoreMap":83},[10,8776,161],{},[14,8778,164],{"id":164},[166,8780,8781,8787],{},[48,8782,8783,8786],{},[33,8784,8785],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[48,8788,8789],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[348,8791,2713],{"id":2713},[10,8793,8794],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8796,8797],{},[26,8798],{"alt":8799,"src":8800},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8802,8803],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8805,185],{"id":185},[45,8807,8808,8811],{},[48,8809,8810],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[48,8812,8813],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8815,209],{"id":209},[166,8817,8818,8821],{},[48,8819,8820],{},"为负数进度增加测试。",[48,8822,8823],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8825,224],{},[14,8827,227],{"id":227},[10,8829,8830],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,8832,234],{},{"title":83,"searchDepth":96,"depth":96,"links":8834},[8835,8836,8837,8838,8839,8842,8843,8844],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":8840},[8841],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8653,"description":8658},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[245,8852,8853],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8856,"title":8857,"body":8858,"category":245,"cover":246,"description":8862,"extension":247,"meta":9162,"navigation":99,"path":9163,"pinned":250,"publishedAt":251,"seo":9164,"slug":9165,"stem":9166,"summary":9167,"tags":9168,"updatedAt":251,"visible":99,"__hash__":9171},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8859,"toc":9149},[8860,8863,8865,8868,8870,8876,8879,8881,8896,8898,8900,9047,9049,9055,9057,9059,9072,9074,9077,9083,9086,9088,9091,9097,9104,9106,9117,9119,9140,9142,9144,9147],[10,8861,8862],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8864,16],{"id":16},[10,8866,8867],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8869,22],{"id":22},[10,8871,8872],{},[26,8873],{"alt":8874,"src":8875},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8877,8878],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8880,43],{"id":43},[45,8882,8883,8886,8889],{},[48,8884,8885],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[48,8887,8888],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[48,8890,8891,8892,8895],{},"实际扩展前先为 ",[33,8893,8894],{},"add()"," 和存储边界补充测试。",[14,8897,73],{"id":73},[10,8899,76],{},[78,8901,8903],{"className":80,"code":8902,"language":82,"meta":83,"style":83},"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,8904,8905,8909,8913,8917,8922,8927,8932,8937,8941,8946,8951,8956,8961,8966,8970,8975,8980,8986,8991,8997,9002,9007,9013,9019,9025,9030,9036,9041],{"__ignoreMap":83},[87,8906,8907],{"class":89,"line":90},[87,8908,6960],{},[87,8910,8911],{"class":89,"line":96},[87,8912,93],{},[87,8914,8915],{"class":89,"line":103},[87,8916,100],{"emptyLinePlaceholder":99},[87,8918,8919],{"class":89,"line":109},[87,8920,8921],{},"class LearningRecords:\n",[87,8923,8924],{"class":89,"line":115},[87,8925,8926],{},"    def __init__(self, file_path):\n",[87,8928,8929],{"class":89,"line":121},[87,8930,8931],{},"        self.file_path = Path(file_path)\n",[87,8933,8934],{"class":89,"line":126},[87,8935,8936],{},"        self.items = []\n",[87,8938,8939],{"class":89,"line":132},[87,8940,100],{"emptyLinePlaceholder":99},[87,8942,8943],{"class":89,"line":138},[87,8944,8945],{},"    def add(self, title):\n",[87,8947,8948],{"class":89,"line":144},[87,8949,8950],{},"        title = title.strip()\n",[87,8952,8953],{"class":89,"line":5843},[87,8954,8955],{},"        if not title:\n",[87,8957,8958],{"class":89,"line":5848},[87,8959,8960],{},"            raise ValueError(\"课程名称不能为空\")\n",[87,8962,8963],{"class":89,"line":7405},[87,8964,8965],{},"        self.items.append({\"title\": title, \"done\": False})\n",[87,8967,8968],{"class":89,"line":7411},[87,8969,100],{"emptyLinePlaceholder":99},[87,8971,8972],{"class":89,"line":8534},[87,8973,8974],{},"    def save(self):\n",[87,8976,8977],{"class":89,"line":8539},[87,8978,8979],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[87,8981,8983],{"class":89,"line":8982},17,[87,8984,8985],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[87,8987,8989],{"class":89,"line":8988},18,[87,8990,100],{"emptyLinePlaceholder":99},[87,8992,8994],{"class":89,"line":8993},19,[87,8995,8996],{},"records = LearningRecords(\"learning-records.json\")\n",[87,8998,9000],{"class":89,"line":8999},20,[87,9001,100],{"emptyLinePlaceholder":99},[87,9003,9005],{"class":89,"line":9004},21,[87,9006,7378],{},[87,9008,9010],{"class":89,"line":9009},22,[87,9011,9012],{},"    title = input(\"输入已学习课程：\")\n",[87,9014,9016],{"class":89,"line":9015},23,[87,9017,9018],{},"    records.add(title)\n",[87,9020,9022],{"class":89,"line":9021},24,[87,9023,9024],{},"    records.save()\n",[87,9026,9028],{"class":89,"line":9027},25,[87,9029,7388],{},[87,9031,9033],{"class":89,"line":9032},26,[87,9034,9035],{},"    print(\"无法保存：\", error)\n",[87,9037,9039],{"class":89,"line":9038},27,[87,9040,1165],{},[87,9042,9044],{"class":89,"line":9043},28,[87,9045,9046],{},"    print(\"已保存 1 条学习记录\")\n",[10,9048,150],{},[78,9050,9053],{"className":9051,"code":9052,"language":156,"meta":83},[154],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9054,9052],{"__ignoreMap":83},[10,9056,161],{},[14,9058,164],{"id":164},[166,9060,9061,9067],{},[48,9062,9063,9064,9066],{},"输入层取得课程名后，",[33,9065,8894],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[48,9068,9069,9071],{},[33,9070,8126],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[348,9073,2713],{"id":2713},[10,9075,9076],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9078,9079],{},[26,9080],{"alt":9081,"src":9082},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9084,9085],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[348,9087,2713],{"id":4233},[10,9089,9090],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9092,9093],{},[26,9094],{"alt":9095,"src":9096},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9098,9099,9100,9103],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9101,9102],{},"load()"," 把文件状态恢复到内存。",[14,9105,185],{"id":185},[45,9107,9108,9111],{},[48,9109,9110],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[48,9112,9113,9114,9116],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9115,9102],{}," 是下一项必要扩展。",[14,9118,209],{"id":209},[166,9120,9121,9127,9130],{},[48,9122,9123,9124,9126],{},"增加 ",[33,9125,9102],{},"，文件不存在时从空列表开始。",[48,9128,9129],{},"增加按序号标记完成的功能，并校验序号范围。",[48,9131,9132,9133,9136,9137,9139],{},"把输入循环放进 ",[33,9134,9135],{},"main()","，通过 ",[33,9138,6152],{}," 控制程序入口。",[10,9141,224],{},[14,9143,227],{"id":227},[10,9145,9146],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[232,9148,234],{},{"title":83,"searchDepth":96,"depth":96,"links":9150},[9151,9152,9153,9154,9155,9159,9160,9161],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":9156},[9157,9158],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8857,"description":8862},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[245,9169,9170],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9173,9276,9395,9526,9669,9794,9931,10068,10209,10378,10515,10648,10771,10900,11027,11190,11366,11507,11636,11785,11928,12049,12172,12321,12474,12639,12766,12947,13090,13247,13398,13545,13700,13918,14073,14248,14399,14566,14753,14916,15158,15398],{"id":1412,"title":1413,"body":9174,"category":245,"cover":246,"description":1418,"extension":247,"meta":9273,"navigation":99,"path":1537,"pinned":250,"publishedAt":251,"seo":9274,"slug":1539,"stem":1540,"summary":1541,"tags":9275,"updatedAt":251,"visible":99,"__hash__":1544},{"type":7,"value":9175,"toc":9263},[9176,9178,9180,9182,9184,9188,9192,9194,9204,9206,9208,9216,9218,9223,9225,9227,9237,9239,9247,9249,9255,9257,9259,9261],[10,9177,1418],{},[14,9179,16],{"id":16},[10,9181,1423],{},[14,9183,22],{"id":22},[10,9185,9186],{},[26,9187],{"alt":1430,"src":1431},[10,9189,9190,1436],{},[33,9191,1190],{},[14,9193,43],{"id":43},[45,9195,9196,9200,9202],{},[48,9197,1443,9198,1446],{},[33,9199,1190],{},[48,9201,1449],{},[48,9203,1452],{},[14,9205,73],{"id":73},[10,9207,76],{},[78,9209,9210],{"className":80,"code":1459,"language":82,"meta":83,"style":83},[33,9211,9212],{"__ignoreMap":83},[87,9213,9214],{"class":89,"line":90},[87,9215,1459],{},[10,9217,150],{},[78,9219,9221],{"className":9220,"code":1471,"language":156,"meta":83},[154],[33,9222,1471],{"__ignoreMap":83},[10,9224,161],{},[14,9226,164],{"id":164},[166,9228,9229,9233],{},[48,9230,1482,9231,1486],{},[33,9232,1485],{},[48,9234,1489,9235,1493],{},[33,9236,1492],{},[14,9238,185],{"id":185},[45,9240,9241,9243],{},[48,9242,1500],{},[48,9244,1503,9245,1506],{},[33,9246,1190],{},[14,9248,209],{"id":209},[166,9250,9251,9253],{},[48,9252,1513],{},[48,9254,1516],{},[10,9256,224],{},[14,9258,227],{"id":227},[10,9260,1523],{},[232,9262,234],{},{"title":83,"searchDepth":96,"depth":96,"links":9264},[9265,9266,9267,9268,9269,9270,9271,9272],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":1413,"description":1418},[245,1408,1543],{"id":1546,"title":1547,"body":9277,"category":245,"cover":246,"description":1552,"extension":247,"meta":9392,"navigation":99,"path":1689,"pinned":250,"publishedAt":251,"seo":9393,"slug":1691,"stem":1692,"summary":1693,"tags":9394,"updatedAt":251,"visible":99,"__hash__":1696},{"type":7,"value":9278,"toc":9382},[9279,9281,9283,9285,9287,9291,9295,9297,9307,9309,9311,9331,9333,9338,9340,9342,9352,9354,9364,9366,9374,9376,9378,9380],[10,9280,1552],{},[14,9282,16],{"id":16},[10,9284,1557],{},[14,9286,22],{"id":22},[10,9288,9289],{},[26,9290],{"alt":1564,"src":1565},[10,9292,1568,9293,1571],{},[33,9294,711],{},[14,9296,43],{"id":43},[45,9298,9299,9301,9303],{},[48,9300,1578],{},[48,9302,1581],{},[48,9304,1584,9305,1588],{},[33,9306,1587],{},[14,9308,73],{"id":73},[10,9310,1593],{},[78,9312,9313],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,9314,9315,9321],{"__ignoreMap":83},[87,9316,9317,9319],{"class":89,"line":90},[87,9318,711],{"class":620},[87,9320,624],{"class":623},[87,9322,9323,9325,9327,9329],{"class":89,"line":96},[87,9324,711],{"class":620},[87,9326,653],{"class":623},[87,9328,657],{"class":656},[87,9330,624],{"class":623},[10,9332,150],{},[78,9334,9336],{"className":9335,"code":1619,"language":156,"meta":83},[154],[33,9337,1619],{"__ignoreMap":83},[10,9339,161],{},[14,9341,164],{"id":164},[166,9343,9344,9348],{},[48,9345,9346,1633],{},[33,9347,1632],{},[48,9349,9350,1638],{},[33,9351,719],{},[14,9353,185],{"id":185},[45,9355,9356,9360],{},[48,9357,1645,9358,1648],{},[33,9359,711],{},[48,9361,1651,9362,1654],{},[33,9363,711],{},[14,9365,209],{"id":209},[166,9367,9368,9372],{},[48,9369,958,9370,1664],{},[33,9371,1663],{},[48,9373,1667],{},[10,9375,224],{},[14,9377,227],{"id":227},[10,9379,1674],{},[232,9381,1677],{},{"title":83,"searchDepth":96,"depth":96,"links":9383},[9384,9385,9386,9387,9388,9389,9390,9391],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":1547,"description":1552},[245,1695,1071],{"id":1698,"title":1699,"body":9396,"category":245,"cover":246,"description":1865,"extension":247,"meta":9523,"navigation":99,"path":1867,"pinned":250,"publishedAt":251,"seo":9524,"slug":1869,"stem":1870,"summary":1871,"tags":9525,"updatedAt":251,"visible":99,"__hash__":1875},{"type":7,"value":9397,"toc":9513},[9398,9402,9404,9406,9408,9412,9414,9416,9432,9434,9436,9456,9458,9463,9465,9467,9479,9481,9491,9493,9503,9505,9507,9511],[10,9399,1704,9400,1707],{},[33,9401,1190],{},[14,9403,16],{"id":16},[10,9405,1712],{},[14,9407,22],{"id":22},[10,9409,9410],{},[26,9411],{"alt":1719,"src":1720},[10,9413,1723],{},[14,9415,43],{"id":43},[45,9417,9418,9424,9428],{},[48,9419,1730,9420,1733,9422,382],{},[33,9421,711],{},[33,9423,1736],{},[48,9425,1739,9426,1743],{},[33,9427,1742],{},[48,9429,1746,9430,1749],{},[33,9431,1190],{},[14,9433,73],{"id":73},[10,9435,76],{},[78,9437,9438],{"className":1756,"code":1757,"language":1758,"meta":83,"style":83},[33,9439,9440,9444,9448,9452],{"__ignoreMap":83},[87,9441,9442],{"class":89,"line":90},[87,9443,1765],{},[87,9445,9446],{"class":89,"line":96},[87,9447,1770],{},[87,9449,9450],{"class":89,"line":103},[87,9451,1775],{},[87,9453,9454],{"class":89,"line":109},[87,9455,1780],{},[10,9457,150],{},[78,9459,9461],{"className":9460,"code":1786,"language":156,"meta":83},[154],[33,9462,1786],{"__ignoreMap":83},[10,9464,161],{},[14,9466,164],{"id":164},[166,9468,9469,9475],{},[48,9470,1797,9471,1801,9473,382],{},[33,9472,1800],{},[33,9474,1804],{},[48,9476,1807,9477,1810],{},[33,9478,1492],{},[14,9480,185],{"id":185},[45,9482,9483,9489],{},[48,9484,1817,9485,1820,9487,1823],{},[33,9486,1736],{},[33,9488,1190],{},[48,9490,1826],{},[14,9492,209],{"id":209},[166,9494,9495,9499],{},[48,9496,1833,9497,382],{},[33,9498,1836],{},[48,9500,1839,9501,1842],{},[33,9502,1492],{},[10,9504,224],{},[14,9506,227],{"id":227},[10,9508,1849,9509,1852],{},[33,9510,1190],{},[232,9512,234],{},{"title":83,"searchDepth":96,"depth":96,"links":9514},[9515,9516,9517,9518,9519,9520,9521,9522],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":1699,"description":1865},[245,1873,1874],{"id":1877,"title":1878,"body":9527,"category":245,"cover":246,"description":1883,"extension":247,"meta":9666,"navigation":99,"path":2055,"pinned":250,"publishedAt":251,"seo":9667,"slug":2057,"stem":2058,"summary":2059,"tags":9668,"updatedAt":251,"visible":99,"__hash__":2063},{"type":7,"value":9528,"toc":9656},[9529,9531,9533,9535,9537,9541,9545,9547,9559,9561,9563,9599,9601,9606,9608,9610,9626,9628,9638,9640,9648,9650,9652,9654],[10,9530,1883],{},[14,9532,16],{"id":16},[10,9534,1888],{},[14,9536,22],{"id":22},[10,9538,9539],{},[26,9540],{"alt":1895,"src":1896},[10,9542,9543,1902],{},[33,9544,1901],{},[14,9546,43],{"id":43},[45,9548,9549,9551,9557],{},[48,9550,1909],{},[48,9552,9553,1915,9555,1919],{},[33,9554,1914],{},[33,9556,1918],{},[48,9558,1922],{},[14,9560,73],{"id":73},[10,9562,1593],{},[78,9564,9565],{"className":611,"code":1929,"language":613,"meta":83,"style":83},[33,9566,9567,9573,9579,9583,9593],{"__ignoreMap":83},[87,9568,9569,9571],{"class":89,"line":90},[87,9570,1936],{"class":620},[87,9572,1939],{"class":656},[87,9574,9575,9577],{"class":89,"line":96},[87,9576,1944],{"class":623},[87,9578,1939],{"class":656},[87,9580,9581],{"class":89,"line":103},[87,9582,1951],{"class":623},[87,9584,9585,9587,9589,9591],{"class":89,"line":109},[87,9586,1956],{"class":623},[87,9588,1959],{"class":656},[87,9590,1963],{"class":1962},[87,9592,1234],{"class":656},[87,9594,9595,9597],{"class":89,"line":115},[87,9596,711],{"class":620},[87,9598,1234],{"class":656},[10,9600,150],{},[78,9602,9604],{"className":9603,"code":1977,"language":156,"meta":83},[154],[33,9605,1977],{"__ignoreMap":83},[10,9607,161],{},[14,9609,164],{"id":164},[166,9611,9612,9620],{},[48,9613,9614,1990,9616,1993,9618,1996],{},[33,9615,1936],{},[33,9617,1944],{},[33,9619,1914],{},[48,9621,9622,2001,9624,2005],{},[33,9623,1901],{},[33,9625,2004],{},[14,9627,185],{"id":185},[45,9629,9630,9636],{},[48,9631,2012,9632,1176,9634,382],{},[33,9633,1914],{},[33,9635,1918],{},[48,9637,2019],{},[14,9639,209],{"id":209},[166,9641,9642,9646],{},[48,9643,2026,9644,2030],{},[33,9645,2029],{},[48,9647,2033],{},[10,9649,224],{},[14,9651,227],{"id":227},[10,9653,2040],{},[232,9655,2043],{},{"title":83,"searchDepth":96,"depth":96,"links":9657},[9658,9659,9660,9661,9662,9663,9664,9665],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":1878,"description":1883},[245,2061,2062],{"id":2065,"title":2066,"body":9670,"category":245,"cover":246,"description":2071,"extension":247,"meta":9791,"navigation":99,"path":2220,"pinned":250,"publishedAt":251,"seo":9792,"slug":2222,"stem":2223,"summary":2224,"tags":9793,"updatedAt":251,"visible":99,"__hash__":2228},{"type":7,"value":9671,"toc":9781},[9672,9674,9676,9678,9680,9684,9692,9694,9708,9710,9712,9728,9730,9735,9737,9739,9753,9755,9761,9763,9773,9775,9777,9779],[10,9673,2071],{},[14,9675,16],{"id":16},[10,9677,2076],{},[14,9679,22],{"id":22},[10,9681,9682],{},[26,9683],{"alt":2083,"src":2084},[10,9685,2087,9686,382,9688,2093,9690,382],{},[33,9687,1492],{},[33,9689,2092],{},[33,9691,1800],{},[14,9693,43],{"id":43},[45,9695,9696,9700,9706],{},[48,9697,9698,2105],{},[33,9699,2104],{},[48,9701,9702,2111,9704,382],{},[33,9703,2110],{},[33,9705,2114],{},[48,9707,2117],{},[14,9709,73],{"id":73},[10,9711,76],{},[78,9713,9714],{"className":80,"code":2124,"language":82,"meta":83,"style":83},[33,9715,9716,9720,9724],{"__ignoreMap":83},[87,9717,9718],{"class":89,"line":90},[87,9719,2131],{},[87,9721,9722],{"class":89,"line":96},[87,9723,2136],{},[87,9725,9726],{"class":89,"line":103},[87,9727,2141],{},[10,9729,150],{},[78,9731,9733],{"className":9732,"code":2147,"language":156,"meta":83},[154],[33,9734,2147],{"__ignoreMap":83},[10,9736,161],{},[14,9738,164],{"id":164},[166,9740,9741,9747],{},[48,9742,9743,2161,9745,382],{},[33,9744,2160],{},[33,9746,2114],{},[48,9748,9749,2168,9751,2172],{},[33,9750,1492],{},[33,9752,2171],{},[14,9754,185],{"id":185},[45,9756,9757,9759],{},[48,9758,2179],{},[48,9760,2182],{},[14,9762,209],{"id":209},[166,9764,9765,9767],{},[48,9766,2189],{},[48,9768,2192,9769,2195,9771,2199],{},[33,9770,2092],{},[33,9772,2198],{},[10,9774,224],{},[14,9776,227],{"id":227},[10,9778,2206],{},[232,9780,234],{},{"title":83,"searchDepth":96,"depth":96,"links":9782},[9783,9784,9785,9786,9787,9788,9789,9790],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":2066,"description":2071},[245,2226,2227],{"id":2230,"title":2231,"body":9795,"category":245,"cover":246,"description":2236,"extension":247,"meta":9928,"navigation":99,"path":2402,"pinned":250,"publishedAt":251,"seo":9929,"slug":2404,"stem":2405,"summary":2406,"tags":9930,"updatedAt":251,"visible":99,"__hash__":2410},{"type":7,"value":9796,"toc":9918},[9797,9799,9801,9803,9805,9809,9811,9813,9829,9831,9833,9857,9859,9864,9866,9868,9884,9886,9898,9900,9910,9912,9914,9916],[10,9798,2236],{},[14,9800,16],{"id":16},[10,9802,2241],{},[14,9804,22],{"id":22},[10,9806,9807],{},[26,9808],{"alt":2248,"src":2249},[10,9810,2252],{},[14,9812,43],{"id":43},[45,9814,9815,9817,9823],{},[48,9816,2259],{},[48,9818,2262,9819,2195,9821,2269],{},[33,9820,2265],{},[33,9822,2268],{},[48,9824,2272,9825,56,9827,2279],{},[33,9826,2275],{},[33,9828,2278],{},[14,9830,73],{"id":73},[10,9832,76],{},[78,9834,9835],{"className":80,"code":2286,"language":82,"meta":83,"style":83},[33,9836,9837,9841,9845,9849,9853],{"__ignoreMap":83},[87,9838,9839],{"class":89,"line":90},[87,9840,2293],{},[87,9842,9843],{"class":89,"line":96},[87,9844,2298],{},[87,9846,9847],{"class":89,"line":103},[87,9848,100],{"emptyLinePlaceholder":99},[87,9850,9851],{"class":89,"line":109},[87,9852,2307],{},[87,9854,9855],{"class":89,"line":115},[87,9856,2298],{},[10,9858,150],{},[78,9860,9862],{"className":9861,"code":2317,"language":156,"meta":83},[154],[33,9863,2317],{"__ignoreMap":83},[10,9865,161],{},[14,9867,164],{"id":164},[166,9869,9870,9876],{},[48,9871,958,9872,2331,9874,2334],{},[33,9873,2330],{},[33,9875,2265],{},[48,9877,958,9878,2340,9880,2344,9882,382],{},[33,9879,2339],{},[33,9881,2343],{},[33,9883,2347],{},[14,9885,185],{"id":185},[45,9887,9888,9890],{},[48,9889,2354],{},[48,9891,176,9892,56,9894,56,9896,2364],{},[33,9893,2275],{},[33,9895,2278],{},[33,9897,2363],{},[14,9899,209],{"id":209},[166,9901,9902,9908],{},[48,9903,2371,9904,1176,9906,2378],{},[33,9905,2374],{},[33,9907,2377],{},[48,9909,2381],{},[10,9911,224],{},[14,9913,227],{"id":227},[10,9915,2388],{},[232,9917,234],{},{"title":83,"searchDepth":96,"depth":96,"links":9919},[9920,9921,9922,9923,9924,9925,9926,9927],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":2231,"description":2236},[245,2408,2409],{"id":2412,"title":2413,"body":9932,"category":245,"cover":246,"description":2418,"extension":247,"meta":10065,"navigation":99,"path":2582,"pinned":250,"publishedAt":251,"seo":10066,"slug":2584,"stem":2585,"summary":2586,"tags":10067,"updatedAt":251,"visible":99,"__hash__":2590},{"type":7,"value":9933,"toc":10055},[9934,9936,9938,9940,9942,9946,9948,9950,9968,9970,9972,10008,10010,10015,10017,10019,10029,10031,10039,10041,10047,10049,10051,10053],[10,9935,2418],{},[14,9937,16],{"id":16},[10,9939,2423],{},[14,9941,22],{"id":22},[10,9943,9944],{},[26,9945],{"alt":2430,"src":2431},[10,9947,2434],{},[14,9949,43],{"id":43},[45,9951,9952,9958,9966],{},[48,9953,9954,2444,9956,2448],{},[33,9955,2443],{},[33,9957,2447],{},[48,9959,9960,2453,9962,2457,9964,2461],{},[33,9961,39],{},[33,9963,2456],{},[33,9965,2460],{},[48,9967,2464],{},[14,9969,73],{"id":73},[10,9971,76],{},[78,9973,9974],{"className":80,"code":2471,"language":82,"meta":83,"style":83},[33,9975,9976,9980,9984,9988,9992,9996,10000,10004],{"__ignoreMap":83},[87,9977,9978],{"class":89,"line":90},[87,9979,2478],{},[87,9981,9982],{"class":89,"line":96},[87,9983,2483],{},[87,9985,9986],{"class":89,"line":103},[87,9987,2488],{},[87,9989,9990],{"class":89,"line":109},[87,9991,100],{"emptyLinePlaceholder":99},[87,9993,9994],{"class":89,"line":115},[87,9995,2497],{},[87,9997,9998],{"class":89,"line":121},[87,9999,2502],{},[87,10001,10002],{"class":89,"line":126},[87,10003,2507],{},[87,10005,10006],{"class":89,"line":132},[87,10007,2512],{},[10,10009,150],{},[78,10011,10013],{"className":10012,"code":2518,"language":156,"meta":83},[154],[33,10014,2518],{"__ignoreMap":83},[10,10016,161],{},[14,10018,164],{"id":164},[166,10020,10021,10025],{},[48,10022,10023,2532],{},[33,10024,2531],{},[48,10026,10027,2538],{},[33,10028,2537],{},[14,10030,185],{"id":185},[45,10032,10033,10037],{},[48,10034,2545,10035,382],{},[33,10036,2548],{},[48,10038,2551],{},[14,10040,209],{"id":209},[166,10042,10043,10045],{},[48,10044,2558],{},[48,10046,2561],{},[10,10048,224],{},[14,10050,227],{"id":227},[10,10052,2568],{},[232,10054,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10056},[10057,10058,10059,10060,10061,10062,10063,10064],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":2413,"description":2418},[245,2588,2589],{"id":2592,"title":2593,"body":10069,"category":245,"cover":246,"description":2598,"extension":247,"meta":10206,"navigation":99,"path":2775,"pinned":250,"publishedAt":251,"seo":10207,"slug":2777,"stem":2778,"summary":2779,"tags":10208,"updatedAt":251,"visible":99,"__hash__":2783},{"type":7,"value":10070,"toc":10194},[10071,10073,10075,10077,10079,10083,10089,10091,10099,10101,10103,10127,10129,10134,10136,10138,10156,10158,10160,10164,10166,10168,10174,10176,10186,10188,10190,10192],[10,10072,2598],{},[14,10074,16],{"id":16},[10,10076,2603],{},[14,10078,22],{"id":22},[10,10080,10081],{},[26,10082],{"alt":2610,"src":2611},[10,10084,2614,10085,2618,10087,382],{},[33,10086,2617],{},[33,10088,2621],{},[14,10090,43],{"id":43},[45,10092,10093,10095,10097],{},[48,10094,2628],{},[48,10096,2631],{},[48,10098,2634],{},[14,10100,73],{"id":73},[10,10102,76],{},[78,10104,10105],{"className":80,"code":2641,"language":82,"meta":83,"style":83},[33,10106,10107,10111,10115,10119,10123],{"__ignoreMap":83},[87,10108,10109],{"class":89,"line":90},[87,10110,2648],{},[87,10112,10113],{"class":89,"line":96},[87,10114,2653],{},[87,10116,10117],{"class":89,"line":103},[87,10118,2658],{},[87,10120,10121],{"class":89,"line":109},[87,10122,2663],{},[87,10124,10125],{"class":89,"line":115},[87,10126,2668],{},[10,10128,150],{},[78,10130,10132],{"className":10131,"code":2674,"language":156,"meta":83},[154],[33,10133,2674],{"__ignoreMap":83},[10,10135,161],{},[14,10137,164],{"id":164},[166,10139,10140,10148],{},[48,10141,2685,10142,2688,10144,2692,10146,2696],{},[33,10143,245],{},[33,10145,2691],{},[33,10147,2695],{},[48,10149,10150,2702,10152,2706,10154,2710],{},[33,10151,2701],{},[33,10153,2705],{},[33,10155,2709],{},[348,10157,2713],{"id":2713},[10,10159,2716],{},[10,10161,10162],{},[26,10163],{"alt":2721,"src":2722},[10,10165,2725],{},[14,10167,185],{"id":185},[45,10169,10170,10172],{},[48,10171,2732],{},[48,10173,2735],{},[14,10175,209],{"id":209},[166,10177,10178,10184],{},[48,10179,2742,10180,2746,10182,382],{},[33,10181,2745],{},[33,10183,2749],{},[48,10185,2752],{},[10,10187,224],{},[14,10189,227],{"id":227},[10,10191,2759],{},[232,10193,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10195},[10196,10197,10198,10199,10200,10203,10204,10205],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":10201},[10202],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":2593,"description":2598},[245,2781,2782],{"id":2785,"title":2786,"body":10210,"category":245,"cover":246,"description":2791,"extension":247,"meta":10375,"navigation":99,"path":3006,"pinned":250,"publishedAt":251,"seo":10376,"slug":3008,"stem":3009,"summary":3010,"tags":10377,"updatedAt":251,"visible":99,"__hash__":3014},{"type":7,"value":10211,"toc":10363},[10212,10214,10216,10218,10220,10224,10230,10232,10252,10254,10256,10292,10294,10299,10301,10303,10317,10319,10321,10325,10331,10333,10343,10345,10355,10357,10359,10361],[10,10213,2791],{},[14,10215,16],{"id":16},[10,10217,2796],{},[14,10219,22],{"id":22},[10,10221,10222],{},[26,10223],{"alt":2803,"src":2804},[10,10225,2807,10226,202,10228,2814],{},[33,10227,2810],{},[33,10229,2813],{},[14,10231,43],{"id":43},[45,10233,10234,10242,10250],{},[48,10235,10236,2824,10238,2828,10240,2832],{},[33,10237,2823],{},[33,10239,2827],{},[33,10241,2831],{},[48,10243,10244,2838,10246,2842,10248,2846],{},[33,10245,2837],{},[33,10247,2841],{},[33,10249,2845],{},[48,10251,2849],{},[14,10253,73],{"id":73},[10,10255,76],{},[78,10257,10258],{"className":80,"code":2856,"language":82,"meta":83,"style":83},[33,10259,10260,10264,10268,10272,10276,10280,10284,10288],{"__ignoreMap":83},[87,10261,10262],{"class":89,"line":90},[87,10263,2863],{},[87,10265,10266],{"class":89,"line":96},[87,10267,2868],{},[87,10269,10270],{"class":89,"line":103},[87,10271,100],{"emptyLinePlaceholder":99},[87,10273,10274],{"class":89,"line":109},[87,10275,2877],{},[87,10277,10278],{"class":89,"line":115},[87,10279,2882],{},[87,10281,10282],{"class":89,"line":121},[87,10283,2887],{},[87,10285,10286],{"class":89,"line":126},[87,10287,2892],{},[87,10289,10290],{"class":89,"line":132},[87,10291,2897],{},[10,10293,150],{},[78,10295,10297],{"className":10296,"code":2903,"language":156,"meta":83},[154],[33,10298,2903],{"__ignoreMap":83},[10,10300,161],{},[14,10302,164],{"id":164},[166,10304,10305,10311],{},[48,10306,10307,2917,10309,2921],{},[33,10308,2916],{},[33,10310,2920],{},[48,10312,10313,2927,10315,2930],{},[33,10314,2926],{},[33,10316,2845],{},[348,10318,2713],{"id":2713},[10,10320,2935],{},[10,10322,10323],{},[26,10324],{"alt":2940,"src":2941},[10,10326,10327,2946,10329,2949],{},[33,10328,2837],{},[33,10330,2841],{},[14,10332,185],{"id":185},[45,10334,10335,10341],{},[48,10336,2956,10337,2959,10339,2962],{},[33,10338,2831],{},[33,10340,2823],{},[48,10342,2965],{},[14,10344,209],{"id":209},[166,10346,10347,10351],{},[48,10348,2972,10349,2976],{},[33,10350,2975],{},[48,10352,2979,10353,2983],{},[33,10354,2982],{},[10,10356,224],{},[14,10358,227],{"id":227},[10,10360,2990],{},[232,10362,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10364},[10365,10366,10367,10368,10369,10372,10373,10374],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":10370},[10371],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":2786,"description":2791},[245,3012,3013],{"id":3016,"title":3017,"body":10379,"category":245,"cover":246,"description":3022,"extension":247,"meta":10512,"navigation":99,"path":3191,"pinned":250,"publishedAt":251,"seo":10513,"slug":3193,"stem":3194,"summary":3195,"tags":10514,"updatedAt":251,"visible":99,"__hash__":3198},{"type":7,"value":10380,"toc":10502},[10381,10383,10385,10387,10389,10393,10403,10405,10415,10417,10419,10447,10449,10454,10456,10458,10472,10474,10482,10484,10494,10496,10498,10500],[10,10382,3022],{},[14,10384,16],{"id":16},[10,10386,3027],{},[14,10388,22],{"id":22},[10,10390,10391],{},[26,10392],{"alt":3034,"src":3035},[10,10394,10395,3041,10397,3045,10399,3049,10401,3053],{},[33,10396,3040],{},[33,10398,3044],{},[33,10400,3048],{},[33,10402,3052],{},[14,10404,43],{"id":43},[45,10406,10407,10409,10413],{},[48,10408,3060],{},[48,10410,10411,3065],{},[33,10412,3052],{},[48,10414,3068],{},[14,10416,73],{"id":73},[10,10418,76],{},[78,10420,10421],{"className":80,"code":3075,"language":82,"meta":83,"style":83},[33,10422,10423,10427,10431,10435,10439,10443],{"__ignoreMap":83},[87,10424,10425],{"class":89,"line":90},[87,10426,3082],{},[87,10428,10429],{"class":89,"line":96},[87,10430,3087],{},[87,10432,10433],{"class":89,"line":103},[87,10434,3092],{},[87,10436,10437],{"class":89,"line":109},[87,10438,100],{"emptyLinePlaceholder":99},[87,10440,10441],{"class":89,"line":115},[87,10442,3101],{},[87,10444,10445],{"class":89,"line":121},[87,10446,3106],{},[10,10448,150],{},[78,10450,10452],{"className":10451,"code":3112,"language":156,"meta":83},[154],[33,10453,3112],{"__ignoreMap":83},[10,10455,161],{},[14,10457,164],{"id":164},[166,10459,10460,10466],{},[48,10461,3123,10462,3126,10464,3130],{},[33,10463,3040],{},[33,10465,3129],{},[48,10467,10468,3136,10470,3140],{},[33,10469,3135],{},[33,10471,3139],{},[14,10473,185],{"id":185},[45,10475,10476,10480],{},[48,10477,3147,10478,3151],{},[33,10479,3150],{},[48,10481,3154],{},[14,10483,209],{"id":209},[166,10485,10486,10488],{},[48,10487,3161],{},[48,10489,1739,10490,3167,10492,3170],{},[33,10491,3166],{},[33,10493,3052],{},[10,10495,224],{},[14,10497,227],{"id":227},[10,10499,3177],{},[232,10501,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10503},[10504,10505,10506,10507,10508,10509,10510,10511],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3017,"description":3022},[245,2363,3197],{"id":3200,"title":3201,"body":10516,"category":245,"cover":246,"description":3206,"extension":247,"meta":10645,"navigation":99,"path":3367,"pinned":250,"publishedAt":251,"seo":10646,"slug":3369,"stem":3370,"summary":3371,"tags":10647,"updatedAt":251,"visible":99,"__hash__":3375},{"type":7,"value":10517,"toc":10635},[10518,10520,10522,10524,10526,10530,10534,10536,10546,10548,10550,10582,10584,10589,10591,10593,10605,10607,10617,10619,10627,10629,10631,10633],[10,10519,3206],{},[14,10521,16],{"id":16},[10,10523,3211],{},[14,10525,22],{"id":22},[10,10527,10528],{},[26,10529],{"alt":3218,"src":3219},[10,10531,3222,10532,3226],{},[33,10533,3225],{},[14,10535,43],{"id":43},[45,10537,10538,10540,10542],{},[48,10539,3233],{},[48,10541,3236],{},[48,10543,3239,10544,382],{},[33,10545,3242],{},[14,10547,73],{"id":73},[10,10549,76],{},[78,10551,10552],{"className":80,"code":3249,"language":82,"meta":83,"style":83},[33,10553,10554,10558,10562,10566,10570,10574,10578],{"__ignoreMap":83},[87,10555,10556],{"class":89,"line":90},[87,10557,3256],{},[87,10559,10560],{"class":89,"line":96},[87,10561,3261],{},[87,10563,10564],{"class":89,"line":103},[87,10565,100],{"emptyLinePlaceholder":99},[87,10567,10568],{"class":89,"line":109},[87,10569,3270],{},[87,10571,10572],{"class":89,"line":115},[87,10573,3275],{},[87,10575,10576],{"class":89,"line":121},[87,10577,3280],{},[87,10579,10580],{"class":89,"line":126},[87,10581,3285],{},[10,10583,150],{},[78,10585,10587],{"className":10586,"code":3291,"language":156,"meta":83},[154],[33,10588,3291],{"__ignoreMap":83},[10,10590,161],{},[14,10592,164],{"id":164},[166,10594,10595,10597],{},[48,10596,3302],{},[48,10598,10599,3308,10601,3312,10603,3316],{},[33,10600,3307],{},[33,10602,3311],{},[33,10604,3315],{},[14,10606,185],{"id":185},[45,10608,10609,10615],{},[48,10610,3323,10611,3327,10613,382],{},[33,10612,3326],{},[33,10614,3330],{},[48,10616,3333],{},[14,10618,209],{"id":209},[166,10620,10621,10623],{},[48,10622,3340],{},[48,10624,3343,10625,3346],{},[33,10626,3315],{},[10,10628,224],{},[14,10630,227],{"id":227},[10,10632,3353],{},[232,10634,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10636},[10637,10638,10639,10640,10641,10642,10643,10644],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3201,"description":3206},[245,3373,3374],{"id":3377,"title":3378,"body":10649,"category":245,"cover":246,"description":3383,"extension":247,"meta":10768,"navigation":99,"path":3524,"pinned":250,"publishedAt":251,"seo":10769,"slug":3526,"stem":3527,"summary":3528,"tags":10770,"updatedAt":251,"visible":99,"__hash__":3531},{"type":7,"value":10650,"toc":10758},[10651,10653,10655,10657,10659,10663,10665,10667,10675,10677,10679,10707,10709,10714,10716,10718,10728,10730,10738,10740,10750,10752,10754,10756],[10,10652,3383],{},[14,10654,16],{"id":16},[10,10656,3388],{},[14,10658,22],{"id":22},[10,10660,10661],{},[26,10662],{"alt":3395,"src":3396},[10,10664,3399],{},[14,10666,43],{"id":43},[45,10668,10669,10671,10673],{},[48,10670,3406],{},[48,10672,3409],{},[48,10674,3412],{},[14,10676,73],{"id":73},[10,10678,76],{},[78,10680,10681],{"className":80,"code":3419,"language":82,"meta":83,"style":83},[33,10682,10683,10687,10691,10695,10699,10703],{"__ignoreMap":83},[87,10684,10685],{"class":89,"line":90},[87,10686,3426],{},[87,10688,10689],{"class":89,"line":96},[87,10690,3431],{},[87,10692,10693],{"class":89,"line":103},[87,10694,3436],{},[87,10696,10697],{"class":89,"line":109},[87,10698,100],{"emptyLinePlaceholder":99},[87,10700,10701],{"class":89,"line":115},[87,10702,3445],{},[87,10704,10705],{"class":89,"line":121},[87,10706,3450],{},[10,10708,150],{},[78,10710,10712],{"className":10711,"code":3456,"language":156,"meta":83},[154],[33,10713,3456],{"__ignoreMap":83},[10,10715,161],{},[14,10717,164],{"id":164},[166,10719,10720,10724],{},[48,10721,10722,3470],{},[33,10723,3469],{},[48,10725,10726,3476],{},[33,10727,3475],{},[14,10729,185],{"id":185},[45,10731,10732,10736],{},[48,10733,190,10734,3486],{},[33,10735,3485],{},[48,10737,3489],{},[14,10739,209],{"id":209},[166,10741,10742,10744],{},[48,10743,3496],{},[48,10745,2192,10746,2195,10748,3503],{},[33,10747,3485],{},[33,10749,3475],{},[10,10751,224],{},[14,10753,227],{"id":227},[10,10755,3510],{},[232,10757,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10759},[10760,10761,10762,10763,10764,10765,10766,10767],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3378,"description":3383},[245,3530,3374],{"id":3533,"title":3534,"body":10772,"category":245,"cover":246,"description":3539,"extension":247,"meta":10897,"navigation":99,"path":3695,"pinned":250,"publishedAt":251,"seo":10898,"slug":3697,"stem":3698,"summary":3699,"tags":10899,"updatedAt":251,"visible":99,"__hash__":3702},{"type":7,"value":10773,"toc":10887},[10774,10776,10778,10780,10782,10786,10792,10794,10804,10806,10808,10836,10838,10843,10845,10847,10857,10859,10871,10873,10879,10881,10883,10885],[10,10775,3539],{},[14,10777,16],{"id":16},[10,10779,3544],{},[14,10781,22],{"id":22},[10,10783,10784],{},[26,10785],{"alt":3551,"src":3552},[10,10787,3555,10788,3559,10790,3562],{},[33,10789,3558],{},[33,10791,2265],{},[14,10793,43],{"id":43},[45,10795,10796,10798,10802],{},[48,10797,3569],{},[48,10799,176,10800,3575],{},[33,10801,3574],{},[48,10803,3578],{},[14,10805,73],{"id":73},[10,10807,76],{},[78,10809,10810],{"className":80,"code":3585,"language":82,"meta":83,"style":83},[33,10811,10812,10816,10820,10824,10828,10832],{"__ignoreMap":83},[87,10813,10814],{"class":89,"line":90},[87,10815,3592],{},[87,10817,10818],{"class":89,"line":96},[87,10819,3597],{},[87,10821,10822],{"class":89,"line":103},[87,10823,100],{"emptyLinePlaceholder":99},[87,10825,10826],{"class":89,"line":109},[87,10827,3606],{},[87,10829,10830],{"class":89,"line":115},[87,10831,3611],{},[87,10833,10834],{"class":89,"line":121},[87,10835,3616],{},[10,10837,150],{},[78,10839,10841],{"className":10840,"code":3622,"language":156,"meta":83},[154],[33,10842,3622],{"__ignoreMap":83},[10,10844,161],{},[14,10846,164],{"id":164},[166,10848,10849,10851],{},[48,10850,3633],{},[48,10852,3636,10853,3639,10855,3643],{},[33,10854,2265],{},[33,10856,3642],{},[14,10858,185],{"id":185},[45,10860,10861,10865],{},[48,10862,3650,10863,3654],{},[33,10864,3653],{},[48,10866,3657,10867,3661,10869,382],{},[33,10868,3660],{},[33,10870,3664],{},[14,10872,209],{"id":209},[166,10874,10875,10877],{},[48,10876,3671],{},[48,10878,3674],{},[10,10880,224],{},[14,10882,227],{"id":227},[10,10884,3681],{},[232,10886,234],{},{"title":83,"searchDepth":96,"depth":96,"links":10888},[10889,10890,10891,10892,10893,10894,10895,10896],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3534,"description":3539},[245,3701,3374],{"id":3704,"title":3705,"body":10901,"category":245,"cover":246,"description":3710,"extension":247,"meta":11024,"navigation":99,"path":3860,"pinned":250,"publishedAt":251,"seo":11025,"slug":3862,"stem":3863,"summary":3864,"tags":11026,"updatedAt":251,"visible":99,"__hash__":3867},{"type":7,"value":10902,"toc":11014},[10903,10905,10907,10909,10911,10915,10917,10919,10931,10933,10935,10963,10965,10970,10972,10974,10984,10986,10996,10998,11006,11008,11010,11012],[10,10904,3710],{},[14,10906,16],{"id":16},[10,10908,3715],{},[14,10910,22],{"id":22},[10,10912,10913],{},[26,10914],{"alt":3722,"src":3723},[10,10916,3726],{},[14,10918,43],{"id":43},[45,10920,10921,10923,10925],{},[48,10922,3733],{},[48,10924,3736],{},[48,10926,3739,10927,3743,10929,3747],{},[33,10928,3742],{},[33,10930,3746],{},[14,10932,73],{"id":73},[10,10934,76],{},[78,10936,10937],{"className":80,"code":3754,"language":82,"meta":83,"style":83},[33,10938,10939,10943,10947,10951,10955,10959],{"__ignoreMap":83},[87,10940,10941],{"class":89,"line":90},[87,10942,3761],{},[87,10944,10945],{"class":89,"line":96},[87,10946,3766],{},[87,10948,10949],{"class":89,"line":103},[87,10950,100],{"emptyLinePlaceholder":99},[87,10952,10953],{"class":89,"line":109},[87,10954,3775],{},[87,10956,10957],{"class":89,"line":115},[87,10958,3780],{},[87,10960,10961],{"class":89,"line":121},[87,10962,3785],{},[10,10964,150],{},[78,10966,10968],{"className":10967,"code":3791,"language":156,"meta":83},[154],[33,10969,3791],{"__ignoreMap":83},[10,10971,161],{},[14,10973,164],{"id":164},[166,10975,10976,10978],{},[48,10977,3802],{},[48,10979,10980,3808,10982,3812],{},[33,10981,3807],{},[33,10983,3811],{},[14,10985,185],{"id":185},[45,10987,10988,10994],{},[48,10989,176,10990,3821,10992,382],{},[33,10991,3746],{},[33,10993,3742],{},[48,10995,3826],{},[14,10997,209],{"id":209},[166,10999,11000,11004],{},[48,11001,3833,11002,3836],{},[33,11003,3742],{},[48,11005,3839],{},[10,11007,224],{},[14,11009,227],{"id":227},[10,11011,3846],{},[232,11013,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11015},[11016,11017,11018,11019,11020,11021,11022,11023],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3705,"description":3710},[245,3866,3374],{"id":3869,"title":3870,"body":11028,"category":245,"cover":246,"description":3875,"extension":247,"meta":11187,"navigation":99,"path":4073,"pinned":250,"publishedAt":251,"seo":11188,"slug":4075,"stem":4076,"summary":4077,"tags":11189,"updatedAt":251,"visible":99,"__hash__":4081},{"type":7,"value":11029,"toc":11175},[11030,11032,11034,11036,11038,11042,11048,11050,11062,11064,11066,11106,11108,11113,11115,11117,11131,11133,11135,11139,11141,11143,11153,11155,11167,11169,11171,11173],[10,11031,3875],{},[14,11033,16],{"id":16},[10,11035,3880],{},[14,11037,22],{"id":22},[10,11039,11040],{},[26,11041],{"alt":3887,"src":3888},[10,11043,11044,3894,11046,3898],{},[33,11045,3893],{},[33,11047,3897],{},[14,11049,43],{"id":43},[45,11051,11052,11058,11060],{},[48,11053,11054,3907,11056,3911],{},[33,11055,2823],{},[33,11057,3910],{},[48,11059,3914],{},[48,11061,3917],{},[14,11063,73],{"id":73},[10,11065,76],{},[78,11067,11068],{"className":80,"code":3924,"language":82,"meta":83,"style":83},[33,11069,11070,11074,11078,11082,11086,11090,11094,11098,11102],{"__ignoreMap":83},[87,11071,11072],{"class":89,"line":90},[87,11073,3931],{},[87,11075,11076],{"class":89,"line":96},[87,11077,3936],{},[87,11079,11080],{"class":89,"line":103},[87,11081,3941],{},[87,11083,11084],{"class":89,"line":109},[87,11085,100],{"emptyLinePlaceholder":99},[87,11087,11088],{"class":89,"line":115},[87,11089,3950],{},[87,11091,11092],{"class":89,"line":121},[87,11093,3955],{},[87,11095,11096],{"class":89,"line":126},[87,11097,3960],{},[87,11099,11100],{"class":89,"line":132},[87,11101,3965],{},[87,11103,11104],{"class":89,"line":138},[87,11105,3970],{},[10,11107,150],{},[78,11109,11111],{"className":11110,"code":3976,"language":156,"meta":83},[154],[33,11112,3976],{"__ignoreMap":83},[10,11114,161],{},[14,11116,164],{"id":164},[166,11118,11119,11123],{},[48,11120,11121,3990],{},[33,11122,3989],{},[48,11124,11125,3996,11127,4000,11129,4004],{},[33,11126,3995],{},[33,11128,3999],{},[33,11130,4003],{},[348,11132,2713],{"id":2713},[10,11134,4009],{},[10,11136,11137],{},[26,11138],{"alt":4014,"src":4015},[10,11140,4018],{},[14,11142,185],{"id":185},[45,11144,11145,11151],{},[48,11146,4025,11147,4028,11149,382],{},[33,11148,2823],{},[33,11150,3910],{},[48,11152,4033],{},[14,11154,209],{"id":209},[166,11156,11157,11159],{},[48,11158,4040],{},[48,11160,176,11161,4046,11163,1176,11165,382],{},[33,11162,4045],{},[33,11164,3910],{},[33,11166,2823],{},[10,11168,224],{},[14,11170,227],{"id":227},[10,11172,4057],{},[232,11174,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11176},[11177,11178,11179,11180,11181,11184,11185,11186],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":11182},[11183],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":3870,"description":3875},[245,4079,4080],{"id":4083,"title":4084,"body":11191,"category":245,"cover":246,"description":4089,"extension":247,"meta":11363,"navigation":99,"path":4302,"pinned":250,"publishedAt":251,"seo":11364,"slug":4304,"stem":4305,"summary":4306,"tags":11365,"updatedAt":251,"visible":99,"__hash__":4309},{"type":7,"value":11192,"toc":11350},[11193,11195,11197,11199,11201,11205,11213,11215,11223,11225,11227,11271,11273,11278,11280,11282,11294,11296,11298,11302,11308,11310,11312,11316,11320,11322,11334,11336,11342,11344,11346,11348],[10,11194,4089],{},[14,11196,16],{"id":16},[10,11198,4094],{},[14,11200,22],{"id":22},[10,11202,11203],{},[26,11204],{"alt":4101,"src":4102},[10,11206,11207,56,11209,56,11211,4112],{},[33,11208,1175],{},[33,11210,4109],{},[33,11212,1179],{},[14,11214,43],{"id":43},[45,11216,11217,11219,11221],{},[48,11218,4119],{},[48,11220,4122],{},[48,11222,4125],{},[14,11224,73],{"id":73},[10,11226,76],{},[78,11228,11229],{"className":80,"code":4132,"language":82,"meta":83,"style":83},[33,11230,11231,11235,11239,11243,11247,11251,11255,11259,11263,11267],{"__ignoreMap":83},[87,11232,11233],{"class":89,"line":90},[87,11234,4139],{},[87,11236,11237],{"class":89,"line":96},[87,11238,100],{"emptyLinePlaceholder":99},[87,11240,11241],{"class":89,"line":103},[87,11242,4148],{},[87,11244,11245],{"class":89,"line":109},[87,11246,4153],{},[87,11248,11249],{"class":89,"line":115},[87,11250,4158],{},[87,11252,11253],{"class":89,"line":121},[87,11254,4163],{},[87,11256,11257],{"class":89,"line":126},[87,11258,1165],{},[87,11260,11261],{"class":89,"line":132},[87,11262,4172],{},[87,11264,11265],{"class":89,"line":138},[87,11266,100],{"emptyLinePlaceholder":99},[87,11268,11269],{"class":89,"line":144},[87,11270,4181],{},[10,11272,150],{},[78,11274,11276],{"className":11275,"code":4187,"language":156,"meta":83},[154],[33,11277,4187],{"__ignoreMap":83},[10,11279,161],{},[14,11281,164],{"id":164},[166,11283,11284,11288],{},[48,11285,4198,11286,4202],{},[33,11287,4201],{},[48,11289,11290,4208,11292,4211],{},[33,11291,4207],{},[33,11293,1179],{},[348,11295,2713],{"id":2713},[10,11297,4216],{},[10,11299,11300],{},[26,11301],{"alt":4221,"src":4222},[10,11303,11304,4227,11306,4230],{},[33,11305,4201],{},[33,11307,4207],{},[348,11309,2713],{"id":4233},[10,11311,4236],{},[10,11313,11314],{},[26,11315],{"alt":4241,"src":4242},[10,11317,4245,11318,4248],{},[33,11319,1175],{},[14,11321,185],{"id":185},[45,11323,11324,11328],{},[48,11325,4255,11326,4258],{},[33,11327,4207],{},[48,11329,4261,11330,4264,11332,4268],{},[33,11331,1175],{},[33,11333,4267],{},[14,11335,209],{"id":209},[166,11337,11338,11340],{},[48,11339,4275],{},[48,11341,4278],{},[10,11343,224],{},[14,11345,227],{"id":227},[10,11347,4285],{},[232,11349,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11351},[11352,11353,11354,11355,11356,11360,11361,11362],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":11357},[11358,11359],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":4084,"description":4089},[245,1175,4308],{"id":4311,"title":4312,"body":11367,"category":245,"cover":246,"description":4317,"extension":247,"meta":11504,"navigation":99,"path":4484,"pinned":250,"publishedAt":251,"seo":11505,"slug":4486,"stem":4487,"summary":4488,"tags":11506,"updatedAt":251,"visible":99,"__hash__":4491},{"type":7,"value":11368,"toc":11492},[11369,11371,11373,11375,11377,11381,11385,11387,11397,11399,11401,11433,11435,11440,11442,11444,11454,11456,11458,11462,11466,11468,11474,11476,11484,11486,11488,11490],[10,11370,4317],{},[14,11372,16],{"id":16},[10,11374,4322],{},[14,11376,22],{"id":22},[10,11378,11379],{},[26,11380],{"alt":4329,"src":4330},[10,11382,11383,4336],{},[33,11384,4335],{},[14,11386,43],{"id":43},[45,11388,11389,11391,11393],{},[48,11390,4343],{},[48,11392,4346],{},[48,11394,4349,11395,4353],{},[33,11396,4352],{},[14,11398,73],{"id":73},[10,11400,76],{},[78,11402,11403],{"className":80,"code":4360,"language":82,"meta":83,"style":83},[33,11404,11405,11409,11413,11417,11421,11425,11429],{"__ignoreMap":83},[87,11406,11407],{"class":89,"line":90},[87,11408,4367],{},[87,11410,11411],{"class":89,"line":96},[87,11412,100],{"emptyLinePlaceholder":99},[87,11414,11415],{"class":89,"line":103},[87,11416,4376],{},[87,11418,11419],{"class":89,"line":109},[87,11420,4381],{},[87,11422,11423],{"class":89,"line":115},[87,11424,4386],{},[87,11426,11427],{"class":89,"line":121},[87,11428,100],{"emptyLinePlaceholder":99},[87,11430,11431],{"class":89,"line":126},[87,11432,4395],{},[10,11434,150],{},[78,11436,11438],{"className":11437,"code":4401,"language":156,"meta":83},[154],[33,11439,4401],{"__ignoreMap":83},[10,11441,161],{},[14,11443,164],{"id":164},[166,11445,11446,11450],{},[48,11447,4412,11448,4416],{},[33,11449,4415],{},[48,11451,4419,11452,4422],{},[33,11453,4415],{},[348,11455,2713],{"id":2713},[10,11457,4427],{},[10,11459,11460],{},[26,11461],{"alt":4432,"src":4433},[10,11463,4436,11464,4439],{},[33,11465,4415],{},[14,11467,185],{"id":185},[45,11469,11470,11472],{},[48,11471,4446],{},[48,11473,4449],{},[14,11475,209],{"id":209},[166,11477,11478,11482],{},[48,11479,176,11480,4458],{},[33,11481,4335],{},[48,11483,4461],{},[10,11485,224],{},[14,11487,227],{"id":227},[10,11489,4468],{},[232,11491,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11493},[11494,11495,11496,11497,11498,11501,11502,11503],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":11499},[11500],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":4312,"description":4317},[245,4335,4490],{"id":4493,"title":4494,"body":11508,"category":245,"cover":246,"description":4499,"extension":247,"meta":11633,"navigation":99,"path":4648,"pinned":250,"publishedAt":251,"seo":11634,"slug":4650,"stem":4651,"summary":4652,"tags":11635,"updatedAt":251,"visible":99,"__hash__":4655},{"type":7,"value":11509,"toc":11623},[11510,11512,11514,11516,11518,11522,11526,11528,11538,11540,11542,11574,11576,11581,11583,11585,11597,11599,11605,11607,11615,11617,11619,11621],[10,11511,4499],{},[14,11513,16],{"id":16},[10,11515,4504],{},[14,11517,22],{"id":22},[10,11519,11520],{},[26,11521],{"alt":4511,"src":4512},[10,11523,11524,4517],{},[33,11525,4352],{},[14,11527,43],{"id":43},[45,11529,11530,11534,11536],{},[48,11531,11532,4527],{},[33,11533,4526],{},[48,11535,4530],{},[48,11537,4533],{},[14,11539,73],{"id":73},[10,11541,76],{},[78,11543,11544],{"className":80,"code":4540,"language":82,"meta":83,"style":83},[33,11545,11546,11550,11554,11558,11562,11566,11570],{"__ignoreMap":83},[87,11547,11548],{"class":89,"line":90},[87,11549,4547],{},[87,11551,11552],{"class":89,"line":96},[87,11553,100],{"emptyLinePlaceholder":99},[87,11555,11556],{"class":89,"line":103},[87,11557,4556],{},[87,11559,11560],{"class":89,"line":109},[87,11561,4561],{},[87,11563,11564],{"class":89,"line":115},[87,11565,100],{"emptyLinePlaceholder":99},[87,11567,11568],{"class":89,"line":121},[87,11569,4570],{},[87,11571,11572],{"class":89,"line":126},[87,11573,4575],{},[10,11575,150],{},[78,11577,11579],{"className":11578,"code":4581,"language":156,"meta":83},[154],[33,11580,4581],{"__ignoreMap":83},[10,11582,161],{},[14,11584,164],{"id":164},[166,11586,11587,11593],{},[48,11588,4592,11589,4595,11591,4599],{},[33,11590,4352],{},[33,11592,4598],{},[48,11594,11595,4604],{},[33,11596,4526],{},[14,11598,185],{"id":185},[45,11600,11601,11603],{},[48,11602,4611],{},[48,11604,4614],{},[14,11606,209],{"id":209},[166,11608,11609,11611],{},[48,11610,4621],{},[48,11612,176,11613,4627],{},[33,11614,4626],{},[10,11616,224],{},[14,11618,227],{"id":227},[10,11620,4634],{},[232,11622,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11624},[11625,11626,11627,11628,11629,11630,11631,11632],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":4494,"description":4499},[245,4352,4654],{"id":4657,"title":4658,"body":11637,"category":245,"cover":246,"description":4663,"extension":247,"meta":11782,"navigation":99,"path":4838,"pinned":250,"publishedAt":251,"seo":11783,"slug":4840,"stem":4841,"summary":4842,"tags":11784,"updatedAt":251,"visible":99,"__hash__":4844},{"type":7,"value":11638,"toc":11772},[11639,11641,11643,11645,11647,11651,11657,11659,11673,11675,11677,11721,11723,11728,11730,11732,11742,11744,11756,11758,11764,11766,11768,11770],[10,11640,4663],{},[14,11642,16],{"id":16},[10,11644,4668],{},[14,11646,22],{"id":22},[10,11648,11649],{},[26,11650],{"alt":4675,"src":4676},[10,11652,11653,4682,11655,4686],{},[33,11654,4681],{},[33,11656,4685],{},[14,11658,43],{"id":43},[45,11660,11661,11663,11669],{},[48,11662,4693],{},[48,11664,11665,4698,11667,4701],{},[33,11666,4681],{},[33,11668,4335],{},[48,11670,4704,11671,4707],{},[33,11672,4685],{},[14,11674,73],{"id":73},[10,11676,76],{},[78,11678,11679],{"className":80,"code":4714,"language":82,"meta":83,"style":83},[33,11680,11681,11685,11689,11693,11697,11701,11705,11709,11713,11717],{"__ignoreMap":83},[87,11682,11683],{"class":89,"line":90},[87,11684,4721],{},[87,11686,11687],{"class":89,"line":96},[87,11688,100],{"emptyLinePlaceholder":99},[87,11690,11691],{"class":89,"line":103},[87,11692,4730],{},[87,11694,11695],{"class":89,"line":109},[87,11696,4735],{},[87,11698,11699],{"class":89,"line":115},[87,11700,4740],{},[87,11702,11703],{"class":89,"line":121},[87,11704,4745],{},[87,11706,11707],{"class":89,"line":126},[87,11708,4750],{},[87,11710,11711],{"class":89,"line":132},[87,11712,4575],{},[87,11714,11715],{"class":89,"line":138},[87,11716,100],{"emptyLinePlaceholder":99},[87,11718,11719],{"class":89,"line":144},[87,11720,4763],{},[10,11722,150],{},[78,11724,11726],{"className":11725,"code":4769,"language":156,"meta":83},[154],[33,11727,4769],{"__ignoreMap":83},[10,11729,161],{},[14,11731,164],{"id":164},[166,11733,11734,11738],{},[48,11735,4780,11736,4783],{},[33,11737,4681],{},[48,11739,4786,11740,4789],{},[33,11741,4685],{},[14,11743,185],{"id":185},[45,11745,11746,11750],{},[48,11747,190,11748,4798],{},[33,11749,4681],{},[48,11751,4801,11752,4804,11754,4807],{},[33,11753,4335],{},[33,11755,4681],{},[14,11757,209],{"id":209},[166,11759,11760,11762],{},[48,11761,4814],{},[48,11763,4817],{},[10,11765,224],{},[14,11767,227],{"id":227},[10,11769,4824],{},[232,11771,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11773},[11774,11775,11776,11777,11778,11779,11780,11781],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":4658,"description":4663},[245,4685,4681],{"id":4846,"title":4847,"body":11786,"category":245,"cover":246,"description":4852,"extension":247,"meta":11925,"navigation":99,"path":5024,"pinned":250,"publishedAt":251,"seo":11926,"slug":5026,"stem":5027,"summary":5028,"tags":11927,"updatedAt":251,"visible":99,"__hash__":5032},{"type":7,"value":11787,"toc":11913},[11788,11790,11792,11794,11796,11800,11802,11804,11820,11822,11824,11852,11854,11859,11861,11863,11875,11877,11879,11883,11885,11887,11897,11899,11905,11907,11909,11911],[10,11789,4852],{},[14,11791,16],{"id":16},[10,11793,4857],{},[14,11795,22],{"id":22},[10,11797,11798],{},[26,11799],{"alt":4864,"src":4865},[10,11801,4868],{},[14,11803,43],{"id":43},[45,11805,11806,11808,11810],{},[48,11807,4875],{},[48,11809,4878],{},[48,11811,4881,11812,56,11814,4888,11816,56,11818,382],{},[33,11813,4884],{},[33,11815,4887],{},[33,11817,4891],{},[33,11819,4894],{},[14,11821,73],{"id":73},[10,11823,76],{},[78,11825,11826],{"className":80,"code":4901,"language":82,"meta":83,"style":83},[33,11827,11828,11832,11836,11840,11844,11848],{"__ignoreMap":83},[87,11829,11830],{"class":89,"line":90},[87,11831,4908],{},[87,11833,11834],{"class":89,"line":96},[87,11835,100],{"emptyLinePlaceholder":99},[87,11837,11838],{"class":89,"line":103},[87,11839,4917],{},[87,11841,11842],{"class":89,"line":109},[87,11843,4922],{},[87,11845,11846],{"class":89,"line":115},[87,11847,4927],{},[87,11849,11850],{"class":89,"line":121},[87,11851,4932],{},[10,11853,150],{},[78,11855,11857],{"className":11856,"code":4938,"language":156,"meta":83},[154],[33,11858,4938],{"__ignoreMap":83},[10,11860,161],{},[14,11862,164],{"id":164},[166,11864,11865,11873],{},[48,11866,4949,11867,4952,11869,1176,11871,382],{},[33,11868,4884],{},[33,11870,4955],{},[33,11872,4958],{},[48,11874,4961],{},[348,11876,2713],{"id":2713},[10,11878,4966],{},[10,11880,11881],{},[26,11882],{"alt":4971,"src":4972},[10,11884,4975],{},[14,11886,185],{"id":185},[45,11888,11889,11895],{},[48,11890,4982,11891,202,11893,4988],{},[33,11892,4985],{},[33,11894,4891],{},[48,11896,4991],{},[14,11898,209],{"id":209},[166,11900,11901,11903],{},[48,11902,4998],{},[48,11904,5001],{},[10,11906,224],{},[14,11908,227],{"id":227},[10,11910,5008],{},[232,11912,234],{},{"title":83,"searchDepth":96,"depth":96,"links":11914},[11915,11916,11917,11918,11919,11922,11923,11924],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":11920},[11921],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":4847,"description":4852},[245,5030,5031],{"id":5034,"title":5035,"body":11929,"category":245,"cover":246,"description":5040,"extension":247,"meta":12046,"navigation":99,"path":5179,"pinned":250,"publishedAt":251,"seo":12047,"slug":5181,"stem":5182,"summary":5183,"tags":12048,"updatedAt":251,"visible":99,"__hash__":5187},{"type":7,"value":11930,"toc":12036},[11931,11933,11935,11937,11939,11943,11945,11947,11955,11957,11959,11991,11993,11998,12000,12002,12010,12012,12020,12022,12028,12030,12032,12034],[10,11932,5040],{},[14,11934,16],{"id":16},[10,11936,5045],{},[14,11938,22],{"id":22},[10,11940,11941],{},[26,11942],{"alt":5052,"src":5053},[10,11944,5056],{},[14,11946,43],{"id":43},[45,11948,11949,11951,11953],{},[48,11950,5063],{},[48,11952,5066],{},[48,11954,5069],{},[14,11956,73],{"id":73},[10,11958,76],{},[78,11960,11961],{"className":80,"code":5076,"language":82,"meta":83,"style":83},[33,11962,11963,11967,11971,11975,11979,11983,11987],{"__ignoreMap":83},[87,11964,11965],{"class":89,"line":90},[87,11966,5083],{},[87,11968,11969],{"class":89,"line":96},[87,11970,100],{"emptyLinePlaceholder":99},[87,11972,11973],{"class":89,"line":103},[87,11974,5092],{},[87,11976,11977],{"class":89,"line":109},[87,11978,5097],{},[87,11980,11981],{"class":89,"line":115},[87,11982,100],{"emptyLinePlaceholder":99},[87,11984,11985],{"class":89,"line":121},[87,11986,5106],{},[87,11988,11989],{"class":89,"line":126},[87,11990,5111],{},[10,11992,150],{},[78,11994,11996],{"className":11995,"code":5117,"language":156,"meta":83},[154],[33,11997,5117],{"__ignoreMap":83},[10,11999,161],{},[14,12001,164],{"id":164},[166,12003,12004,12006],{},[48,12005,5128],{},[48,12007,5131,12008,5135],{},[33,12009,5134],{},[14,12011,185],{"id":185},[45,12013,12014,12018],{},[48,12015,5142,12016,5145],{},[33,12017,4352],{},[48,12019,5148],{},[14,12021,209],{"id":209},[166,12023,12024,12026],{},[48,12025,5155],{},[48,12027,5158],{},[10,12029,224],{},[14,12031,227],{"id":227},[10,12033,5165],{},[232,12035,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12037},[12038,12039,12040,12041,12042,12043,12044,12045],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5035,"description":5040},[245,5185,5186],{"id":5189,"title":5190,"body":12050,"category":245,"cover":246,"description":5195,"extension":247,"meta":12169,"navigation":99,"path":5339,"pinned":250,"publishedAt":251,"seo":12170,"slug":5341,"stem":5342,"summary":5343,"tags":12171,"updatedAt":251,"visible":99,"__hash__":5347},{"type":7,"value":12051,"toc":12159},[12052,12054,12056,12058,12060,12064,12066,12068,12076,12078,12080,12112,12114,12119,12121,12123,12133,12135,12141,12143,12151,12153,12155,12157],[10,12053,5195],{},[14,12055,16],{"id":16},[10,12057,5200],{},[14,12059,22],{"id":22},[10,12061,12062],{},[26,12063],{"alt":5207,"src":5208},[10,12065,5211],{},[14,12067,43],{"id":43},[45,12069,12070,12072,12074],{},[48,12071,5218],{},[48,12073,5221],{},[48,12075,5224],{},[14,12077,73],{"id":73},[10,12079,76],{},[78,12081,12082],{"className":80,"code":5231,"language":82,"meta":83,"style":83},[33,12083,12084,12088,12092,12096,12100,12104,12108],{"__ignoreMap":83},[87,12085,12086],{"class":89,"line":90},[87,12087,5238],{},[87,12089,12090],{"class":89,"line":96},[87,12091,5243],{},[87,12093,12094],{"class":89,"line":103},[87,12095,5248],{},[87,12097,12098],{"class":89,"line":109},[87,12099,100],{"emptyLinePlaceholder":99},[87,12101,12102],{"class":89,"line":115},[87,12103,5257],{},[87,12105,12106],{"class":89,"line":121},[87,12107,5262],{},[87,12109,12110],{"class":89,"line":126},[87,12111,5267],{},[10,12113,150],{},[78,12115,12117],{"className":12116,"code":5273,"language":156,"meta":83},[154],[33,12118,5273],{"__ignoreMap":83},[10,12120,161],{},[14,12122,164],{"id":164},[166,12124,12125,12129],{},[48,12126,958,12127,5287],{},[33,12128,5286],{},[48,12130,5290,12131,5294],{},[33,12132,5293],{},[14,12134,185],{"id":185},[45,12136,12137,12139],{},[48,12138,5301],{},[48,12140,5304],{},[14,12142,209],{"id":209},[166,12144,12145,12149],{},[48,12146,5311,12147,5315],{},[33,12148,5314],{},[48,12150,5318],{},[10,12152,224],{},[14,12154,227],{"id":227},[10,12156,5325],{},[232,12158,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12160},[12161,12162,12163,12164,12165,12166,12167,12168],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5190,"description":5195},[245,5345,5346],{"id":5349,"title":5350,"body":12173,"category":245,"cover":246,"description":5355,"extension":247,"meta":12318,"navigation":99,"path":5536,"pinned":250,"publishedAt":251,"seo":12319,"slug":5538,"stem":5539,"summary":5540,"tags":12320,"updatedAt":251,"visible":99,"__hash__":5544},{"type":7,"value":12174,"toc":12306},[12175,12177,12179,12181,12183,12187,12191,12193,12205,12207,12209,12237,12239,12244,12246,12248,12262,12264,12266,12270,12278,12280,12290,12292,12298,12300,12302,12304],[10,12176,5355],{},[14,12178,16],{"id":16},[10,12180,5360],{},[14,12182,22],{"id":22},[10,12184,12185],{},[26,12186],{"alt":5367,"src":5368},[10,12188,5371,12189,5375],{},[33,12190,5374],{},[14,12192,43],{"id":43},[45,12194,12195,12197,12199],{},[48,12196,5382],{},[48,12198,5385],{},[48,12200,5388,12201,5391,12203,382],{},[33,12202,5374],{},[33,12204,5394],{},[14,12206,73],{"id":73},[10,12208,76],{},[78,12210,12211],{"className":80,"code":5401,"language":82,"meta":83,"style":83},[33,12212,12213,12217,12221,12225,12229,12233],{"__ignoreMap":83},[87,12214,12215],{"class":89,"line":90},[87,12216,5408],{},[87,12218,12219],{"class":89,"line":96},[87,12220,5413],{},[87,12222,12223],{"class":89,"line":103},[87,12224,5418],{},[87,12226,12227],{"class":89,"line":109},[87,12228,100],{"emptyLinePlaceholder":99},[87,12230,12231],{"class":89,"line":115},[87,12232,5427],{},[87,12234,12235],{"class":89,"line":121},[87,12236,5432],{},[10,12238,150],{},[78,12240,12242],{"className":12241,"code":5438,"language":156,"meta":83},[154],[33,12243,5438],{"__ignoreMap":83},[10,12245,161],{},[14,12247,164],{"id":164},[166,12249,12250,12256],{},[48,12251,5449,12252,56,12254,5455],{},[33,12253,5452],{},[33,12255,4415],{},[48,12257,12258,5461,12260,5465],{},[33,12259,5460],{},[33,12261,5464],{},[348,12263,2713],{"id":2713},[10,12265,5470],{},[10,12267,12268],{},[26,12269],{"alt":5475,"src":5476},[10,12271,12272,56,12274,1176,12276,5486],{},[33,12273,5452],{},[33,12275,4415],{},[33,12277,5485],{},[14,12279,185],{"id":185},[45,12281,12282,12286],{},[48,12283,5493,12284,5497],{},[33,12285,5496],{},[48,12287,5500,12288,5503],{},[33,12289,5485],{},[14,12291,209],{"id":209},[166,12293,12294,12296],{},[48,12295,5510],{},[48,12297,5513],{},[10,12299,224],{},[14,12301,227],{"id":227},[10,12303,5520],{},[232,12305,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12307},[12308,12309,12310,12311,12312,12315,12316,12317],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":12313},[12314],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5350,"description":5355},[245,5542,5543],{"id":5546,"title":5547,"body":12322,"category":245,"cover":246,"description":5552,"extension":247,"meta":12471,"navigation":99,"path":5733,"pinned":250,"publishedAt":251,"seo":12472,"slug":5735,"stem":5736,"summary":5737,"tags":12473,"updatedAt":251,"visible":99,"__hash__":5741},{"type":7,"value":12323,"toc":12459},[12324,12326,12328,12330,12332,12336,12338,12340,12352,12354,12356,12400,12402,12407,12409,12411,12423,12425,12427,12431,12433,12435,12443,12445,12451,12453,12455,12457],[10,12325,5552],{},[14,12327,16],{"id":16},[10,12329,5557],{},[14,12331,22],{"id":22},[10,12333,12334],{},[26,12335],{"alt":5564,"src":5565},[10,12337,5568],{},[14,12339,43],{"id":43},[45,12341,12342,12344,12348],{},[48,12343,5575],{},[48,12345,12346,5581],{},[33,12347,5580],{},[48,12349,12350,5587],{},[33,12351,5586],{},[14,12353,73],{"id":73},[10,12355,76],{},[78,12357,12358],{"className":80,"code":5594,"language":82,"meta":83,"style":83},[33,12359,12360,12364,12368,12372,12376,12380,12384,12388,12392,12396],{"__ignoreMap":83},[87,12361,12362],{"class":89,"line":90},[87,12363,5601],{},[87,12365,12366],{"class":89,"line":96},[87,12367,5606],{},[87,12369,12370],{"class":89,"line":103},[87,12371,100],{"emptyLinePlaceholder":99},[87,12373,12374],{"class":89,"line":109},[87,12375,5615],{},[87,12377,12378],{"class":89,"line":115},[87,12379,5620],{},[87,12381,12382],{"class":89,"line":121},[87,12383,100],{"emptyLinePlaceholder":99},[87,12385,12386],{"class":89,"line":126},[87,12387,5629],{},[87,12389,12390],{"class":89,"line":132},[87,12391,5634],{},[87,12393,12394],{"class":89,"line":138},[87,12395,100],{"emptyLinePlaceholder":99},[87,12397,12398],{"class":89,"line":144},[87,12399,5643],{},[10,12401,150],{},[78,12403,12405],{"className":12404,"code":5649,"language":156,"meta":83},[154],[33,12406,5649],{"__ignoreMap":83},[10,12408,161],{},[14,12410,164],{"id":164},[166,12412,12413,12417],{},[48,12414,5660,12415,5664],{},[33,12416,5663],{},[48,12418,12419,5670,12421,382],{},[33,12420,5669],{},[33,12422,5673],{},[348,12424,2713],{"id":2713},[10,12426,5678],{},[10,12428,12429],{},[26,12430],{"alt":5683,"src":5684},[10,12432,5687],{},[14,12434,185],{"id":185},[45,12436,12437,12441],{},[48,12438,5694,12439,5697],{},[33,12440,5394],{},[48,12442,5700],{},[14,12444,209],{"id":209},[166,12446,12447,12449],{},[48,12448,5707],{},[48,12450,5710],{},[10,12452,224],{},[14,12454,227],{"id":227},[10,12456,5717],{},[232,12458,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12460},[12461,12462,12463,12464,12465,12468,12469,12470],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":12466},[12467],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5547,"description":5552},[245,5739,5740],{"id":5743,"title":5744,"body":12475,"category":245,"cover":246,"description":5749,"extension":247,"meta":12636,"navigation":99,"path":5947,"pinned":250,"publishedAt":251,"seo":12637,"slug":5949,"stem":5950,"summary":5951,"tags":12638,"updatedAt":251,"visible":99,"__hash__":5955},{"type":7,"value":12476,"toc":12624},[12477,12479,12481,12483,12485,12489,12491,12493,12505,12507,12509,12561,12563,12568,12570,12572,12590,12592,12594,12598,12600,12602,12608,12610,12616,12618,12620,12622],[10,12478,5749],{},[14,12480,16],{"id":16},[10,12482,5754],{},[14,12484,22],{"id":22},[10,12486,12487],{},[26,12488],{"alt":5761,"src":5762},[10,12490,5765],{},[14,12492,43],{"id":43},[45,12494,12495,12497,12499],{},[48,12496,5772],{},[48,12498,5775],{},[48,12500,12501,2195,12503,5784],{},[33,12502,5780],{},[33,12504,5783],{},[14,12506,73],{"id":73},[10,12508,76],{},[78,12510,12511],{"className":80,"code":5791,"language":82,"meta":83,"style":83},[33,12512,12513,12517,12521,12525,12529,12533,12537,12541,12545,12549,12553,12557],{"__ignoreMap":83},[87,12514,12515],{"class":89,"line":90},[87,12516,5798],{},[87,12518,12519],{"class":89,"line":96},[87,12520,100],{"emptyLinePlaceholder":99},[87,12522,12523],{"class":89,"line":103},[87,12524,5807],{},[87,12526,12527],{"class":89,"line":109},[87,12528,5812],{},[87,12530,12531],{"class":89,"line":115},[87,12532,100],{"emptyLinePlaceholder":99},[87,12534,12535],{"class":89,"line":121},[87,12536,5821],{},[87,12538,12539],{"class":89,"line":126},[87,12540,5826],{},[87,12542,12543],{"class":89,"line":132},[87,12544,5831],{},[87,12546,12547],{"class":89,"line":138},[87,12548,100],{"emptyLinePlaceholder":99},[87,12550,12551],{"class":89,"line":144},[87,12552,5840],{},[87,12554,12555],{"class":89,"line":5843},[87,12556,100],{"emptyLinePlaceholder":99},[87,12558,12559],{"class":89,"line":5848},[87,12560,5851],{},[10,12562,150],{},[78,12564,12566],{"className":12565,"code":5857,"language":156,"meta":83},[154],[33,12567,5857],{"__ignoreMap":83},[10,12569,161],{},[14,12571,164],{"id":164},[166,12573,12574,12584],{},[48,12575,12576,5871,12578,5875,12580,5878,12582,5882],{},[33,12577,5870],{},[33,12579,5874],{},[33,12581,5663],{},[33,12583,5881],{},[48,12585,12586,5887,12588,5890],{},[33,12587,4598],{},[33,12589,2227],{},[348,12591,2713],{"id":2713},[10,12593,5895],{},[10,12595,12596],{},[26,12597],{"alt":5900,"src":5901},[10,12599,5904],{},[14,12601,185],{"id":185},[45,12603,12604,12606],{},[48,12605,5911],{},[48,12607,5914],{},[14,12609,209],{"id":209},[166,12611,12612,12614],{},[48,12613,5921],{},[48,12615,5924],{},[10,12617,224],{},[14,12619,227],{"id":227},[10,12621,5931],{},[232,12623,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12625},[12626,12627,12628,12629,12630,12633,12634,12635],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":12631},[12632],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5744,"description":5749},[245,5953,5954],{"id":5957,"title":5958,"body":12640,"category":245,"cover":246,"description":5963,"extension":247,"meta":12763,"navigation":99,"path":6114,"pinned":250,"publishedAt":251,"seo":12764,"slug":6116,"stem":6117,"summary":6118,"tags":12765,"updatedAt":251,"visible":99,"__hash__":6122},{"type":7,"value":12641,"toc":12753},[12642,12644,12646,12648,12650,12654,12656,12658,12672,12674,12676,12704,12706,12711,12713,12715,12725,12727,12735,12737,12745,12747,12749,12751],[10,12643,5963],{},[14,12645,16],{"id":16},[10,12647,5968],{},[14,12649,22],{"id":22},[10,12651,12652],{},[26,12653],{"alt":5975,"src":5976},[10,12655,5979],{},[14,12657,43],{"id":43},[45,12659,12660,12662,12664],{},[48,12661,5986],{},[48,12663,5989],{},[48,12665,5992,12666,56,12668,56,12670,6000],{},[33,12667,2278],{},[33,12669,2443],{},[33,12671,5999],{},[14,12673,73],{"id":73},[10,12675,76],{},[78,12677,12678],{"className":80,"code":6007,"language":82,"meta":83,"style":83},[33,12679,12680,12684,12688,12692,12696,12700],{"__ignoreMap":83},[87,12681,12682],{"class":89,"line":90},[87,12683,6014],{},[87,12685,12686],{"class":89,"line":96},[87,12687,6019],{},[87,12689,12690],{"class":89,"line":103},[87,12691,6024],{},[87,12693,12694],{"class":89,"line":109},[87,12695,100],{"emptyLinePlaceholder":99},[87,12697,12698],{"class":89,"line":115},[87,12699,6033],{},[87,12701,12702],{"class":89,"line":121},[87,12703,6038],{},[10,12705,150],{},[78,12707,12709],{"className":12708,"code":6044,"language":156,"meta":83},[154],[33,12710,6044],{"__ignoreMap":83},[10,12712,161],{},[14,12714,164],{"id":164},[166,12716,12717,12723],{},[48,12718,6055,12719,6059,12721,6062],{},[33,12720,6058],{},[33,12722,2265],{},[48,12724,6065],{},[14,12726,185],{"id":185},[45,12728,12729,12733],{},[48,12730,6072,12731,6076],{},[33,12732,6075],{},[48,12734,6079],{},[14,12736,209],{"id":209},[166,12738,12739,12741],{},[48,12740,6086],{},[48,12742,6089,12743,6093],{},[33,12744,6092],{},[10,12746,224],{},[14,12748,227],{"id":227},[10,12750,6100],{},[232,12752,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12754},[12755,12756,12757,12758,12759,12760,12761,12762],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5958,"description":5963},[245,6120,6121],{"id":6124,"title":6125,"body":12767,"category":245,"cover":246,"description":6130,"extension":247,"meta":12944,"navigation":99,"path":6358,"pinned":250,"publishedAt":251,"seo":12945,"slug":6360,"stem":6361,"summary":6362,"tags":12946,"updatedAt":251,"visible":99,"__hash__":6366},{"type":7,"value":12768,"toc":12932},[12769,12771,12773,12777,12779,12783,12789,12791,12803,12805,12809,12833,12837,12853,12859,12861,12866,12868,12870,12886,12888,12890,12894,12898,12900,12912,12914,12924,12926,12928,12930],[10,12770,6130],{},[14,12772,16],{"id":16},[10,12774,6135,12775,6138],{},[314,12776,6058],{},[14,12778,22],{"id":22},[10,12780,12781],{},[26,12782],{"alt":6145,"src":6146},[10,12784,6149,12785,6153,12787,6157],{},[33,12786,6152],{},[33,12788,6156],{},[14,12790,43],{"id":43},[45,12792,12793,12797,12799],{},[48,12794,6164,12795,6167],{},[33,12796,1190],{},[48,12798,6170],{},[48,12800,6173,12801,6177],{},[33,12802,6176],{},[14,12804,73],{"id":73},[10,12806,6182,12807,6186],{},[33,12808,6185],{},[78,12810,12811],{"className":80,"code":6189,"language":82,"meta":83,"style":83},[33,12812,12813,12817,12821,12825,12829],{"__ignoreMap":83},[87,12814,12815],{"class":89,"line":90},[87,12816,6196],{},[87,12818,12819],{"class":89,"line":96},[87,12820,6201],{},[87,12822,12823],{"class":89,"line":103},[87,12824,100],{"emptyLinePlaceholder":99},[87,12826,12827],{"class":89,"line":109},[87,12828,6210],{},[87,12830,12831],{"class":89,"line":115},[87,12832,6215],{},[10,12834,6218,12835,6222],{},[33,12836,6221],{},[78,12838,12839],{"className":80,"code":6225,"language":82,"meta":83,"style":83},[33,12840,12841,12845,12849],{"__ignoreMap":83},[87,12842,12843],{"class":89,"line":90},[87,12844,6232],{},[87,12846,12847],{"class":89,"line":96},[87,12848,100],{"emptyLinePlaceholder":99},[87,12850,12851],{"class":89,"line":103},[87,12852,6241],{},[10,12854,6244,12855,1176,12857,382],{},[33,12856,6247],{},[33,12858,6250],{},[10,12860,150],{},[78,12862,12864],{"className":12863,"code":6256,"language":156,"meta":83},[154],[33,12865,6256],{"__ignoreMap":83},[10,12867,161],{},[14,12869,164],{"id":164},[166,12871,12872,12878],{},[48,12873,6267,12874,6270,12876,6274],{},[33,12875,6185],{},[33,12877,6273],{},[48,12879,12880,6279,12882,6282,12884,6285],{},[33,12881,6221],{},[33,12883,6185],{},[33,12885,6221],{},[348,12887,2713],{"id":2713},[10,12889,6290],{},[10,12891,12892],{},[26,12893],{"alt":6295,"src":6296},[10,12895,6299,12896,6302],{},[33,12897,6273],{},[14,12899,185],{"id":185},[45,12901,12902,12908],{},[48,12903,6309,12904,1176,12906,382],{},[33,12905,6185],{},[33,12907,6221],{},[48,12909,6316,12910,6320],{},[33,12911,6319],{},[14,12913,209],{"id":209},[166,12915,12916,12920],{},[48,12917,2371,12918,6330],{},[33,12919,6329],{},[48,12921,6333,12922,382],{},[33,12923,6152],{},[10,12925,224],{},[14,12927,227],{"id":227},[10,12929,6342],{},[232,12931,234],{},{"title":83,"searchDepth":96,"depth":96,"links":12933},[12934,12935,12936,12937,12938,12941,12942,12943],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":12939},[12940],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":6125,"description":6130},[245,6364,6365],{"id":6368,"title":6369,"body":12948,"category":245,"cover":246,"description":6374,"extension":247,"meta":13087,"navigation":99,"path":6540,"pinned":250,"publishedAt":251,"seo":13088,"slug":6542,"stem":6543,"summary":6544,"tags":13089,"updatedAt":251,"visible":99,"__hash__":6547},{"type":7,"value":12949,"toc":13077},[12950,12952,12954,12956,12958,12962,12964,12966,12976,12978,12980,13020,13022,13027,13029,13031,13049,13051,13059,13061,13069,13071,13073,13075],[10,12951,6374],{},[14,12953,16],{"id":16},[10,12955,6379],{},[14,12957,22],{"id":22},[10,12959,12960],{},[26,12961],{"alt":6386,"src":6387},[10,12963,6390],{},[14,12965,43],{"id":43},[45,12967,12968,12972,12974],{},[48,12969,12970,6400],{},[33,12971,6399],{},[48,12973,6403],{},[48,12975,6406],{},[14,12977,73],{"id":73},[10,12979,1593],{},[78,12981,12982],{"className":611,"code":6413,"language":613,"meta":83,"style":83},[33,12983,12984,12994,13000,13006,13016],{"__ignoreMap":83},[87,12985,12986,12988,12990,12992],{"class":89,"line":90},[87,12987,711],{"class":620},[87,12989,653],{"class":623},[87,12991,6424],{"class":656},[87,12993,6427],{"class":656},[87,12995,12996,12998],{"class":89,"line":96},[87,12997,6432],{"class":623},[87,12999,6435],{"class":656},[87,13001,13002,13004],{"class":89,"line":103},[87,13003,82],{"class":620},[87,13005,624],{"class":623},[87,13007,13008,13010,13012,13014],{"class":89,"line":109},[87,13009,82],{"class":620},[87,13011,653],{"class":623},[87,13013,657],{"class":656},[87,13015,624],{"class":623},[87,13017,13018],{"class":89,"line":115},[87,13019,6456],{"class":620},[10,13021,150],{},[78,13023,13025],{"className":13024,"code":6462,"language":156,"meta":83},[154],[33,13026,6462],{"__ignoreMap":83},[10,13028,161],{},[14,13030,164],{"id":164},[166,13032,13033,13039],{},[48,13034,13035,6476,13037,6479],{},[33,13036,6475],{},[33,13038,711],{},[48,13040,6482,13041,2195,13043,6488,13045,3743,13047,6494],{},[33,13042,82],{},[33,13044,6487],{},[33,13046,6399],{},[33,13048,6493],{},[14,13050,185],{"id":185},[45,13052,13053,13055],{},[48,13054,6501],{},[48,13056,190,13057,6506],{},[33,13058,6399],{},[14,13060,209],{"id":209},[166,13062,13063,13067],{},[48,13064,6513,13065,382],{},[33,13066,6516],{},[48,13068,6519],{},[10,13070,224],{},[14,13072,227],{"id":227},[10,13074,6526],{},[232,13076,1677],{},{"title":83,"searchDepth":96,"depth":96,"links":13078},[13079,13080,13081,13082,13083,13084,13085,13086],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":6369,"description":6374},[245,6546,280],{"id":4,"title":5,"body":13091,"category":245,"cover":246,"description":12,"extension":247,"meta":13244,"navigation":99,"path":249,"pinned":250,"publishedAt":251,"seo":13245,"slug":253,"stem":254,"summary":255,"tags":13246,"updatedAt":251,"visible":99,"__hash__":259},{"type":7,"value":13092,"toc":13234},[13093,13095,13097,13099,13101,13105,13111,13113,13129,13131,13133,13177,13179,13184,13186,13188,13200,13202,13216,13218,13226,13228,13230,13232],[10,13094,12],{},[14,13096,16],{"id":16},[10,13098,19],{},[14,13100,22],{"id":22},[10,13102,13103],{},[26,13104],{"alt":28,"src":29},[10,13106,13107,36,13109,40],{},[33,13108,35],{},[33,13110,39],{},[14,13112,43],{"id":43},[45,13114,13115,13117,13125],{},[48,13116,50],{},[48,13118,13119,56,13121,56,13123,63],{},[33,13120,55],{},[33,13122,59],{},[33,13124,62],{},[48,13126,66,13127,70],{},[33,13128,69],{},[14,13130,73],{"id":73},[10,13132,76],{},[78,13134,13135],{"className":80,"code":81,"language":82,"meta":83,"style":83},[33,13136,13137,13141,13145,13149,13153,13157,13161,13165,13169,13173],{"__ignoreMap":83},[87,13138,13139],{"class":89,"line":90},[87,13140,93],{},[87,13142,13143],{"class":89,"line":96},[87,13144,100],{"emptyLinePlaceholder":99},[87,13146,13147],{"class":89,"line":103},[87,13148,106],{},[87,13150,13151],{"class":89,"line":109},[87,13152,112],{},[87,13154,13155],{"class":89,"line":115},[87,13156,118],{},[87,13158,13159],{"class":89,"line":121},[87,13160,100],{"emptyLinePlaceholder":99},[87,13162,13163],{"class":89,"line":126},[87,13164,129],{},[87,13166,13167],{"class":89,"line":132},[87,13168,135],{},[87,13170,13171],{"class":89,"line":138},[87,13172,141],{},[87,13174,13175],{"class":89,"line":144},[87,13176,147],{},[10,13178,150],{},[78,13180,13182],{"className":13181,"code":155,"language":156,"meta":83},[154],[33,13183,155],{"__ignoreMap":83},[10,13185,161],{},[14,13187,164],{"id":164},[166,13189,13190,13194],{},[48,13191,13192,173],{},[33,13193,172],{},[48,13195,176,13196,179,13198,182],{},[33,13197,39],{},[33,13199,35],{},[14,13201,185],{"id":185},[45,13203,13204,13210],{},[48,13205,190,13206,193,13208,196],{},[33,13207,35],{},[33,13209,55],{},[48,13211,199,13212,202,13214,206],{},[33,13213,39],{},[33,13215,205],{},[14,13217,209],{"id":209},[166,13219,13220,13224],{},[48,13221,214,13222,218],{},[33,13223,217],{},[48,13225,221],{},[10,13227,224],{},[14,13229,227],{"id":227},[10,13231,230],{},[232,13233,234],{},{"title":83,"searchDepth":96,"depth":96,"links":13235},[13236,13237,13238,13239,13240,13241,13242,13243],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":5,"description":12},[245,257,258],{"id":6706,"title":6707,"body":13248,"category":245,"cover":246,"description":6712,"extension":247,"meta":13395,"navigation":99,"path":6891,"pinned":250,"publishedAt":251,"seo":13396,"slug":6893,"stem":6894,"summary":6895,"tags":13397,"updatedAt":251,"visible":99,"__hash__":6899},{"type":7,"value":13249,"toc":13385},[13250,13252,13254,13256,13258,13262,13264,13266,13284,13286,13288,13336,13338,13343,13345,13347,13355,13357,13367,13369,13377,13379,13381,13383],[10,13251,6712],{},[14,13253,16],{"id":16},[10,13255,6717],{},[14,13257,22],{"id":22},[10,13259,13260],{},[26,13261],{"alt":6724,"src":6725},[10,13263,6728],{},[14,13265,43],{"id":43},[45,13267,13268,13272,13278],{},[48,13269,13270,6738],{},[33,13271,6737],{},[48,13273,13274,6744,13276,382],{},[33,13275,6743],{},[33,13277,6747],{},[48,13279,6750,13280,6754,13282,6758],{},[33,13281,6753],{},[33,13283,6757],{},[14,13285,73],{"id":73},[10,13287,76],{},[78,13289,13290],{"className":80,"code":6765,"language":82,"meta":83,"style":83},[33,13291,13292,13296,13300,13304,13308,13312,13316,13320,13324,13328,13332],{"__ignoreMap":83},[87,13293,13294],{"class":89,"line":90},[87,13295,93],{},[87,13297,13298],{"class":89,"line":96},[87,13299,100],{"emptyLinePlaceholder":99},[87,13301,13302],{"class":89,"line":103},[87,13303,6780],{},[87,13305,13306],{"class":89,"line":109},[87,13307,6785],{},[87,13309,13310],{"class":89,"line":115},[87,13311,6790],{},[87,13313,13314],{"class":89,"line":121},[87,13315,6795],{},[87,13317,13318],{"class":89,"line":126},[87,13319,100],{"emptyLinePlaceholder":99},[87,13321,13322],{"class":89,"line":132},[87,13323,6804],{},[87,13325,13326],{"class":89,"line":138},[87,13327,6809],{},[87,13329,13330],{"class":89,"line":144},[87,13331,6814],{},[87,13333,13334],{"class":89,"line":5843},[87,13335,6819],{},[10,13337,150],{},[78,13339,13341],{"className":13340,"code":6825,"language":156,"meta":83},[154],[33,13342,6825],{"__ignoreMap":83},[10,13344,161],{},[14,13346,164],{"id":164},[166,13348,13349,13353],{},[48,13350,6836,13351,6839],{},[33,13352,6753],{},[48,13354,6842],{},[14,13356,185],{"id":185},[45,13358,13359,13363],{},[48,13360,176,13361,6851],{},[33,13362,6737],{},[48,13364,6854,13365,382],{},[33,13366,6857],{},[14,13368,209],{"id":209},[166,13370,13371,13373],{},[48,13372,6864],{},[48,13374,6867,13375,6870],{},[33,13376,356],{},[10,13378,224],{},[14,13380,227],{"id":227},[10,13382,6877],{},[232,13384,234],{},{"title":83,"searchDepth":96,"depth":96,"links":13386},[13387,13388,13389,13390,13391,13392,13393,13394],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":6707,"description":6712},[245,6897,6898],{"id":6901,"title":6902,"body":13399,"category":245,"cover":246,"description":6907,"extension":247,"meta":13542,"navigation":99,"path":7075,"pinned":250,"publishedAt":251,"seo":13543,"slug":7077,"stem":7078,"summary":7079,"tags":13544,"updatedAt":251,"visible":99,"__hash__":7083},{"type":7,"value":13400,"toc":13532},[13401,13403,13405,13407,13409,13413,13419,13421,13431,13433,13435,13487,13489,13494,13496,13498,13508,13510,13516,13518,13524,13526,13528,13530],[10,13402,6907],{},[14,13404,16],{"id":16},[10,13406,6912],{},[14,13408,22],{"id":22},[10,13410,13411],{},[26,13412],{"alt":6919,"src":6920},[10,13414,13415,6926,13417,6930],{},[33,13416,6925],{},[33,13418,6929],{},[14,13420,43],{"id":43},[45,13422,13423,13425,13429],{},[48,13424,6937],{},[48,13426,13427,6943],{},[33,13428,6942],{},[48,13430,6946],{},[14,13432,73],{"id":73},[10,13434,76],{},[78,13436,13437],{"className":80,"code":6953,"language":82,"meta":83,"style":83},[33,13438,13439,13443,13447,13451,13455,13459,13463,13467,13471,13475,13479,13483],{"__ignoreMap":83},[87,13440,13441],{"class":89,"line":90},[87,13442,6960],{},[87,13444,13445],{"class":89,"line":96},[87,13446,100],{"emptyLinePlaceholder":99},[87,13448,13449],{"class":89,"line":103},[87,13450,6969],{},[87,13452,13453],{"class":89,"line":109},[87,13454,100],{"emptyLinePlaceholder":99},[87,13456,13457],{"class":89,"line":115},[87,13458,6978],{},[87,13460,13461],{"class":89,"line":121},[87,13462,6983],{},[87,13464,13465],{"class":89,"line":126},[87,13466,6795],{},[87,13468,13469],{"class":89,"line":132},[87,13470,100],{"emptyLinePlaceholder":99},[87,13472,13473],{"class":89,"line":138},[87,13474,6996],{},[87,13476,13477],{"class":89,"line":144},[87,13478,7001],{},[87,13480,13481],{"class":89,"line":5843},[87,13482,6814],{},[87,13484,13485],{"class":89,"line":5848},[87,13486,7010],{},[10,13488,150],{},[78,13490,13492],{"className":13491,"code":7016,"language":156,"meta":83},[154],[33,13493,7016],{"__ignoreMap":83},[10,13495,161],{},[14,13497,164],{"id":164},[166,13499,13500,13504],{},[48,13501,13502,7029],{},[33,13503,6925],{},[48,13505,13506,7034],{},[33,13507,6929],{},[14,13509,185],{"id":185},[45,13511,13512,13514],{},[48,13513,7041],{},[48,13515,7044],{},[14,13517,209],{"id":209},[166,13519,13520,13522],{},[48,13521,7051],{},[48,13523,7054],{},[10,13525,224],{},[14,13527,227],{"id":227},[10,13529,7061],{},[232,13531,234],{},{"title":83,"searchDepth":96,"depth":96,"links":13533},[13534,13535,13536,13537,13538,13539,13540,13541],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":6902,"description":6907},[245,7081,7082],{"id":7085,"title":7086,"body":13546,"category":245,"cover":246,"description":7091,"extension":247,"meta":13697,"navigation":99,"path":7276,"pinned":250,"publishedAt":251,"seo":13698,"slug":7278,"stem":7279,"summary":7280,"tags":13699,"updatedAt":251,"visible":99,"__hash__":7284},{"type":7,"value":13547,"toc":13687},[13548,13550,13552,13554,13556,13560,13564,13566,13580,13582,13584,13636,13638,13643,13645,13647,13659,13661,13671,13673,13679,13681,13683,13685],[10,13549,7091],{},[14,13551,16],{"id":16},[10,13553,7096],{},[14,13555,22],{"id":22},[10,13557,13558],{},[26,13559],{"alt":7103,"src":7104},[10,13561,13562,7110],{},[33,13563,7109],{},[14,13565,43],{"id":43},[45,13567,13568,13574,13578],{},[48,13569,176,13570,7120,13572,7124],{},[33,13571,7119],{},[33,13573,7123],{},[48,13575,7127,13576,7131],{},[33,13577,7130],{},[48,13579,7134],{},[14,13581,73],{"id":73},[10,13583,76],{},[78,13585,13586],{"className":80,"code":7141,"language":82,"meta":83,"style":83},[33,13587,13588,13592,13596,13600,13604,13608,13612,13616,13620,13624,13628,13632],{"__ignoreMap":83},[87,13589,13590],{"class":89,"line":90},[87,13591,7148],{},[87,13593,13594],{"class":89,"line":96},[87,13595,100],{"emptyLinePlaceholder":99},[87,13597,13598],{"class":89,"line":103},[87,13599,7157],{},[87,13601,13602],{"class":89,"line":109},[87,13603,7162],{},[87,13605,13606],{"class":89,"line":115},[87,13607,7167],{},[87,13609,13610],{"class":89,"line":121},[87,13611,7172],{},[87,13613,13614],{"class":89,"line":126},[87,13615,7177],{},[87,13617,13618],{"class":89,"line":132},[87,13619,100],{"emptyLinePlaceholder":99},[87,13621,13622],{"class":89,"line":138},[87,13623,7186],{},[87,13625,13626],{"class":89,"line":144},[87,13627,7191],{},[87,13629,13630],{"class":89,"line":5843},[87,13631,7196],{},[87,13633,13634],{"class":89,"line":5848},[87,13635,7201],{},[10,13637,150],{},[78,13639,13641],{"className":13640,"code":7207,"language":156,"meta":83},[154],[33,13642,7207],{"__ignoreMap":83},[10,13644,161],{},[14,13646,164],{"id":164},[166,13648,13649,13655],{},[48,13650,13651,7221,13653,7224],{},[33,13652,7220],{},[33,13654,7130],{},[48,13656,13657,7229],{},[33,13658,7109],{},[14,13660,185],{"id":185},[45,13662,13663,13665],{},[48,13664,7236],{},[48,13666,7239,13667,7242,13669,7245],{},[33,13668,7119],{},[33,13670,7123],{},[14,13672,209],{"id":209},[166,13674,13675,13677],{},[48,13676,7252],{},[48,13678,7255],{},[10,13680,224],{},[14,13682,227],{"id":227},[10,13684,7262],{},[232,13686,234],{},{"title":83,"searchDepth":96,"depth":96,"links":13688},[13689,13690,13691,13692,13693,13694,13695,13696],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":7086,"description":7091},[245,7282,7283],{"id":7286,"title":7287,"body":13701,"category":245,"cover":246,"description":7292,"extension":247,"meta":13915,"navigation":99,"path":7566,"pinned":250,"publishedAt":251,"seo":13916,"slug":7568,"stem":7569,"summary":7570,"tags":13917,"updatedAt":251,"visible":99,"__hash__":7574},{"type":7,"value":13702,"toc":13902},[13703,13705,13707,13709,13711,13715,13721,13723,13735,13737,13739,13799,13801,13806,13808,13810,13828,13830,13838,13842,13850,13852,13856,13860,13866,13868,13878,13880,13894,13896,13898,13900],[10,13704,7292],{},[14,13706,16],{"id":16},[10,13708,7297],{},[14,13710,22],{"id":22},[10,13712,13713],{},[26,13714],{"alt":7304,"src":7305},[10,13716,7308,13717,7312,13719,7316],{},[33,13718,7311],{},[33,13720,7315],{},[14,13722,43],{"id":43},[45,13724,13725,13729,13733],{},[48,13726,7323,13727,7326],{},[33,13728,7311],{},[48,13730,13731,7332],{},[33,13732,7331],{},[48,13734,7335],{},[14,13736,73],{"id":73},[10,13738,76],{},[78,13740,13741],{"className":80,"code":7342,"language":82,"meta":83,"style":83},[33,13742,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779,13783,13787,13791,13795],{"__ignoreMap":83},[87,13744,13745],{"class":89,"line":90},[87,13746,7349],{},[87,13748,13749],{"class":89,"line":96},[87,13750,7354],{},[87,13752,13753],{"class":89,"line":103},[87,13754,7359],{},[87,13756,13757],{"class":89,"line":109},[87,13758,7364],{},[87,13760,13761],{"class":89,"line":115},[87,13762,7369],{},[87,13764,13765],{"class":89,"line":121},[87,13766,100],{"emptyLinePlaceholder":99},[87,13768,13769],{"class":89,"line":126},[87,13770,7378],{},[87,13772,13773],{"class":89,"line":132},[87,13774,7383],{},[87,13776,13777],{"class":89,"line":138},[87,13778,7388],{},[87,13780,13781],{"class":89,"line":144},[87,13782,7393],{},[87,13784,13785],{"class":89,"line":5843},[87,13786,1165],{},[87,13788,13789],{"class":89,"line":5848},[87,13790,7402],{},[87,13792,13793],{"class":89,"line":7405},[87,13794,7408],{},[87,13796,13797],{"class":89,"line":7411},[87,13798,7414],{},[10,13800,150],{},[78,13802,13804],{"className":13803,"code":7420,"language":156,"meta":83},[154],[33,13805,7420],{"__ignoreMap":83},[10,13807,161],{},[14,13809,164],{"id":164},[166,13811,13812,13820],{},[48,13813,13814,7433,13816,7436,13818,7440],{},[33,13815,3052],{},[33,13817,7331],{},[33,13819,7439],{},[48,13821,7443,13822,7446,13824,7449,13826,382],{},[33,13823,7311],{},[33,13825,1179],{},[33,13827,7315],{},[348,13829,2713],{"id":2713},[10,13831,13832,56,13834,1176,13836,7462],{},[33,13833,7311],{},[33,13835,1179],{},[33,13837,7315],{},[10,13839,13840],{},[26,13841],{"alt":7467,"src":7468},[10,13843,13844,7473,13846,7476,13848,7479],{},[33,13845,7311],{},[33,13847,1179],{},[33,13849,7315],{},[348,13851,2713],{"id":4233},[10,13853,13854,7487],{},[33,13855,7486],{},[10,13857,13858],{},[26,13859],{"alt":7492,"src":7493},[10,13861,7496,13862,7499,13864,7502],{},[33,13863,7486],{},[33,13865,1179],{},[14,13867,185],{"id":185},[45,13869,13870,13874],{},[48,13871,7509,13872,7513],{},[33,13873,7512],{},[48,13875,7516,13876,7519],{},[33,13877,7486],{},[14,13879,209],{"id":209},[166,13881,13882,13890],{},[48,13883,7526,13884,7530,13886,1176,13888,382],{},[33,13885,7529],{},[33,13887,7533],{},[33,13889,7536],{},[48,13891,7539,13892,7542],{},[33,13893,6747],{},[10,13895,224],{},[14,13897,227],{"id":227},[10,13899,7549],{},[232,13901,234],{},{"title":83,"searchDepth":96,"depth":96,"links":13903},[13904,13905,13906,13907,13908,13912,13913,13914],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":13909},[13910,13911],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":7287,"description":7292},[245,7572,7573],{"id":7576,"title":7577,"body":13919,"category":245,"cover":246,"description":7582,"extension":247,"meta":14070,"navigation":99,"path":7759,"pinned":250,"publishedAt":251,"seo":14071,"slug":7761,"stem":7762,"summary":7763,"tags":14072,"updatedAt":251,"visible":99,"__hash__":7766},{"type":7,"value":13920,"toc":14060},[13921,13923,13925,13927,13929,13933,13937,13939,13951,13953,13955,14003,14005,14010,14012,14014,14024,14026,14036,14038,14052,14054,14056,14058],[10,13922,7582],{},[14,13924,16],{"id":16},[10,13926,7587],{},[14,13928,22],{"id":22},[10,13930,13931],{},[26,13932],{"alt":7594,"src":7595},[10,13934,7598,13935,7601],{},[33,13936,6757],{},[14,13938,43],{"id":43},[45,13940,13941,13945,13949],{},[48,13942,13943,7610],{},[33,13944,6757],{},[48,13946,13947,7616],{},[33,13948,7615],{},[48,13950,7619],{},[14,13952,73],{"id":73},[10,13954,76],{},[78,13956,13957],{"className":80,"code":7626,"language":82,"meta":83,"style":83},[33,13958,13959,13963,13967,13971,13975,13979,13983,13987,13991,13995,13999],{"__ignoreMap":83},[87,13960,13961],{"class":89,"line":90},[87,13962,93],{},[87,13964,13965],{"class":89,"line":96},[87,13966,100],{"emptyLinePlaceholder":99},[87,13968,13969],{"class":89,"line":103},[87,13970,6780],{},[87,13972,13973],{"class":89,"line":109},[87,13974,100],{"emptyLinePlaceholder":99},[87,13976,13977],{"class":89,"line":115},[87,13978,7649],{},[87,13980,13981],{"class":89,"line":121},[87,13982,7654],{},[87,13984,13985],{"class":89,"line":126},[87,13986,100],{"emptyLinePlaceholder":99},[87,13988,13989],{"class":89,"line":132},[87,13990,7663],{},[87,13992,13993],{"class":89,"line":138},[87,13994,7668],{},[87,13996,13997],{"class":89,"line":144},[87,13998,100],{"emptyLinePlaceholder":99},[87,14000,14001],{"class":89,"line":5843},[87,14002,7677],{},[10,14004,150],{},[78,14006,14008],{"className":14007,"code":7683,"language":156,"meta":83},[154],[33,14009,7683],{"__ignoreMap":83},[10,14011,161],{},[14,14013,164],{"id":164},[166,14015,14016,14022],{},[48,14017,7598,14018,7696,14020,382],{},[33,14019,6757],{},[33,14021,7699],{},[48,14023,7702],{},[14,14025,185],{"id":185},[45,14027,14028,14032],{},[48,14029,4801,14030,7711],{},[33,14031,6757],{},[48,14033,7714,14034,7717],{},[33,14035,6757],{},[14,14037,209],{"id":209},[166,14039,14040,14046],{},[48,14041,7724,14042,7728,14044,382],{},[33,14043,7727],{},[33,14045,6757],{},[48,14047,4801,14048,7735,14050,382],{},[33,14049,6757],{},[33,14051,7738],{},[10,14053,224],{},[14,14055,227],{"id":227},[10,14057,7745],{},[232,14059,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14061},[14062,14063,14064,14065,14066,14067,14068,14069],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":7577,"description":7582},[245,6757,7765],{"id":7768,"title":7769,"body":14074,"category":245,"cover":246,"description":7774,"extension":247,"meta":14245,"navigation":99,"path":7987,"pinned":250,"publishedAt":251,"seo":14246,"slug":7989,"stem":7990,"summary":7991,"tags":14247,"updatedAt":251,"visible":99,"__hash__":7995},{"type":7,"value":14075,"toc":14233},[14076,14078,14080,14082,14084,14088,14090,14092,14104,14106,14108,14164,14166,14171,14173,14175,14191,14193,14195,14199,14205,14207,14215,14217,14225,14227,14229,14231],[10,14077,7774],{},[14,14079,16],{"id":16},[10,14081,7779],{},[14,14083,22],{"id":22},[10,14085,14086],{},[26,14087],{"alt":7786,"src":7787},[10,14089,7790],{},[14,14091,43],{"id":43},[45,14093,14094,14098,14102],{},[48,14095,14096,7800],{},[33,14097,7799],{},[48,14099,14100,7806],{},[33,14101,7805],{},[48,14103,7809],{},[14,14105,73],{"id":73},[10,14107,76],{},[78,14109,14110],{"className":80,"code":7816,"language":82,"meta":83,"style":83},[33,14111,14112,14116,14120,14124,14128,14132,14136,14140,14144,14148,14152,14156,14160],{"__ignoreMap":83},[87,14113,14114],{"class":89,"line":90},[87,14115,7823],{},[87,14117,14118],{"class":89,"line":96},[87,14119,7828],{},[87,14121,14122],{"class":89,"line":103},[87,14123,7833],{},[87,14125,14126],{"class":89,"line":109},[87,14127,7838],{},[87,14129,14130],{"class":89,"line":115},[87,14131,100],{"emptyLinePlaceholder":99},[87,14133,14134],{"class":89,"line":121},[87,14135,7847],{},[87,14137,14138],{"class":89,"line":126},[87,14139,7852],{},[87,14141,14142],{"class":89,"line":132},[87,14143,7857],{},[87,14145,14146],{"class":89,"line":138},[87,14147,7862],{},[87,14149,14150],{"class":89,"line":144},[87,14151,100],{"emptyLinePlaceholder":99},[87,14153,14154],{"class":89,"line":5843},[87,14155,7871],{},[87,14157,14158],{"class":89,"line":5848},[87,14159,7876],{},[87,14161,14162],{"class":89,"line":7405},[87,14163,7881],{},[10,14165,150],{},[78,14167,14169],{"className":14168,"code":7887,"language":156,"meta":83},[154],[33,14170,7887],{"__ignoreMap":83},[10,14172,161],{},[14,14174,164],{"id":164},[166,14176,14177,14183],{},[48,14178,7898,14179,7902,14181,7905],{},[33,14180,7901],{},[33,14182,7805],{},[48,14184,14185,7911,14187,7915,14189,7918],{},[33,14186,7910],{},[33,14188,7914],{},[33,14190,7799],{},[348,14192,2713],{"id":2713},[10,14194,7923],{},[10,14196,14197],{},[26,14198],{"alt":7928,"src":7929},[10,14200,7932,14201,1176,14203,7938],{},[33,14202,4598],{},[33,14204,7937],{},[14,14206,185],{"id":185},[45,14208,14209,14213],{},[48,14210,7945,14211,7948],{},[33,14212,7799],{},[48,14214,7951],{},[14,14216,209],{"id":209},[166,14218,14219,14223],{},[48,14220,5311,14221,7961],{},[33,14222,7960],{},[48,14224,7964],{},[10,14226,224],{},[14,14228,227],{"id":227},[10,14230,7971],{},[232,14232,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14234},[14235,14236,14237,14238,14239,14242,14243,14244],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":14240},[14241],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":7769,"description":7774},[245,7993,7994],{"id":7997,"title":7998,"body":14249,"category":245,"cover":246,"description":8003,"extension":247,"meta":14396,"navigation":99,"path":8182,"pinned":250,"publishedAt":251,"seo":14397,"slug":8184,"stem":8185,"summary":8186,"tags":14398,"updatedAt":251,"visible":99,"__hash__":8190},{"type":7,"value":14250,"toc":14386},[14251,14253,14255,14257,14259,14263,14265,14267,14275,14277,14279,14335,14337,14342,14344,14346,14358,14360,14366,14368,14378,14380,14382,14384],[10,14252,8003],{},[14,14254,16],{"id":16},[10,14256,8008],{},[14,14258,22],{"id":22},[10,14260,14261],{},[26,14262],{"alt":8015,"src":8016},[10,14264,8019],{},[14,14266,43],{"id":43},[45,14268,14269,14271,14273],{},[48,14270,8026],{},[48,14272,8029],{},[48,14274,8032],{},[14,14276,73],{"id":73},[10,14278,76],{},[78,14280,14281],{"className":80,"code":8039,"language":82,"meta":83,"style":83},[33,14282,14283,14287,14291,14295,14299,14303,14307,14311,14315,14319,14323,14327,14331],{"__ignoreMap":83},[87,14284,14285],{"class":89,"line":90},[87,14286,8046],{},[87,14288,14289],{"class":89,"line":96},[87,14290,8051],{},[87,14292,14293],{"class":89,"line":103},[87,14294,8056],{},[87,14296,14297],{"class":89,"line":109},[87,14298,100],{"emptyLinePlaceholder":99},[87,14300,14301],{"class":89,"line":115},[87,14302,8065],{},[87,14304,14305],{"class":89,"line":121},[87,14306,8070],{},[87,14308,14309],{"class":89,"line":126},[87,14310,8075],{},[87,14312,14313],{"class":89,"line":132},[87,14314,100],{"emptyLinePlaceholder":99},[87,14316,14317],{"class":89,"line":138},[87,14318,8084],{},[87,14320,14321],{"class":89,"line":144},[87,14322,8089],{},[87,14324,14325],{"class":89,"line":5843},[87,14326,100],{"emptyLinePlaceholder":99},[87,14328,14329],{"class":89,"line":5848},[87,14330,8098],{},[87,14332,14333],{"class":89,"line":7405},[87,14334,8103],{},[10,14336,150],{},[78,14338,14340],{"className":14339,"code":8109,"language":156,"meta":83},[154],[33,14341,8109],{"__ignoreMap":83},[10,14343,161],{},[14,14345,164],{"id":164},[166,14347,14348,14354],{},[48,14349,14350,8123,14352,8127],{},[33,14351,8122],{},[33,14353,8126],{},[48,14355,8130,14356,8134],{},[33,14357,8133],{},[14,14359,185],{"id":185},[45,14361,14362,14364],{},[48,14363,8141],{},[48,14365,8144],{},[14,14367,209],{"id":209},[166,14369,14370,14376],{},[48,14371,8151,14372,8155,14374,382],{},[33,14373,8154],{},[33,14375,8158],{},[48,14377,8161],{},[10,14379,224],{},[14,14381,227],{"id":227},[10,14383,8168],{},[232,14385,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14387},[14388,14389,14390,14391,14392,14393,14394,14395],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":7998,"description":8003},[245,8188,8189],{"id":8192,"title":8193,"body":14400,"category":245,"cover":246,"description":8198,"extension":247,"meta":14563,"navigation":99,"path":8402,"pinned":250,"publishedAt":251,"seo":14564,"slug":8404,"stem":8405,"summary":8406,"tags":14565,"updatedAt":251,"visible":99,"__hash__":8410},{"type":7,"value":14401,"toc":14551},[14402,14404,14406,14408,14410,14414,14418,14420,14436,14438,14440,14484,14486,14491,14493,14495,14509,14511,14515,14519,14523,14525,14531,14533,14543,14545,14547,14549],[10,14403,8198],{},[14,14405,16],{"id":16},[10,14407,8203],{},[14,14409,22],{"id":22},[10,14411,14412],{},[26,14413],{"alt":8210,"src":8211},[10,14415,8214,14416,8218],{},[33,14417,8217],{},[14,14419,43],{"id":43},[45,14421,14422,14428,14434],{},[48,14423,14424,8228,14426,8232],{},[33,14425,8227],{},[33,14427,8231],{},[48,14429,8235,14430,8239,14432,8242],{},[33,14431,8238],{},[33,14433,4352],{},[48,14435,8245],{},[14,14437,73],{"id":73},[10,14439,76],{},[78,14441,14442],{"className":80,"code":8252,"language":82,"meta":83,"style":83},[33,14443,14444,14448,14452,14456,14460,14464,14468,14472,14476,14480],{"__ignoreMap":83},[87,14445,14446],{"class":89,"line":90},[87,14447,8259],{},[87,14449,14450],{"class":89,"line":96},[87,14451,8264],{},[87,14453,14454],{"class":89,"line":103},[87,14455,8269],{},[87,14457,14458],{"class":89,"line":109},[87,14459,8274],{},[87,14461,14462],{"class":89,"line":115},[87,14463,8279],{},[87,14465,14466],{"class":89,"line":121},[87,14467,100],{"emptyLinePlaceholder":99},[87,14469,14470],{"class":89,"line":126},[87,14471,8288],{},[87,14473,14474],{"class":89,"line":132},[87,14475,8293],{},[87,14477,14478],{"class":89,"line":138},[87,14479,8293],{},[87,14481,14482],{"class":89,"line":144},[87,14483,8293],{},[10,14485,150],{},[78,14487,14489],{"className":14488,"code":8307,"language":156,"meta":83},[154],[33,14490,8307],{"__ignoreMap":83},[10,14492,161],{},[14,14494,164],{"id":164},[166,14496,14497,14501],{},[48,14498,7898,14499,8321],{},[33,14500,8320],{},[48,14502,8324,14503,8327,14505,8330,14507,8334],{},[33,14504,8231],{},[33,14506,8217],{},[33,14508,8333],{},[348,14510,2713],{"id":2713},[10,14512,8339,14513,8342],{},[33,14514,8231],{},[10,14516,14517],{},[26,14518],{"alt":8347,"src":8348},[10,14520,8351,14521,8354],{},[33,14522,8217],{},[14,14524,185],{"id":185},[45,14526,14527,14529],{},[48,14528,8361],{},[48,14530,8364],{},[14,14532,209],{"id":209},[166,14534,14535,14537],{},[48,14536,8371],{},[48,14538,4025,14539,8376,14541,8379],{},[33,14540,4352],{},[33,14542,8231],{},[10,14544,224],{},[14,14546,227],{"id":227},[10,14548,8386],{},[232,14550,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14552},[14553,14554,14555,14556,14557,14560,14561,14562],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":14558},[14559],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":8193,"description":8198},[245,8408,8409],{"id":8412,"title":8413,"body":14567,"category":245,"cover":246,"description":8418,"extension":247,"meta":14750,"navigation":99,"path":8643,"pinned":250,"publishedAt":251,"seo":14751,"slug":8645,"stem":8646,"summary":8647,"tags":14752,"updatedAt":251,"visible":99,"__hash__":8650},{"type":7,"value":14568,"toc":14738},[14569,14571,14573,14575,14577,14581,14583,14585,14599,14601,14603,14671,14673,14678,14680,14682,14696,14698,14700,14704,14710,14712,14720,14722,14730,14732,14734,14736],[10,14570,8418],{},[14,14572,16],{"id":16},[10,14574,8423],{},[14,14576,22],{"id":22},[10,14578,14579],{},[26,14580],{"alt":8430,"src":8431},[10,14582,8434],{},[14,14584,43],{"id":43},[45,14586,14587,14593,14595],{},[48,14588,14589,8444,14591,382],{},[33,14590,8443],{},[33,14592,8447],{},[48,14594,8450],{},[48,14596,14597,8456],{},[33,14598,8455],{},[14,14600,73],{"id":73},[10,14602,76],{},[78,14604,14605],{"className":80,"code":8463,"language":82,"meta":83,"style":83},[33,14606,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651,14655,14659,14663,14667],{"__ignoreMap":83},[87,14608,14609],{"class":89,"line":90},[87,14610,8470],{},[87,14612,14613],{"class":89,"line":96},[87,14614,100],{"emptyLinePlaceholder":99},[87,14616,14617],{"class":89,"line":103},[87,14618,8479],{},[87,14620,14621],{"class":89,"line":109},[87,14622,8484],{},[87,14624,14625],{"class":89,"line":115},[87,14626,8489],{},[87,14628,14629],{"class":89,"line":121},[87,14630,8494],{},[87,14632,14633],{"class":89,"line":126},[87,14634,8499],{},[87,14636,14637],{"class":89,"line":132},[87,14638,8504],{},[87,14640,14641],{"class":89,"line":138},[87,14642,8509],{},[87,14644,14645],{"class":89,"line":144},[87,14646,8514],{},[87,14648,14649],{"class":89,"line":5843},[87,14650,100],{"emptyLinePlaceholder":99},[87,14652,14653],{"class":89,"line":5848},[87,14654,8523],{},[87,14656,14657],{"class":89,"line":7405},[87,14658,6196],{},[87,14660,14661],{"class":89,"line":7411},[87,14662,6201],{},[87,14664,14665],{"class":89,"line":8534},[87,14666,100],{"emptyLinePlaceholder":99},[87,14668,14669],{"class":89,"line":8539},[87,14670,8542],{},[10,14672,150],{},[78,14674,14676],{"className":14675,"code":8548,"language":156,"meta":83},[154],[33,14677,8548],{"__ignoreMap":83},[10,14679,161],{},[14,14681,164],{"id":164},[166,14683,14684,14694],{},[48,14685,8559,14686,8563,14688,8567,14690,8571,14692,382],{},[33,14687,8562],{},[33,14689,8566],{},[33,14691,8570],{},[33,14693,8562],{},[48,14695,8576],{},[348,14697,2713],{"id":2713},[10,14699,8581],{},[10,14701,14702],{},[26,14703],{"alt":8586,"src":8587},[10,14705,14706,8592,14708,382],{},[33,14707,8443],{},[33,14709,8447],{},[14,14711,185],{"id":185},[45,14713,14714,14718],{},[48,14715,8601,14716,382],{},[33,14717,5394],{},[48,14719,8606],{},[14,14721,209],{"id":209},[166,14723,14724,14726],{},[48,14725,8613],{},[48,14727,8616,14728,8620],{},[33,14729,8619],{},[10,14731,224],{},[14,14733,227],{"id":227},[10,14735,8627],{},[232,14737,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14739},[14740,14741,14742,14743,14744,14747,14748,14749],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":14745},[14746],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":8413,"description":8418},[245,8649,5345],{"id":8652,"title":8653,"body":14754,"category":245,"cover":246,"description":8658,"extension":247,"meta":14913,"navigation":99,"path":8846,"pinned":250,"publishedAt":251,"seo":14914,"slug":8848,"stem":8849,"summary":8850,"tags":14915,"updatedAt":251,"visible":99,"__hash__":8854},{"type":7,"value":14755,"toc":14901},[14756,14758,14760,14762,14764,14768,14770,14772,14780,14782,14784,14848,14850,14855,14857,14859,14867,14869,14871,14875,14877,14879,14885,14887,14893,14895,14897,14899],[10,14757,8658],{},[14,14759,16],{"id":16},[10,14761,8663],{},[14,14763,22],{"id":22},[10,14765,14766],{},[26,14767],{"alt":8670,"src":8671},[10,14769,8674],{},[14,14771,43],{"id":43},[45,14773,14774,14776,14778],{},[48,14775,8681],{},[48,14777,8684],{},[48,14779,8687],{},[14,14781,73],{"id":73},[10,14783,76],{},[78,14785,14786],{"className":80,"code":8694,"language":82,"meta":83,"style":83},[33,14787,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828,14832,14836,14840,14844],{"__ignoreMap":83},[87,14789,14790],{"class":89,"line":90},[87,14791,8701],{},[87,14793,14794],{"class":89,"line":96},[87,14795,8706],{},[87,14797,14798],{"class":89,"line":103},[87,14799,100],{"emptyLinePlaceholder":99},[87,14801,14802],{"class":89,"line":109},[87,14803,8715],{},[87,14805,14806],{"class":89,"line":115},[87,14807,100],{"emptyLinePlaceholder":99},[87,14809,14810],{"class":89,"line":121},[87,14811,8724],{},[87,14813,14814],{"class":89,"line":126},[87,14815,8729],{},[87,14817,14818],{"class":89,"line":132},[87,14819,8734],{},[87,14821,14822],{"class":89,"line":138},[87,14823,100],{"emptyLinePlaceholder":99},[87,14825,14826],{"class":89,"line":144},[87,14827,8743],{},[87,14829,14830],{"class":89,"line":5843},[87,14831,8748],{},[87,14833,14834],{"class":89,"line":5848},[87,14835,8753],{},[87,14837,14838],{"class":89,"line":7405},[87,14839,100],{"emptyLinePlaceholder":99},[87,14841,14842],{"class":89,"line":7411},[87,14843,6210],{},[87,14845,14846],{"class":89,"line":8534},[87,14847,8766],{},[10,14849,150],{},[78,14851,14853],{"className":14852,"code":8772,"language":156,"meta":83},[154],[33,14854,8772],{"__ignoreMap":83},[10,14856,161],{},[14,14858,164],{"id":164},[166,14860,14861,14865],{},[48,14862,14863,8786],{},[33,14864,8785],{},[48,14866,8789],{},[348,14868,2713],{"id":2713},[10,14870,8794],{},[10,14872,14873],{},[26,14874],{"alt":8799,"src":8800},[10,14876,8803],{},[14,14878,185],{"id":185},[45,14880,14881,14883],{},[48,14882,8810],{},[48,14884,8813],{},[14,14886,209],{"id":209},[166,14888,14889,14891],{},[48,14890,8820],{},[48,14892,8823],{},[10,14894,224],{},[14,14896,227],{"id":227},[10,14898,8830],{},[232,14900,234],{},{"title":83,"searchDepth":96,"depth":96,"links":14902},[14903,14904,14905,14906,14907,14910,14911,14912],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":14908},[14909],{"id":2713,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":8653,"description":8658},[245,8852,8853],{"id":8856,"title":8857,"body":14917,"category":245,"cover":246,"description":8862,"extension":247,"meta":15155,"navigation":99,"path":9163,"pinned":250,"publishedAt":251,"seo":15156,"slug":9165,"stem":9166,"summary":9167,"tags":15157,"updatedAt":251,"visible":99,"__hash__":9171},{"type":7,"value":14918,"toc":15142},[14919,14921,14923,14925,14927,14931,14933,14935,14945,14947,14949,15065,15067,15072,15074,15076,15086,15088,15090,15094,15096,15098,15100,15104,15108,15110,15118,15120,15134,15136,15138,15140],[10,14920,8862],{},[14,14922,16],{"id":16},[10,14924,8867],{},[14,14926,22],{"id":22},[10,14928,14929],{},[26,14930],{"alt":8874,"src":8875},[10,14932,8878],{},[14,14934,43],{"id":43},[45,14936,14937,14939,14941],{},[48,14938,8885],{},[48,14940,8888],{},[48,14942,8891,14943,8895],{},[33,14944,8894],{},[14,14946,73],{"id":73},[10,14948,76],{},[78,14950,14951],{"className":80,"code":8902,"language":82,"meta":83,"style":83},[33,14952,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041,15045,15049,15053,15057,15061],{"__ignoreMap":83},[87,14954,14955],{"class":89,"line":90},[87,14956,6960],{},[87,14958,14959],{"class":89,"line":96},[87,14960,93],{},[87,14962,14963],{"class":89,"line":103},[87,14964,100],{"emptyLinePlaceholder":99},[87,14966,14967],{"class":89,"line":109},[87,14968,8921],{},[87,14970,14971],{"class":89,"line":115},[87,14972,8926],{},[87,14974,14975],{"class":89,"line":121},[87,14976,8931],{},[87,14978,14979],{"class":89,"line":126},[87,14980,8936],{},[87,14982,14983],{"class":89,"line":132},[87,14984,100],{"emptyLinePlaceholder":99},[87,14986,14987],{"class":89,"line":138},[87,14988,8945],{},[87,14990,14991],{"class":89,"line":144},[87,14992,8950],{},[87,14994,14995],{"class":89,"line":5843},[87,14996,8955],{},[87,14998,14999],{"class":89,"line":5848},[87,15000,8960],{},[87,15002,15003],{"class":89,"line":7405},[87,15004,8965],{},[87,15006,15007],{"class":89,"line":7411},[87,15008,100],{"emptyLinePlaceholder":99},[87,15010,15011],{"class":89,"line":8534},[87,15012,8974],{},[87,15014,15015],{"class":89,"line":8539},[87,15016,8979],{},[87,15018,15019],{"class":89,"line":8982},[87,15020,8985],{},[87,15022,15023],{"class":89,"line":8988},[87,15024,100],{"emptyLinePlaceholder":99},[87,15026,15027],{"class":89,"line":8993},[87,15028,8996],{},[87,15030,15031],{"class":89,"line":8999},[87,15032,100],{"emptyLinePlaceholder":99},[87,15034,15035],{"class":89,"line":9004},[87,15036,7378],{},[87,15038,15039],{"class":89,"line":9009},[87,15040,9012],{},[87,15042,15043],{"class":89,"line":9015},[87,15044,9018],{},[87,15046,15047],{"class":89,"line":9021},[87,15048,9024],{},[87,15050,15051],{"class":89,"line":9027},[87,15052,7388],{},[87,15054,15055],{"class":89,"line":9032},[87,15056,9035],{},[87,15058,15059],{"class":89,"line":9038},[87,15060,1165],{},[87,15062,15063],{"class":89,"line":9043},[87,15064,9046],{},[10,15066,150],{},[78,15068,15070],{"className":15069,"code":9052,"language":156,"meta":83},[154],[33,15071,9052],{"__ignoreMap":83},[10,15073,161],{},[14,15075,164],{"id":164},[166,15077,15078,15082],{},[48,15079,9063,15080,9066],{},[33,15081,8894],{},[48,15083,15084,9071],{},[33,15085,8126],{},[348,15087,2713],{"id":2713},[10,15089,9076],{},[10,15091,15092],{},[26,15093],{"alt":9081,"src":9082},[10,15095,9085],{},[348,15097,2713],{"id":4233},[10,15099,9090],{},[10,15101,15102],{},[26,15103],{"alt":9095,"src":9096},[10,15105,9099,15106,9103],{},[33,15107,9102],{},[14,15109,185],{"id":185},[45,15111,15112,15114],{},[48,15113,9110],{},[48,15115,9113,15116,9116],{},[33,15117,9102],{},[14,15119,209],{"id":209},[166,15121,15122,15126,15128],{},[48,15123,9123,15124,9126],{},[33,15125,9102],{},[48,15127,9129],{},[48,15129,9132,15130,9136,15132,9139],{},[33,15131,9135],{},[33,15133,6152],{},[10,15135,224],{},[14,15137,227],{"id":227},[10,15139,9146],{},[232,15141,234],{},{"title":83,"searchDepth":96,"depth":96,"links":15143},[15144,15145,15146,15147,15148,15152,15153,15154],{"id":16,"depth":96,"text":16},{"id":22,"depth":96,"text":22},{"id":43,"depth":96,"text":43},{"id":73,"depth":96,"text":73},{"id":164,"depth":96,"text":164,"children":15149},[15150,15151],{"id":2713,"depth":103,"text":2713},{"id":4233,"depth":103,"text":2713},{"id":185,"depth":96,"text":185},{"id":209,"depth":96,"text":209},{"id":227,"depth":96,"text":227},{},{"title":8857,"description":8862},[245,9169,9170],{"id":1075,"title":1076,"body":15159,"category":245,"cover":1084,"description":83,"extension":247,"meta":15395,"navigation":99,"path":1401,"pinned":250,"publishedAt":1402,"seo":15396,"slug":1404,"stem":1405,"summary":1406,"tags":15397,"updatedAt":1402,"visible":99,"__hash__":1410},{"type":7,"value":15160,"toc":15380},[15161,15165,15167,15169,15171,15173,15193,15195,15200,15202,15204,15232,15238,15240,15244,15246,15266,15268,15278,15280,15282,15284,15286,15288,15290,15292,15294,15296,15316,15318,15320,15324,15326,15328,15330,15332,15336,15338,15356,15358,15360,15362,15364,15366,15368,15370,15372,15374,15376,15378],[10,15162,15163],{},[26,15164],{"alt":1083,"src":1084},[10,15166,1087],{},[10,15168,1090],{},[14,15170,1094],{"id":1093},[10,15172,1097],{},[78,15174,15175],{"className":80,"code":1100,"language":82,"meta":83,"style":83},[33,15176,15177,15181,15185,15189],{"__ignoreMap":83},[87,15178,15179],{"class":89,"line":90},[87,15180,1107],{},[87,15182,15183],{"class":89,"line":96},[87,15184,1112],{},[87,15186,15187],{"class":89,"line":103},[87,15188,100],{"emptyLinePlaceholder":99},[87,15190,15191],{"class":89,"line":109},[87,15192,1121],{},[10,15194,1124],{},[78,15196,15198],{"className":15197,"code":1128,"language":156,"meta":83},[154],[33,15199,1128],{"__ignoreMap":83},[10,15201,1133],{},[10,15203,1136],{},[78,15205,15206],{"className":80,"code":1139,"language":82,"meta":83,"style":83},[33,15207,15208,15212,15216,15220,15224,15228],{"__ignoreMap":83},[87,15209,15210],{"class":89,"line":90},[87,15211,1146],{},[87,15213,15214],{"class":89,"line":96},[87,15215,100],{"emptyLinePlaceholder":99},[87,15217,15218],{"class":89,"line":103},[87,15219,1155],{},[87,15221,15222],{"class":89,"line":109},[87,15223,1160],{},[87,15225,15226],{"class":89,"line":115},[87,15227,1165],{},[87,15229,15230],{"class":89,"line":121},[87,15231,1170],{},[10,15233,15234,1176,15236,1180],{},[33,15235,1175],{},[33,15237,1179],{},[14,15239,1184],{"id":1183},[10,15241,1187,15242,1191],{},[33,15243,1190],{},[10,15245,1194],{},[78,15247,15248],{"className":80,"code":1197,"language":82,"meta":83,"style":83},[33,15249,15250,15254,15258,15262],{"__ignoreMap":83},[87,15251,15252],{"class":89,"line":90},[87,15253,1204],{},[87,15255,15256],{"class":89,"line":96},[87,15257,1209],{},[87,15259,15260],{"class":89,"line":103},[87,15261,1214],{},[87,15263,15264],{"class":89,"line":109},[87,15265,1219],{},[10,15267,1222],{},[78,15269,15270],{"className":611,"code":1225,"language":613,"meta":83,"style":83},[33,15271,15272],{"__ignoreMap":83},[87,15273,15274,15276],{"class":89,"line":90},[87,15275,711],{"class":620},[87,15277,1234],{"class":656},[10,15279,1237],{},[14,15281,1241],{"id":1240},[348,15283,1244],{"id":1244},[10,15285,1247],{},[348,15287,1250],{"id":1250},[10,15289,1253],{},[348,15291,1256],{"id":1256},[10,15293,1259],{},[10,15295,1262],{},[78,15297,15298],{"className":80,"code":1265,"language":82,"meta":83,"style":83},[33,15299,15300,15304,15308,15312],{"__ignoreMap":83},[87,15301,15302],{"class":89,"line":90},[87,15303,1272],{},[87,15305,15306],{"class":89,"line":96},[87,15307,100],{"emptyLinePlaceholder":99},[87,15309,15310],{"class":89,"line":103},[87,15311,1281],{},[87,15313,15314],{"class":89,"line":109},[87,15315,1286],{},[10,15317,1289],{},[348,15319,1292],{"id":1292},[10,15321,1295,15322,1298],{},[33,15323,280],{},[10,15325,1301],{},[348,15327,1304],{"id":1304},[10,15329,1307],{},[14,15331,1311],{"id":1310},[10,15333,15334],{},[26,15335],{"alt":1316,"src":1317},[10,15337,1320],{},[45,15339,15340,15342,15344,15346,15348,15350,15352,15354],{},[48,15341,1325],{},[48,15343,1328],{},[48,15345,1331],{},[48,15347,1334],{},[48,15349,1337],{},[48,15351,1340],{},[48,15353,1343],{},[48,15355,1346],{},[10,15357,1349],{},[14,15359,1353],{"id":1352},[10,15361,1356],{},[10,15363,1359],{},[14,15365,1363],{"id":1362},[10,15367,1366],{},[10,15369,1369],{},[10,15371,1372],{},[14,15373,1375],{"id":1375},[10,15375,1378],{},[10,15377,1381],{},[232,15379,1384],{},{"title":83,"searchDepth":96,"depth":96,"links":15381},[15382,15383,15384,15391,15392,15393,15394],{"id":1093,"depth":96,"text":1094},{"id":1183,"depth":96,"text":1184},{"id":1240,"depth":96,"text":1241,"children":15385},[15386,15387,15388,15389,15390],{"id":1244,"depth":103,"text":1244},{"id":1250,"depth":103,"text":1250},{"id":1256,"depth":103,"text":1256},{"id":1292,"depth":103,"text":1292},{"id":1304,"depth":103,"text":1304},{"id":1310,"depth":96,"text":1311},{"id":1352,"depth":96,"text":1353},{"id":1362,"depth":96,"text":1363},{"id":1375,"depth":96,"text":1375},{},{"title":1076,"description":83},[245,1408,1409],{"id":262,"title":263,"body":15399,"category":245,"cover":246,"description":83,"extension":247,"meta":15978,"navigation":99,"path":1064,"pinned":250,"publishedAt":1065,"seo":15979,"slug":1067,"stem":1068,"summary":1069,"tags":15980,"updatedAt":1065,"visible":99,"__hash__":1073},{"type":7,"value":15400,"toc":15954},[15401,15403,15405,15407,15411,15413,15415,15439,15451,15453,15455,15460,15464,15468,15480,15484,15488,15492,15494,15528,15530,15534,15538,15540,15562,15592,15604,15614,15622,15624,15630,15640,15642,15647,15651,15653,15667,15673,15693,15695,15697,15699,15709,15713,15715,15724,15728,15730,15732,15752,15756,15758,15760,15762,15764,15784,15786,15788,15790,15816,15818,15834,15836,15852,15856,15858,15860,15880,15882,15884,15886,15890,15900,15902,15904,15906,15916,15924,15926,15928,15942,15952],[14,15402,268],{"id":268},[10,15404,271],{},[10,15406,274],{},[10,15408,277,15409,281],{},[33,15410,280],{},[14,15412,284],{"id":284},[10,15414,287],{},[289,15416,15417,15419],{},[10,15418,293],{},[289,15420,15421,15427,15429,15433,15435],{},[10,15422,298,15423,302,15425,306],{},[33,15424,301],{},[33,15426,305],{},[10,15428,309],{},[10,15430,312,15431,317],{},[314,15432,316],{},[10,15434,320],{},[10,15436,15437],{},[26,15438],{"alt":325,"src":326},[289,15440,15441,15443],{},[10,15442,331],{},[289,15444,15445,15447],{},[10,15446,336],{},[10,15448,15449],{},[26,15450],{"alt":341,"src":342},[14,15452,346],{"id":345},[348,15454,351],{"id":350},[10,15456,354,15457,362],{},[356,15458,361],{"href":358,"rel":15459},[360],[289,15461,15462],{},[10,15463,367],{},[10,15465,15466],{},[26,15467],{"alt":372,"src":373},[45,15469,15470,15474,15478],{},[48,15471,378,15472,382],{},[314,15473,381],{},[48,15475,385,15476,382],{},[314,15477,388],{},[48,15479,391],{},[10,15481,15482],{},[26,15483],{"alt":396,"src":397},[289,15485,15486],{},[10,15487,402],{},[10,15489,15490],{},[26,15491],{"alt":407,"src":408},[348,15493,412],{"id":411},[289,15495,15496,15500,15504,15524],{},[289,15497,15498],{},[10,15499,419],{},[10,15501,422,15502,426],{},[314,15503,425],{},[78,15505,15506],{"className":80,"code":429,"language":82,"meta":83,"style":83},[33,15507,15508,15512,15516,15520],{"__ignoreMap":83},[87,15509,15510],{"class":89,"line":90},[87,15511,436],{},[87,15513,15514],{"class":89,"line":96},[87,15515,441],{},[87,15517,15518],{"class":89,"line":103},[87,15519,446],{},[87,15521,15522],{"class":89,"line":109},[87,15523,451],{},[10,15525,454,15526,458],{},[314,15527,457],{},[10,15529,461],{},[10,15531,464,15532,467],{},[33,15533,82],{},[10,15535,15536],{},[26,15537],{"alt":472,"src":473},[10,15539,476],{},[289,15541,15542,15544,15548],{},[10,15543,481],{},[10,15545,15546],{},[314,15547,486],{},[289,15549,15550,15554,15558],{},[10,15551,491,15552,494],{},[33,15553,82],{},[10,15555,497,15556,500],{},[33,15557,82],{},[10,15559,503,15560,507],{},[314,15561,506],{},[289,15563,15564,15566,15570],{},[10,15565,512],{},[10,15567,15568],{},[314,15569,517],{},[289,15571,15572,15578,15586,15588],{},[10,15573,15574,525,15576,529],{},[33,15575,524],{},[33,15577,528],{},[10,15579,532,15580,535,15582,539,15584,543],{},[33,15581,524],{},[314,15583,538],{},[314,15585,542],{},[10,15587,546],{},[10,15589,15590,552],{},[314,15591,551],{},[289,15593,15594,15596],{},[10,15595,557],{},[289,15597,15598,15602],{},[10,15599,562,15600,566],{},[314,15601,565],{},[10,15603,569],{},[289,15605,15606,15610],{},[10,15607,574,15608],{},[314,15609,577],{},[10,15611,15612],{},[26,15613],{"alt":582,"src":583},[289,15615,15616,15618],{},[10,15617,588],{},[10,15619,15620],{},[26,15621],{"alt":582,"src":593},[348,15623,597],{"id":596},[10,15625,600,15626,604,15628,608],{},[33,15627,603],{},[33,15629,607],{},[78,15631,15632],{"className":611,"code":612,"language":613,"meta":83,"style":83},[33,15633,15634],{"__ignoreMap":83},[87,15635,15636,15638],{"class":89,"line":90},[87,15637,82],{"class":620},[87,15639,624],{"class":623},[10,15641,627],{},[78,15643,15645],{"className":15644,"code":631,"language":156,"meta":83},[154],[33,15646,631],{"__ignoreMap":83},[10,15648,15649],{},[26,15650],{"alt":582,"src":638},[10,15652,641],{},[78,15654,15655],{"className":611,"code":644,"language":613,"meta":83,"style":83},[33,15656,15657],{"__ignoreMap":83},[87,15658,15659,15661,15663,15665],{"class":89,"line":90},[87,15660,82],{"class":620},[87,15662,653],{"class":623},[87,15664,657],{"class":656},[87,15666,624],{"class":623},[10,15668,662,15669,665,15671,669],{},[33,15670,82],{},[33,15672,668],{},[78,15674,15675],{"className":611,"code":672,"language":613,"meta":83,"style":83},[33,15676,15677,15683],{"__ignoreMap":83},[87,15678,15679,15681],{"class":89,"line":90},[87,15680,528],{"class":620},[87,15682,624],{"class":623},[87,15684,15685,15687,15689,15691],{"class":89,"line":96},[87,15686,528],{"class":620},[87,15688,653],{"class":623},[87,15690,657],{"class":656},[87,15692,624],{"class":623},[14,15694,694],{"id":693},[348,15696,698],{"id":697},[10,15698,701],{},[78,15700,15701],{"className":611,"code":704,"language":613,"meta":83,"style":83},[33,15702,15703],{"__ignoreMap":83},[87,15704,15705,15707],{"class":89,"line":90},[87,15706,711],{"class":620},[87,15708,624],{"class":623},[10,15710,716,15711,720],{},[33,15712,719],{},[348,15714,724],{"id":723},[10,15716,354,15717,732,15720,382,15722,739],{},[356,15718,731],{"href":729,"rel":15719},[360],[314,15721,735],{},[33,15723,738],{},[10,15725,742,15726,746],{},[33,15727,745],{},[348,15729,750],{"id":749},[10,15731,753],{},[78,15733,15734],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,15735,15736,15742],{"__ignoreMap":83},[87,15737,15738,15740],{"class":89,"line":90},[87,15739,711],{"class":620},[87,15741,624],{"class":623},[87,15743,15744,15746,15748,15750],{"class":89,"line":96},[87,15745,711],{"class":620},[87,15747,653],{"class":623},[87,15749,657],{"class":656},[87,15751,624],{"class":623},[10,15753,777,15754,780],{},[33,15755,711],{},[14,15757,784],{"id":783},[10,15759,787],{},[348,15761,791],{"id":790},[10,15763,794],{},[78,15765,15766],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,15767,15768,15774],{"__ignoreMap":83},[87,15769,15770,15772],{"class":89,"line":90},[87,15771,711],{"class":620},[87,15773,624],{"class":623},[87,15775,15776,15778,15780,15782],{"class":89,"line":96},[87,15777,711],{"class":620},[87,15779,653],{"class":623},[87,15781,657],{"class":656},[87,15783,624],{"class":623},[10,15785,817],{},[348,15787,821],{"id":820},[10,15789,824],{},[78,15791,15792],{"className":611,"code":827,"language":613,"meta":83,"style":83},[33,15793,15794,15802],{"__ignoreMap":83},[87,15795,15796,15798,15800],{"class":89,"line":90},[87,15797,834],{"class":620},[87,15799,837],{"class":656},[87,15801,840],{"class":656},[87,15803,15804,15806,15808,15810,15812,15814],{"class":89,"line":96},[87,15805,834],{"class":620},[87,15807,837],{"class":656},[87,15809,849],{"class":656},[87,15811,852],{"class":656},[87,15813,855],{"class":656},[87,15815,858],{"class":656},[10,15817,861],{},[78,15819,15820],{"className":611,"code":864,"language":613,"meta":83,"style":83},[33,15821,15822],{"__ignoreMap":83},[87,15823,15824,15826,15828,15830,15832],{"class":89,"line":90},[87,15825,834],{"class":620},[87,15827,873],{"class":656},[87,15829,849],{"class":656},[87,15831,852],{"class":656},[87,15833,880],{"class":656},[10,15835,883],{},[78,15837,15838],{"className":611,"code":886,"language":613,"meta":83,"style":83},[33,15839,15840],{"__ignoreMap":83},[87,15841,15842,15844,15846,15848,15850],{"class":89,"line":90},[87,15843,834],{"class":620},[87,15845,895],{"class":656},[87,15847,898],{"class":623},[87,15849,901],{"class":656},[87,15851,904],{"class":656},[10,15853,15854,909],{},[33,15855,834],{},[348,15857,913],{"id":912},[10,15859,916],{},[78,15861,15862],{"className":611,"code":756,"language":613,"meta":83,"style":83},[33,15863,15864,15870],{"__ignoreMap":83},[87,15865,15866,15868],{"class":89,"line":90},[87,15867,711],{"class":620},[87,15869,624],{"class":623},[87,15871,15872,15874,15876,15878],{"class":89,"line":96},[87,15873,711],{"class":620},[87,15875,653],{"class":623},[87,15877,657],{"class":656},[87,15879,624],{"class":623},[10,15881,939],{},[14,15883,942],{"id":942},[348,15885,946],{"id":945},[10,15887,949,15888,953],{},[33,15889,952],{},[166,15891,15892,15896,15898],{},[48,15893,958,15894,961],{},[33,15895,668],{},[48,15897,964],{},[48,15899,967],{},[10,15901,970],{},[348,15903,974],{"id":973},[10,15905,977],{},[78,15907,15908],{"className":611,"code":704,"language":613,"meta":83,"style":83},[33,15909,15910],{"__ignoreMap":83},[87,15911,15912,15914],{"class":89,"line":90},[87,15913,711],{"class":620},[87,15915,624],{"class":623},[10,15917,990,15918,993,15920,996,15922,382],{},[33,15919,711],{},[33,15921,82],{},[33,15923,711],{},[348,15925,1002],{"id":1001},[10,15927,1005],{},[78,15929,15930],{"className":611,"code":1008,"language":613,"meta":83,"style":83},[33,15931,15932],{"__ignoreMap":83},[87,15933,15934,15936,15938,15940],{"class":89,"line":90},[87,15935,711],{"class":620},[87,15937,653],{"class":623},[87,15939,657],{"class":656},[87,15941,624],{"class":623},[10,15943,1023,15944,1026,15946,202,15948,1031,15950,1035],{},[33,15945,711],{},[33,15947,82],{},[33,15949,528],{},[33,15951,1034],{},[232,15953,1038],{},{"title":83,"searchDepth":96,"depth":96,"links":15955},[15956,15957,15958,15963,15968,15973],{"id":268,"depth":96,"text":268},{"id":284,"depth":96,"text":284},{"id":345,"depth":96,"text":346,"children":15959},[15960,15961,15962],{"id":350,"depth":103,"text":351},{"id":411,"depth":103,"text":412},{"id":596,"depth":103,"text":597},{"id":693,"depth":96,"text":694,"children":15964},[15965,15966,15967],{"id":697,"depth":103,"text":698},{"id":723,"depth":103,"text":724},{"id":749,"depth":103,"text":750},{"id":783,"depth":96,"text":784,"children":15969},[15970,15971,15972],{"id":790,"depth":103,"text":791},{"id":820,"depth":103,"text":821},{"id":912,"depth":103,"text":913},{"id":942,"depth":96,"text":942,"children":15974},[15975,15976,15977],{"id":945,"depth":103,"text":946},{"id":973,"depth":103,"text":974},{"id":1001,"depth":103,"text":1002},{},{"title":263,"description":83},[245,1071,1072],1786973365463]