[{"data":1,"prerenderedAt":15945},["ShallowReactive",2],{"post-python-list-comprehension":3,"sidebar-posts":203,"post-related-source":9136},{"id":4,"title":5,"body":6,"category":188,"cover":189,"description":12,"extension":190,"meta":191,"navigation":78,"path":192,"pinned":193,"publishedAt":194,"seo":195,"slug":196,"stem":197,"summary":198,"tags":199,"updatedAt":194,"visible":78,"__hash__":202},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":8,"toc":178},"minimark",[9,13,17,20,23,30,33,36,49,52,55,109,112,120,123,126,139,142,154,157,165,168,171,174],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,31,32],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,44,45],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,47,48],{},"推导式创建新列表，不修改输入列表。",[14,50,51],{"id":51},"跟着示例运行",[10,53,54],{},"把下面代码保存到本课脚本并运行：",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-python shiki shiki-themes github-dark","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","python","",[63,64,65,73,80,86,92,97,103],"code",{"__ignoreMap":61},[66,67,70],"span",{"class":68,"line":69},"line",1,[66,71,72],{},"numbers = [1, 2, 3, 4, 5]\n",[66,74,76],{"class":68,"line":75},2,[66,77,79],{"emptyLinePlaceholder":78},true,"\n",[66,81,83],{"class":68,"line":82},3,[66,84,85],{},"squares = [number * number for number in numbers]\n",[66,87,89],{"class":68,"line":88},4,[66,90,91],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[66,93,95],{"class":68,"line":94},5,[66,96,79],{"emptyLinePlaceholder":78},[66,98,100],{"class":68,"line":99},6,[66,101,102],{},"print(squares)\n",[66,104,106],{"class":68,"line":105},7,[66,107,108],{},"print(even_squares)\n",[10,110,111],{},"预期结果：",[56,113,118],{"className":114,"code":116,"language":117,"meta":61},[115],"language-text","[1, 4, 9, 16, 25]\n[4, 16]\n","text",[63,119,116],{"__ignoreMap":61},[10,121,122],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,124,125],{"id":125},"按执行顺序拆开看",[127,128,129,132],"ol",{},[40,130,131],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,133,134,135,138],{},"第二条先用 ",[63,136,137],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,140,141],{"id":141},"初学者容易混淆的地方",[37,143,144,151],{},[40,145,146,147,150],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[63,148,149],{},"for"," 开始找输入。",[40,152,153],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,155,156],{"id":156},"练习",[127,158,159,162],{},[40,160,161],{},"把字符串列表转换为长度列表。",[40,163,164],{},"筛选 1 到 20 中能被 3 整除的数。",[10,166,167],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,169,170],{"id":170},"本篇边界",[10,172,173],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,176,177],"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":61,"searchDepth":75,"depth":75,"links":179},[180,181,182,183,184,185,186,187],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",false,"2026-08-17",{"title":5,"description":12},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[188,200,201],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",[204,1018,1355,1489,1641,1820,2008,2173,2357,2539,2732,2963,3147,3324,3481,3652,3817,4032,4261,4442,4606,4795,4983,5104,5264,5461,5658,5872,6039,6283,6464,6669,6864,7048,7249,7539,7731,7960,8155,8375,8615,8819],{"id":205,"title":206,"body":207,"category":188,"cover":189,"description":61,"extension":190,"meta":1007,"navigation":78,"path":1008,"pinned":193,"publishedAt":1009,"seo":1010,"slug":1011,"stem":1012,"summary":1013,"tags":1014,"updatedAt":1009,"visible":78,"__hash__":1017},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":208,"toc":983},[209,212,215,218,225,228,231,270,286,290,295,306,311,317,335,341,346,352,356,402,405,411,417,420,451,496,513,527,537,541,552,568,571,577,582,585,603,613,634,638,642,645,657,664,668,683,690,694,697,718,724,728,731,735,738,758,761,765,768,802,805,824,827,848,853,857,860,880,883,886,890,897,911,914,918,921,931,942,946,949,964,980],[14,210,211],{"id":211},"引言",[10,213,214],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,216,217],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,219,220,221,224],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[63,222,223],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,226,227],{"id":227},"扫盲",[10,229,230],{},"那么这里有几个概念：",[232,233,234,237],"blockquote",{},[10,235,236],{},"为什么需要安装python解释器？",[232,238,239,250,253,261,264],{},[10,240,241,242,245,246,249],{},"我们写的代码，电脑其实看不懂，电脑只认识",[63,243,244],{},"0","和",[63,247,248],{},"1","组成的机器指令。",[10,251,252],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,254,255,256,260],{},"这样，我们就能用",[257,258,259],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,262,263],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,265,266],{},[26,267],{"alt":268,"src":269},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[232,271,272,275],{},[10,273,274],{},"pip又是什么？",[232,276,277,280],{},[10,278,279],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,281,282],{},[26,283],{"alt":284,"src":285},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,287,289],{"id":288},"windows-安装","Windows 安装",[291,292,294],"h3",{"id":293},"_1-下载官方安装程序","1. 下载官方安装程序",[10,296,297,298,305],{},"打开 ",[299,300,304],"a",{"href":301,"rel":302},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[303],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[232,307,308],{},[10,309,310],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,312,313],{},[26,314],{"alt":315,"src":316},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,318,319,326,332],{},[40,320,321,322,325],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[257,323,324],{},"Windows installer (64-bit)","。",[40,327,328,329,325],{},"搭载 ARM 处理器的 Windows 设备选择 ",[257,330,331],{},"Windows installer (ARM64)",[40,333,334],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,336,337],{},[26,338],{"alt":339,"src":340},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[232,342,343],{},[10,344,345],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,347,348],{},[26,349],{"alt":350,"src":351},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[291,353,355],{"id":354},"_2-安装并加入-path","2. 安装并加入 PATH",[232,357,358,363,370,395],{},[232,359,360],{},[10,361,362],{},"PATH 环境变量",[10,364,365,366,369],{},"Windows 有一个特殊的变量叫 ",[257,367,368],{},"PATH","，它里面存了一串文件夹路径，比如：",[56,371,373],{"className":58,"code":372,"language":60,"meta":61,"style":61},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[63,374,375,380,385,390],{"__ignoreMap":61},[66,376,377],{"class":68,"line":69},[66,378,379],{},"D:\\Python313\\\n",[66,381,382],{"class":68,"line":75},[66,383,384],{},"D:\\Python313\\Scripts\\\n",[66,386,387],{"class":68,"line":82},[66,388,389],{},"C:\\Windows\\System32\\\n",[66,391,392],{"class":68,"line":88},[66,393,394],{},"...\n",[10,396,397,398,401],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[257,399,400],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,403,404],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,406,407,408,410],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[63,409,60],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,412,413],{},[26,414],{"alt":415,"src":416},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,418,419],{},"对安装界面最底部的两个勾选项分别解释 :",[232,421,422,425,430],{},[10,423,424],{},"Add python.exe to PATH",[10,426,427],{},[257,428,429],{},"把 Python 添加到系统环境变量",[232,431,432,438,444],{},[10,433,434,435,437],{},"勾选后，你可以在命令行任意位置直接输入 ",[63,436,60],{}," 就能运行",[10,439,440,441,443],{},"不勾选的话，命令行输入 ",[63,442,60],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,445,446,447,450],{},"必须",[257,448,449],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[232,452,453,456,461],{},[10,454,455],{},"Use admin privileges when installing py.exe",[10,457,458],{},[257,459,460],{},"使用管理员权限安装 py.exe（Python 启动器）",[232,462,463,473,487,490],{},[10,464,465,468,469,472],{},[63,466,467],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[63,470,471],{},"py"," 来启动 Python。",[10,474,475,476,478,479,482,483,486],{},"勾选后，",[63,477,467],{}," 会安装到",[257,480,481],{},"系统级目录","，电脑上",[257,484,485],{},"所有用户账户","都能用",[10,488,489],{},"不勾选，只有当前用户能用",[10,491,492,495],{},[257,493,494],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[232,497,498,501],{},[10,499,500],{},"操作建议",[232,502,503,510],{},[10,504,505,506,509],{},"两个都勾上之后，再点 ",[257,507,508],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,511,512],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[232,514,515,521],{},[10,516,517,518],{},"Python 安装的",[257,519,520],{},"可选功能页",[10,522,523],{},[26,524],{"alt":525,"src":526},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[232,528,529,532],{},[10,530,531],{},"高级选项页",[10,533,534],{},[26,535],{"alt":525,"src":536},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[291,538,540],{"id":539},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,542,543,544,547,548,551],{},"按 ",[63,545,546],{},"Win + R","，输入 ",[63,549,550],{},"cmd"," 并回车，然后执行：",[56,553,557],{"className":554,"code":555,"language":556,"meta":61,"style":61},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[63,558,559],{"__ignoreMap":61},[66,560,561,564],{"class":68,"line":69},[66,562,60],{"class":563},"svObZ",[66,565,567],{"class":566},"sDLfK"," --version\n",[10,569,570],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[56,572,575],{"className":573,"code":574,"language":117,"meta":61},[115],"Python 3.x.x\n",[63,576,574],{"__ignoreMap":61},[10,578,579],{},[26,580],{"alt":525,"src":581},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,583,584],{},"继续检查 pip：",[56,586,588],{"className":554,"code":587,"language":556,"meta":61,"style":61},"python -m pip --version\n",[63,589,590],{"__ignoreMap":61},[66,591,592,594,597,601],{"class":68,"line":69},[66,593,60],{"class":563},[66,595,596],{"class":566}," -m",[66,598,600],{"class":599},"sU2Wk"," pip",[66,602,567],{"class":566},[10,604,605,606,608,609,612],{},"如果 ",[63,607,60],{}," 无法识别，但 ",[63,610,611],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[56,614,616],{"className":554,"code":615,"language":556,"meta":61,"style":61},"py --version\npy -m pip --version\n",[63,617,618,624],{"__ignoreMap":61},[66,619,620,622],{"class":68,"line":69},[66,621,471],{"class":563},[66,623,567],{"class":566},[66,625,626,628,630,632],{"class":68,"line":75},[66,627,471],{"class":563},[66,629,596],{"class":566},[66,631,600],{"class":599},[66,633,567],{"class":566},[14,635,637],{"id":636},"macos-安装","macOS 安装",[291,639,641],{"id":640},"_1-先检查现有环境","1. 先检查现有环境",[10,643,644],{},"打开“终端”应用，执行：",[56,646,648],{"className":554,"code":647,"language":556,"meta":61,"style":61},"python3 --version\n",[63,649,650],{"__ignoreMap":61},[66,651,652,655],{"class":68,"line":69},[66,653,654],{"class":563},"python3",[66,656,567],{"class":566},[10,658,659,660,663],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[63,661,662],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[291,665,667],{"id":666},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,669,297,670,675,676,325,679,682],{},[299,671,674],{"href":672,"rel":673},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[303],"Python macOS 下载页","，下载当前稳定版的 ",[257,677,678],{},"macOS 64-bit universal2 installer",[63,680,681],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,684,685,686,689],{},"下载完成后打开 ",[63,687,688],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[291,691,693],{"id":692},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,695,696],{},"安装完成后重新打开终端，执行：",[56,698,700],{"className":554,"code":699,"language":556,"meta":61,"style":61},"python3 --version\npython3 -m pip --version\n",[63,701,702,708],{"__ignoreMap":61},[66,703,704,706],{"class":68,"line":69},[66,705,654],{"class":563},[66,707,567],{"class":566},[66,709,710,712,714,716],{"class":68,"line":75},[66,711,654],{"class":563},[66,713,596],{"class":566},[66,715,600],{"class":599},[66,717,567],{"class":566},[10,719,720,721,723],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[63,722,654],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,725,727],{"id":726},"linux-安装","Linux 安装",[10,729,730],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[291,732,734],{"id":733},"_1-检查是否已经安装","1. 检查是否已经安装",[10,736,737],{},"打开终端，执行：",[56,739,740],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,741,742,748],{"__ignoreMap":61},[66,743,744,746],{"class":68,"line":69},[66,745,654],{"class":563},[66,747,567],{"class":566},[66,749,750,752,754,756],{"class":68,"line":75},[66,751,654],{"class":563},[66,753,596],{"class":566},[66,755,600],{"class":599},[66,757,567],{"class":566},[10,759,760],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[291,762,764],{"id":763},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,766,767],{},"Ubuntu 或 Debian：",[56,769,771],{"className":554,"code":770,"language":556,"meta":61,"style":61},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[63,772,773,784],{"__ignoreMap":61},[66,774,775,778,781],{"class":68,"line":69},[66,776,777],{"class":563},"sudo",[66,779,780],{"class":599}," apt",[66,782,783],{"class":599}," update\n",[66,785,786,788,790,793,796,799],{"class":68,"line":75},[66,787,777],{"class":563},[66,789,780],{"class":599},[66,791,792],{"class":599}," install",[66,794,795],{"class":599}," python3",[66,797,798],{"class":599}," python3-pip",[66,800,801],{"class":599}," python3-venv\n",[10,803,804],{},"Fedora：",[56,806,808],{"className":554,"code":807,"language":556,"meta":61,"style":61},"sudo dnf install python3 python3-pip\n",[63,809,810],{"__ignoreMap":61},[66,811,812,814,817,819,821],{"class":68,"line":69},[66,813,777],{"class":563},[66,815,816],{"class":599}," dnf",[66,818,792],{"class":599},[66,820,795],{"class":599},[66,822,823],{"class":599}," python3-pip\n",[10,825,826],{},"Arch Linux：",[56,828,830],{"className":554,"code":829,"language":556,"meta":61,"style":61},"sudo pacman -S python python-pip\n",[63,831,832],{"__ignoreMap":61},[66,833,834,836,839,842,845],{"class":68,"line":69},[66,835,777],{"class":563},[66,837,838],{"class":599}," pacman",[66,840,841],{"class":566}," -S",[66,843,844],{"class":599}," python",[66,846,847],{"class":599}," python-pip\n",[10,849,850,852],{},[63,851,777],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[291,854,856],{"id":855},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,858,859],{},"安装结束后执行：",[56,861,862],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,863,864,870],{"__ignoreMap":61},[66,865,866,868],{"class":68,"line":69},[66,867,654],{"class":563},[66,869,567],{"class":566},[66,871,872,874,876,878],{"class":68,"line":75},[66,873,654],{"class":563},[66,875,596],{"class":566},[66,877,600],{"class":599},[66,879,567],{"class":566},[10,881,882],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,884,885],{"id":885},"常见问题",[291,887,889],{"id":888},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,891,892,893,896],{},"先关闭当前命令提示符并重新打开，再执行 ",[63,894,895],{},"python --version","。如果仍然失败，按下面的顺序检查：",[127,898,899,905,908],{},[40,900,901,902,904],{},"执行 ",[63,903,611],{},"，确认 Python Launcher 是否可用。",[40,906,907],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,909,910],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,912,913],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[291,915,917],{"id":916},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,919,920],{},"先尝试：",[56,922,923],{"className":554,"code":647,"language":556,"meta":61,"style":61},[63,924,925],{"__ignoreMap":61},[66,926,927,929],{"class":68,"line":69},[66,928,654],{"class":563},[66,930,567],{"class":566},[10,932,933,934,936,937,939,940,325],{},"在这两个系统中，只有 ",[63,935,654],{}," 命令而没有 ",[63,938,60],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[63,941,654],{},[291,943,945],{"id":944},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,947,948],{},"先使用模块方式检查：",[56,950,952],{"className":554,"code":951,"language":556,"meta":61,"style":61},"python3 -m pip --version\n",[63,953,954],{"__ignoreMap":61},[66,955,956,958,960,962],{"class":68,"line":69},[66,957,654],{"class":563},[66,959,596],{"class":566},[66,961,600],{"class":599},[66,963,567],{"class":566},[10,965,966,967,969,970,972,973,975,976,979],{},"Windows 用户将命令中的 ",[63,968,654],{}," 换成 ",[63,971,60],{}," 或 ",[63,974,471],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[63,977,978],{},"python3-pip","；不要直接使用其他系统的安装命令。",[175,981,982],{},"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":61,"searchDepth":75,"depth":75,"links":984},[985,986,987,992,997,1002],{"id":211,"depth":75,"text":211},{"id":227,"depth":75,"text":227},{"id":288,"depth":75,"text":289,"children":988},[989,990,991],{"id":293,"depth":82,"text":294},{"id":354,"depth":82,"text":355},{"id":539,"depth":82,"text":540},{"id":636,"depth":75,"text":637,"children":993},[994,995,996],{"id":640,"depth":82,"text":641},{"id":666,"depth":82,"text":667},{"id":692,"depth":82,"text":693},{"id":726,"depth":75,"text":727,"children":998},[999,1000,1001],{"id":733,"depth":82,"text":734},{"id":763,"depth":82,"text":764},{"id":855,"depth":82,"text":856},{"id":885,"depth":75,"text":885,"children":1003},[1004,1005,1006],{"id":888,"depth":82,"text":889},{"id":916,"depth":82,"text":917},{"id":944,"depth":82,"text":945},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":206,"description":61},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[188,1015,1016],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1019,"title":1020,"body":1021,"category":188,"cover":1028,"description":61,"extension":190,"meta":1344,"navigation":78,"path":1345,"pinned":193,"publishedAt":1346,"seo":1347,"slug":1348,"stem":1349,"summary":1350,"tags":1351,"updatedAt":1346,"visible":78,"__hash__":1354},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1022,"toc":1329},[1023,1029,1032,1035,1039,1042,1066,1069,1075,1078,1081,1115,1125,1129,1136,1139,1164,1167,1179,1182,1186,1189,1192,1195,1198,1201,1204,1207,1231,1234,1237,1243,1246,1249,1252,1256,1262,1265,1291,1294,1298,1301,1304,1308,1311,1314,1317,1320,1323,1326],[10,1024,1025],{},[26,1026],{"alt":1027,"src":1028},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1030,1031],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1033,1034],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1036,1038],{"id":1037},"python-代码是什么样的","Python 代码是什么样的",[10,1040,1041],{},"下面是一段简单的 Python 代码：",[56,1043,1045],{"className":58,"code":1044,"language":60,"meta":61,"style":61},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[63,1046,1047,1052,1057,1061],{"__ignoreMap":61},[66,1048,1049],{"class":68,"line":69},[66,1050,1051],{},"name = \"Python\"\n",[66,1053,1054],{"class":68,"line":75},[66,1055,1056],{},"year = 2026\n",[66,1058,1059],{"class":68,"line":82},[66,1060,79],{"emptyLinePlaceholder":78},[66,1062,1063],{"class":68,"line":88},[66,1064,1065],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1067,1068],{},"运行结果：",[56,1070,1073],{"className":1071,"code":1072,"language":117,"meta":61},[115],"正在学习 Python，当前年份是 2026\n",[63,1074,1072],{"__ignoreMap":61},[10,1076,1077],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1079,1080],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[56,1082,1084],{"className":58,"code":1083,"language":60,"meta":61,"style":61},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[63,1085,1086,1091,1095,1100,1105,1110],{"__ignoreMap":61},[66,1087,1088],{"class":68,"line":69},[66,1089,1090],{},"score = 85\n",[66,1092,1093],{"class":68,"line":75},[66,1094,79],{"emptyLinePlaceholder":78},[66,1096,1097],{"class":68,"line":82},[66,1098,1099],{},"if score >= 60:\n",[66,1101,1102],{"class":68,"line":88},[66,1103,1104],{},"    print(\"成绩合格\")\n",[66,1106,1107],{"class":68,"line":94},[66,1108,1109],{},"else:\n",[66,1111,1112],{"class":68,"line":99},[66,1113,1114],{},"    print(\"需要继续学习\")\n",[10,1116,1117,1120,1121,1124],{},[63,1118,1119],{},"if"," 和 ",[63,1122,1123],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1126,1128],{"id":1127},"python-如何运行代码","Python 如何运行代码",[10,1130,1131,1132,1135],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[63,1133,1134],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1137,1138],{},"交互式环境适合快速验证一个表达式：",[56,1140,1142],{"className":58,"code":1141,"language":60,"meta":61,"style":61},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[63,1143,1144,1149,1154,1159],{"__ignoreMap":61},[66,1145,1146],{"class":68,"line":69},[66,1147,1148],{},">>> 10 + 20\n",[66,1150,1151],{"class":68,"line":75},[66,1152,1153],{},"30\n",[66,1155,1156],{"class":68,"line":82},[66,1157,1158],{},">>> \"Python\".lower()\n",[66,1160,1161],{"class":68,"line":88},[66,1162,1163],{},"'python'\n",[10,1165,1166],{},"需要保存和重复运行的程序，则可以写入文件：",[56,1168,1170],{"className":554,"code":1169,"language":556,"meta":61,"style":61},"python3 hello.py\n",[63,1171,1172],{"__ignoreMap":61},[66,1173,1174,1176],{"class":68,"line":69},[66,1175,654],{"class":563},[66,1177,1178],{"class":599}," hello.py\n",[10,1180,1181],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1183,1185],{"id":1184},"python-的特点","Python 的特点",[291,1187,1188],{"id":1188},"语法相对简洁",[10,1190,1191],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[291,1193,1194],{"id":1194},"支持多种编程方式",[10,1196,1197],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[291,1199,1200],{"id":1200},"标准库比较完整",[10,1202,1203],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1205,1206],{},"例如，获取当前时间：",[56,1208,1210],{"className":58,"code":1209,"language":60,"meta":61,"style":61},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[63,1211,1212,1217,1221,1226],{"__ignoreMap":61},[66,1213,1214],{"class":68,"line":69},[66,1215,1216],{},"from datetime import datetime\n",[66,1218,1219],{"class":68,"line":75},[66,1220,79],{"emptyLinePlaceholder":78},[66,1222,1223],{"class":68,"line":82},[66,1224,1225],{},"now = datetime.now()\n",[66,1227,1228],{"class":68,"line":88},[66,1229,1230],{},"print(now)\n",[10,1232,1233],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[291,1235,1236],{"id":1236},"第三方工具丰富",[10,1238,1239,1240,1242],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[63,1241,223],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1244,1245],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[291,1247,1248],{"id":1248},"支持多个操作系统",[10,1250,1251],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1253,1255],{"id":1254},"python-可以做什么","Python 可以做什么",[10,1257,1258],{},[26,1259],{"alt":1260,"src":1261},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1263,1264],{},"Python 的应用范围比较广，常见方向包括：",[37,1266,1267,1270,1273,1276,1279,1282,1285,1288],{},[40,1268,1269],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1271,1272],{},"开发网站后端和 API 服务；",[40,1274,1275],{},"进行数据清洗、统计分析和图表展示；",[40,1277,1278],{},"编写网络爬虫和信息采集工具；",[40,1280,1281],{},"开发自动化测试程序；",[40,1283,1284],{},"进行机器学习和人工智能开发；",[40,1286,1287],{},"编写运维、监控和辅助开发工具；",[40,1289,1290],{},"开发部分桌面应用和插件。",[10,1292,1293],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1295,1297],{"id":1296},"python-的发展","Python 的发展",[10,1299,1300],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1302,1303],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1305,1307],{"id":1306},"python-也有局限","Python 也有局限",[10,1309,1310],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1312,1313],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1315,1316],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1318,1319],{"id":1319},"写在最后",[10,1321,1322],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1324,1325],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[175,1327,1328],{},"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":61,"searchDepth":75,"depth":75,"links":1330},[1331,1332,1333,1340,1341,1342,1343],{"id":1037,"depth":75,"text":1038},{"id":1127,"depth":75,"text":1128},{"id":1184,"depth":75,"text":1185,"children":1334},[1335,1336,1337,1338,1339],{"id":1188,"depth":82,"text":1188},{"id":1194,"depth":82,"text":1194},{"id":1200,"depth":82,"text":1200},{"id":1236,"depth":82,"text":1236},{"id":1248,"depth":82,"text":1248},{"id":1254,"depth":75,"text":1255},{"id":1296,"depth":75,"text":1297},{"id":1306,"depth":75,"text":1307},{"id":1319,"depth":75,"text":1319},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1020,"description":61},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[188,1352,1353],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1356,"title":1357,"body":1358,"category":188,"cover":189,"description":1362,"extension":190,"meta":1480,"navigation":78,"path":1481,"pinned":193,"publishedAt":194,"seo":1482,"slug":1483,"stem":1484,"summary":1485,"tags":1486,"updatedAt":194,"visible":78,"__hash__":1488},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1359,"toc":1470},[1360,1363,1365,1368,1370,1376,1381,1383,1397,1399,1401,1410,1412,1418,1420,1422,1438,1440,1451,1453,1461,1463,1465,1468],[10,1361,1362],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1364,16],{"id":16},[10,1366,1367],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1369,22],{"id":22},[10,1371,1372],{},[26,1373],{"alt":1374,"src":1375},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1377,1378,1380],{},[63,1379,1134],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1382,35],{"id":35},[37,1384,1385,1391,1394],{},[40,1386,1387,1388,1390],{},"源代码是人编写的文本，通常保存在 ",[63,1389,1134],{}," 文件中。",[40,1392,1393],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1395,1396],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1398,51],{"id":51},[10,1400,54],{},[56,1402,1404],{"className":58,"code":1403,"language":60,"meta":61,"style":61},"print(\"你好，Python\")\n",[63,1405,1406],{"__ignoreMap":61},[66,1407,1408],{"class":68,"line":69},[66,1409,1403],{},[10,1411,111],{},[56,1413,1416],{"className":1414,"code":1415,"language":117,"meta":61},[115],"你好，Python\n",[63,1417,1415],{"__ignoreMap":61},[10,1419,122],{},[14,1421,125],{"id":125},[127,1423,1424,1431],{},[40,1425,1426,1427,1430],{},"终端启动解释器后，解释器读取 ",[63,1428,1429],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1432,1433,1434,1437],{},"字符串对象先准备好，再交给 ",[63,1435,1436],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1439,141],{"id":141},[37,1441,1442,1445],{},[40,1443,1444],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1446,1447,1448,1450],{},"认为 ",[63,1449,1134],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1452,156],{"id":156},[127,1454,1455,1458],{},[40,1456,1457],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1459,1460],{},"把示例文字改成自己的学习目标并重新运行。",[10,1462,167],{},[14,1464,170],{"id":170},[10,1466,1467],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,1469,177],{},{"title":61,"searchDepth":75,"depth":75,"links":1471},[1472,1473,1474,1475,1476,1477,1478,1479],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1357,"description":1362},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[188,1352,1487],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1490,"title":1491,"body":1492,"category":188,"cover":189,"description":1496,"extension":190,"meta":1632,"navigation":78,"path":1633,"pinned":193,"publishedAt":194,"seo":1634,"slug":1635,"stem":1636,"summary":1637,"tags":1638,"updatedAt":194,"visible":78,"__hash__":1640},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1493,"toc":1622},[1494,1497,1499,1502,1504,1510,1516,1518,1533,1535,1538,1558,1560,1566,1568,1570,1583,1585,1599,1601,1612,1614,1616,1619],[10,1495,1496],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1498,16],{"id":16},[10,1500,1501],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1503,22],{"id":22},[10,1505,1506],{},[26,1507],{"alt":1508,"src":1509},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1511,1512,1513,1515],{},"终端收到 ",[63,1514,654],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1517,35],{"id":35},[37,1519,1520,1523,1526],{},[40,1521,1522],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1524,1525],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1527,1528,1529,1532],{},"检查 pip 时使用 ",[63,1530,1531],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1534,51],{"id":51},[10,1536,1537],{},"在 macOS 终端执行：",[56,1539,1540],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,1541,1542,1548],{"__ignoreMap":61},[66,1543,1544,1546],{"class":68,"line":69},[66,1545,654],{"class":563},[66,1547,567],{"class":566},[66,1549,1550,1552,1554,1556],{"class":68,"line":75},[66,1551,654],{"class":563},[66,1553,596],{"class":566},[66,1555,600],{"class":599},[66,1557,567],{"class":566},[10,1559,111],{},[56,1561,1564],{"className":1562,"code":1563,"language":117,"meta":61},[115],"Python 3.14.x\npip 版本信息与安装路径\n",[63,1565,1563],{"__ignoreMap":61},[10,1567,122],{},[14,1569,125],{"id":125},[127,1571,1572,1578],{},[40,1573,1574,1577],{},[63,1575,1576],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1579,1580,1582],{},[63,1581,662],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1584,141],{"id":141},[37,1586,1587,1593],{},[40,1588,1589,1590,1592],{},"看到系统已有 ",[63,1591,654],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1594,1595,1596,1598],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[63,1597,654],{},"，不修改系统自带工具。",[14,1600,156],{"id":156},[127,1602,1603,1609],{},[40,1604,901,1605,1608],{},[63,1606,1607],{},"which python3","，记录当前解释器路径。",[40,1610,1611],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1613,167],{},[14,1615,170],{"id":170},[10,1617,1618],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,1620,1621],{},"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":61,"searchDepth":75,"depth":75,"links":1623},[1624,1625,1626,1627,1628,1629,1630,1631],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1491,"description":1496},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[188,1639,1015],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1642,"title":1643,"body":1644,"category":188,"cover":189,"description":1809,"extension":190,"meta":1810,"navigation":78,"path":1811,"pinned":193,"publishedAt":194,"seo":1812,"slug":1813,"stem":1814,"summary":1815,"tags":1816,"updatedAt":194,"visible":78,"__hash__":1819},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1645,"toc":1799},[1646,1652,1654,1657,1659,1665,1668,1670,1694,1696,1698,1725,1727,1733,1735,1737,1755,1757,1771,1773,1787,1789,1791,1797],[10,1647,1648,1649,1651],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[63,1650,1134],{}," 脚本。",[14,1653,16],{"id":16},[10,1655,1656],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1658,22],{"id":22},[10,1660,1661],{},[26,1662],{"alt":1663,"src":1664},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1666,1667],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1669,35],{"id":35},[37,1671,1672,1681,1688],{},[40,1673,1674,1675,1677,1678,325],{},"在终端输入 ",[63,1676,654],{}," 进入 REPL，提示符通常是 ",[63,1679,1680],{},">>>",[40,1682,1683,1684,1687],{},"输入 ",[63,1685,1686],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1689,1690,1691,1693],{},"需要保存、复查或多次运行的代码应写入 ",[63,1692,1134],{}," 文件。",[14,1695,51],{"id":51},[10,1697,54],{},[56,1699,1703],{"className":1700,"code":1701,"language":1702,"meta":61,"style":61},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[63,1704,1705,1710,1715,1720],{"__ignoreMap":61},[66,1706,1707],{"class":68,"line":69},[66,1708,1709],{},">>> 2 + 3\n",[66,1711,1712],{"class":68,"line":75},[66,1713,1714],{},"5\n",[66,1716,1717],{"class":68,"line":82},[66,1718,1719],{},">>> \"python\".upper()\n",[66,1721,1722],{"class":68,"line":88},[66,1723,1724],{},"'PYTHON'\n",[10,1726,111],{},[56,1728,1731],{"className":1729,"code":1730,"language":117,"meta":61},[115],"REPL 会直接显示表达式结果\n",[63,1732,1730],{"__ignoreMap":61},[10,1734,122],{},[14,1736,125],{"id":125},[127,1738,1739,1749],{},[40,1740,1741,1742,1745,1746,325],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[63,1743,1744],{},"2 + 3"," 能直接看到 ",[63,1747,1748],{},"5",[40,1750,1751,1752,1754],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[63,1753,1436],{}," 才会写到标准输出。",[14,1756,141],{"id":141},[37,1758,1759,1768],{},[40,1760,1761,1762,1764,1765,1767],{},"把提示符 ",[63,1763,1680],{}," 复制进 ",[63,1766,1134],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1769,1770],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1772,156],{"id":156},[127,1774,1775,1781],{},[40,1776,1777,1778,325],{},"在 REPL 计算 ",[63,1779,1780],{},"12 * 8",[40,1782,1783,1784,1786],{},"把同一表达式写入脚本；观察脚本中不调用 ",[63,1785,1436],{}," 时是否显示结果。",[10,1788,167],{},[14,1790,170],{"id":170},[10,1792,1793,1794,1796],{},"本篇目标是根据任务选择 REPL 或 ",[63,1795,1134],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,1798,177],{},{"title":61,"searchDepth":75,"depth":75,"links":1800},[1801,1802,1803,1804,1805,1806,1807,1808],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1643,"description":1809},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[188,1817,1818],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1821,"title":1822,"body":1823,"category":188,"cover":189,"description":1827,"extension":190,"meta":1998,"navigation":78,"path":1999,"pinned":193,"publishedAt":194,"seo":2000,"slug":2001,"stem":2002,"summary":2003,"tags":2004,"updatedAt":194,"visible":78,"__hash__":2007},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1824,"toc":1988},[1825,1828,1830,1833,1835,1841,1847,1849,1867,1869,1871,1916,1918,1924,1926,1928,1950,1952,1964,1966,1978,1980,1982,1985],[10,1826,1827],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1829,16],{"id":16},[10,1831,1832],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1834,22],{"id":22},[10,1836,1837],{},[26,1838],{"alt":1839,"src":1840},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1842,1843,1846],{},[63,1844,1845],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1848,35],{"id":35},[37,1850,1851,1854,1864],{},[40,1852,1853],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1855,1856,1859,1860,1863],{},[63,1857,1858],{},"pwd"," 显示当前目录，",[63,1861,1862],{},"ls"," 显示目录里的文件。",[40,1865,1866],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1868,51],{"id":51},[10,1870,1537],{},[56,1872,1874],{"className":554,"code":1873,"language":556,"meta":61,"style":61},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[63,1875,1876,1884,1891,1896,1910],{"__ignoreMap":61},[66,1877,1878,1881],{"class":68,"line":69},[66,1879,1880],{"class":563},"mkdir",[66,1882,1883],{"class":599}," python-study\n",[66,1885,1886,1889],{"class":68,"line":75},[66,1887,1888],{"class":566},"cd",[66,1890,1883],{"class":599},[66,1892,1893],{"class":68,"line":82},[66,1894,1895],{"class":566},"pwd\n",[66,1897,1898,1901,1904,1908],{"class":68,"line":88},[66,1899,1900],{"class":566},"printf",[66,1902,1903],{"class":599}," 'print(\"项目已经运行\")\\n'",[66,1905,1907],{"class":1906},"snl16"," >",[66,1909,1178],{"class":599},[66,1911,1912,1914],{"class":68,"line":94},[66,1913,654],{"class":563},[66,1915,1178],{"class":599},[10,1917,111],{},[56,1919,1922],{"className":1920,"code":1921,"language":117,"meta":61},[115],"项目已经运行\n",[63,1923,1921],{"__ignoreMap":61},[10,1925,122],{},[14,1927,125],{"id":125},[127,1929,1930,1941],{},[40,1931,1932,1934,1935,1937,1938,1940],{},[63,1933,1880],{}," 创建目录，",[63,1936,1888],{}," 改变终端当前目录，",[63,1939,1858],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1942,1943,1945,1946,1949],{},[63,1944,1845],{}," 会在当前目录寻找 ",[63,1947,1948],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1951,141],{"id":141},[37,1953,1954,1961],{},[40,1955,1956,1957,1120,1959,325],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[63,1958,1858],{},[63,1960,1862],{},[40,1962,1963],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1965,156],{"id":156},[127,1967,1968,1975],{},[40,1969,1970,1971,1974],{},"新建 ",[63,1972,1973],{},"lesson01.py"," 并输出课程编号。",[40,1976,1977],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1979,167],{},[14,1981,170],{"id":170},[10,1983,1984],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,1986,1987],{},"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":61,"searchDepth":75,"depth":75,"links":1989},[1990,1991,1992,1993,1994,1995,1996,1997],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1822,"description":1827},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[188,2005,2006],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2009,"title":2010,"body":2011,"category":188,"cover":189,"description":2015,"extension":190,"meta":2163,"navigation":78,"path":2164,"pinned":193,"publishedAt":194,"seo":2165,"slug":2166,"stem":2167,"summary":2168,"tags":2169,"updatedAt":194,"visible":78,"__hash__":2172},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2012,"toc":2153},[2013,2016,2018,2021,2023,2029,2040,2042,2062,2064,2066,2086,2088,2094,2096,2098,2117,2119,2127,2129,2144,2146,2148,2151],[10,2014,2015],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2017,16],{"id":16},[10,2019,2020],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2022,22],{"id":22},[10,2024,2025],{},[26,2026],{"alt":2027,"src":2028},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2030,2031,2032,325,2034,2037,2038,325],{},"Python 先计算表达式，再把得到的对象交给 ",[63,2033,1436],{},[63,2035,2036],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[63,2039,1744],{},[14,2041,35],{"id":35},[37,2043,2044,2050,2059],{},[40,2045,2046,2049],{},[63,2047,2048],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2051,2052,2055,2056,325],{},[63,2053,2054],{},"7 + 5"," 是表达式，运行时先求值得到 ",[63,2057,2058],{},"12",[40,2060,2061],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2063,51],{"id":51},[10,2065,54],{},[56,2067,2069],{"className":58,"code":2068,"language":60,"meta":61,"style":61},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[63,2070,2071,2076,2081],{"__ignoreMap":61},[66,2072,2073],{"class":68,"line":69},[66,2074,2075],{},"print(42)\n",[66,2077,2078],{"class":68,"line":75},[66,2079,2080],{},"print(7 + 5)\n",[66,2082,2083],{"class":68,"line":82},[66,2084,2085],{},"print(\"Python 基础课\")\n",[10,2087,111],{},[56,2089,2092],{"className":2090,"code":2091,"language":117,"meta":61},[115],"42\n12\nPython 基础课\n",[63,2093,2091],{"__ignoreMap":61},[10,2095,122],{},[14,2097,125],{"id":125},[127,2099,2100,2108],{},[40,2101,2102,2105,2106,325],{},[63,2103,2104],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[63,2107,2058],{},[40,2109,2110,2112,2113,2116],{},[63,2111,1436],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[63,2114,2115],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2118,141],{"id":141},[37,2120,2121,2124],{},[40,2122,2123],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2125,2126],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2128,156],{"id":156},[127,2130,2131,2134],{},[40,2132,2133],{},"分别输出一个整数、一个小数和一段文本。",[40,2135,2136,2137,2139,2140,2143],{},"比较 ",[63,2138,2036],{}," 与 ",[63,2141,2142],{},"print(\"2 + 3\")"," 的结果。",[10,2145,167],{},[14,2147,170],{"id":170},[10,2149,2150],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,2152,177],{},{"title":61,"searchDepth":75,"depth":75,"links":2154},[2155,2156,2157,2158,2159,2160,2161,2162],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2010,"description":2015},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[188,2170,2171],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2174,"title":2175,"body":2176,"category":188,"cover":189,"description":2180,"extension":190,"meta":2347,"navigation":78,"path":2348,"pinned":193,"publishedAt":194,"seo":2349,"slug":2350,"stem":2351,"summary":2352,"tags":2353,"updatedAt":194,"visible":78,"__hash__":2356},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2177,"toc":2337},[2178,2181,2183,2186,2188,2194,2197,2199,2225,2227,2229,2257,2259,2265,2267,2269,2293,2295,2311,2313,2328,2330,2332,2335],[10,2179,2180],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2182,16],{"id":16},[10,2184,2185],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2187,22],{"id":22},[10,2189,2190],{},[26,2191],{"alt":2192,"src":2193},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2195,2196],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2198,35],{"id":35},[37,2200,2201,2204,2214],{},[40,2202,2203],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2205,2206,2207,2139,2210,2213],{},"变量名区分大小写，",[63,2208,2209],{},"score",[63,2211,2212],{},"Score"," 是两个名字。",[40,2215,2216,2217,2220,2221,2224],{},"使用能表达含义的名称；不要用 ",[63,2218,2219],{},"list","、",[63,2222,2223],{},"str"," 等内置名称作为普通变量名。",[14,2226,51],{"id":51},[10,2228,54],{},[56,2230,2232],{"className":58,"code":2231,"language":60,"meta":61,"style":61},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[63,2233,2234,2239,2244,2248,2253],{"__ignoreMap":61},[66,2235,2236],{"class":68,"line":69},[66,2237,2238],{},"score = 90\n",[66,2240,2241],{"class":68,"line":75},[66,2242,2243],{},"print(score)\n",[66,2245,2246],{"class":68,"line":82},[66,2247,79],{"emptyLinePlaceholder":78},[66,2249,2250],{"class":68,"line":88},[66,2251,2252],{},"score = 95\n",[66,2254,2255],{"class":68,"line":94},[66,2256,2243],{},[10,2258,111],{},[56,2260,2263],{"className":2261,"code":2262,"language":117,"meta":61},[115],"90\n95\n",[63,2264,2262],{"__ignoreMap":61},[10,2266,122],{},[14,2268,125],{"id":125},[127,2270,2271,2280],{},[40,2272,901,2273,2276,2277,2279],{},[63,2274,2275],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[63,2278,2209],{}," 再绑定到它。",[40,2281,901,2282,2285,2286,2289,2290,325],{},[63,2283,2284],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[63,2287,2288],{},"90"," 没有被改造成 ",[63,2291,2292],{},"95",[14,2294,141],{"id":141},[37,2296,2297,2300],{},[40,2298,2299],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2301,2302,2303,2220,2305,2220,2307,2310],{},"使用 ",[63,2304,2219],{},[63,2306,2223],{},[63,2308,2309],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2312,156],{"id":156},[127,2314,2315,2325],{},[40,2316,2317,2318,1120,2321,2324],{},"创建 ",[63,2319,2320],{},"course_name",[63,2322,2323],{},"lesson_count"," 两个变量并输出。",[40,2326,2327],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2329,167],{},[14,2331,170],{"id":170},[10,2333,2334],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,2336,177],{},{"title":61,"searchDepth":75,"depth":75,"links":2338},[2339,2340,2341,2342,2343,2344,2345,2346],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2175,"description":2180},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[188,2354,2355],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2358,"title":2359,"body":2360,"category":188,"cover":189,"description":2364,"extension":190,"meta":2529,"navigation":78,"path":2530,"pinned":193,"publishedAt":194,"seo":2531,"slug":2532,"stem":2533,"summary":2534,"tags":2535,"updatedAt":194,"visible":78,"__hash__":2538},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2361,"toc":2519},[2362,2365,2367,2370,2372,2378,2381,2383,2412,2414,2416,2461,2463,2469,2471,2473,2487,2489,2500,2502,2510,2512,2514,2517],[10,2363,2364],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2366,16],{"id":16},[10,2368,2369],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2371,22],{"id":22},[10,2373,2374],{},[26,2375],{"alt":2376,"src":2377},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2379,2380],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2382,35],{"id":35},[37,2384,2385,2395,2409],{},[40,2386,2387,2390,2391,2394],{},[63,2388,2389],{},"int"," 表示整数，",[63,2392,2393],{},"float"," 表示浮点数。",[40,2396,2397,2400,2401,2404,2405,2408],{},[63,2398,2399],{},"\u002F"," 总是进行真除法；",[63,2402,2403],{},"\u002F\u002F"," 是向下取整除法，",[63,2406,2407],{},"%"," 得到余数。",[40,2410,2411],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2413,51],{"id":51},[10,2415,54],{},[56,2417,2419],{"className":58,"code":2418,"language":60,"meta":61,"style":61},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[63,2420,2421,2426,2431,2436,2440,2445,2450,2455],{"__ignoreMap":61},[66,2422,2423],{"class":68,"line":69},[66,2424,2425],{},"price = 25\n",[66,2427,2428],{"class":68,"line":75},[66,2429,2430],{},"count = 4\n",[66,2432,2433],{"class":68,"line":82},[66,2434,2435],{},"discount = 0.9\n",[66,2437,2438],{"class":68,"line":88},[66,2439,79],{"emptyLinePlaceholder":78},[66,2441,2442],{"class":68,"line":94},[66,2443,2444],{},"total = price * count * discount\n",[66,2446,2447],{"class":68,"line":99},[66,2448,2449],{},"average = total \u002F count\n",[66,2451,2452],{"class":68,"line":105},[66,2453,2454],{},"print(total)\n",[66,2456,2458],{"class":68,"line":2457},8,[66,2459,2460],{},"print(average)\n",[10,2462,111],{},[56,2464,2467],{"className":2465,"code":2466,"language":117,"meta":61},[115],"90.0\n22.5\n",[63,2468,2466],{"__ignoreMap":61},[10,2470,122],{},[14,2472,125],{"id":125},[127,2474,2475,2481],{},[40,2476,2477,2480],{},[63,2478,2479],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2482,2483,2486],{},[63,2484,2485],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2488,141],{"id":141},[37,2490,2491,2497],{},[40,2492,2493,2494,325],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[63,2495,2496],{},"decimal.Decimal",[40,2498,2499],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2501,156],{"id":156},[127,2503,2504,2507],{},[40,2505,2506],{},"计算 137 除以 10 的商和余数。",[40,2508,2509],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2511,167],{},[14,2513,170],{"id":170},[10,2515,2516],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,2518,177],{},{"title":61,"searchDepth":75,"depth":75,"links":2520},[2521,2522,2523,2524,2525,2526,2527,2528],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2359,"description":2364},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[188,2536,2537],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2540,"title":2541,"body":2542,"category":188,"cover":189,"description":2546,"extension":190,"meta":2722,"navigation":78,"path":2723,"pinned":193,"publishedAt":194,"seo":2724,"slug":2725,"stem":2726,"summary":2727,"tags":2728,"updatedAt":194,"visible":78,"__hash__":2731},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2543,"toc":2710},[2544,2547,2549,2552,2554,2560,2570,2572,2583,2585,2587,2617,2619,2625,2627,2629,2659,2662,2665,2671,2674,2676,2684,2686,2701,2703,2705,2708],[10,2545,2546],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2548,16],{"id":16},[10,2550,2551],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2553,22],{"id":22},[10,2555,2556],{},[26,2557],{"alt":2558,"src":2559},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2561,2562,2563,2566,2567,325],{},"切片 ",[63,2564,2565],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[63,2568,2569],{},"stop - start",[14,2571,35],{"id":35},[37,2573,2574,2577,2580],{},[40,2575,2576],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2578,2579],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2581,2582],{},"切片会创建新的字符串，不会修改原字符串。",[14,2584,51],{"id":51},[10,2586,54],{},[56,2588,2590],{"className":58,"code":2589,"language":60,"meta":61,"style":61},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[63,2591,2592,2597,2602,2607,2612],{"__ignoreMap":61},[66,2593,2594],{"class":68,"line":69},[66,2595,2596],{},"language = \"Python\"\n",[66,2598,2599],{"class":68,"line":75},[66,2600,2601],{},"print(language[0])\n",[66,2603,2604],{"class":68,"line":82},[66,2605,2606],{},"print(language[-1])\n",[66,2608,2609],{"class":68,"line":88},[66,2610,2611],{},"print(language[0:3])\n",[66,2613,2614],{"class":68,"line":94},[66,2615,2616],{},"print(language + \" 3.14\")\n",[10,2618,111],{},[56,2620,2623],{"className":2621,"code":2622,"language":117,"meta":61},[115],"P\nn\nPyt\nPython 3.14\n",[63,2624,2622],{"__ignoreMap":61},[10,2626,122],{},[14,2628,125],{"id":125},[127,2630,2631,2645],{},[40,2632,2633,2634,2636,2637,2640,2641,2644],{},"字符串 ",[63,2635,188],{}," 的正索引从 ",[63,2638,2639],{},"P"," 的 0 开始，负索引从末尾 ",[63,2642,2643],{},"n"," 的 -1 开始。",[40,2646,2647,2650,2651,2654,2655,2658],{},[63,2648,2649],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[63,2652,2653],{},"Pyt","；索引 3 的 ",[63,2656,2657],{},"h"," 不在结果中。",[291,2660,2661],{"id":2661},"再看一个具体细节",[10,2663,2664],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2666,2667],{},[26,2668],{"alt":2669,"src":2670},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2672,2673],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2675,141],{"id":141},[37,2677,2678,2681],{},[40,2679,2680],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2682,2683],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2685,156],{"id":156},[127,2687,2688,2698],{},[40,2689,2690,2691,2694,2695,325],{},"从 ",[63,2692,2693],{},"\"programming\""," 中切出 ",[63,2696,2697],{},"\"gram\"",[40,2699,2700],{},"使用负索引取得字符串倒数第二个字符。",[10,2702,167],{},[14,2704,170],{"id":170},[10,2706,2707],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,2709,177],{},{"title":61,"searchDepth":75,"depth":75,"links":2711},[2712,2713,2714,2715,2716,2719,2720,2721],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":2717},[2718],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2541,"description":2546},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[188,2729,2730],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2733,"title":2734,"body":2735,"category":188,"cover":189,"description":2739,"extension":190,"meta":2953,"navigation":78,"path":2954,"pinned":193,"publishedAt":194,"seo":2955,"slug":2956,"stem":2957,"summary":2958,"tags":2959,"updatedAt":194,"visible":78,"__hash__":2962},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2736,"toc":2941},[2737,2740,2742,2745,2747,2753,2763,2765,2798,2800,2802,2846,2848,2854,2856,2858,2879,2881,2884,2890,2898,2900,2914,2916,2932,2934,2936,2939],[10,2738,2739],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2741,16],{"id":16},[10,2743,2744],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2746,22],{"id":22},[10,2748,2749],{},[26,2750],{"alt":2751,"src":2752},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2754,2755,2756,972,2759,2762],{},"比较表达式先产生 ",[63,2757,2758],{},"True",[63,2760,2761],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2764,35],{"id":35},[37,2766,2767,2781,2795],{},[40,2768,2769,2772,2773,2776,2777,2780],{},[63,2770,2771],{},"=="," 判断是否相等，",[63,2774,2775],{},"!="," 判断是否不等；单个 ",[63,2778,2779],{},"="," 是赋值。",[40,2782,2783,2786,2787,2790,2791,2794],{},[63,2784,2785],{},"and"," 要求两侧都为真，",[63,2788,2789],{},"or"," 只需一侧为真，",[63,2792,2793],{},"not"," 取反。",[40,2796,2797],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2799,51],{"id":51},[10,2801,54],{},[56,2803,2805],{"className":58,"code":2804,"language":60,"meta":61,"style":61},"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",[63,2806,2807,2812,2817,2821,2826,2831,2836,2841],{"__ignoreMap":61},[66,2808,2809],{"class":68,"line":69},[66,2810,2811],{},"age = 20\n",[66,2813,2814],{"class":68,"line":75},[66,2815,2816],{},"has_ticket = True\n",[66,2818,2819],{"class":68,"line":82},[66,2820,79],{"emptyLinePlaceholder":78},[66,2822,2823],{"class":68,"line":88},[66,2824,2825],{},"is_adult = age >= 18\n",[66,2827,2828],{"class":68,"line":94},[66,2829,2830],{},"can_enter = is_adult and has_ticket\n",[66,2832,2833],{"class":68,"line":99},[66,2834,2835],{},"print(is_adult)\n",[66,2837,2838],{"class":68,"line":105},[66,2839,2840],{},"print(can_enter)\n",[66,2842,2843],{"class":68,"line":2457},[66,2844,2845],{},"print(not has_ticket)\n",[10,2847,111],{},[56,2849,2852],{"className":2850,"code":2851,"language":117,"meta":61},[115],"True\nTrue\nFalse\n",[63,2853,2851],{"__ignoreMap":61},[10,2855,122],{},[14,2857,125],{"id":125},[127,2859,2860,2870],{},[40,2861,2862,2865,2866,2869],{},[63,2863,2864],{},"age >= 18"," 先产生布尔值并绑定给 ",[63,2867,2868],{},"is_adult","，这一步没有任何分支跳转。",[40,2871,2872,2875,2876,2878],{},[63,2873,2874],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[63,2877,2793],{}," 只对紧随其后的值取反。",[291,2880,2661],{"id":2661},[10,2882,2883],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2885,2886],{},[26,2887],{"alt":2888,"src":2889},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2891,2892,2894,2895,2897],{},[63,2893,2785],{}," 只有“真、真”得到真；",[63,2896,2789],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2899,141],{"id":141},[37,2901,2902,2911],{},[40,2903,2904,2905,2907,2908,2910],{},"用单个等号判断相等。",[63,2906,2779],{}," 是赋值，",[63,2909,2771],{}," 才是相等比较。",[40,2912,2913],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2915,156],{"id":156},[127,2917,2918,2925],{},[40,2919,2920,2921,2924],{},"判断数字 ",[63,2922,2923],{},"15"," 是否同时大于 10 且小于 20。",[40,2926,2927,2928,2931],{},"分别修改年龄和票据状态，记录 ",[63,2929,2930],{},"can_enter"," 的四种组合结果。",[10,2933,167],{},[14,2935,170],{"id":170},[10,2937,2938],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,2940,177],{},{"title":61,"searchDepth":75,"depth":75,"links":2942},[2943,2944,2945,2946,2947,2950,2951,2952],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":2948},[2949],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2734,"description":2739},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[188,2960,2961],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2964,"title":2965,"body":2966,"category":188,"cover":189,"description":2970,"extension":190,"meta":3138,"navigation":78,"path":3139,"pinned":193,"publishedAt":194,"seo":3140,"slug":3141,"stem":3142,"summary":3143,"tags":3144,"updatedAt":194,"visible":78,"__hash__":3146},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2967,"toc":3128},[2968,2971,2973,2976,2978,2984,3002,3004,3017,3019,3021,3055,3057,3063,3065,3067,3089,3091,3103,3105,3119,3121,3123,3126],[10,2969,2970],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2972,16],{"id":16},[10,2974,2975],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2977,22],{"id":22},[10,2979,2980],{},[26,2981],{"alt":2982,"src":2983},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2985,2986,2989,2990,2993,2994,2997,2998,3001],{},[63,2987,2988],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[63,2991,2992],{},"18","，程序首先得到的也是 ",[63,2995,2996],{},"\"18\"","，需要 ",[63,2999,3000],{},"int()"," 后才能按整数参与计算。",[14,3003,35],{"id":35},[37,3005,3006,3009,3014],{},[40,3007,3008],{},"提示文字应告诉用户需要输入什么。",[40,3010,3011,3013],{},[63,3012,3000],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3015,3016],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3018,51],{"id":51},[10,3020,54],{},[56,3022,3024],{"className":58,"code":3023,"language":60,"meta":61,"style":61},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[63,3025,3026,3031,3036,3041,3045,3050],{"__ignoreMap":61},[66,3027,3028],{"class":68,"line":69},[66,3029,3030],{},"name = input(\"请输入姓名：\")\n",[66,3032,3033],{"class":68,"line":75},[66,3034,3035],{},"age_text = input(\"请输入年龄：\")\n",[66,3037,3038],{"class":68,"line":82},[66,3039,3040],{},"age = int(age_text)\n",[66,3042,3043],{"class":68,"line":88},[66,3044,79],{"emptyLinePlaceholder":78},[66,3046,3047],{"class":68,"line":94},[66,3048,3049],{},"print(\"你好，\" + name)\n",[66,3051,3052],{"class":68,"line":99},[66,3053,3054],{},"print(age + 1)\n",[10,3056,111],{},[56,3058,3061],{"className":3059,"code":3060,"language":117,"meta":61},[115],"根据输入显示姓名，并输出下一年的年龄\n",[63,3062,3060],{"__ignoreMap":61},[10,3064,122],{},[14,3066,125],{"id":125},[127,3068,3069,3079],{},[40,3070,3071,3072,3074,3075,3078],{},"两次 ",[63,3073,2988],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[63,3076,3077],{},"age_text"," 用来提醒这仍是文本。",[40,3080,3081,3084,3085,3088],{},[63,3082,3083],{},"int(age_text)"," 创建整数对象，后面的 ",[63,3086,3087],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3090,141],{"id":141},[37,3092,3093,3100],{},[40,3094,3095,3096,3099],{},"直接计算 ",[63,3097,3098],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3101,3102],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3104,156],{"id":156},[127,3106,3107,3110],{},[40,3108,3109],{},"接收两个整数并输出它们的和。",[40,3111,1683,3112,3115,3116,3118],{},[63,3113,3114],{},"18.5"," 给 ",[63,3117,3000],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3120,167],{},[14,3122,170],{"id":170},[10,3124,3125],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,3127,177],{},{"title":61,"searchDepth":75,"depth":75,"links":3129},[3130,3131,3132,3133,3134,3135,3136,3137],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2965,"description":2970},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[188,2309,3145],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3148,"title":3149,"body":3150,"category":188,"cover":189,"description":3154,"extension":190,"meta":3314,"navigation":78,"path":3315,"pinned":193,"publishedAt":194,"seo":3316,"slug":3317,"stem":3318,"summary":3319,"tags":3320,"updatedAt":194,"visible":78,"__hash__":3323},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3151,"toc":3304},[3152,3155,3157,3160,3162,3168,3175,3177,3191,3193,3195,3234,3236,3242,3244,3246,3265,3267,3282,3284,3295,3297,3299,3302],[10,3153,3154],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3156,16],{"id":16},[10,3158,3159],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3161,22],{"id":22},[10,3163,3164],{},[26,3165],{"alt":3166,"src":3167},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3169,3170,3171,3174],{},"列表为元素维护从 0 开始的位置索引。修改 ",[63,3172,3173],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3176,35],{"id":35},[37,3178,3179,3182,3185],{},[40,3180,3181],{},"列表使用方括号，元素之间用逗号分隔。",[40,3183,3184],{},"列表可变，可以替换、追加和删除元素。",[40,3186,3187,3188,325],{},"访问不存在的索引会产生 ",[63,3189,3190],{},"IndexError",[14,3192,51],{"id":51},[10,3194,54],{},[56,3196,3198],{"className":58,"code":3197,"language":60,"meta":61,"style":61},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[63,3199,3200,3205,3210,3214,3219,3224,3229],{"__ignoreMap":61},[66,3201,3202],{"class":68,"line":69},[66,3203,3204],{},"scores = [82, 90, 76]\n",[66,3206,3207],{"class":68,"line":75},[66,3208,3209],{},"print(scores[0])\n",[66,3211,3212],{"class":68,"line":82},[66,3213,79],{"emptyLinePlaceholder":78},[66,3215,3216],{"class":68,"line":88},[66,3217,3218],{},"scores[1] = 95\n",[66,3220,3221],{"class":68,"line":94},[66,3222,3223],{},"scores.append(88)\n",[66,3225,3226],{"class":68,"line":99},[66,3227,3228],{},"print(scores)\n",[66,3230,3231],{"class":68,"line":105},[66,3232,3233],{},"print(len(scores))\n",[10,3235,111],{},[56,3237,3240],{"className":3238,"code":3239,"language":117,"meta":61},[115],"82\n[82, 95, 76, 88]\n4\n",[63,3241,3239],{"__ignoreMap":61},[10,3243,122],{},[14,3245,125],{"id":125},[127,3247,3248,3251],{},[40,3249,3250],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3252,3253,3256,3257,3260,3261,3264],{},[63,3254,3255],{},"scores[1] = 95"," 替换第二个位置，",[63,3258,3259],{},"append(88)"," 在末尾增加新位置，",[63,3262,3263],{},"len()"," 因而从 3 变为 4。",[14,3266,141],{"id":141},[37,3268,3269,3279],{},[40,3270,3271,3272,3275,3276,325],{},"访问 ",[63,3273,3274],{},"scores[len(scores)]","。最后一个合法正索引是 ",[63,3277,3278],{},"len(scores) - 1",[40,3280,3281],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3283,156],{"id":156},[127,3285,3286,3289],{},[40,3287,3288],{},"建立三项学习任务列表，再追加第四项。",[40,3290,3291,3292,3294],{},"修改第二项，并用 ",[63,3293,3263],{}," 检查元素数量。",[10,3296,167],{},[14,3298,170],{"id":170},[10,3300,3301],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,3303,177],{},{"title":61,"searchDepth":75,"depth":75,"links":3305},[3306,3307,3308,3309,3310,3311,3312,3313],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3149,"description":3154},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[188,3321,3322],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3325,"title":3326,"body":3327,"category":188,"cover":189,"description":3331,"extension":190,"meta":3472,"navigation":78,"path":3473,"pinned":193,"publishedAt":194,"seo":3474,"slug":3475,"stem":3476,"summary":3477,"tags":3478,"updatedAt":194,"visible":78,"__hash__":3480},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3328,"toc":3462},[3329,3332,3334,3337,3339,3345,3348,3350,3361,3363,3365,3399,3401,3407,3409,3411,3425,3427,3439,3441,3453,3455,3457,3460],[10,3330,3331],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3333,16],{"id":16},[10,3335,3336],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3338,22],{"id":22},[10,3340,3341],{},[26,3342],{"alt":3343,"src":3344},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3346,3347],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3349,35],{"id":35},[37,3351,3352,3355,3358],{},[40,3353,3354],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3356,3357],{},"只有一个元素的元组必须保留尾随逗号。",[40,3359,3360],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3362,51],{"id":51},[10,3364,54],{},[56,3366,3368],{"className":58,"code":3367,"language":60,"meta":61,"style":61},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[63,3369,3370,3375,3380,3385,3389,3394],{"__ignoreMap":61},[66,3371,3372],{"class":68,"line":69},[66,3373,3374],{},"point = (120, 80)\n",[66,3376,3377],{"class":68,"line":75},[66,3378,3379],{},"print(point[0])\n",[66,3381,3382],{"class":68,"line":82},[66,3383,3384],{},"print(point[1])\n",[66,3386,3387],{"class":68,"line":88},[66,3388,79],{"emptyLinePlaceholder":78},[66,3390,3391],{"class":68,"line":94},[66,3392,3393],{},"single = (5,)\n",[66,3395,3396],{"class":68,"line":99},[66,3397,3398],{},"print(single)\n",[10,3400,111],{},[56,3402,3405],{"className":3403,"code":3404,"language":117,"meta":61},[115],"120\n80\n(5,)\n",[63,3406,3404],{"__ignoreMap":61},[10,3408,122],{},[14,3410,125],{"id":125},[127,3412,3413,3419],{},[40,3414,3415,3418],{},[63,3416,3417],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3420,3421,3424],{},[63,3422,3423],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3426,141],{"id":141},[37,3428,3429,3436],{},[40,3430,3431,3432,3435],{},"把 ",[63,3433,3434],{},"(5)"," 当作元组，实际它仍是整数。",[40,3437,3438],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3440,156],{"id":156},[127,3442,3443,3446],{},[40,3444,3445],{},"用元组表示宽度和高度。",[40,3447,2136,3448,2139,3450,3452],{},[63,3449,3434],{},[63,3451,3423],{}," 的类型。",[10,3454,167],{},[14,3456,170],{"id":170},[10,3458,3459],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,3461,177],{},{"title":61,"searchDepth":75,"depth":75,"links":3463},[3464,3465,3466,3467,3468,3469,3470,3471],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3326,"description":3331},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[188,3479,3322],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3482,"title":3483,"body":3484,"category":188,"cover":189,"description":3488,"extension":190,"meta":3643,"navigation":78,"path":3644,"pinned":193,"publishedAt":194,"seo":3645,"slug":3646,"stem":3647,"summary":3648,"tags":3649,"updatedAt":194,"visible":78,"__hash__":3651},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3485,"toc":3633},[3486,3489,3491,3494,3496,3502,3512,3514,3528,3530,3532,3566,3568,3574,3576,3578,3593,3595,3614,3616,3624,3626,3628,3631],[10,3487,3488],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3490,16],{"id":16},[10,3492,3493],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3495,22],{"id":22},[10,3497,3498],{},[26,3499],{"alt":3500,"src":3501},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3503,3504,3505,3508,3509,3511],{},"字典通过键定位值，不使用连续位置表达含义。",[63,3506,3507],{},"student[\"score\"]"," 读取的是键 ",[63,3510,2209],{}," 对应的值，而不是“第几个元素”。",[14,3513,35],{"id":35},[37,3515,3516,3519,3525],{},[40,3517,3518],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3520,2302,3521,3524],{},[63,3522,3523],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3526,3527],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3529,51],{"id":51},[10,3531,54],{},[56,3533,3535],{"className":58,"code":3534,"language":60,"meta":61,"style":61},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[63,3536,3537,3542,3547,3551,3556,3561],{"__ignoreMap":61},[66,3538,3539],{"class":68,"line":69},[66,3540,3541],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[66,3543,3544],{"class":68,"line":75},[66,3545,3546],{},"print(student[\"name\"])\n",[66,3548,3549],{"class":68,"line":82},[66,3550,79],{"emptyLinePlaceholder":78},[66,3552,3553],{"class":68,"line":88},[66,3554,3555],{},"student[\"score\"] = 95\n",[66,3557,3558],{"class":68,"line":94},[66,3559,3560],{},"student[\"city\"] = \"郑州\"\n",[66,3562,3563],{"class":68,"line":99},[66,3564,3565],{},"print(student)\n",[10,3567,111],{},[56,3569,3572],{"className":3570,"code":3571,"language":117,"meta":61},[115],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[63,3573,3571],{"__ignoreMap":61},[10,3575,122],{},[14,3577,125],{"id":125},[127,3579,3580,3583],{},[40,3581,3582],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3584,3585,3586,3588,3589,3592],{},"给已有键 ",[63,3587,2209],{}," 赋值会更新映射，给新键 ",[63,3590,3591],{},"city"," 赋值会增加映射。",[14,3594,141],{"id":141},[37,3596,3597,3604],{},[40,3598,3599,3600,3603],{},"按位置理解字典并尝试 ",[63,3601,3602],{},"student[0]","，而实际键是字符串。",[40,3605,3606,3607,3610,3611,325],{},"直接读取不确定存在的键并忽略 ",[63,3608,3609],{},"KeyError","；后续可根据场景使用成员检查或 ",[63,3612,3613],{},"get()",[14,3615,156],{"id":156},[127,3617,3618,3621],{},[40,3619,3620],{},"建立一本书的标题、作者和页数字典。",[40,3622,3623],{},"添加分类键，再修改页数。",[10,3625,167],{},[14,3627,170],{"id":170},[10,3629,3630],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,3632,177],{},{"title":61,"searchDepth":75,"depth":75,"links":3634},[3635,3636,3637,3638,3639,3640,3641,3642],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3483,"description":3488},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[188,3650,3322],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3653,"title":3654,"body":3655,"category":188,"cover":189,"description":3659,"extension":190,"meta":3808,"navigation":78,"path":3809,"pinned":193,"publishedAt":194,"seo":3810,"slug":3811,"stem":3812,"summary":3813,"tags":3814,"updatedAt":194,"visible":78,"__hash__":3816},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3656,"toc":3798},[3657,3660,3662,3665,3667,3673,3676,3678,3697,3699,3701,3735,3737,3743,3745,3747,3762,3764,3776,3778,3789,3791,3793,3796],[10,3658,3659],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3661,16],{"id":16},[10,3663,3664],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3666,22],{"id":22},[10,3668,3669],{},[26,3670],{"alt":3671,"src":3672},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3674,3675],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3677,35],{"id":35},[37,3679,3680,3683,3686],{},[40,3681,3682],{},"集合中的元素不重复。",[40,3684,3685],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3687,3688,3689,3692,3693,3696],{},"创建空集合必须写 ",[63,3690,3691],{},"set()","；",[63,3694,3695],{},"{}"," 创建的是空字典。",[14,3698,51],{"id":51},[10,3700,54],{},[56,3702,3704],{"className":58,"code":3703,"language":60,"meta":61,"style":61},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[63,3705,3706,3711,3716,3720,3725,3730],{"__ignoreMap":61},[66,3707,3708],{"class":68,"line":69},[66,3709,3710],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[66,3712,3713],{"class":68,"line":75},[66,3714,3715],{},"right = {\"Python\", \"Docker\"}\n",[66,3717,3718],{"class":68,"line":82},[66,3719,79],{"emptyLinePlaceholder":78},[66,3721,3722],{"class":68,"line":88},[66,3723,3724],{},"print(left & right)\n",[66,3726,3727],{"class":68,"line":94},[66,3728,3729],{},"print(left | right)\n",[66,3731,3732],{"class":68,"line":99},[66,3733,3734],{},"print(\"Git\" in left)\n",[10,3736,111],{},[56,3738,3741],{"className":3739,"code":3740,"language":117,"meta":61},[115],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[63,3742,3740],{"__ignoreMap":61},[10,3744,122],{},[14,3746,125],{"id":125},[127,3748,3749,3752],{},[40,3750,3751],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3753,3754,3757,3758,3761],{},[63,3755,3756],{},"&"," 计算交集，",[63,3759,3760],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3763,141],{"id":141},[37,3765,3766,3773],{},[40,3767,2302,3768,3770,3771,325],{},[63,3769,3695],{}," 创建空集合，实际得到空字典；空集合应写 ",[63,3772,3691],{},[40,3774,3775],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3777,156],{"id":156},[127,3779,3780,3786],{},[40,3781,3782,3783,3785],{},"把包含重复标签的列表交给 ",[63,3784,3691],{}," 去重。",[40,3787,3788],{},"计算两组课程标签的交集和差集。",[10,3790,167],{},[14,3792,170],{"id":170},[10,3794,3795],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,3797,177],{},{"title":61,"searchDepth":75,"depth":75,"links":3799},[3800,3801,3802,3803,3804,3805,3806,3807],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3654,"description":3659},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[188,3815,3322],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3818,"title":3819,"body":3820,"category":188,"cover":189,"description":3824,"extension":190,"meta":4022,"navigation":78,"path":4023,"pinned":193,"publishedAt":194,"seo":4024,"slug":4025,"stem":4026,"summary":4027,"tags":4028,"updatedAt":194,"visible":78,"__hash__":4031},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3821,"toc":4010},[3822,3825,3827,3830,3832,3838,3848,3850,3867,3869,3871,3921,3923,3929,3931,3933,3955,3957,3960,3966,3969,3971,3984,3986,4001,4003,4005,4008],[10,3823,3824],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3826,16],{"id":16},[10,3828,3829],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3831,22],{"id":22},[10,3833,3834],{},[26,3835],{"alt":3836,"src":3837},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3839,3840,3843,3844,3847],{},[63,3841,3842],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[63,3845,3846],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3849,35],{"id":35},[37,3851,3852,3861,3864],{},[40,3853,3854,3856,3857,3860],{},[63,3855,2771],{}," 比较内容是否相等，",[63,3858,3859],{},"is"," 比较是否为同一个对象。",[40,3862,3863],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3865,3866],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3868,51],{"id":51},[10,3870,54],{},[56,3872,3874],{"className":58,"code":3873,"language":60,"meta":61,"style":61},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[63,3875,3876,3881,3886,3891,3895,3900,3905,3910,3915],{"__ignoreMap":61},[66,3877,3878],{"class":68,"line":69},[66,3879,3880],{},"tasks = [\"变量\", \"字符串\"]\n",[66,3882,3883],{"class":68,"line":75},[66,3884,3885],{},"shared = tasks\n",[66,3887,3888],{"class":68,"line":82},[66,3889,3890],{},"backup = tasks.copy()\n",[66,3892,3893],{"class":68,"line":88},[66,3894,79],{"emptyLinePlaceholder":78},[66,3896,3897],{"class":68,"line":94},[66,3898,3899],{},"tasks.append(\"列表\")\n",[66,3901,3902],{"class":68,"line":99},[66,3903,3904],{},"print(shared)\n",[66,3906,3907],{"class":68,"line":105},[66,3908,3909],{},"print(backup)\n",[66,3911,3912],{"class":68,"line":2457},[66,3913,3914],{},"print(tasks is shared)\n",[66,3916,3918],{"class":68,"line":3917},9,[66,3919,3920],{},"print(tasks is backup)\n",[10,3922,111],{},[56,3924,3927],{"className":3925,"code":3926,"language":117,"meta":61},[115],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[63,3928,3926],{"__ignoreMap":61},[10,3930,122],{},[14,3932,125],{"id":125},[127,3934,3935,3941],{},[40,3936,3937,3940],{},[63,3938,3939],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3942,3943,3946,3947,3950,3951,3954],{},[63,3944,3945],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[63,3948,3949],{},"shared"," 能观察到变化，",[63,3952,3953],{},"backup"," 不会。",[291,3956,2661],{"id":2661},[10,3958,3959],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3961,3962],{},[26,3963],{"alt":3964,"src":3965},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3967,3968],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3970,141],{"id":141},[37,3972,3973,3981],{},[40,3974,3975,3976,3978,3979,325],{},"用 ",[63,3977,2771],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[63,3980,3859],{},[40,3982,3983],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3985,156],{"id":156},[127,3987,3988,3991],{},[40,3989,3990],{},"让两个变量引用同一个字典并修改其中一个。",[40,3992,2302,3993,3996,3997,1120,3999,325],{},[63,3994,3995],{},"copy()"," 创建外层副本，再比较 ",[63,3998,3859],{},[63,4000,2771],{},[10,4002,167],{},[14,4004,170],{"id":170},[10,4006,4007],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4009,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4011},[4012,4013,4014,4015,4016,4019,4020,4021],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":4017},[4018],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3819,"description":3824},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[188,4029,4030],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4033,"title":4034,"body":4035,"category":188,"cover":189,"description":4039,"extension":190,"meta":4252,"navigation":78,"path":4253,"pinned":193,"publishedAt":194,"seo":4254,"slug":4255,"stem":4256,"summary":4257,"tags":4258,"updatedAt":194,"visible":78,"__hash__":4260},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4036,"toc":4239},[4037,4040,4042,4045,4047,4053,4063,4065,4076,4078,4080,4133,4135,4141,4143,4145,4163,4165,4168,4174,4182,4185,4188,4194,4200,4202,4220,4222,4230,4232,4234,4237],[10,4038,4039],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4041,16],{"id":16},[10,4043,4044],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4046,22],{"id":22},[10,4048,4049],{},[26,4050],{"alt":4051,"src":4052},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4054,4055,2220,4057,2220,4060,4062],{},[63,4056,1119],{},[63,4058,4059],{},"elif",[63,4061,1123],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4064,35],{"id":35},[37,4066,4067,4070,4073],{},[40,4068,4069],{},"冒号表示接下来开始一个代码块。",[40,4071,4072],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4074,4075],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4077,51],{"id":51},[10,4079,54],{},[56,4081,4083],{"className":58,"code":4082,"language":60,"meta":61,"style":61},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[63,4084,4085,4090,4094,4099,4104,4109,4114,4118,4123,4127],{"__ignoreMap":61},[66,4086,4087],{"class":68,"line":69},[66,4088,4089],{},"score = int(input(\"请输入分数：\"))\n",[66,4091,4092],{"class":68,"line":75},[66,4093,79],{"emptyLinePlaceholder":78},[66,4095,4096],{"class":68,"line":82},[66,4097,4098],{},"if score >= 90:\n",[66,4100,4101],{"class":68,"line":88},[66,4102,4103],{},"    level = \"优秀\"\n",[66,4105,4106],{"class":68,"line":94},[66,4107,4108],{},"elif score >= 60:\n",[66,4110,4111],{"class":68,"line":99},[66,4112,4113],{},"    level = \"合格\"\n",[66,4115,4116],{"class":68,"line":105},[66,4117,1109],{},[66,4119,4120],{"class":68,"line":2457},[66,4121,4122],{},"    level = \"需要继续学习\"\n",[66,4124,4125],{"class":68,"line":3917},[66,4126,79],{"emptyLinePlaceholder":78},[66,4128,4130],{"class":68,"line":4129},10,[66,4131,4132],{},"print(level)\n",[10,4134,111],{},[56,4136,4139],{"className":4137,"code":4138,"language":117,"meta":61},[115],"输入 85 时输出：合格\n",[63,4140,4138],{"__ignoreMap":61},[10,4142,122],{},[14,4144,125],{"id":125},[127,4146,4147,4154],{},[40,4148,4149,4150,4153],{},"输入先转换为整数，程序从 ",[63,4151,4152],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4155,4156,4159,4160,4162],{},[63,4157,4158],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[63,4161,1123],{}," 被跳过；最终三个分支只会选择一个。",[291,4164,2661],{"id":2661},[10,4166,4167],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4169,4170],{},[26,4171],{"alt":4172,"src":4173},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4175,4176,4178,4179,4181],{},[63,4177,4152],{}," 必须放在 ",[63,4180,4158],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[291,4183,2661],{"id":4184},"再看一个具体细节-1",[10,4186,4187],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4189,4190],{},[26,4191],{"alt":4192,"src":4193},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4195,4196,4197,4199],{},"同一缩进层级属于同一个代码块；回到 ",[63,4198,1119],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4201,141],{"id":141},[37,4203,4204,4210],{},[40,4205,4206,4207,4209],{},"先写 ",[63,4208,4158],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4211,4212,4213,4215,4216,4219],{},"混用多个独立 ",[63,4214,1119],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[63,4217,4218],{},"if\u002Felif\u002Felse"," 链。",[14,4221,156],{"id":156},[127,4223,4224,4227],{},[40,4225,4226],{},"根据温度输出“冷、适中、热”三个等级。",[40,4228,4229],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4231,167],{},[14,4233,170],{"id":170},[10,4235,4236],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4238,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4240},[4241,4242,4243,4244,4245,4249,4250,4251],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":4246},[4247,4248],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4034,"description":4039},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[188,1119,4259],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4262,"title":4263,"body":4264,"category":188,"cover":189,"description":4268,"extension":190,"meta":4433,"navigation":78,"path":4434,"pinned":193,"publishedAt":194,"seo":4435,"slug":4436,"stem":4437,"summary":4438,"tags":4439,"updatedAt":194,"visible":78,"__hash__":4441},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4265,"toc":4421},[4266,4269,4271,4274,4276,4282,4288,4290,4304,4306,4308,4346,4348,4354,4356,4358,4373,4375,4378,4384,4390,4392,4400,4402,4412,4414,4416,4419],[10,4267,4268],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4270,16],{"id":16},[10,4272,4273],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4275,22],{"id":22},[10,4277,4278],{},[26,4279],{"alt":4280,"src":4281},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4283,4284,4287],{},[63,4285,4286],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4289,35],{"id":35},[37,4291,4292,4295,4298],{},[40,4293,4294],{},"进入循环前先准备参与条件判断的状态。",[40,4296,4297],{},"循环体中必须有机会让条件变为假。",[40,4299,4300,4301,4303],{},"能够预先确定遍历对象时，后续介绍的 ",[63,4302,149],{}," 通常更直接。",[14,4305,51],{"id":51},[10,4307,54],{},[56,4309,4311],{"className":58,"code":4310,"language":60,"meta":61,"style":61},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[63,4312,4313,4318,4322,4327,4332,4337,4341],{"__ignoreMap":61},[66,4314,4315],{"class":68,"line":69},[66,4316,4317],{},"count = 1\n",[66,4319,4320],{"class":68,"line":75},[66,4321,79],{"emptyLinePlaceholder":78},[66,4323,4324],{"class":68,"line":82},[66,4325,4326],{},"while count \u003C= 3:\n",[66,4328,4329],{"class":68,"line":88},[66,4330,4331],{},"    print(\"第\", count, \"次练习\")\n",[66,4333,4334],{"class":68,"line":94},[66,4335,4336],{},"    count = count + 1\n",[66,4338,4339],{"class":68,"line":99},[66,4340,79],{"emptyLinePlaceholder":78},[66,4342,4343],{"class":68,"line":105},[66,4344,4345],{},"print(\"练习结束\")\n",[10,4347,111],{},[56,4349,4352],{"className":4350,"code":4351,"language":117,"meta":61},[115],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[63,4353,4351],{"__ignoreMap":61},[10,4355,122],{},[14,4357,125],{"id":125},[127,4359,4360,4367],{},[40,4361,4362,4363,4366],{},"进入循环前 ",[63,4364,4365],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4368,4369,4370,4372],{},"循环体末尾把 ",[63,4371,4365],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[291,4374,2661],{"id":2661},[10,4376,4377],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4379,4380],{},[26,4381],{"alt":4382,"src":4383},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4385,4386,4387,4389],{},"第4次检查时 ",[63,4388,4365],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4391,141],{"id":141},[37,4393,4394,4397],{},[40,4395,4396],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4398,4399],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4401,156],{"id":156},[127,4403,4404,4409],{},[40,4405,2302,4406,4408],{},[63,4407,4286],{}," 输出 1 到 5。",[40,4410,4411],{},"计算 1 到 10 的累加和。",[10,4413,167],{},[14,4415,170],{"id":170},[10,4417,4418],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4420,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4422},[4423,4424,4425,4426,4427,4430,4431,4432],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":4428},[4429],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4263,"description":4268},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[188,4286,4440],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4443,"title":4444,"body":4445,"category":188,"cover":189,"description":4449,"extension":190,"meta":4597,"navigation":78,"path":4598,"pinned":193,"publishedAt":194,"seo":4599,"slug":4600,"stem":4601,"summary":4602,"tags":4603,"updatedAt":194,"visible":78,"__hash__":4605},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4446,"toc":4587},[4447,4450,4452,4455,4457,4463,4468,4470,4484,4486,4488,4526,4528,4534,4536,4538,4555,4557,4565,4567,4578,4580,4582,4585],[10,4448,4449],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4451,16],{"id":16},[10,4453,4454],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4456,22],{"id":22},[10,4458,4459],{},[26,4460],{"alt":4461,"src":4462},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4464,4465,4467],{},[63,4466,149],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4469,35],{"id":35},[37,4471,4472,4478,4481],{},[40,4473,4474,4477],{},[63,4475,4476],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4479,4480],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4482,4483],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4485,51],{"id":51},[10,4487,54],{},[56,4489,4491],{"className":58,"code":4490,"language":60,"meta":61,"style":61},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[63,4492,4493,4498,4502,4507,4512,4516,4521],{"__ignoreMap":61},[66,4494,4495],{"class":68,"line":69},[66,4496,4497],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[66,4499,4500],{"class":68,"line":75},[66,4501,79],{"emptyLinePlaceholder":78},[66,4503,4504],{"class":68,"line":82},[66,4505,4506],{},"for course in courses:\n",[66,4508,4509],{"class":68,"line":88},[66,4510,4511],{},"    print(course)\n",[66,4513,4514],{"class":68,"line":94},[66,4515,79],{"emptyLinePlaceholder":78},[66,4517,4518],{"class":68,"line":99},[66,4519,4520],{},"for number in range(1, 4):\n",[66,4522,4523],{"class":68,"line":105},[66,4524,4525],{},"    print(number)\n",[10,4527,111],{},[56,4529,4532],{"className":4530,"code":4531,"language":117,"meta":61},[115],"变量\n字符串\n列表\n1\n2\n3\n",[63,4533,4531],{"__ignoreMap":61},[10,4535,122],{},[14,4537,125],{"id":125},[127,4539,4540,4550],{},[40,4541,4542,4543,4545,4546,4549],{},"第一个 ",[63,4544,149],{}," 依次从列表取得字符串，循环变量 ",[63,4547,4548],{},"course"," 每轮重新绑定。",[40,4551,4552,4554],{},[63,4553,4476],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4556,141],{"id":141},[37,4558,4559,4562],{},[40,4560,4561],{},"只需要元素却手工维护索引，增加越界风险。",[40,4563,4564],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4566,156],{"id":156},[127,4568,4569,4572],{},[40,4570,4571],{},"逐项输出一个字符串中的字符。",[40,4573,2302,4574,4577],{},[63,4575,4576],{},"range()"," 输出 2、4、6、8。",[10,4579,167],{},[14,4581,170],{"id":170},[10,4583,4584],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4586,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4588},[4589,4590,4591,4592,4593,4594,4595,4596],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4444,"description":4449},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[188,149,4604],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4607,"title":4608,"body":4609,"category":188,"cover":189,"description":4613,"extension":190,"meta":4787,"navigation":78,"path":4788,"pinned":193,"publishedAt":194,"seo":4789,"slug":4790,"stem":4791,"summary":4792,"tags":4793,"updatedAt":194,"visible":78,"__hash__":4794},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4610,"toc":4777},[4611,4614,4616,4619,4621,4627,4637,4639,4658,4660,4662,4714,4716,4722,4724,4726,4740,4742,4758,4760,4768,4770,4772,4775],[10,4612,4613],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4615,16],{"id":16},[10,4617,4618],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4620,22],{"id":22},[10,4622,4623],{},[26,4624],{"alt":4625,"src":4626},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4628,4629,4632,4633,4636],{},[63,4630,4631],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[63,4634,4635],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4638,35],{"id":35},[37,4640,4641,4644,4652],{},[40,4642,4643],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4645,4646,4648,4649,4651],{},[63,4647,4631],{}," 前要确认不会跳过 ",[63,4650,4286],{}," 循环中的状态更新。",[40,4653,4654,4655,4657],{},"多层嵌套中 ",[63,4656,4635],{}," 只结束它所在的最内层循环。",[14,4659,51],{"id":51},[10,4661,54],{},[56,4663,4665],{"className":58,"code":4664,"language":60,"meta":61,"style":61},"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",[63,4666,4667,4672,4676,4681,4686,4691,4696,4701,4705,4709],{"__ignoreMap":61},[66,4668,4669],{"class":68,"line":69},[66,4670,4671],{},"numbers = [3, -1, 0, 8, 12]\n",[66,4673,4674],{"class":68,"line":75},[66,4675,79],{"emptyLinePlaceholder":78},[66,4677,4678],{"class":68,"line":82},[66,4679,4680],{},"for number in numbers:\n",[66,4682,4683],{"class":68,"line":88},[66,4684,4685],{},"    if number \u003C 0:\n",[66,4687,4688],{"class":68,"line":94},[66,4689,4690],{},"        continue\n",[66,4692,4693],{"class":68,"line":99},[66,4694,4695],{},"    if number == 0:\n",[66,4697,4698],{"class":68,"line":105},[66,4699,4700],{},"        break\n",[66,4702,4703],{"class":68,"line":2457},[66,4704,4525],{},[66,4706,4707],{"class":68,"line":3917},[66,4708,79],{"emptyLinePlaceholder":78},[66,4710,4711],{"class":68,"line":4129},[66,4712,4713],{},"print(\"循环结束\")\n",[10,4715,111],{},[56,4717,4720],{"className":4718,"code":4719,"language":117,"meta":61},[115],"3\n循环结束\n",[63,4721,4719],{"__ignoreMap":61},[10,4723,122],{},[14,4725,125],{"id":125},[127,4727,4728,4734],{},[40,4729,4730,4731,4733],{},"遇到 -1 时 ",[63,4732,4631],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4735,4736,4737,4739],{},"遇到 0 时 ",[63,4738,4635],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4741,141],{"id":141},[37,4743,4744,4749],{},[40,4745,3431,4746,4748],{},[63,4747,4631],{}," 当作结束循环，实际它只跳到下一轮。",[40,4750,4751,4752,4754,4755,4757],{},"在 ",[63,4753,4286],{}," 中把状态更新放在可能被 ",[63,4756,4631],{}," 跳过的位置，造成无限循环。",[14,4759,156],{"id":156},[127,4761,4762,4765],{},[40,4763,4764],{},"跳过列表中的空字符串并输出其他内容。",[40,4766,4767],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4769,167],{},[14,4771,170],{"id":170},[10,4773,4774],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4776,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4778},[4779,4780,4781,4782,4783,4784,4785,4786],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4608,"description":4613},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[188,4635,4631],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4796,"title":4797,"body":4798,"category":188,"cover":189,"description":4802,"extension":190,"meta":4973,"navigation":78,"path":4974,"pinned":193,"publishedAt":194,"seo":4975,"slug":4976,"stem":4977,"summary":4978,"tags":4979,"updatedAt":194,"visible":78,"__hash__":4982},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4799,"toc":4961},[4800,4803,4805,4808,4810,4816,4819,4821,4845,4847,4849,4883,4885,4891,4893,4895,4912,4914,4917,4923,4926,4928,4942,4944,4952,4954,4956,4959],[10,4801,4802],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4804,16],{"id":16},[10,4806,4807],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4809,22],{"id":22},[10,4811,4812],{},[26,4813],{"alt":4814,"src":4815},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4817,4818],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4820,35],{"id":35},[37,4822,4823,4826,4829],{},[40,4824,4825],{},"每增加一层嵌套，阅读成本都会上升。",[40,4827,4828],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4830,4831,4832,2220,4835,4838,4839,2220,4842,325],{},"变量名使用 ",[63,4833,4834],{},"row",[63,4836,4837],{},"cell"," 等层级含义，避免全部写成 ",[63,4840,4841],{},"i",[63,4843,4844],{},"j",[14,4846,51],{"id":51},[10,4848,54],{},[56,4850,4852],{"className":58,"code":4851,"language":60,"meta":61,"style":61},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[63,4853,4854,4859,4863,4868,4873,4878],{"__ignoreMap":61},[66,4855,4856],{"class":68,"line":69},[66,4857,4858],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[66,4860,4861],{"class":68,"line":75},[66,4862,79],{"emptyLinePlaceholder":78},[66,4864,4865],{"class":68,"line":82},[66,4866,4867],{},"for row in table:\n",[66,4869,4870],{"class":68,"line":88},[66,4871,4872],{},"    for cell in row:\n",[66,4874,4875],{"class":68,"line":94},[66,4876,4877],{},"        print(cell)\n",[66,4879,4880],{"class":68,"line":99},[66,4881,4882],{},"    print(\"一行结束\")\n",[10,4884,111],{},[56,4886,4889],{"className":4887,"code":4888,"language":117,"meta":61},[115],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[63,4890,4888],{"__ignoreMap":61},[10,4892,122],{},[14,4894,125],{"id":125},[127,4896,4897,4909],{},[40,4898,4899,4900,4902,4903,1120,4906,325],{},"外层变量 ",[63,4901,4834],{}," 先引用第一行列表，内层才依次处理 ",[63,4904,4905],{},"A1",[63,4907,4908],{},"A2",[40,4910,4911],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[291,4913,2661],{"id":2661},[10,4915,4916],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4918,4919],{},[26,4920],{"alt":4921,"src":4922},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4924,4925],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4927,141],{"id":141},[37,4929,4930,4939],{},[40,4931,4932,4933,972,4936,4938],{},"把两层循环变量都叫 ",[63,4934,4935],{},"item",[63,4937,4841],{},"，难以确认当前层级。",[40,4940,4941],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4943,156],{"id":156},[127,4945,4946,4949],{},[40,4947,4948],{},"打印一个 2×3 数字表。",[40,4950,4951],{},"在内层增加条件，只输出大于 3 的元素。",[10,4953,167],{},[14,4955,170],{"id":170},[10,4957,4958],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,4960,177],{},{"title":61,"searchDepth":75,"depth":75,"links":4962},[4963,4964,4965,4966,4967,4970,4971,4972],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":4968},[4969],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4797,"description":4802},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[188,4980,4981],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4,"title":5,"body":4984,"category":188,"cover":189,"description":12,"extension":190,"meta":5101,"navigation":78,"path":192,"pinned":193,"publishedAt":194,"seo":5102,"slug":196,"stem":197,"summary":198,"tags":5103,"updatedAt":194,"visible":78,"__hash__":202},{"type":7,"value":4985,"toc":5091},[4986,4988,4990,4992,4994,4998,5000,5002,5010,5012,5014,5046,5048,5053,5055,5057,5065,5067,5075,5077,5083,5085,5087,5089],[10,4987,12],{},[14,4989,16],{"id":16},[10,4991,19],{},[14,4993,22],{"id":22},[10,4995,4996],{},[26,4997],{"alt":28,"src":29},[10,4999,32],{},[14,5001,35],{"id":35},[37,5003,5004,5006,5008],{},[40,5005,42],{},[40,5007,45],{},[40,5009,48],{},[14,5011,51],{"id":51},[10,5013,54],{},[56,5015,5016],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,5017,5018,5022,5026,5030,5034,5038,5042],{"__ignoreMap":61},[66,5019,5020],{"class":68,"line":69},[66,5021,72],{},[66,5023,5024],{"class":68,"line":75},[66,5025,79],{"emptyLinePlaceholder":78},[66,5027,5028],{"class":68,"line":82},[66,5029,85],{},[66,5031,5032],{"class":68,"line":88},[66,5033,91],{},[66,5035,5036],{"class":68,"line":94},[66,5037,79],{"emptyLinePlaceholder":78},[66,5039,5040],{"class":68,"line":99},[66,5041,102],{},[66,5043,5044],{"class":68,"line":105},[66,5045,108],{},[10,5047,111],{},[56,5049,5051],{"className":5050,"code":116,"language":117,"meta":61},[115],[63,5052,116],{"__ignoreMap":61},[10,5054,122],{},[14,5056,125],{"id":125},[127,5058,5059,5061],{},[40,5060,131],{},[40,5062,134,5063,138],{},[63,5064,137],{},[14,5066,141],{"id":141},[37,5068,5069,5073],{},[40,5070,146,5071,150],{},[63,5072,149],{},[40,5074,153],{},[14,5076,156],{"id":156},[127,5078,5079,5081],{},[40,5080,161],{},[40,5082,164],{},[10,5084,167],{},[14,5086,170],{"id":170},[10,5088,173],{},[175,5090,177],{},{"title":61,"searchDepth":75,"depth":75,"links":5092},[5093,5094,5095,5096,5097,5098,5099,5100],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5,"description":12},[188,200,201],{"id":5105,"title":5106,"body":5107,"category":188,"cover":189,"description":5111,"extension":190,"meta":5254,"navigation":78,"path":5255,"pinned":193,"publishedAt":194,"seo":5256,"slug":5257,"stem":5258,"summary":5259,"tags":5260,"updatedAt":194,"visible":78,"__hash__":5263},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5108,"toc":5244},[5109,5112,5114,5117,5119,5125,5128,5130,5141,5143,5145,5184,5186,5192,5194,5196,5211,5213,5221,5223,5235,5237,5239,5242],[10,5110,5111],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5113,16],{"id":16},[10,5115,5116],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5118,22],{"id":22},[10,5120,5121],{},[26,5122],{"alt":5123,"src":5124},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5126,5127],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5129,35],{"id":35},[37,5131,5132,5135,5138],{},[40,5133,5134],{},"函数名描述动作，使用小写字母和下划线。",[40,5136,5137],{},"函数定义要先执行，之后才能调用。",[40,5139,5140],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5142,51],{"id":51},[10,5144,54],{},[56,5146,5148],{"className":58,"code":5147,"language":60,"meta":61,"style":61},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[63,5149,5150,5155,5160,5165,5169,5174,5179],{"__ignoreMap":61},[66,5151,5152],{"class":68,"line":69},[66,5153,5154],{},"def show_progress():\n",[66,5156,5157],{"class":68,"line":75},[66,5158,5159],{},"    print(\"正在学习函数\")\n",[66,5161,5162],{"class":68,"line":82},[66,5163,5164],{},"    print(\"本节完成 50%\")\n",[66,5166,5167],{"class":68,"line":88},[66,5168,79],{"emptyLinePlaceholder":78},[66,5170,5171],{"class":68,"line":94},[66,5172,5173],{},"print(\"调用前\")\n",[66,5175,5176],{"class":68,"line":99},[66,5177,5178],{},"show_progress()\n",[66,5180,5181],{"class":68,"line":105},[66,5182,5183],{},"print(\"调用后\")\n",[10,5185,111],{},[56,5187,5190],{"className":5188,"code":5189,"language":117,"meta":61},[115],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[63,5191,5189],{"__ignoreMap":61},[10,5193,122],{},[14,5195,125],{"id":125},[127,5197,5198,5204],{},[40,5199,901,5200,5203],{},[63,5201,5202],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5205,5206,5207,5210],{},"运行到 ",[63,5208,5209],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5212,141],{"id":141},[37,5214,5215,5218],{},[40,5216,5217],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5219,5220],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5222,156],{"id":156},[127,5224,5225,5232],{},[40,5226,5227,5228,5231],{},"定义 ",[63,5229,5230],{},"show_plan()"," 输出两行学习计划。",[40,5233,5234],{},"连续调用同一个函数两次，观察执行顺序。",[10,5236,167],{},[14,5238,170],{"id":170},[10,5240,5241],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,5243,177],{},{"title":61,"searchDepth":75,"depth":75,"links":5245},[5246,5247,5248,5249,5250,5251,5252,5253],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5106,"description":5111},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[188,5261,5262],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5265,"title":5266,"body":5267,"category":188,"cover":189,"description":5271,"extension":190,"meta":5451,"navigation":78,"path":5452,"pinned":193,"publishedAt":194,"seo":5453,"slug":5454,"stem":5455,"summary":5456,"tags":5457,"updatedAt":194,"visible":78,"__hash__":5460},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5268,"toc":5439},[5269,5272,5274,5277,5279,5285,5292,5294,5311,5313,5315,5349,5351,5357,5359,5361,5382,5384,5387,5393,5403,5405,5420,5422,5430,5432,5434,5437],[10,5270,5271],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5273,16],{"id":16},[10,5275,5276],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5278,22],{"id":22},[10,5280,5281],{},[26,5282],{"alt":5283,"src":5284},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5286,5287,5288,5291],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[63,5289,5290],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5293,35],{"id":35},[37,5295,5296,5299,5302],{},[40,5297,5298],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5300,5301],{},"局部变量默认只在函数内部可见。",[40,5303,5304,5305,5307,5308,325],{},"没有显式 ",[63,5306,5290],{}," 的函数会返回 ",[63,5309,5310],{},"None",[14,5312,51],{"id":51},[10,5314,54],{},[56,5316,5318],{"className":58,"code":5317,"language":60,"meta":61,"style":61},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[63,5319,5320,5325,5330,5335,5339,5344],{"__ignoreMap":61},[66,5321,5322],{"class":68,"line":69},[66,5323,5324],{},"def calculate_total(price, count):\n",[66,5326,5327],{"class":68,"line":75},[66,5328,5329],{},"    total = price * count\n",[66,5331,5332],{"class":68,"line":82},[66,5333,5334],{},"    return total\n",[66,5336,5337],{"class":68,"line":88},[66,5338,79],{"emptyLinePlaceholder":78},[66,5340,5341],{"class":68,"line":94},[66,5342,5343],{},"result = calculate_total(25, 4)\n",[66,5345,5346],{"class":68,"line":99},[66,5347,5348],{},"print(result)\n",[10,5350,111],{},[56,5352,5355],{"className":5353,"code":5354,"language":117,"meta":61},[115],"100\n",[63,5356,5354],{"__ignoreMap":61},[10,5358,122],{},[14,5360,125],{"id":125},[127,5362,5363,5372],{},[40,5364,5365,5366,2220,5369,5371],{},"调用时 25 和 4 分别绑定到 ",[63,5367,5368],{},"price",[63,5370,4365],{},"，它们只在本次函数调用的局部范围中使用。",[40,5373,5374,5377,5378,5381],{},[63,5375,5376],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[63,5379,5380],{},"result"," 并输出。",[291,5383,2661],{"id":2661},[10,5385,5386],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5388,5389],{},[26,5390],{"alt":5391,"src":5392},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5394,5395,2220,5397,1120,5399,5402],{},[63,5396,5368],{},[63,5398,4365],{},[63,5400,5401],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5404,141],{"id":141},[37,5406,5407,5414],{},[40,5408,5409,5410,5413],{},"在函数内部只 ",[63,5411,5412],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5415,5416,5417,5419],{},"试图在函数外直接访问局部变量 ",[63,5418,5401],{},"，它的名字只在调用期间的局部作用域存在。",[14,5421,156],{"id":156},[127,5423,5424,5427],{},[40,5425,5426],{},"编写计算长方形面积的函数。",[40,5428,5429],{},"让函数返回结果后在调用方加上单位再输出。",[10,5431,167],{},[14,5433,170],{"id":170},[10,5435,5436],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,5438,177],{},{"title":61,"searchDepth":75,"depth":75,"links":5440},[5441,5442,5443,5444,5445,5448,5449,5450],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":5446},[5447],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5266,"description":5271},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[188,5458,5459],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5462,"title":5463,"body":5464,"category":188,"cover":189,"description":5468,"extension":190,"meta":5648,"navigation":78,"path":5649,"pinned":193,"publishedAt":194,"seo":5650,"slug":5651,"stem":5652,"summary":5653,"tags":5654,"updatedAt":194,"visible":78,"__hash__":5657},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5465,"toc":5636},[5466,5469,5471,5474,5476,5482,5485,5487,5504,5506,5508,5560,5562,5568,5570,5572,5590,5592,5595,5601,5604,5606,5617,5619,5627,5629,5631,5634],[10,5467,5468],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5470,16],{"id":16},[10,5472,5473],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5475,22],{"id":22},[10,5477,5478],{},[26,5479],{"alt":5480,"src":5481},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5483,5484],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5486,35],{"id":35},[37,5488,5489,5492,5498],{},[40,5490,5491],{},"必需参数应放在有默认值的参数之前。",[40,5493,5494,5497],{},[63,5495,5496],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5499,5500,5503],{},[63,5501,5502],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5505,51],{"id":51},[10,5507,54],{},[56,5509,5511],{"className":58,"code":5510,"language":60,"meta":61,"style":61},"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",[63,5512,5513,5518,5523,5527,5532,5537,5541,5546,5551,5555],{"__ignoreMap":61},[66,5514,5515],{"class":68,"line":69},[66,5516,5517],{},"def build_title(name, level=\"基础\"):\n",[66,5519,5520],{"class":68,"line":75},[66,5521,5522],{},"    return name + \"｜\" + level\n",[66,5524,5525],{"class":68,"line":82},[66,5526,79],{"emptyLinePlaceholder":78},[66,5528,5529],{"class":68,"line":88},[66,5530,5531],{},"print(build_title(\"Python\"))\n",[66,5533,5534],{"class":68,"line":94},[66,5535,5536],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[66,5538,5539],{"class":68,"line":99},[66,5540,79],{"emptyLinePlaceholder":78},[66,5542,5543],{"class":68,"line":105},[66,5544,5545],{},"def total(*numbers):\n",[66,5547,5548],{"class":68,"line":2457},[66,5549,5550],{},"    return sum(numbers)\n",[66,5552,5553],{"class":68,"line":3917},[66,5554,79],{"emptyLinePlaceholder":78},[66,5556,5557],{"class":68,"line":4129},[66,5558,5559],{},"print(total(10, 20, 30))\n",[10,5561,111],{},[56,5563,5566],{"className":5564,"code":5565,"language":117,"meta":61},[115],"Python｜基础\n异常处理｜进阶\n60\n",[63,5567,5565],{"__ignoreMap":61},[10,5569,122],{},[14,5571,125],{"id":125},[127,5573,5574,5581],{},[40,5575,5576,5577,5580],{},"第一次调用只提供必需参数，",[63,5578,5579],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5582,5583,5586,5587,325],{},[63,5584,5585],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[63,5588,5589],{},"sum()",[291,5591,2661],{"id":2661},[10,5593,5594],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5596,5597],{},[26,5598],{"alt":5599,"src":5600},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5602,5603],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5605,141],{"id":141},[37,5607,5608,5614],{},[40,5609,5610,5611,5613],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[63,5612,5310],{}," 再在函数内创建。",[40,5615,5616],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5618,156],{"id":156},[127,5620,5621,5624],{},[40,5622,5623],{},"给问候函数增加默认称呼。",[40,5625,5626],{},"编写接收任意数量分数并返回总分的函数。",[10,5628,167],{},[14,5630,170],{"id":170},[10,5632,5633],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,5635,177],{},{"title":61,"searchDepth":75,"depth":75,"links":5637},[5638,5639,5640,5641,5642,5645,5646,5647],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":5643},[5644],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5463,"description":5468},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[188,5655,5656],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5659,"title":5660,"body":5661,"category":188,"cover":189,"description":5665,"extension":190,"meta":5862,"navigation":78,"path":5863,"pinned":193,"publishedAt":194,"seo":5864,"slug":5865,"stem":5866,"summary":5867,"tags":5868,"updatedAt":194,"visible":78,"__hash__":5871},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5662,"toc":5850},[5663,5666,5668,5671,5673,5679,5682,5684,5701,5703,5705,5768,5770,5776,5778,5780,5807,5809,5812,5818,5821,5823,5831,5833,5841,5843,5845,5848],[10,5664,5665],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5667,16],{"id":16},[10,5669,5670],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5672,22],{"id":22},[10,5674,5675],{},[26,5676],{"alt":5677,"src":5678},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5680,5681],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5683,35],{"id":35},[37,5685,5686,5689,5692],{},[40,5687,5688],{},"函数内部赋值默认创建局部变量。",[40,5690,5691],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5693,5694,2139,5697,5700],{},[63,5695,5696],{},"global",[63,5698,5699],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5702,51],{"id":51},[10,5704,54],{},[56,5706,5708],{"className":58,"code":5707,"language":60,"meta":61,"style":61},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[63,5709,5710,5715,5719,5724,5729,5733,5738,5743,5748,5752,5757,5762],{"__ignoreMap":61},[66,5711,5712],{"class":68,"line":69},[66,5713,5714],{},"course = \"Python\"\n",[66,5716,5717],{"class":68,"line":75},[66,5718,79],{"emptyLinePlaceholder":78},[66,5720,5721],{"class":68,"line":82},[66,5722,5723],{},"def outer():\n",[66,5725,5726],{"class":68,"line":88},[66,5727,5728],{},"    level = \"基础\"\n",[66,5730,5731],{"class":68,"line":94},[66,5732,79],{"emptyLinePlaceholder":78},[66,5734,5735],{"class":68,"line":99},[66,5736,5737],{},"    def show():\n",[66,5739,5740],{"class":68,"line":105},[66,5741,5742],{},"        lesson = \"作用域\"\n",[66,5744,5745],{"class":68,"line":2457},[66,5746,5747],{},"        print(course, level, lesson)\n",[66,5749,5750],{"class":68,"line":3917},[66,5751,79],{"emptyLinePlaceholder":78},[66,5753,5754],{"class":68,"line":4129},[66,5755,5756],{},"    show()\n",[66,5758,5760],{"class":68,"line":5759},11,[66,5761,79],{"emptyLinePlaceholder":78},[66,5763,5765],{"class":68,"line":5764},12,[66,5766,5767],{},"outer()\n",[10,5769,111],{},[56,5771,5774],{"className":5772,"code":5773,"language":117,"meta":61},[115],"Python 基础 作用域\n",[63,5775,5773],{"__ignoreMap":61},[10,5777,122],{},[14,5779,125],{"id":125},[127,5781,5782,5799],{},[40,5783,5784,5787,5788,5791,5792,5794,5795,5798],{},[63,5785,5786],{},"show()"," 中查找 ",[63,5789,5790],{},"lesson"," 时先在局部找到，查找 ",[63,5793,5579],{}," 时到外层 ",[63,5796,5797],{},"outer()"," 找到。",[40,5800,5801,5803,5804,5806],{},[63,5802,4548],{}," 在局部和外层都不存在，继续到模块全局找到；",[63,5805,2171],{}," 最后在内置作用域找到。",[291,5808,2661],{"id":2661},[10,5810,5811],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5813,5814],{},[26,5815],{"alt":5816,"src":5817},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5819,5820],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5822,141],{"id":141},[37,5824,5825,5828],{},[40,5826,5827],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5829,5830],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5832,156],{"id":156},[127,5834,5835,5838],{},[40,5836,5837],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5839,5840],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5842,167],{},[14,5844,170],{"id":170},[10,5846,5847],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,5849,177],{},{"title":61,"searchDepth":75,"depth":75,"links":5851},[5852,5853,5854,5855,5856,5859,5860,5861],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":5857},[5858],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5660,"description":5665},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[188,5869,5870],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5873,"title":5874,"body":5875,"category":188,"cover":189,"description":5879,"extension":190,"meta":6029,"navigation":78,"path":6030,"pinned":193,"publishedAt":194,"seo":6031,"slug":6032,"stem":6033,"summary":6034,"tags":6035,"updatedAt":194,"visible":78,"__hash__":6038},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5876,"toc":6019},[5877,5880,5882,5885,5887,5893,5896,5898,5917,5919,5921,5955,5957,5963,5965,5967,5982,5984,5996,5998,6010,6012,6014,6017],[10,5878,5879],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5881,16],{"id":16},[10,5883,5884],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5886,22],{"id":22},[10,5888,5889],{},[26,5890],{"alt":5891,"src":5892},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5894,5895],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5897,35],{"id":35},[37,5899,5900,5903,5906],{},[40,5901,5902],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5904,5905],{},"注解表达接口意图，不代替输入校验和测试。",[40,5907,5908,5909,2220,5911,2220,5913,5916],{},"基础注解优先使用 ",[63,5910,2223],{},[63,5912,2389],{},[63,5914,5915],{},"list[str]"," 等直接写法。",[14,5918,51],{"id":51},[10,5920,54],{},[56,5922,5924],{"className":58,"code":5923,"language":60,"meta":61,"style":61},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[63,5925,5926,5931,5936,5941,5945,5950],{"__ignoreMap":61},[66,5927,5928],{"class":68,"line":69},[66,5929,5930],{},"def format_score(name: str, score: int) -> str:\n",[66,5932,5933],{"class":68,"line":75},[66,5934,5935],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[66,5937,5938],{"class":68,"line":82},[66,5939,5940],{},"    return name + \"：\" + str(score)\n",[66,5942,5943],{"class":68,"line":88},[66,5944,79],{"emptyLinePlaceholder":78},[66,5946,5947],{"class":68,"line":94},[66,5948,5949],{},"print(format_score(\"小郑\", 95))\n",[66,5951,5952],{"class":68,"line":99},[66,5953,5954],{},"print(format_score.__doc__)\n",[10,5956,111],{},[56,5958,5961],{"className":5959,"code":5960,"language":117,"meta":61},[115],"小郑：95\n返回带姓名的分数文本。\n",[63,5962,5960],{"__ignoreMap":61},[10,5964,122],{},[14,5966,125],{"id":125},[127,5968,5969,5979],{},[40,5970,5971,5972,5975,5976,5978],{},"函数签名说明 ",[63,5973,5974],{},"name"," 预期为字符串、",[63,5977,2209],{}," 预期为整数，返回值预期为字符串。",[40,5980,5981],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5983,141],{"id":141},[37,5985,5986,5993],{},[40,5987,5988,5989,5992],{},"认为加了 ",[63,5990,5991],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,5994,5995],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,5997,156],{"id":156},[127,5999,6000,6003],{},[40,6001,6002],{},"为面积函数补充参数和返回值注解。",[40,6004,6005,6006,6009],{},"通过 ",[63,6007,6008],{},"函数名.__doc__"," 查看文档字符串。",[10,6011,167],{},[14,6013,170],{"id":170},[10,6015,6016],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,6018,177],{},{"title":61,"searchDepth":75,"depth":75,"links":6020},[6021,6022,6023,6024,6025,6026,6027,6028],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5874,"description":5879},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[188,6036,6037],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6040,"title":6041,"body":6042,"category":188,"cover":189,"description":6046,"extension":190,"meta":6273,"navigation":78,"path":6274,"pinned":193,"publishedAt":194,"seo":6275,"slug":6276,"stem":6277,"summary":6278,"tags":6279,"updatedAt":194,"visible":78,"__hash__":6282},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6043,"toc":6261},[6044,6047,6049,6055,6057,6063,6074,6076,6094,6096,6103,6132,6139,6158,6167,6169,6175,6177,6179,6202,6204,6207,6213,6219,6221,6237,6239,6252,6254,6256,6259],[10,6045,6046],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6048,16],{"id":16},[10,6050,6051,6052,6054],{},"本篇只处理“模块、import 与 ",[257,6053,5974],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6056,22],{"id":22},[10,6058,6059],{},[26,6060],{"alt":6061,"src":6062},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6064,6065,6066,6069,6070,6073],{},"同一个文件直接运行时 ",[63,6067,6068],{},"__name__"," 等于 ",[63,6071,6072],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6075,35],{"id":35},[37,6077,6078,6084,6087],{},[40,6079,6080,6081,6083],{},"一个 ",[63,6082,1134],{}," 文件就是一个模块。",[40,6085,6086],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6088,6089,6090,6093],{},"避免使用 ",[63,6091,6092],{},"from module import *","，它会让名字来源不清楚。",[14,6095,51],{"id":51},[10,6097,6098,6099,6102],{},"先在同一个目录中创建两个文件。把函数放进 ",[63,6100,6101],{},"calculator.py","：",[56,6104,6106],{"className":58,"code":6105,"language":60,"meta":61,"style":61},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[63,6107,6108,6113,6118,6122,6127],{"__ignoreMap":61},[66,6109,6110],{"class":68,"line":69},[66,6111,6112],{},"def add(left, right):\n",[66,6114,6115],{"class":68,"line":75},[66,6116,6117],{},"    return left + right\n",[66,6119,6120],{"class":68,"line":82},[66,6121,79],{"emptyLinePlaceholder":78},[66,6123,6124],{"class":68,"line":88},[66,6125,6126],{},"if __name__ == \"__main__\":\n",[66,6128,6129],{"class":68,"line":94},[66,6130,6131],{},"    print(add(2, 3))\n",[10,6133,6134,6135,6138],{},"再创建 ",[63,6136,6137],{},"app.py","，从模块中导入函数：",[56,6140,6142],{"className":58,"code":6141,"language":60,"meta":61,"style":61},"from calculator import add\n\nprint(add(10, 20))\n",[63,6143,6144,6149,6153],{"__ignoreMap":61},[66,6145,6146],{"class":68,"line":69},[66,6147,6148],{},"from calculator import add\n",[66,6150,6151],{"class":68,"line":75},[66,6152,79],{"emptyLinePlaceholder":78},[66,6154,6155],{"class":68,"line":82},[66,6156,6157],{},"print(add(10, 20))\n",[10,6159,6160,6161,1120,6164,325],{},"分别执行 ",[63,6162,6163],{},"python3 calculator.py",[63,6165,6166],{},"python3 app.py",[10,6168,111],{},[56,6170,6173],{"className":6171,"code":6172,"language":117,"meta":61},[115],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[63,6174,6172],{"__ignoreMap":61},[10,6176,122],{},[14,6178,125],{"id":125},[127,6180,6181,6191],{},[40,6182,6183,6184,6186,6187,6190],{},"直接运行 ",[63,6185,6101],{}," 时，模块名是 ",[63,6188,6189],{},"__main__","，入口代码输出 5。",[40,6192,6193,6195,6196,6198,6199,6201],{},[63,6194,6137],{}," 导入模块时，",[63,6197,6101],{}," 的函数定义会执行，但入口判断为假；随后 ",[63,6200,6137],{}," 调用函数输出 30。",[291,6203,2661],{"id":2661},[10,6205,6206],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6208,6209],{},[26,6210],{"alt":6211,"src":6212},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6214,6215,6216,6218],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[63,6217,6189],{}," 保护下的演示代码。",[14,6220,141],{"id":141},[37,6222,6223,6230],{},[40,6224,6225,6226,1120,6228,325],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[63,6227,6101],{},[63,6229,6137],{},[40,6231,6232,6233,6236],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[63,6234,6235],{},"json.py","，导致导入目标被遮蔽。",[14,6238,156],{"id":156},[127,6240,6241,6247],{},[40,6242,2317,6243,6246],{},[63,6244,6245],{},"text_tools.py"," 并导出一个格式化函数。",[40,6248,6249,6250,325],{},"分别直接运行模块和从另一个脚本导入，输出 ",[63,6251,6068],{},[10,6253,167],{},[14,6255,170],{"id":170},[10,6257,6258],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,6260,177],{},{"title":61,"searchDepth":75,"depth":75,"links":6262},[6263,6264,6265,6266,6267,6270,6271,6272],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":6268},[6269],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6041,"description":6046},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[188,6280,6281],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6284,"title":6285,"body":6286,"category":188,"cover":189,"description":6290,"extension":190,"meta":6455,"navigation":78,"path":6456,"pinned":193,"publishedAt":194,"seo":6457,"slug":6458,"stem":6459,"summary":6460,"tags":6461,"updatedAt":194,"visible":78,"__hash__":6463},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6287,"toc":6445},[6288,6291,6293,6296,6298,6304,6307,6309,6323,6325,6327,6373,6375,6381,6383,6385,6411,6413,6423,6425,6436,6438,6440,6443],[10,6289,6290],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6292,16],{"id":16},[10,6294,6295],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6297,22],{"id":22},[10,6299,6300],{},[26,6301],{"alt":6302,"src":6303},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6305,6306],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6308,35],{"id":35},[37,6310,6311,6317,6320],{},[40,6312,6313,6316],{},[63,6314,6315],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6318,6319],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6321,6322],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6324,51],{"id":51},[10,6326,1537],{},[56,6328,6330],{"className":554,"code":6329,"language":556,"meta":61,"style":61},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[63,6331,6332,6344,6352,6358,6368],{"__ignoreMap":61},[66,6333,6334,6336,6338,6341],{"class":68,"line":69},[66,6335,654],{"class":563},[66,6337,596],{"class":566},[66,6339,6340],{"class":599}," venv",[66,6342,6343],{"class":599}," .venv\n",[66,6345,6346,6349],{"class":68,"line":75},[66,6347,6348],{"class":566},"source",[66,6350,6351],{"class":599}," .venv\u002Fbin\u002Factivate\n",[66,6353,6354,6356],{"class":68,"line":82},[66,6355,60],{"class":563},[66,6357,567],{"class":566},[66,6359,6360,6362,6364,6366],{"class":68,"line":88},[66,6361,60],{"class":563},[66,6363,596],{"class":566},[66,6365,600],{"class":599},[66,6367,567],{"class":566},[66,6369,6370],{"class":68,"line":94},[66,6371,6372],{"class":563},"deactivate\n",[10,6374,111],{},[56,6376,6379],{"className":6377,"code":6378,"language":117,"meta":61},[115],"Python 和 pip 的路径应指向当前项目的 .venv\n",[63,6380,6378],{"__ignoreMap":61},[10,6382,122],{},[14,6384,125],{"id":125},[127,6386,6387,6396],{},[40,6388,6389,6392,6393,6395],{},[63,6390,6391],{},"venv"," 根据当前 ",[63,6394,654],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6397,6398,6399,2139,6401,6404,6405,3692,6407,6410],{},"激活后 ",[63,6400,60],{},[63,6402,6403],{},"python -m pip"," 优先指向 ",[63,6406,6315],{},[63,6408,6409],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6412,141],{"id":141},[37,6414,6415,6418],{},[40,6416,6417],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6419,3431,6420,6422],{},[63,6421,6315],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6424,156],{"id":156},[127,6426,6427,6433],{},[40,6428,6429,6430,325],{},"创建虚拟环境并记录激活前后的 ",[63,6431,6432],{},"which python",[40,6434,6435],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6437,167],{},[14,6439,170],{"id":170},[10,6441,6442],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,6444,1621],{},{"title":61,"searchDepth":75,"depth":75,"links":6446},[6447,6448,6449,6450,6451,6452,6453,6454],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6285,"description":6290},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[188,6462,223],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6465,"title":6466,"body":6467,"category":188,"cover":189,"description":6471,"extension":190,"meta":6659,"navigation":78,"path":6660,"pinned":193,"publishedAt":194,"seo":6661,"slug":6662,"stem":6663,"summary":6664,"tags":6665,"updatedAt":194,"visible":78,"__hash__":6668},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6468,"toc":6649},[6469,6472,6474,6477,6479,6485,6494,6496,6520,6522,6524,6577,6579,6585,6587,6589,6605,6607,6626,6628,6640,6642,6644,6647],[10,6470,6471],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6473,16],{"id":16},[10,6475,6476],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6478,22],{"id":22},[10,6480,6481],{},[26,6482],{"alt":6483,"src":6484},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6486,6487,6490,6491,6493],{},[63,6488,6489],{},"Path"," 使用 ",[63,6492,2399],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6495,35],{"id":35},[37,6497,6498,6501,6513],{},[40,6499,6500],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6502,6503,2220,6506,2220,6509,6512],{},[63,6504,6505],{},"exists()",[63,6507,6508],{},"is_file()",[63,6510,6511],{},"is_dir()"," 检查真实文件系统状态。",[40,6514,6515,6516,6519],{},"创建目录前明确目标；",[63,6517,6518],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6521,51],{"id":51},[10,6523,54],{},[56,6525,6527],{"className":58,"code":6526,"language":60,"meta":61,"style":61},"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",[63,6528,6529,6534,6538,6543,6548,6553,6557,6562,6567,6572],{"__ignoreMap":61},[66,6530,6531],{"class":68,"line":69},[66,6532,6533],{},"from pathlib import Path\n",[66,6535,6536],{"class":68,"line":75},[66,6537,79],{"emptyLinePlaceholder":78},[66,6539,6540],{"class":68,"line":82},[66,6541,6542],{},"project = Path.cwd()\n",[66,6544,6545],{"class":68,"line":88},[66,6546,6547],{},"data_dir = project \u002F \"data\"\n",[66,6549,6550],{"class":68,"line":94},[66,6551,6552],{},"file_path = data_dir \u002F \"records.json\"\n",[66,6554,6555],{"class":68,"line":99},[66,6556,79],{"emptyLinePlaceholder":78},[66,6558,6559],{"class":68,"line":105},[66,6560,6561],{},"print(project)\n",[66,6563,6564],{"class":68,"line":2457},[66,6565,6566],{},"print(file_path.name)\n",[66,6568,6569],{"class":68,"line":3917},[66,6570,6571],{},"print(file_path.suffix)\n",[66,6573,6574],{"class":68,"line":4129},[66,6575,6576],{},"print(file_path.exists())\n",[10,6578,111],{},[56,6580,6583],{"className":6581,"code":6582,"language":117,"meta":61},[115],"显示当前项目路径、records.json、.json 和存在状态\n",[63,6584,6582],{"__ignoreMap":61},[10,6586,122],{},[14,6588,125],{"id":125},[127,6590,6591,6597],{},[40,6592,6593,6596],{},[63,6594,6595],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6598,2302,6599,6601,6602,6604],{},[63,6600,2399],{}," 组合路径片段只创建新的 ",[63,6603,6489],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6606,141],{"id":141},[37,6608,6609,6617],{},[40,6610,3431,6611,6613,6614,6616],{},[63,6612,6489],{}," 对象存在当成真实文件存在，仍需调用 ",[63,6615,6505],{}," 等方法确认。",[40,6618,6619,6620,972,6622,6625],{},"手工拼接 ",[63,6621,2399],{},[63,6623,6624],{},"\\"," 分隔符，降低跨平台可读性。",[14,6627,156],{"id":156},[127,6629,6630,6637],{},[40,6631,6632,6633,6636],{},"组合 ",[63,6634,6635],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6638,6639],{},"输出路径的父目录、文件名和扩展名。",[10,6641,167],{},[14,6643,170],{"id":170},[10,6645,6646],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,6648,177],{},{"title":61,"searchDepth":75,"depth":75,"links":6650},[6651,6652,6653,6654,6655,6656,6657,6658],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6466,"description":6471},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[188,6666,6667],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6670,"title":6671,"body":6672,"category":188,"cover":189,"description":6676,"extension":190,"meta":6854,"navigation":78,"path":6855,"pinned":193,"publishedAt":194,"seo":6856,"slug":6857,"stem":6858,"summary":6859,"tags":6860,"updatedAt":194,"visible":78,"__hash__":6863},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6673,"toc":6844},[6674,6677,6679,6682,6684,6690,6693,6695,6723,6725,6727,6784,6786,6792,6794,6796,6807,6809,6822,6824,6835,6837,6839,6842],[10,6675,6676],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6678,16],{"id":16},[10,6680,6681],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6683,22],{"id":22},[10,6685,6686],{},[26,6687],{"alt":6688,"src":6689},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6691,6692],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6694,35],{"id":35},[37,6696,6697,6703,6712],{},[40,6698,6699,6702],{},[63,6700,6701],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6704,6705,6708,6709,325],{},[63,6706,6707],{},"r"," 模式读取不存在文件会产生 ",[63,6710,6711],{},"FileNotFoundError",[40,6713,6714,6715,6718,6719,6722],{},"本篇显式调用 ",[63,6716,6717],{},"close()","；第 34 篇会用 ",[63,6720,6721],{},"with"," 更可靠地管理关闭动作。",[14,6724,51],{"id":51},[10,6726,54],{},[56,6728,6730],{"className":58,"code":6729,"language":60,"meta":61,"style":61},"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",[63,6731,6732,6736,6740,6745,6750,6755,6760,6764,6769,6774,6779],{"__ignoreMap":61},[66,6733,6734],{"class":68,"line":69},[66,6735,6533],{},[66,6737,6738],{"class":68,"line":75},[66,6739,79],{"emptyLinePlaceholder":78},[66,6741,6742],{"class":68,"line":82},[66,6743,6744],{},"file_path = Path(\"notes.txt\")\n",[66,6746,6747],{"class":68,"line":88},[66,6748,6749],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[66,6751,6752],{"class":68,"line":94},[66,6753,6754],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[66,6756,6757],{"class":68,"line":99},[66,6758,6759],{},"writer.close()\n",[66,6761,6762],{"class":68,"line":105},[66,6763,79],{"emptyLinePlaceholder":78},[66,6765,6766],{"class":68,"line":2457},[66,6767,6768],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[66,6770,6771],{"class":68,"line":3917},[66,6772,6773],{},"content = reader.read()\n",[66,6775,6776],{"class":68,"line":4129},[66,6777,6778],{},"reader.close()\n",[66,6780,6781],{"class":68,"line":5759},[66,6782,6783],{},"print(content)\n",[10,6785,111],{},[56,6787,6790],{"className":6788,"code":6789,"language":117,"meta":61},[115],"变量\n循环\n函数\n",[63,6791,6789],{"__ignoreMap":61},[10,6793,122],{},[14,6795,125],{"id":125},[127,6797,6798,6804],{},[40,6799,6800,6801,6803],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[63,6802,6717],{}," 确保缓冲内容交给文件系统。",[40,6805,6806],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6808,141],{"id":141},[37,6810,6811,6816],{},[40,6812,2302,6813,6815],{},[63,6814,6701],{}," 模式打开重要文件却未确认覆盖风险。",[40,6817,6818,6819,325],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[63,6820,6821],{},"encoding=\"utf-8\"",[14,6823,156],{"id":156},[127,6825,6826,6829],{},[40,6827,6828],{},"写入三行学习记录并读取。",[40,6830,6831,6832,6834],{},"改用 ",[63,6833,299],{}," 模式追加一行，确认原内容仍保留。",[10,6836,167],{},[14,6838,170],{"id":170},[10,6840,6841],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,6843,177],{},{"title":61,"searchDepth":75,"depth":75,"links":6845},[6846,6847,6848,6849,6850,6851,6852,6853],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6671,"description":6676},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[188,6861,6862],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6865,"title":6866,"body":6867,"category":188,"cover":189,"description":6871,"extension":190,"meta":7038,"navigation":78,"path":7039,"pinned":193,"publishedAt":194,"seo":7040,"slug":7041,"stem":7042,"summary":7043,"tags":7044,"updatedAt":194,"visible":78,"__hash__":7047},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6868,"toc":7028},[6869,6872,6874,6877,6879,6885,6895,6897,6911,6913,6915,6975,6977,6983,6985,6987,6999,7001,7009,7011,7019,7021,7023,7026],[10,6870,6871],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6873,16],{"id":16},[10,6875,6876],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6878,22],{"id":22},[10,6880,6881],{},[26,6882],{"alt":6883,"src":6884},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6886,6887,6890,6891,6894],{},[63,6888,6889],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[63,6892,6893],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6896,35],{"id":35},[37,6898,6899,6902,6908],{},[40,6900,6901],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6903,6904,6907],{},[63,6905,6906],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6909,6910],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6912,51],{"id":51},[10,6914,54],{},[56,6916,6918],{"className":58,"code":6917,"language":60,"meta":61,"style":61},"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",[63,6919,6920,6925,6929,6934,6938,6943,6948,6952,6956,6961,6966,6970],{"__ignoreMap":61},[66,6921,6922],{"class":68,"line":69},[66,6923,6924],{},"import json\n",[66,6926,6927],{"class":68,"line":75},[66,6928,79],{"emptyLinePlaceholder":78},[66,6930,6931],{"class":68,"line":82},[66,6932,6933],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[66,6935,6936],{"class":68,"line":88},[66,6937,79],{"emptyLinePlaceholder":78},[66,6939,6940],{"class":68,"line":94},[66,6941,6942],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[66,6944,6945],{"class":68,"line":99},[66,6946,6947],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[66,6949,6950],{"class":68,"line":105},[66,6951,6759],{},[66,6953,6954],{"class":68,"line":2457},[66,6955,79],{"emptyLinePlaceholder":78},[66,6957,6958],{"class":68,"line":3917},[66,6959,6960],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[66,6962,6963],{"class":68,"line":4129},[66,6964,6965],{},"loaded = json.load(reader)\n",[66,6967,6968],{"class":68,"line":5759},[66,6969,6778],{},[66,6971,6972],{"class":68,"line":5764},[66,6973,6974],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6976,111],{},[56,6978,6981],{"className":6979,"code":6980,"language":117,"meta":61},[115],"Python 60\n",[63,6982,6980],{"__ignoreMap":61},[10,6984,122],{},[14,6986,125],{"id":125},[127,6988,6989,6994],{},[40,6990,6991,6993],{},[63,6992,6889],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,6995,6996,6998],{},[63,6997,6893],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7000,141],{"id":141},[37,7002,7003,7006],{},[40,7004,7005],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7007,7008],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7010,156],{"id":156},[127,7012,7013,7016],{},[40,7014,7015],{},"保存包含两条学习记录的列表。",[40,7017,7018],{},"读取后修改进度，再重新写回文件。",[10,7020,167],{},[14,7022,170],{"id":170},[10,7024,7025],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,7027,177],{},{"title":61,"searchDepth":75,"depth":75,"links":7029},[7030,7031,7032,7033,7034,7035,7036,7037],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6866,"description":6871},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[188,7045,7046],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7049,"title":7050,"body":7051,"category":188,"cover":189,"description":7055,"extension":190,"meta":7239,"navigation":78,"path":7240,"pinned":193,"publishedAt":194,"seo":7241,"slug":7242,"stem":7243,"summary":7244,"tags":7245,"updatedAt":194,"visible":78,"__hash__":7248},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7052,"toc":7229},[7053,7056,7058,7061,7063,7069,7075,7077,7099,7101,7103,7166,7168,7174,7176,7178,7194,7196,7210,7212,7220,7222,7224,7227],[10,7054,7055],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7057,16],{"id":16},[10,7059,7060],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7062,22],{"id":22},[10,7064,7065],{},[26,7066],{"alt":7067,"src":7068},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7070,7071,7074],{},[63,7072,7073],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7076,35],{"id":35},[37,7078,7079,7089,7096],{},[40,7080,2302,7081,7084,7085,7088],{},[63,7082,7083],{},"newline=\"\""," 让 ",[63,7086,7087],{},"csv"," 模块正确处理换行。",[40,7090,7091,7092,7095],{},"字段顺序由 ",[63,7093,7094],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7097,7098],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7100,51],{"id":51},[10,7102,54],{},[56,7104,7106],{"className":58,"code":7105,"language":60,"meta":61,"style":61},"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",[63,7107,7108,7113,7117,7122,7127,7132,7137,7142,7146,7151,7156,7161],{"__ignoreMap":61},[66,7109,7110],{"class":68,"line":69},[66,7111,7112],{},"import csv\n",[66,7114,7115],{"class":68,"line":75},[66,7116,79],{"emptyLinePlaceholder":78},[66,7118,7119],{"class":68,"line":82},[66,7120,7121],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[66,7123,7124],{"class":68,"line":88},[66,7125,7126],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[66,7128,7129],{"class":68,"line":94},[66,7130,7131],{},"writer.writeheader()\n",[66,7133,7134],{"class":68,"line":99},[66,7135,7136],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[66,7138,7139],{"class":68,"line":105},[66,7140,7141],{},"writer_file.close()\n",[66,7143,7144],{"class":68,"line":2457},[66,7145,79],{"emptyLinePlaceholder":78},[66,7147,7148],{"class":68,"line":3917},[66,7149,7150],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[66,7152,7153],{"class":68,"line":4129},[66,7154,7155],{},"for row in csv.DictReader(reader_file):\n",[66,7157,7158],{"class":68,"line":5759},[66,7159,7160],{},"    print(row[\"name\"], row[\"score\"])\n",[66,7162,7163],{"class":68,"line":5764},[66,7164,7165],{},"reader_file.close()\n",[10,7167,111],{},[56,7169,7172],{"className":7170,"code":7171,"language":117,"meta":61},[115],"小郑 95\n",[63,7173,7171],{"__ignoreMap":61},[10,7175,122],{},[14,7177,125],{"id":125},[127,7179,7180,7189],{},[40,7181,7182,7185,7186,7188],{},[63,7183,7184],{},"DictWriter"," 按 ",[63,7187,7094],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7190,7191,7193],{},[63,7192,7073],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7195,141],{"id":141},[37,7197,7198,7201],{},[40,7199,7200],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7202,7203,7204,7206,7207,7209],{},"在 macOS 以外环境忽略 ",[63,7205,7083],{}," 可能出现额外空行；统一交给 ",[63,7208,7087],{}," 模块管理换行。",[14,7211,156],{"id":156},[127,7213,7214,7217],{},[40,7215,7216],{},"写入三名学习者的课程和分数。",[40,7218,7219],{},"读取 CSV 后把分数字符串转换为整数。",[10,7221,167],{},[14,7223,170],{"id":170},[10,7225,7226],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,7228,177],{},{"title":61,"searchDepth":75,"depth":75,"links":7230},[7231,7232,7233,7234,7235,7236,7237,7238],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7050,"description":7055},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[188,7246,7247],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7250,"title":7251,"body":7252,"category":188,"cover":189,"description":7256,"extension":190,"meta":7529,"navigation":78,"path":7530,"pinned":193,"publishedAt":194,"seo":7531,"slug":7532,"stem":7533,"summary":7534,"tags":7535,"updatedAt":194,"visible":78,"__hash__":7538},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7253,"toc":7516},[7254,7257,7259,7262,7264,7270,7281,7283,7300,7302,7304,7379,7381,7387,7389,7391,7416,7418,7427,7433,7444,7446,7452,7458,7467,7469,7484,7486,7507,7509,7511,7514],[10,7255,7256],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7258,16],{"id":16},[10,7260,7261],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7263,22],{"id":22},[10,7265,7266],{},[26,7267],{"alt":7268,"src":7269},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7271,7272,7273,7276,7277,7280],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[63,7274,7275],{},"except","；无论是否异常，",[63,7278,7279],{},"finally"," 都会在离开结构前执行。",[14,7282,35],{"id":35},[37,7284,7285,7291,7297],{},[40,7286,7287,7288,7290],{},"只捕获能够处理的具体异常，不使用空的 ",[63,7289,7275],{}," 吞掉全部错误。",[40,7292,7293,7296],{},[63,7294,7295],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7298,7299],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7301,51],{"id":51},[10,7303,54],{},[56,7305,7307],{"className":58,"code":7306,"language":60,"meta":61,"style":61},"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",[63,7308,7309,7314,7319,7324,7329,7334,7338,7343,7348,7353,7358,7362,7367,7373],{"__ignoreMap":61},[66,7310,7311],{"class":68,"line":69},[66,7312,7313],{},"def parse_age(text):\n",[66,7315,7316],{"class":68,"line":75},[66,7317,7318],{},"    age = int(text)\n",[66,7320,7321],{"class":68,"line":82},[66,7322,7323],{},"    if age \u003C 0:\n",[66,7325,7326],{"class":68,"line":88},[66,7327,7328],{},"        raise ValueError(\"年龄不能为负数\")\n",[66,7330,7331],{"class":68,"line":94},[66,7332,7333],{},"    return age\n",[66,7335,7336],{"class":68,"line":99},[66,7337,79],{"emptyLinePlaceholder":78},[66,7339,7340],{"class":68,"line":105},[66,7341,7342],{},"try:\n",[66,7344,7345],{"class":68,"line":2457},[66,7346,7347],{},"    age = parse_age(\"18\")\n",[66,7349,7350],{"class":68,"line":3917},[66,7351,7352],{},"except ValueError as error:\n",[66,7354,7355],{"class":68,"line":4129},[66,7356,7357],{},"    print(\"输入错误：\", error)\n",[66,7359,7360],{"class":68,"line":5759},[66,7361,1109],{},[66,7363,7364],{"class":68,"line":5764},[66,7365,7366],{},"    print(\"年龄：\", age)\n",[66,7368,7370],{"class":68,"line":7369},13,[66,7371,7372],{},"finally:\n",[66,7374,7376],{"class":68,"line":7375},14,[66,7377,7378],{},"    print(\"处理结束\")\n",[10,7380,111],{},[56,7382,7385],{"className":7383,"code":7384,"language":117,"meta":61},[115],"年龄： 18\n处理结束\n",[63,7386,7384],{"__ignoreMap":61},[10,7388,122],{},[14,7390,125],{"id":125},[127,7392,7393,7405],{},[40,7394,7395,7397,7398,7400,7401,7404],{},[63,7396,3000],{}," 或主动 ",[63,7399,7295],{}," 都可能产生 ",[63,7402,7403],{},"ValueError","，控制流立即离开当前正常路径。",[40,7406,7407,7408,7410,7411,7413,7414,325],{},"有异常时进入匹配的 ",[63,7409,7275],{},"；没有异常时执行 ",[63,7412,1123],{},"；两种情况最后都会执行 ",[63,7415,7279],{},[291,7417,2661],{"id":2661},[10,7419,7420,2220,7422,1120,7424,7426],{},[63,7421,7275],{},[63,7423,1123],{},[63,7425,7279],{}," 的职责不同，不能只看它们出现的顺序。",[10,7428,7429],{},[26,7430],{"alt":7431,"src":7432},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7434,7435,7437,7438,7440,7441,7443],{},[63,7436,7275],{}," 处理匹配异常，",[63,7439,1123],{}," 只在无异常时运行，",[63,7442,7279],{}," 负责两条路径都需要的清理动作。",[291,7445,2661],{"id":4184},[10,7447,7448,7451],{},[63,7449,7450],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7453,7454],{},[26,7455],{"alt":7456,"src":7457},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7459,7460,7461,7463,7464,7466],{},"只把可能产生预期异常的操作放进 ",[63,7462,7450],{},"，后续正常业务放进 ",[63,7465,1123],{},"，错误边界会更清楚。",[14,7468,141],{"id":141},[37,7470,7471,7478],{},[40,7472,7473,7474,7477],{},"使用裸 ",[63,7475,7476],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7479,7480,7481,7483],{},"把整个程序包在一个巨大 ",[63,7482,7450],{}," 中，无法判断究竟哪一步允许失败。",[14,7485,156],{"id":156},[127,7487,7488,7501],{},[40,7489,7490,7491,7494,7495,1120,7498,325],{},"让 ",[63,7492,7493],{},"parse_age"," 分别处理 ",[63,7496,7497],{},"\"abc\"",[63,7499,7500],{},"\"-1\"",[40,7502,7503,7504,7506],{},"为文件读取捕获 ",[63,7505,6711],{}," 并给出清晰提示。",[10,7508,167],{},[14,7510,170],{"id":170},[10,7512,7513],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,7515,177],{},{"title":61,"searchDepth":75,"depth":75,"links":7517},[7518,7519,7520,7521,7522,7526,7527,7528],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":7523},[7524,7525],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7251,"description":7256},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[188,7536,7537],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7540,"title":7541,"body":7542,"category":188,"cover":189,"description":7546,"extension":190,"meta":7722,"navigation":78,"path":7723,"pinned":193,"publishedAt":194,"seo":7724,"slug":7725,"stem":7726,"summary":7727,"tags":7728,"updatedAt":194,"visible":78,"__hash__":7730},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7543,"toc":7712},[7544,7547,7549,7552,7554,7560,7566,7568,7584,7586,7588,7642,7644,7650,7652,7654,7667,7669,7682,7684,7703,7705,7707,7710],[10,7545,7546],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7548,16],{"id":16},[10,7550,7551],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7553,22],{"id":22},[10,7555,7556],{},[26,7557],{"alt":7558,"src":7559},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7561,7562,7563,7565],{},"进入 ",[63,7564,6721],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7567,35],{"id":35},[37,7569,7570,7575,7581],{},[40,7571,7572,7574],{},[63,7573,6721],{}," 把资源获取和释放配成一个清晰边界。",[40,7576,7577,7580],{},[63,7578,7579],{},"as file"," 得到的是上下文返回的资源对象。",[40,7582,7583],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7585,51],{"id":51},[10,7587,54],{},[56,7589,7591],{"className":58,"code":7590,"language":60,"meta":61,"style":61},"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",[63,7592,7593,7597,7601,7605,7609,7614,7619,7623,7628,7633,7637],{"__ignoreMap":61},[66,7594,7595],{"class":68,"line":69},[66,7596,6533],{},[66,7598,7599],{"class":68,"line":75},[66,7600,79],{"emptyLinePlaceholder":78},[66,7602,7603],{"class":68,"line":82},[66,7604,6744],{},[66,7606,7607],{"class":68,"line":88},[66,7608,79],{"emptyLinePlaceholder":78},[66,7610,7611],{"class":68,"line":94},[66,7612,7613],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,7615,7616],{"class":68,"line":99},[66,7617,7618],{},"    file.write(\"上下文管理器\\n\")\n",[66,7620,7621],{"class":68,"line":105},[66,7622,79],{"emptyLinePlaceholder":78},[66,7624,7625],{"class":68,"line":2457},[66,7626,7627],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[66,7629,7630],{"class":68,"line":3917},[66,7631,7632],{},"    print(file.read())\n",[66,7634,7635],{"class":68,"line":4129},[66,7636,79],{"emptyLinePlaceholder":78},[66,7638,7639],{"class":68,"line":5759},[66,7640,7641],{},"print(file.closed)\n",[10,7643,111],{},[56,7645,7648],{"className":7646,"code":7647,"language":117,"meta":61},[115],"上下文管理器\n\nTrue\n",[63,7649,7647],{"__ignoreMap":61},[10,7651,122],{},[14,7653,125],{"id":125},[127,7655,7656,7664],{},[40,7657,7562,7658,7660,7661,325],{},[63,7659,6721],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[63,7662,7663],{},"file",[40,7665,7666],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7668,141],{"id":141},[37,7670,7671,7676],{},[40,7672,4751,7673,7675],{},[63,7674,6721],{}," 代码块外继续读写已经关闭的文件对象。",[40,7677,7678,7679,7681],{},"误以为 ",[63,7680,6721],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7683,156],{"id":156},[127,7685,7686,7695],{},[40,7687,7688,7689,7692,7693,325],{},"把第 30 篇的手动 ",[63,7690,7691],{},"open\u002Fclose"," 改写为 ",[63,7694,6721],{},[40,7696,4751,7697,7699,7700,325],{},[63,7698,6721],{}," 块后检查 ",[63,7701,7702],{},"file.closed",[10,7704,167],{},[14,7706,170],{"id":170},[10,7708,7709],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,7711,177],{},{"title":61,"searchDepth":75,"depth":75,"links":7713},[7714,7715,7716,7717,7718,7719,7720,7721],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7541,"description":7546},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[188,6721,7729],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7732,"title":7733,"body":7734,"category":188,"cover":189,"description":7738,"extension":190,"meta":7950,"navigation":78,"path":7951,"pinned":193,"publishedAt":194,"seo":7952,"slug":7953,"stem":7954,"summary":7955,"tags":7956,"updatedAt":194,"visible":78,"__hash__":7959},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7735,"toc":7938},[7736,7739,7741,7744,7746,7752,7755,7757,7774,7776,7778,7846,7848,7854,7856,7858,7883,7885,7888,7894,7903,7905,7916,7918,7929,7931,7933,7936],[10,7737,7738],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7740,16],{"id":16},[10,7742,7743],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7745,22],{"id":22},[10,7747,7748],{},[26,7749],{"alt":7750,"src":7751},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7753,7754],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7756,35],{"id":35},[37,7758,7759,7765,7771],{},[40,7760,7761,7764],{},[63,7762,7763],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7766,7767,7770],{},[63,7768,7769],{},"__init__"," 在实例创建过程中初始化属性。",[40,7772,7773],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7775,51],{"id":51},[10,7777,54],{},[56,7779,7781],{"className":58,"code":7780,"language":60,"meta":61,"style":61},"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",[63,7782,7783,7788,7793,7798,7803,7807,7812,7817,7822,7827,7831,7836,7841],{"__ignoreMap":61},[66,7784,7785],{"class":68,"line":69},[66,7786,7787],{},"class LearningRecord:\n",[66,7789,7790],{"class":68,"line":75},[66,7791,7792],{},"    def __init__(self, course, progress=0):\n",[66,7794,7795],{"class":68,"line":82},[66,7796,7797],{},"        self.course = course\n",[66,7799,7800],{"class":68,"line":88},[66,7801,7802],{},"        self.progress = progress\n",[66,7804,7805],{"class":68,"line":94},[66,7806,79],{"emptyLinePlaceholder":78},[66,7808,7809],{"class":68,"line":99},[66,7810,7811],{},"    def advance(self, amount):\n",[66,7813,7814],{"class":68,"line":105},[66,7815,7816],{},"        self.progress = self.progress + amount\n",[66,7818,7819],{"class":68,"line":2457},[66,7820,7821],{},"        if self.progress > 100:\n",[66,7823,7824],{"class":68,"line":3917},[66,7825,7826],{},"            self.progress = 100\n",[66,7828,7829],{"class":68,"line":4129},[66,7830,79],{"emptyLinePlaceholder":78},[66,7832,7833],{"class":68,"line":5759},[66,7834,7835],{},"record = LearningRecord(\"Python\", 40)\n",[66,7837,7838],{"class":68,"line":5764},[66,7839,7840],{},"record.advance(15)\n",[66,7842,7843],{"class":68,"line":7369},[66,7844,7845],{},"print(record.course, record.progress)\n",[10,7847,111],{},[56,7849,7852],{"className":7850,"code":7851,"language":117,"meta":61},[115],"Python 55\n",[63,7853,7851],{"__ignoreMap":61},[10,7855,122],{},[14,7857,125],{"id":125},[127,7859,7860,7870],{},[40,7861,7862,7863,7866,7867,7869],{},"调用 ",[63,7864,7865],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[63,7868,7769],{}," 把课程和进度保存在该实例属性中。",[40,7871,7872,7875,7876,7879,7880,7882],{},[63,7873,7874],{},"record.advance(15)"," 自动把 ",[63,7877,7878],{},"record"," 作为 ",[63,7881,7763],{},"，方法更新同一实例的进度并限制上限。",[291,7884,2661],{"id":2661},[10,7886,7887],{},"类是共同定义，实例则各自保存状态。",[10,7889,7890],{},[26,7891],{"alt":7892,"src":7893},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7895,7896,7897,1120,7899,7902],{},"两个实例共享同一套方法定义，但 ",[63,7898,4548],{},[63,7900,7901],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7904,141],{"id":141},[37,7906,7907,7913],{},[40,7908,7909,7910,7912],{},"调用实例方法时手工再传一次 ",[63,7911,7763],{},"。通过实例调用时 Python 会自动绑定。",[40,7914,7915],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7917,156],{"id":156},[127,7919,7920,7926],{},[40,7921,5227,7922,7925],{},[63,7923,7924],{},"Book"," 类，保存标题和阅读页数。",[40,7927,7928],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7930,167],{},[14,7932,170],{"id":170},[10,7934,7935],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,7937,177],{},{"title":61,"searchDepth":75,"depth":75,"links":7939},[7940,7941,7942,7943,7944,7947,7948,7949],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":7945},[7946],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7733,"description":7738},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[188,7957,7958],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7961,"title":7962,"body":7963,"category":188,"cover":189,"description":7967,"extension":190,"meta":8145,"navigation":78,"path":8146,"pinned":193,"publishedAt":194,"seo":8147,"slug":8148,"stem":8149,"summary":8150,"tags":8151,"updatedAt":194,"visible":78,"__hash__":8154},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7964,"toc":8135},[7965,7968,7970,7973,7975,7981,7984,7986,7997,7999,8001,8068,8070,8076,8078,8080,8099,8101,8109,8111,8126,8128,8130,8133],[10,7966,7967],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7969,16],{"id":16},[10,7971,7972],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7974,22],{"id":22},[10,7976,7977],{},[26,7978],{"alt":7979,"src":7980},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7982,7983],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7985,35],{"id":35},[37,7987,7988,7991,7994],{},[40,7989,7990],{},"封装让对象通过方法维护自己的有效状态。",[40,7992,7993],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,7995,7996],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,7998,51],{"id":51},[10,8000,54],{},[56,8002,8004],{"className":58,"code":8003,"language":60,"meta":61,"style":61},"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",[63,8005,8006,8011,8016,8021,8025,8030,8035,8040,8044,8049,8054,8058,8063],{"__ignoreMap":61},[66,8007,8008],{"class":68,"line":69},[66,8009,8010],{},"class Storage:\n",[66,8012,8013],{"class":68,"line":75},[66,8014,8015],{},"    def save(self, text):\n",[66,8017,8018],{"class":68,"line":82},[66,8019,8020],{},"        print(\"保存：\", text)\n",[66,8022,8023],{"class":68,"line":88},[66,8024,79],{"emptyLinePlaceholder":78},[66,8026,8027],{"class":68,"line":94},[66,8028,8029],{},"class LearningService:\n",[66,8031,8032],{"class":68,"line":99},[66,8033,8034],{},"    def __init__(self, storage):\n",[66,8036,8037],{"class":68,"line":105},[66,8038,8039],{},"        self.storage = storage\n",[66,8041,8042],{"class":68,"line":2457},[66,8043,79],{"emptyLinePlaceholder":78},[66,8045,8046],{"class":68,"line":3917},[66,8047,8048],{},"    def finish_lesson(self, title):\n",[66,8050,8051],{"class":68,"line":4129},[66,8052,8053],{},"        self.storage.save(title)\n",[66,8055,8056],{"class":68,"line":5759},[66,8057,79],{"emptyLinePlaceholder":78},[66,8059,8060],{"class":68,"line":5764},[66,8061,8062],{},"service = LearningService(Storage())\n",[66,8064,8065],{"class":68,"line":7369},[66,8066,8067],{},"service.finish_lesson(\"异常处理\")\n",[10,8069,111],{},[56,8071,8074],{"className":8072,"code":8073,"language":117,"meta":61},[115],"保存： 异常处理\n",[63,8075,8073],{"__ignoreMap":61},[10,8077,122],{},[14,8079,125],{"id":125},[127,8081,8082,8092],{},[40,8083,8084,8087,8088,8091],{},[63,8085,8086],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[63,8089,8090],{},"save()"," 的协作对象。",[40,8093,8094,8095,8098],{},"调用业务方法时，服务把保存动作委托给 ",[63,8096,8097],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8100,141],{"id":141},[37,8102,8103,8106],{},[40,8104,8105],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8107,8108],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8110,156],{"id":156},[127,8112,8113,8123],{},[40,8114,8115,8116,8119,8120,325],{},"用组合让 ",[63,8117,8118],{},"OrderService"," 使用一个 ",[63,8121,8122],{},"Notifier",[40,8124,8125],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8127,167],{},[14,8129,170],{"id":170},[10,8131,8132],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,8134,177],{},{"title":61,"searchDepth":75,"depth":75,"links":8136},[8137,8138,8139,8140,8141,8142,8143,8144],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7962,"description":7967},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[188,8152,8153],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8156,"title":8157,"body":8158,"category":188,"cover":189,"description":8162,"extension":190,"meta":8365,"navigation":78,"path":8366,"pinned":193,"publishedAt":194,"seo":8367,"slug":8368,"stem":8369,"summary":8370,"tags":8371,"updatedAt":194,"visible":78,"__hash__":8374},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8159,"toc":8353},[8160,8163,8165,8168,8170,8176,8183,8185,8210,8212,8214,8266,8268,8274,8276,8278,8299,8301,8307,8313,8319,8321,8329,8331,8344,8346,8348,8351],[10,8161,8162],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8164,16],{"id":16},[10,8166,8167],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8169,22],{"id":22},[10,8171,8172],{},[26,8173],{"alt":8174,"src":8175},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8177,8178,8179,8182],{},"生成器运行到 ",[63,8180,8181],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8184,35],{"id":35},[37,8186,8187,8197,8207],{},[40,8188,8189,8192,8193,8196],{},[63,8190,8191],{},"iter()"," 从可迭代对象取得迭代器，",[63,8194,8195],{},"next()"," 请求下一个值。",[40,8198,8199,8200,8203,8204,8206],{},"没有更多值时迭代器抛出 ",[63,8201,8202],{},"StopIteration","，",[63,8205,149],{}," 会自动处理。",[40,8208,8209],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8211,51],{"id":51},[10,8213,54],{},[56,8215,8217],{"className":58,"code":8216,"language":60,"meta":61,"style":61},"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",[63,8218,8219,8224,8229,8234,8239,8244,8248,8253,8258,8262],{"__ignoreMap":61},[66,8220,8221],{"class":68,"line":69},[66,8222,8223],{},"def countdown(start):\n",[66,8225,8226],{"class":68,"line":75},[66,8227,8228],{},"    current = start\n",[66,8230,8231],{"class":68,"line":82},[66,8232,8233],{},"    while current > 0:\n",[66,8235,8236],{"class":68,"line":88},[66,8237,8238],{},"        yield current\n",[66,8240,8241],{"class":68,"line":94},[66,8242,8243],{},"        current = current - 1\n",[66,8245,8246],{"class":68,"line":99},[66,8247,79],{"emptyLinePlaceholder":78},[66,8249,8250],{"class":68,"line":105},[66,8251,8252],{},"iterator = countdown(3)\n",[66,8254,8255],{"class":68,"line":2457},[66,8256,8257],{},"print(next(iterator))\n",[66,8259,8260],{"class":68,"line":3917},[66,8261,8257],{},[66,8263,8264],{"class":68,"line":4129},[66,8265,8257],{},[10,8267,111],{},[56,8269,8272],{"className":8270,"code":8271,"language":117,"meta":61},[115],"3\n2\n1\n",[63,8273,8271],{"__ignoreMap":61},[10,8275,122],{},[14,8277,125],{"id":125},[127,8279,8280,8286],{},[40,8281,7862,8282,8285],{},[63,8283,8284],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8287,8288,8289,8291,8292,8294,8295,8298],{},"每次 ",[63,8290,8195],{}," 运行到下一个 ",[63,8293,8181],{}," 并暂停，局部变量 ",[63,8296,8297],{},"current"," 和执行位置被保留。",[291,8300,2661],{"id":2661},[10,8302,8303,8304,8306],{},"生成器的暂停位置可以展开成多次 ",[63,8305,8195],{}," 的时间线。",[10,8308,8309],{},[26,8310],{"alt":8311,"src":8312},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8314,8315,8316,8318],{},"每次请求只推进到下一个 ",[63,8317,8181],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8320,141],{"id":141},[37,8322,8323,8326],{},[40,8324,8325],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8327,8328],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8330,156],{"id":156},[127,8332,8333,8336],{},[40,8334,8335],{},"编写产生 1 到指定上限偶数的生成器。",[40,8337,3975,8338,8340,8341,8343],{},[63,8339,149],{}," 遍历生成器，比较手动 ",[63,8342,8195],{}," 的差异。",[10,8345,167],{},[14,8347,170],{"id":170},[10,8349,8350],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,8352,177],{},{"title":61,"searchDepth":75,"depth":75,"links":8354},[8355,8356,8357,8358,8359,8362,8363,8364],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":8360},[8361],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8157,"description":8162},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[188,8372,8373],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8376,"title":8377,"body":8378,"category":188,"cover":189,"description":8382,"extension":190,"meta":8606,"navigation":78,"path":8607,"pinned":193,"publishedAt":194,"seo":8608,"slug":8609,"stem":8610,"summary":8611,"tags":8612,"updatedAt":194,"visible":78,"__hash__":8614},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8379,"toc":8594},[8380,8383,8385,8388,8390,8396,8399,8401,8421,8423,8425,8507,8509,8515,8517,8519,8541,8543,8546,8552,8559,8561,8571,8573,8585,8587,8589,8592],[10,8381,8382],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8384,16],{"id":16},[10,8386,8387],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8389,22],{"id":22},[10,8391,8392],{},[26,8393],{"alt":8394,"src":8395},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8397,8398],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8400,35],{"id":35},[37,8402,8403,8412,8415],{},[40,8404,8405,8408,8409,325],{},[63,8406,8407],{},"@trace"," 等价于 ",[63,8410,8411],{},"add = trace(add)",[40,8413,8414],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8416,8417,8420],{},[63,8418,8419],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8422,51],{"id":51},[10,8424,54],{},[56,8426,8428],{"className":58,"code":8427,"language":60,"meta":61,"style":61},"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",[63,8429,8430,8435,8439,8444,8449,8454,8459,8464,8469,8474,8479,8483,8488,8492,8496,8501],{"__ignoreMap":61},[66,8431,8432],{"class":68,"line":69},[66,8433,8434],{},"from functools import wraps\n",[66,8436,8437],{"class":68,"line":75},[66,8438,79],{"emptyLinePlaceholder":78},[66,8440,8441],{"class":68,"line":82},[66,8442,8443],{},"def trace(function):\n",[66,8445,8446],{"class":68,"line":88},[66,8447,8448],{},"    @wraps(function)\n",[66,8450,8451],{"class":68,"line":94},[66,8452,8453],{},"    def wrapper(*args, **kwargs):\n",[66,8455,8456],{"class":68,"line":99},[66,8457,8458],{},"        print(\"开始：\", function.__name__)\n",[66,8460,8461],{"class":68,"line":105},[66,8462,8463],{},"        result = function(*args, **kwargs)\n",[66,8465,8466],{"class":68,"line":2457},[66,8467,8468],{},"        print(\"结束：\", function.__name__)\n",[66,8470,8471],{"class":68,"line":3917},[66,8472,8473],{},"        return result\n",[66,8475,8476],{"class":68,"line":4129},[66,8477,8478],{},"    return wrapper\n",[66,8480,8481],{"class":68,"line":5759},[66,8482,79],{"emptyLinePlaceholder":78},[66,8484,8485],{"class":68,"line":5764},[66,8486,8487],{},"@trace\n",[66,8489,8490],{"class":68,"line":7369},[66,8491,6112],{},[66,8493,8494],{"class":68,"line":7375},[66,8495,6117],{},[66,8497,8499],{"class":68,"line":8498},15,[66,8500,79],{"emptyLinePlaceholder":78},[66,8502,8504],{"class":68,"line":8503},16,[66,8505,8506],{},"print(add(2, 3))\n",[10,8508,111],{},[56,8510,8513],{"className":8511,"code":8512,"language":117,"meta":61},[115],"开始： add\n结束： add\n5\n",[63,8514,8512],{"__ignoreMap":61},[10,8516,122],{},[14,8518,125],{"id":125},[127,8520,8521,8538],{},[40,8522,8523,8524,8527,8528,8531,8532,8535,8536,325],{},"解释器执行定义时，把原 ",[63,8525,8526],{},"add"," 函数交给 ",[63,8529,8530],{},"trace","，返回的 ",[63,8533,8534],{},"wrapper"," 重新绑定到名字 ",[63,8537,8526],{},[40,8539,8540],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[291,8542,2661],{"id":2661},[10,8544,8545],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8547,8548],{},[26,8549],{"alt":8550,"src":8551},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8553,8554,8556,8557,325],{},[63,8555,8407],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[63,8558,8411],{},[14,8560,141],{"id":141},[37,8562,8563,8568],{},[40,8564,8565,8566,325],{},"包装函数忘记返回原函数结果，调用方得到 ",[63,8567,5310],{},[40,8569,8570],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8572,156],{"id":156},[127,8574,8575,8578],{},[40,8576,8577],{},"编写只记录调用次数的简单装饰器。",[40,8579,8580,8581,8584],{},"删除包装函数的 ",[63,8582,8583],{},"return result","，观察调用方得到什么。",[10,8586,167],{},[14,8588,170],{"id":170},[10,8590,8591],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,8593,177],{},{"title":61,"searchDepth":75,"depth":75,"links":8595},[8596,8597,8598,8599,8600,8603,8604,8605],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":8601},[8602],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8377,"description":8382},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[188,8613,5261],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8616,"title":8617,"body":8618,"category":188,"cover":189,"description":8622,"extension":190,"meta":8809,"navigation":78,"path":8810,"pinned":193,"publishedAt":194,"seo":8811,"slug":8812,"stem":8813,"summary":8814,"tags":8815,"updatedAt":194,"visible":78,"__hash__":8818},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8619,"toc":8797},[8620,8623,8625,8628,8630,8636,8639,8641,8652,8654,8656,8731,8733,8739,8741,8743,8754,8756,8759,8765,8768,8770,8778,8780,8788,8790,8792,8795],[10,8621,8622],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8624,16],{"id":16},[10,8626,8627],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8629,22],{"id":22},[10,8631,8632],{},[26,8633],{"alt":8634,"src":8635},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8637,8638],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8640,35],{"id":35},[37,8642,8643,8646,8649],{},[40,8644,8645],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8647,8648],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8650,8651],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8653,51],{"id":51},[10,8655,54],{},[56,8657,8659],{"className":58,"code":8658,"language":60,"meta":61,"style":61},"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",[63,8660,8661,8666,8671,8675,8680,8684,8689,8694,8699,8703,8708,8713,8718,8722,8726],{"__ignoreMap":61},[66,8662,8663],{"class":68,"line":69},[66,8664,8665],{},"import logging\n",[66,8667,8668],{"class":68,"line":75},[66,8669,8670],{},"import unittest\n",[66,8672,8673],{"class":68,"line":82},[66,8674,79],{"emptyLinePlaceholder":78},[66,8676,8677],{"class":68,"line":88},[66,8678,8679],{},"logging.basicConfig(level=logging.INFO)\n",[66,8681,8682],{"class":68,"line":94},[66,8683,79],{"emptyLinePlaceholder":78},[66,8685,8686],{"class":68,"line":99},[66,8687,8688],{},"def clamp_progress(value):\n",[66,8690,8691],{"class":68,"line":105},[66,8692,8693],{},"    logging.info(\"检查进度：%s\", value)\n",[66,8695,8696],{"class":68,"line":2457},[66,8697,8698],{},"    return max(0, min(100, value))\n",[66,8700,8701],{"class":68,"line":3917},[66,8702,79],{"emptyLinePlaceholder":78},[66,8704,8705],{"class":68,"line":4129},[66,8706,8707],{},"class ProgressTest(unittest.TestCase):\n",[66,8709,8710],{"class":68,"line":5759},[66,8711,8712],{},"    def test_upper_limit(self):\n",[66,8714,8715],{"class":68,"line":5764},[66,8716,8717],{},"        self.assertEqual(clamp_progress(120), 100)\n",[66,8719,8720],{"class":68,"line":7369},[66,8721,79],{"emptyLinePlaceholder":78},[66,8723,8724],{"class":68,"line":7375},[66,8725,6126],{},[66,8727,8728],{"class":68,"line":8498},[66,8729,8730],{},"    unittest.main()\n",[10,8732,111],{},[56,8734,8737],{"className":8735,"code":8736,"language":117,"meta":61},[115],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[63,8738,8736],{"__ignoreMap":61},[10,8740,122],{},[14,8742,125],{"id":125},[127,8744,8745,8751],{},[40,8746,8747,8750],{},[63,8748,8749],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8752,8753],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[291,8755,2661],{"id":2661},[10,8757,8758],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8760,8761],{},[26,8762],{"alt":8763,"src":8764},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8766,8767],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8769,141],{"id":141},[37,8771,8772,8775],{},[40,8773,8774],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8776,8777],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8779,156],{"id":156},[127,8781,8782,8785],{},[40,8783,8784],{},"为负数进度增加测试。",[40,8786,8787],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8789,167],{},[14,8791,170],{"id":170},[10,8793,8794],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,8796,177],{},{"title":61,"searchDepth":75,"depth":75,"links":8798},[8799,8800,8801,8802,8803,8806,8807,8808],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":8804},[8805],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8617,"description":8622},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[188,8816,8817],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8820,"title":8821,"body":8822,"category":188,"cover":189,"description":8826,"extension":190,"meta":9126,"navigation":78,"path":9127,"pinned":193,"publishedAt":194,"seo":9128,"slug":9129,"stem":9130,"summary":9131,"tags":9132,"updatedAt":194,"visible":78,"__hash__":9135},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8823,"toc":9113},[8824,8827,8829,8832,8834,8840,8843,8845,8860,8862,8864,9011,9013,9019,9021,9023,9036,9038,9041,9047,9050,9052,9055,9061,9068,9070,9081,9083,9104,9106,9108,9111],[10,8825,8826],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8828,16],{"id":16},[10,8830,8831],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8833,22],{"id":22},[10,8835,8836],{},[26,8837],{"alt":8838,"src":8839},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8841,8842],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8844,35],{"id":35},[37,8846,8847,8850,8853],{},[40,8848,8849],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8851,8852],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8854,8855,8856,8859],{},"实际扩展前先为 ",[63,8857,8858],{},"add()"," 和存储边界补充测试。",[14,8861,51],{"id":51},[10,8863,54],{},[56,8865,8867],{"className":58,"code":8866,"language":60,"meta":61,"style":61},"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",[63,8868,8869,8873,8877,8881,8886,8891,8896,8901,8905,8910,8915,8920,8925,8930,8934,8939,8944,8950,8955,8961,8966,8971,8977,8983,8989,8994,9000,9005],{"__ignoreMap":61},[66,8870,8871],{"class":68,"line":69},[66,8872,6924],{},[66,8874,8875],{"class":68,"line":75},[66,8876,6533],{},[66,8878,8879],{"class":68,"line":82},[66,8880,79],{"emptyLinePlaceholder":78},[66,8882,8883],{"class":68,"line":88},[66,8884,8885],{},"class LearningRecords:\n",[66,8887,8888],{"class":68,"line":94},[66,8889,8890],{},"    def __init__(self, file_path):\n",[66,8892,8893],{"class":68,"line":99},[66,8894,8895],{},"        self.file_path = Path(file_path)\n",[66,8897,8898],{"class":68,"line":105},[66,8899,8900],{},"        self.items = []\n",[66,8902,8903],{"class":68,"line":2457},[66,8904,79],{"emptyLinePlaceholder":78},[66,8906,8907],{"class":68,"line":3917},[66,8908,8909],{},"    def add(self, title):\n",[66,8911,8912],{"class":68,"line":4129},[66,8913,8914],{},"        title = title.strip()\n",[66,8916,8917],{"class":68,"line":5759},[66,8918,8919],{},"        if not title:\n",[66,8921,8922],{"class":68,"line":5764},[66,8923,8924],{},"            raise ValueError(\"课程名称不能为空\")\n",[66,8926,8927],{"class":68,"line":7369},[66,8928,8929],{},"        self.items.append({\"title\": title, \"done\": False})\n",[66,8931,8932],{"class":68,"line":7375},[66,8933,79],{"emptyLinePlaceholder":78},[66,8935,8936],{"class":68,"line":8498},[66,8937,8938],{},"    def save(self):\n",[66,8940,8941],{"class":68,"line":8503},[66,8942,8943],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[66,8945,8947],{"class":68,"line":8946},17,[66,8948,8949],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[66,8951,8953],{"class":68,"line":8952},18,[66,8954,79],{"emptyLinePlaceholder":78},[66,8956,8958],{"class":68,"line":8957},19,[66,8959,8960],{},"records = LearningRecords(\"learning-records.json\")\n",[66,8962,8964],{"class":68,"line":8963},20,[66,8965,79],{"emptyLinePlaceholder":78},[66,8967,8969],{"class":68,"line":8968},21,[66,8970,7342],{},[66,8972,8974],{"class":68,"line":8973},22,[66,8975,8976],{},"    title = input(\"输入已学习课程：\")\n",[66,8978,8980],{"class":68,"line":8979},23,[66,8981,8982],{},"    records.add(title)\n",[66,8984,8986],{"class":68,"line":8985},24,[66,8987,8988],{},"    records.save()\n",[66,8990,8992],{"class":68,"line":8991},25,[66,8993,7352],{},[66,8995,8997],{"class":68,"line":8996},26,[66,8998,8999],{},"    print(\"无法保存：\", error)\n",[66,9001,9003],{"class":68,"line":9002},27,[66,9004,1109],{},[66,9006,9008],{"class":68,"line":9007},28,[66,9009,9010],{},"    print(\"已保存 1 条学习记录\")\n",[10,9012,111],{},[56,9014,9017],{"className":9015,"code":9016,"language":117,"meta":61},[115],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[63,9018,9016],{"__ignoreMap":61},[10,9020,122],{},[14,9022,125],{"id":125},[127,9024,9025,9031],{},[40,9026,9027,9028,9030],{},"输入层取得课程名后，",[63,9029,8858],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9032,9033,9035],{},[63,9034,8090],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[291,9037,2661],{"id":2661},[10,9039,9040],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9042,9043],{},[26,9044],{"alt":9045,"src":9046},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9048,9049],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[291,9051,2661],{"id":4184},[10,9053,9054],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9056,9057],{},[26,9058],{"alt":9059,"src":9060},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9062,9063,9064,9067],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[63,9065,9066],{},"load()"," 把文件状态恢复到内存。",[14,9069,141],{"id":141},[37,9071,9072,9075],{},[40,9073,9074],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9076,9077,9078,9080],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[63,9079,9066],{}," 是下一项必要扩展。",[14,9082,156],{"id":156},[127,9084,9085,9091,9094],{},[40,9086,9087,9088,9090],{},"增加 ",[63,9089,9066],{},"，文件不存在时从空列表开始。",[40,9092,9093],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9095,9096,9097,9100,9101,9103],{},"把输入循环放进 ",[63,9098,9099],{},"main()","，通过 ",[63,9102,6068],{}," 控制程序入口。",[10,9105,167],{},[14,9107,170],{"id":170},[10,9109,9110],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[175,9112,177],{},{"title":61,"searchDepth":75,"depth":75,"links":9114},[9115,9116,9117,9118,9119,9123,9124,9125],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":9120},[9121,9122],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8821,"description":8826},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[188,9133,9134],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9137,9240,9359,9490,9633,9758,9895,10032,10173,10342,10479,10612,10735,10864,10991,11154,11330,11471,11600,11749,11892,12013,12136,12285,12438,12603,12730,12911,13054,13211,13362,13509,13664,13882,14037,14212,14363,14530,14717,14880,15122,15362],{"id":1356,"title":1357,"body":9138,"category":188,"cover":189,"description":1362,"extension":190,"meta":9237,"navigation":78,"path":1481,"pinned":193,"publishedAt":194,"seo":9238,"slug":1483,"stem":1484,"summary":1485,"tags":9239,"updatedAt":194,"visible":78,"__hash__":1488},{"type":7,"value":9139,"toc":9227},[9140,9142,9144,9146,9148,9152,9156,9158,9168,9170,9172,9180,9182,9187,9189,9191,9201,9203,9211,9213,9219,9221,9223,9225],[10,9141,1362],{},[14,9143,16],{"id":16},[10,9145,1367],{},[14,9147,22],{"id":22},[10,9149,9150],{},[26,9151],{"alt":1374,"src":1375},[10,9153,9154,1380],{},[63,9155,1134],{},[14,9157,35],{"id":35},[37,9159,9160,9164,9166],{},[40,9161,1387,9162,1390],{},[63,9163,1134],{},[40,9165,1393],{},[40,9167,1396],{},[14,9169,51],{"id":51},[10,9171,54],{},[56,9173,9174],{"className":58,"code":1403,"language":60,"meta":61,"style":61},[63,9175,9176],{"__ignoreMap":61},[66,9177,9178],{"class":68,"line":69},[66,9179,1403],{},[10,9181,111],{},[56,9183,9185],{"className":9184,"code":1415,"language":117,"meta":61},[115],[63,9186,1415],{"__ignoreMap":61},[10,9188,122],{},[14,9190,125],{"id":125},[127,9192,9193,9197],{},[40,9194,1426,9195,1430],{},[63,9196,1429],{},[40,9198,1433,9199,1437],{},[63,9200,1436],{},[14,9202,141],{"id":141},[37,9204,9205,9207],{},[40,9206,1444],{},[40,9208,1447,9209,1450],{},[63,9210,1134],{},[14,9212,156],{"id":156},[127,9214,9215,9217],{},[40,9216,1457],{},[40,9218,1460],{},[10,9220,167],{},[14,9222,170],{"id":170},[10,9224,1467],{},[175,9226,177],{},{"title":61,"searchDepth":75,"depth":75,"links":9228},[9229,9230,9231,9232,9233,9234,9235,9236],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":1357,"description":1362},[188,1352,1487],{"id":1490,"title":1491,"body":9241,"category":188,"cover":189,"description":1496,"extension":190,"meta":9356,"navigation":78,"path":1633,"pinned":193,"publishedAt":194,"seo":9357,"slug":1635,"stem":1636,"summary":1637,"tags":9358,"updatedAt":194,"visible":78,"__hash__":1640},{"type":7,"value":9242,"toc":9346},[9243,9245,9247,9249,9251,9255,9259,9261,9271,9273,9275,9295,9297,9302,9304,9306,9316,9318,9328,9330,9338,9340,9342,9344],[10,9244,1496],{},[14,9246,16],{"id":16},[10,9248,1501],{},[14,9250,22],{"id":22},[10,9252,9253],{},[26,9254],{"alt":1508,"src":1509},[10,9256,1512,9257,1515],{},[63,9258,654],{},[14,9260,35],{"id":35},[37,9262,9263,9265,9267],{},[40,9264,1522],{},[40,9266,1525],{},[40,9268,1528,9269,1532],{},[63,9270,1531],{},[14,9272,51],{"id":51},[10,9274,1537],{},[56,9276,9277],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,9278,9279,9285],{"__ignoreMap":61},[66,9280,9281,9283],{"class":68,"line":69},[66,9282,654],{"class":563},[66,9284,567],{"class":566},[66,9286,9287,9289,9291,9293],{"class":68,"line":75},[66,9288,654],{"class":563},[66,9290,596],{"class":566},[66,9292,600],{"class":599},[66,9294,567],{"class":566},[10,9296,111],{},[56,9298,9300],{"className":9299,"code":1563,"language":117,"meta":61},[115],[63,9301,1563],{"__ignoreMap":61},[10,9303,122],{},[14,9305,125],{"id":125},[127,9307,9308,9312],{},[40,9309,9310,1577],{},[63,9311,1576],{},[40,9313,9314,1582],{},[63,9315,662],{},[14,9317,141],{"id":141},[37,9319,9320,9324],{},[40,9321,1589,9322,1592],{},[63,9323,654],{},[40,9325,1595,9326,1598],{},[63,9327,654],{},[14,9329,156],{"id":156},[127,9331,9332,9336],{},[40,9333,901,9334,1608],{},[63,9335,1607],{},[40,9337,1611],{},[10,9339,167],{},[14,9341,170],{"id":170},[10,9343,1618],{},[175,9345,1621],{},{"title":61,"searchDepth":75,"depth":75,"links":9347},[9348,9349,9350,9351,9352,9353,9354,9355],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":1491,"description":1496},[188,1639,1015],{"id":1642,"title":1643,"body":9360,"category":188,"cover":189,"description":1809,"extension":190,"meta":9487,"navigation":78,"path":1811,"pinned":193,"publishedAt":194,"seo":9488,"slug":1813,"stem":1814,"summary":1815,"tags":9489,"updatedAt":194,"visible":78,"__hash__":1819},{"type":7,"value":9361,"toc":9477},[9362,9366,9368,9370,9372,9376,9378,9380,9396,9398,9400,9420,9422,9427,9429,9431,9443,9445,9455,9457,9467,9469,9471,9475],[10,9363,1648,9364,1651],{},[63,9365,1134],{},[14,9367,16],{"id":16},[10,9369,1656],{},[14,9371,22],{"id":22},[10,9373,9374],{},[26,9375],{"alt":1663,"src":1664},[10,9377,1667],{},[14,9379,35],{"id":35},[37,9381,9382,9388,9392],{},[40,9383,1674,9384,1677,9386,325],{},[63,9385,654],{},[63,9387,1680],{},[40,9389,1683,9390,1687],{},[63,9391,1686],{},[40,9393,1690,9394,1693],{},[63,9395,1134],{},[14,9397,51],{"id":51},[10,9399,54],{},[56,9401,9402],{"className":1700,"code":1701,"language":1702,"meta":61,"style":61},[63,9403,9404,9408,9412,9416],{"__ignoreMap":61},[66,9405,9406],{"class":68,"line":69},[66,9407,1709],{},[66,9409,9410],{"class":68,"line":75},[66,9411,1714],{},[66,9413,9414],{"class":68,"line":82},[66,9415,1719],{},[66,9417,9418],{"class":68,"line":88},[66,9419,1724],{},[10,9421,111],{},[56,9423,9425],{"className":9424,"code":1730,"language":117,"meta":61},[115],[63,9426,1730],{"__ignoreMap":61},[10,9428,122],{},[14,9430,125],{"id":125},[127,9432,9433,9439],{},[40,9434,1741,9435,1745,9437,325],{},[63,9436,1744],{},[63,9438,1748],{},[40,9440,1751,9441,1754],{},[63,9442,1436],{},[14,9444,141],{"id":141},[37,9446,9447,9453],{},[40,9448,1761,9449,1764,9451,1767],{},[63,9450,1680],{},[63,9452,1134],{},[40,9454,1770],{},[14,9456,156],{"id":156},[127,9458,9459,9463],{},[40,9460,1777,9461,325],{},[63,9462,1780],{},[40,9464,1783,9465,1786],{},[63,9466,1436],{},[10,9468,167],{},[14,9470,170],{"id":170},[10,9472,1793,9473,1796],{},[63,9474,1134],{},[175,9476,177],{},{"title":61,"searchDepth":75,"depth":75,"links":9478},[9479,9480,9481,9482,9483,9484,9485,9486],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":1643,"description":1809},[188,1817,1818],{"id":1821,"title":1822,"body":9491,"category":188,"cover":189,"description":1827,"extension":190,"meta":9630,"navigation":78,"path":1999,"pinned":193,"publishedAt":194,"seo":9631,"slug":2001,"stem":2002,"summary":2003,"tags":9632,"updatedAt":194,"visible":78,"__hash__":2007},{"type":7,"value":9492,"toc":9620},[9493,9495,9497,9499,9501,9505,9509,9511,9523,9525,9527,9563,9565,9570,9572,9574,9590,9592,9602,9604,9612,9614,9616,9618],[10,9494,1827],{},[14,9496,16],{"id":16},[10,9498,1832],{},[14,9500,22],{"id":22},[10,9502,9503],{},[26,9504],{"alt":1839,"src":1840},[10,9506,9507,1846],{},[63,9508,1845],{},[14,9510,35],{"id":35},[37,9512,9513,9515,9521],{},[40,9514,1853],{},[40,9516,9517,1859,9519,1863],{},[63,9518,1858],{},[63,9520,1862],{},[40,9522,1866],{},[14,9524,51],{"id":51},[10,9526,1537],{},[56,9528,9529],{"className":554,"code":1873,"language":556,"meta":61,"style":61},[63,9530,9531,9537,9543,9547,9557],{"__ignoreMap":61},[66,9532,9533,9535],{"class":68,"line":69},[66,9534,1880],{"class":563},[66,9536,1883],{"class":599},[66,9538,9539,9541],{"class":68,"line":75},[66,9540,1888],{"class":566},[66,9542,1883],{"class":599},[66,9544,9545],{"class":68,"line":82},[66,9546,1895],{"class":566},[66,9548,9549,9551,9553,9555],{"class":68,"line":88},[66,9550,1900],{"class":566},[66,9552,1903],{"class":599},[66,9554,1907],{"class":1906},[66,9556,1178],{"class":599},[66,9558,9559,9561],{"class":68,"line":94},[66,9560,654],{"class":563},[66,9562,1178],{"class":599},[10,9564,111],{},[56,9566,9568],{"className":9567,"code":1921,"language":117,"meta":61},[115],[63,9569,1921],{"__ignoreMap":61},[10,9571,122],{},[14,9573,125],{"id":125},[127,9575,9576,9584],{},[40,9577,9578,1934,9580,1937,9582,1940],{},[63,9579,1880],{},[63,9581,1888],{},[63,9583,1858],{},[40,9585,9586,1945,9588,1949],{},[63,9587,1845],{},[63,9589,1948],{},[14,9591,141],{"id":141},[37,9593,9594,9600],{},[40,9595,1956,9596,1120,9598,325],{},[63,9597,1858],{},[63,9599,1862],{},[40,9601,1963],{},[14,9603,156],{"id":156},[127,9605,9606,9610],{},[40,9607,1970,9608,1974],{},[63,9609,1973],{},[40,9611,1977],{},[10,9613,167],{},[14,9615,170],{"id":170},[10,9617,1984],{},[175,9619,1987],{},{"title":61,"searchDepth":75,"depth":75,"links":9621},[9622,9623,9624,9625,9626,9627,9628,9629],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":1822,"description":1827},[188,2005,2006],{"id":2009,"title":2010,"body":9634,"category":188,"cover":189,"description":2015,"extension":190,"meta":9755,"navigation":78,"path":2164,"pinned":193,"publishedAt":194,"seo":9756,"slug":2166,"stem":2167,"summary":2168,"tags":9757,"updatedAt":194,"visible":78,"__hash__":2172},{"type":7,"value":9635,"toc":9745},[9636,9638,9640,9642,9644,9648,9656,9658,9672,9674,9676,9692,9694,9699,9701,9703,9717,9719,9725,9727,9737,9739,9741,9743],[10,9637,2015],{},[14,9639,16],{"id":16},[10,9641,2020],{},[14,9643,22],{"id":22},[10,9645,9646],{},[26,9647],{"alt":2027,"src":2028},[10,9649,2031,9650,325,9652,2037,9654,325],{},[63,9651,1436],{},[63,9653,2036],{},[63,9655,1744],{},[14,9657,35],{"id":35},[37,9659,9660,9664,9670],{},[40,9661,9662,2049],{},[63,9663,2048],{},[40,9665,9666,2055,9668,325],{},[63,9667,2054],{},[63,9669,2058],{},[40,9671,2061],{},[14,9673,51],{"id":51},[10,9675,54],{},[56,9677,9678],{"className":58,"code":2068,"language":60,"meta":61,"style":61},[63,9679,9680,9684,9688],{"__ignoreMap":61},[66,9681,9682],{"class":68,"line":69},[66,9683,2075],{},[66,9685,9686],{"class":68,"line":75},[66,9687,2080],{},[66,9689,9690],{"class":68,"line":82},[66,9691,2085],{},[10,9693,111],{},[56,9695,9697],{"className":9696,"code":2091,"language":117,"meta":61},[115],[63,9698,2091],{"__ignoreMap":61},[10,9700,122],{},[14,9702,125],{"id":125},[127,9704,9705,9711],{},[40,9706,9707,2105,9709,325],{},[63,9708,2104],{},[63,9710,2058],{},[40,9712,9713,2112,9715,2116],{},[63,9714,1436],{},[63,9716,2115],{},[14,9718,141],{"id":141},[37,9720,9721,9723],{},[40,9722,2123],{},[40,9724,2126],{},[14,9726,156],{"id":156},[127,9728,9729,9731],{},[40,9730,2133],{},[40,9732,2136,9733,2139,9735,2143],{},[63,9734,2036],{},[63,9736,2142],{},[10,9738,167],{},[14,9740,170],{"id":170},[10,9742,2150],{},[175,9744,177],{},{"title":61,"searchDepth":75,"depth":75,"links":9746},[9747,9748,9749,9750,9751,9752,9753,9754],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2010,"description":2015},[188,2170,2171],{"id":2174,"title":2175,"body":9759,"category":188,"cover":189,"description":2180,"extension":190,"meta":9892,"navigation":78,"path":2348,"pinned":193,"publishedAt":194,"seo":9893,"slug":2350,"stem":2351,"summary":2352,"tags":9894,"updatedAt":194,"visible":78,"__hash__":2356},{"type":7,"value":9760,"toc":9882},[9761,9763,9765,9767,9769,9773,9775,9777,9793,9795,9797,9821,9823,9828,9830,9832,9848,9850,9862,9864,9874,9876,9878,9880],[10,9762,2180],{},[14,9764,16],{"id":16},[10,9766,2185],{},[14,9768,22],{"id":22},[10,9770,9771],{},[26,9772],{"alt":2192,"src":2193},[10,9774,2196],{},[14,9776,35],{"id":35},[37,9778,9779,9781,9787],{},[40,9780,2203],{},[40,9782,2206,9783,2139,9785,2213],{},[63,9784,2209],{},[63,9786,2212],{},[40,9788,2216,9789,2220,9791,2224],{},[63,9790,2219],{},[63,9792,2223],{},[14,9794,51],{"id":51},[10,9796,54],{},[56,9798,9799],{"className":58,"code":2231,"language":60,"meta":61,"style":61},[63,9800,9801,9805,9809,9813,9817],{"__ignoreMap":61},[66,9802,9803],{"class":68,"line":69},[66,9804,2238],{},[66,9806,9807],{"class":68,"line":75},[66,9808,2243],{},[66,9810,9811],{"class":68,"line":82},[66,9812,79],{"emptyLinePlaceholder":78},[66,9814,9815],{"class":68,"line":88},[66,9816,2252],{},[66,9818,9819],{"class":68,"line":94},[66,9820,2243],{},[10,9822,111],{},[56,9824,9826],{"className":9825,"code":2262,"language":117,"meta":61},[115],[63,9827,2262],{"__ignoreMap":61},[10,9829,122],{},[14,9831,125],{"id":125},[127,9833,9834,9840],{},[40,9835,901,9836,2276,9838,2279],{},[63,9837,2275],{},[63,9839,2209],{},[40,9841,901,9842,2285,9844,2289,9846,325],{},[63,9843,2284],{},[63,9845,2288],{},[63,9847,2292],{},[14,9849,141],{"id":141},[37,9851,9852,9854],{},[40,9853,2299],{},[40,9855,2302,9856,2220,9858,2220,9860,2310],{},[63,9857,2219],{},[63,9859,2223],{},[63,9861,2309],{},[14,9863,156],{"id":156},[127,9865,9866,9872],{},[40,9867,2317,9868,1120,9870,2324],{},[63,9869,2320],{},[63,9871,2323],{},[40,9873,2327],{},[10,9875,167],{},[14,9877,170],{"id":170},[10,9879,2334],{},[175,9881,177],{},{"title":61,"searchDepth":75,"depth":75,"links":9883},[9884,9885,9886,9887,9888,9889,9890,9891],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2175,"description":2180},[188,2354,2355],{"id":2358,"title":2359,"body":9896,"category":188,"cover":189,"description":2364,"extension":190,"meta":10029,"navigation":78,"path":2530,"pinned":193,"publishedAt":194,"seo":10030,"slug":2532,"stem":2533,"summary":2534,"tags":10031,"updatedAt":194,"visible":78,"__hash__":2538},{"type":7,"value":9897,"toc":10019},[9898,9900,9902,9904,9906,9910,9912,9914,9932,9934,9936,9972,9974,9979,9981,9983,9993,9995,10003,10005,10011,10013,10015,10017],[10,9899,2364],{},[14,9901,16],{"id":16},[10,9903,2369],{},[14,9905,22],{"id":22},[10,9907,9908],{},[26,9909],{"alt":2376,"src":2377},[10,9911,2380],{},[14,9913,35],{"id":35},[37,9915,9916,9922,9930],{},[40,9917,9918,2390,9920,2394],{},[63,9919,2389],{},[63,9921,2393],{},[40,9923,9924,2400,9926,2404,9928,2408],{},[63,9925,2399],{},[63,9927,2403],{},[63,9929,2407],{},[40,9931,2411],{},[14,9933,51],{"id":51},[10,9935,54],{},[56,9937,9938],{"className":58,"code":2418,"language":60,"meta":61,"style":61},[63,9939,9940,9944,9948,9952,9956,9960,9964,9968],{"__ignoreMap":61},[66,9941,9942],{"class":68,"line":69},[66,9943,2425],{},[66,9945,9946],{"class":68,"line":75},[66,9947,2430],{},[66,9949,9950],{"class":68,"line":82},[66,9951,2435],{},[66,9953,9954],{"class":68,"line":88},[66,9955,79],{"emptyLinePlaceholder":78},[66,9957,9958],{"class":68,"line":94},[66,9959,2444],{},[66,9961,9962],{"class":68,"line":99},[66,9963,2449],{},[66,9965,9966],{"class":68,"line":105},[66,9967,2454],{},[66,9969,9970],{"class":68,"line":2457},[66,9971,2460],{},[10,9973,111],{},[56,9975,9977],{"className":9976,"code":2466,"language":117,"meta":61},[115],[63,9978,2466],{"__ignoreMap":61},[10,9980,122],{},[14,9982,125],{"id":125},[127,9984,9985,9989],{},[40,9986,9987,2480],{},[63,9988,2479],{},[40,9990,9991,2486],{},[63,9992,2485],{},[14,9994,141],{"id":141},[37,9996,9997,10001],{},[40,9998,2493,9999,325],{},[63,10000,2496],{},[40,10002,2499],{},[14,10004,156],{"id":156},[127,10006,10007,10009],{},[40,10008,2506],{},[40,10010,2509],{},[10,10012,167],{},[14,10014,170],{"id":170},[10,10016,2516],{},[175,10018,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10020},[10021,10022,10023,10024,10025,10026,10027,10028],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2359,"description":2364},[188,2536,2537],{"id":2540,"title":2541,"body":10033,"category":188,"cover":189,"description":2546,"extension":190,"meta":10170,"navigation":78,"path":2723,"pinned":193,"publishedAt":194,"seo":10171,"slug":2725,"stem":2726,"summary":2727,"tags":10172,"updatedAt":194,"visible":78,"__hash__":2731},{"type":7,"value":10034,"toc":10158},[10035,10037,10039,10041,10043,10047,10053,10055,10063,10065,10067,10091,10093,10098,10100,10102,10120,10122,10124,10128,10130,10132,10138,10140,10150,10152,10154,10156],[10,10036,2546],{},[14,10038,16],{"id":16},[10,10040,2551],{},[14,10042,22],{"id":22},[10,10044,10045],{},[26,10046],{"alt":2558,"src":2559},[10,10048,2562,10049,2566,10051,325],{},[63,10050,2565],{},[63,10052,2569],{},[14,10054,35],{"id":35},[37,10056,10057,10059,10061],{},[40,10058,2576],{},[40,10060,2579],{},[40,10062,2582],{},[14,10064,51],{"id":51},[10,10066,54],{},[56,10068,10069],{"className":58,"code":2589,"language":60,"meta":61,"style":61},[63,10070,10071,10075,10079,10083,10087],{"__ignoreMap":61},[66,10072,10073],{"class":68,"line":69},[66,10074,2596],{},[66,10076,10077],{"class":68,"line":75},[66,10078,2601],{},[66,10080,10081],{"class":68,"line":82},[66,10082,2606],{},[66,10084,10085],{"class":68,"line":88},[66,10086,2611],{},[66,10088,10089],{"class":68,"line":94},[66,10090,2616],{},[10,10092,111],{},[56,10094,10096],{"className":10095,"code":2622,"language":117,"meta":61},[115],[63,10097,2622],{"__ignoreMap":61},[10,10099,122],{},[14,10101,125],{"id":125},[127,10103,10104,10112],{},[40,10105,2633,10106,2636,10108,2640,10110,2644],{},[63,10107,188],{},[63,10109,2639],{},[63,10111,2643],{},[40,10113,10114,2650,10116,2654,10118,2658],{},[63,10115,2649],{},[63,10117,2653],{},[63,10119,2657],{},[291,10121,2661],{"id":2661},[10,10123,2664],{},[10,10125,10126],{},[26,10127],{"alt":2669,"src":2670},[10,10129,2673],{},[14,10131,141],{"id":141},[37,10133,10134,10136],{},[40,10135,2680],{},[40,10137,2683],{},[14,10139,156],{"id":156},[127,10141,10142,10148],{},[40,10143,2690,10144,2694,10146,325],{},[63,10145,2693],{},[63,10147,2697],{},[40,10149,2700],{},[10,10151,167],{},[14,10153,170],{"id":170},[10,10155,2707],{},[175,10157,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10159},[10160,10161,10162,10163,10164,10167,10168,10169],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":10165},[10166],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2541,"description":2546},[188,2729,2730],{"id":2733,"title":2734,"body":10174,"category":188,"cover":189,"description":2739,"extension":190,"meta":10339,"navigation":78,"path":2954,"pinned":193,"publishedAt":194,"seo":10340,"slug":2956,"stem":2957,"summary":2958,"tags":10341,"updatedAt":194,"visible":78,"__hash__":2962},{"type":7,"value":10175,"toc":10327},[10176,10178,10180,10182,10184,10188,10194,10196,10216,10218,10220,10256,10258,10263,10265,10267,10281,10283,10285,10289,10295,10297,10307,10309,10319,10321,10323,10325],[10,10177,2739],{},[14,10179,16],{"id":16},[10,10181,2744],{},[14,10183,22],{"id":22},[10,10185,10186],{},[26,10187],{"alt":2751,"src":2752},[10,10189,2755,10190,972,10192,2762],{},[63,10191,2758],{},[63,10193,2761],{},[14,10195,35],{"id":35},[37,10197,10198,10206,10214],{},[40,10199,10200,2772,10202,2776,10204,2780],{},[63,10201,2771],{},[63,10203,2775],{},[63,10205,2779],{},[40,10207,10208,2786,10210,2790,10212,2794],{},[63,10209,2785],{},[63,10211,2789],{},[63,10213,2793],{},[40,10215,2797],{},[14,10217,51],{"id":51},[10,10219,54],{},[56,10221,10222],{"className":58,"code":2804,"language":60,"meta":61,"style":61},[63,10223,10224,10228,10232,10236,10240,10244,10248,10252],{"__ignoreMap":61},[66,10225,10226],{"class":68,"line":69},[66,10227,2811],{},[66,10229,10230],{"class":68,"line":75},[66,10231,2816],{},[66,10233,10234],{"class":68,"line":82},[66,10235,79],{"emptyLinePlaceholder":78},[66,10237,10238],{"class":68,"line":88},[66,10239,2825],{},[66,10241,10242],{"class":68,"line":94},[66,10243,2830],{},[66,10245,10246],{"class":68,"line":99},[66,10247,2835],{},[66,10249,10250],{"class":68,"line":105},[66,10251,2840],{},[66,10253,10254],{"class":68,"line":2457},[66,10255,2845],{},[10,10257,111],{},[56,10259,10261],{"className":10260,"code":2851,"language":117,"meta":61},[115],[63,10262,2851],{"__ignoreMap":61},[10,10264,122],{},[14,10266,125],{"id":125},[127,10268,10269,10275],{},[40,10270,10271,2865,10273,2869],{},[63,10272,2864],{},[63,10274,2868],{},[40,10276,10277,2875,10279,2878],{},[63,10278,2874],{},[63,10280,2793],{},[291,10282,2661],{"id":2661},[10,10284,2883],{},[10,10286,10287],{},[26,10288],{"alt":2888,"src":2889},[10,10290,10291,2894,10293,2897],{},[63,10292,2785],{},[63,10294,2789],{},[14,10296,141],{"id":141},[37,10298,10299,10305],{},[40,10300,2904,10301,2907,10303,2910],{},[63,10302,2779],{},[63,10304,2771],{},[40,10306,2913],{},[14,10308,156],{"id":156},[127,10310,10311,10315],{},[40,10312,2920,10313,2924],{},[63,10314,2923],{},[40,10316,2927,10317,2931],{},[63,10318,2930],{},[10,10320,167],{},[14,10322,170],{"id":170},[10,10324,2938],{},[175,10326,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10328},[10329,10330,10331,10332,10333,10336,10337,10338],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":10334},[10335],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2734,"description":2739},[188,2960,2961],{"id":2964,"title":2965,"body":10343,"category":188,"cover":189,"description":2970,"extension":190,"meta":10476,"navigation":78,"path":3139,"pinned":193,"publishedAt":194,"seo":10477,"slug":3141,"stem":3142,"summary":3143,"tags":10478,"updatedAt":194,"visible":78,"__hash__":3146},{"type":7,"value":10344,"toc":10466},[10345,10347,10349,10351,10353,10357,10367,10369,10379,10381,10383,10411,10413,10418,10420,10422,10436,10438,10446,10448,10458,10460,10462,10464],[10,10346,2970],{},[14,10348,16],{"id":16},[10,10350,2975],{},[14,10352,22],{"id":22},[10,10354,10355],{},[26,10356],{"alt":2982,"src":2983},[10,10358,10359,2989,10361,2993,10363,2997,10365,3001],{},[63,10360,2988],{},[63,10362,2992],{},[63,10364,2996],{},[63,10366,3000],{},[14,10368,35],{"id":35},[37,10370,10371,10373,10377],{},[40,10372,3008],{},[40,10374,10375,3013],{},[63,10376,3000],{},[40,10378,3016],{},[14,10380,51],{"id":51},[10,10382,54],{},[56,10384,10385],{"className":58,"code":3023,"language":60,"meta":61,"style":61},[63,10386,10387,10391,10395,10399,10403,10407],{"__ignoreMap":61},[66,10388,10389],{"class":68,"line":69},[66,10390,3030],{},[66,10392,10393],{"class":68,"line":75},[66,10394,3035],{},[66,10396,10397],{"class":68,"line":82},[66,10398,3040],{},[66,10400,10401],{"class":68,"line":88},[66,10402,79],{"emptyLinePlaceholder":78},[66,10404,10405],{"class":68,"line":94},[66,10406,3049],{},[66,10408,10409],{"class":68,"line":99},[66,10410,3054],{},[10,10412,111],{},[56,10414,10416],{"className":10415,"code":3060,"language":117,"meta":61},[115],[63,10417,3060],{"__ignoreMap":61},[10,10419,122],{},[14,10421,125],{"id":125},[127,10423,10424,10430],{},[40,10425,3071,10426,3074,10428,3078],{},[63,10427,2988],{},[63,10429,3077],{},[40,10431,10432,3084,10434,3088],{},[63,10433,3083],{},[63,10435,3087],{},[14,10437,141],{"id":141},[37,10439,10440,10444],{},[40,10441,3095,10442,3099],{},[63,10443,3098],{},[40,10445,3102],{},[14,10447,156],{"id":156},[127,10449,10450,10452],{},[40,10451,3109],{},[40,10453,1683,10454,3115,10456,3118],{},[63,10455,3114],{},[63,10457,3000],{},[10,10459,167],{},[14,10461,170],{"id":170},[10,10463,3125],{},[175,10465,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10467},[10468,10469,10470,10471,10472,10473,10474,10475],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":2965,"description":2970},[188,2309,3145],{"id":3148,"title":3149,"body":10480,"category":188,"cover":189,"description":3154,"extension":190,"meta":10609,"navigation":78,"path":3315,"pinned":193,"publishedAt":194,"seo":10610,"slug":3317,"stem":3318,"summary":3319,"tags":10611,"updatedAt":194,"visible":78,"__hash__":3323},{"type":7,"value":10481,"toc":10599},[10482,10484,10486,10488,10490,10494,10498,10500,10510,10512,10514,10546,10548,10553,10555,10557,10569,10571,10581,10583,10591,10593,10595,10597],[10,10483,3154],{},[14,10485,16],{"id":16},[10,10487,3159],{},[14,10489,22],{"id":22},[10,10491,10492],{},[26,10493],{"alt":3166,"src":3167},[10,10495,3170,10496,3174],{},[63,10497,3173],{},[14,10499,35],{"id":35},[37,10501,10502,10504,10506],{},[40,10503,3181],{},[40,10505,3184],{},[40,10507,3187,10508,325],{},[63,10509,3190],{},[14,10511,51],{"id":51},[10,10513,54],{},[56,10515,10516],{"className":58,"code":3197,"language":60,"meta":61,"style":61},[63,10517,10518,10522,10526,10530,10534,10538,10542],{"__ignoreMap":61},[66,10519,10520],{"class":68,"line":69},[66,10521,3204],{},[66,10523,10524],{"class":68,"line":75},[66,10525,3209],{},[66,10527,10528],{"class":68,"line":82},[66,10529,79],{"emptyLinePlaceholder":78},[66,10531,10532],{"class":68,"line":88},[66,10533,3218],{},[66,10535,10536],{"class":68,"line":94},[66,10537,3223],{},[66,10539,10540],{"class":68,"line":99},[66,10541,3228],{},[66,10543,10544],{"class":68,"line":105},[66,10545,3233],{},[10,10547,111],{},[56,10549,10551],{"className":10550,"code":3239,"language":117,"meta":61},[115],[63,10552,3239],{"__ignoreMap":61},[10,10554,122],{},[14,10556,125],{"id":125},[127,10558,10559,10561],{},[40,10560,3250],{},[40,10562,10563,3256,10565,3260,10567,3264],{},[63,10564,3255],{},[63,10566,3259],{},[63,10568,3263],{},[14,10570,141],{"id":141},[37,10572,10573,10579],{},[40,10574,3271,10575,3275,10577,325],{},[63,10576,3274],{},[63,10578,3278],{},[40,10580,3281],{},[14,10582,156],{"id":156},[127,10584,10585,10587],{},[40,10586,3288],{},[40,10588,3291,10589,3294],{},[63,10590,3263],{},[10,10592,167],{},[14,10594,170],{"id":170},[10,10596,3301],{},[175,10598,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10600},[10601,10602,10603,10604,10605,10606,10607,10608],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":3149,"description":3154},[188,3321,3322],{"id":3325,"title":3326,"body":10613,"category":188,"cover":189,"description":3331,"extension":190,"meta":10732,"navigation":78,"path":3473,"pinned":193,"publishedAt":194,"seo":10733,"slug":3475,"stem":3476,"summary":3477,"tags":10734,"updatedAt":194,"visible":78,"__hash__":3480},{"type":7,"value":10614,"toc":10722},[10615,10617,10619,10621,10623,10627,10629,10631,10639,10641,10643,10671,10673,10678,10680,10682,10692,10694,10702,10704,10714,10716,10718,10720],[10,10616,3331],{},[14,10618,16],{"id":16},[10,10620,3336],{},[14,10622,22],{"id":22},[10,10624,10625],{},[26,10626],{"alt":3343,"src":3344},[10,10628,3347],{},[14,10630,35],{"id":35},[37,10632,10633,10635,10637],{},[40,10634,3354],{},[40,10636,3357],{},[40,10638,3360],{},[14,10640,51],{"id":51},[10,10642,54],{},[56,10644,10645],{"className":58,"code":3367,"language":60,"meta":61,"style":61},[63,10646,10647,10651,10655,10659,10663,10667],{"__ignoreMap":61},[66,10648,10649],{"class":68,"line":69},[66,10650,3374],{},[66,10652,10653],{"class":68,"line":75},[66,10654,3379],{},[66,10656,10657],{"class":68,"line":82},[66,10658,3384],{},[66,10660,10661],{"class":68,"line":88},[66,10662,79],{"emptyLinePlaceholder":78},[66,10664,10665],{"class":68,"line":94},[66,10666,3393],{},[66,10668,10669],{"class":68,"line":99},[66,10670,3398],{},[10,10672,111],{},[56,10674,10676],{"className":10675,"code":3404,"language":117,"meta":61},[115],[63,10677,3404],{"__ignoreMap":61},[10,10679,122],{},[14,10681,125],{"id":125},[127,10683,10684,10688],{},[40,10685,10686,3418],{},[63,10687,3417],{},[40,10689,10690,3424],{},[63,10691,3423],{},[14,10693,141],{"id":141},[37,10695,10696,10700],{},[40,10697,3431,10698,3435],{},[63,10699,3434],{},[40,10701,3438],{},[14,10703,156],{"id":156},[127,10705,10706,10708],{},[40,10707,3445],{},[40,10709,2136,10710,2139,10712,3452],{},[63,10711,3434],{},[63,10713,3423],{},[10,10715,167],{},[14,10717,170],{"id":170},[10,10719,3459],{},[175,10721,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10723},[10724,10725,10726,10727,10728,10729,10730,10731],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":3326,"description":3331},[188,3479,3322],{"id":3482,"title":3483,"body":10736,"category":188,"cover":189,"description":3488,"extension":190,"meta":10861,"navigation":78,"path":3644,"pinned":193,"publishedAt":194,"seo":10862,"slug":3646,"stem":3647,"summary":3648,"tags":10863,"updatedAt":194,"visible":78,"__hash__":3651},{"type":7,"value":10737,"toc":10851},[10738,10740,10742,10744,10746,10750,10756,10758,10768,10770,10772,10800,10802,10807,10809,10811,10821,10823,10835,10837,10843,10845,10847,10849],[10,10739,3488],{},[14,10741,16],{"id":16},[10,10743,3493],{},[14,10745,22],{"id":22},[10,10747,10748],{},[26,10749],{"alt":3500,"src":3501},[10,10751,3504,10752,3508,10754,3511],{},[63,10753,3507],{},[63,10755,2209],{},[14,10757,35],{"id":35},[37,10759,10760,10762,10766],{},[40,10761,3518],{},[40,10763,2302,10764,3524],{},[63,10765,3523],{},[40,10767,3527],{},[14,10769,51],{"id":51},[10,10771,54],{},[56,10773,10774],{"className":58,"code":3534,"language":60,"meta":61,"style":61},[63,10775,10776,10780,10784,10788,10792,10796],{"__ignoreMap":61},[66,10777,10778],{"class":68,"line":69},[66,10779,3541],{},[66,10781,10782],{"class":68,"line":75},[66,10783,3546],{},[66,10785,10786],{"class":68,"line":82},[66,10787,79],{"emptyLinePlaceholder":78},[66,10789,10790],{"class":68,"line":88},[66,10791,3555],{},[66,10793,10794],{"class":68,"line":94},[66,10795,3560],{},[66,10797,10798],{"class":68,"line":99},[66,10799,3565],{},[10,10801,111],{},[56,10803,10805],{"className":10804,"code":3571,"language":117,"meta":61},[115],[63,10806,3571],{"__ignoreMap":61},[10,10808,122],{},[14,10810,125],{"id":125},[127,10812,10813,10815],{},[40,10814,3582],{},[40,10816,3585,10817,3588,10819,3592],{},[63,10818,2209],{},[63,10820,3591],{},[14,10822,141],{"id":141},[37,10824,10825,10829],{},[40,10826,3599,10827,3603],{},[63,10828,3602],{},[40,10830,3606,10831,3610,10833,325],{},[63,10832,3609],{},[63,10834,3613],{},[14,10836,156],{"id":156},[127,10838,10839,10841],{},[40,10840,3620],{},[40,10842,3623],{},[10,10844,167],{},[14,10846,170],{"id":170},[10,10848,3630],{},[175,10850,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10852},[10853,10854,10855,10856,10857,10858,10859,10860],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":3483,"description":3488},[188,3650,3322],{"id":3653,"title":3654,"body":10865,"category":188,"cover":189,"description":3659,"extension":190,"meta":10988,"navigation":78,"path":3809,"pinned":193,"publishedAt":194,"seo":10989,"slug":3811,"stem":3812,"summary":3813,"tags":10990,"updatedAt":194,"visible":78,"__hash__":3816},{"type":7,"value":10866,"toc":10978},[10867,10869,10871,10873,10875,10879,10881,10883,10895,10897,10899,10927,10929,10934,10936,10938,10948,10950,10960,10962,10970,10972,10974,10976],[10,10868,3659],{},[14,10870,16],{"id":16},[10,10872,3664],{},[14,10874,22],{"id":22},[10,10876,10877],{},[26,10878],{"alt":3671,"src":3672},[10,10880,3675],{},[14,10882,35],{"id":35},[37,10884,10885,10887,10889],{},[40,10886,3682],{},[40,10888,3685],{},[40,10890,3688,10891,3692,10893,3696],{},[63,10892,3691],{},[63,10894,3695],{},[14,10896,51],{"id":51},[10,10898,54],{},[56,10900,10901],{"className":58,"code":3703,"language":60,"meta":61,"style":61},[63,10902,10903,10907,10911,10915,10919,10923],{"__ignoreMap":61},[66,10904,10905],{"class":68,"line":69},[66,10906,3710],{},[66,10908,10909],{"class":68,"line":75},[66,10910,3715],{},[66,10912,10913],{"class":68,"line":82},[66,10914,79],{"emptyLinePlaceholder":78},[66,10916,10917],{"class":68,"line":88},[66,10918,3724],{},[66,10920,10921],{"class":68,"line":94},[66,10922,3729],{},[66,10924,10925],{"class":68,"line":99},[66,10926,3734],{},[10,10928,111],{},[56,10930,10932],{"className":10931,"code":3740,"language":117,"meta":61},[115],[63,10933,3740],{"__ignoreMap":61},[10,10935,122],{},[14,10937,125],{"id":125},[127,10939,10940,10942],{},[40,10941,3751],{},[40,10943,10944,3757,10946,3761],{},[63,10945,3756],{},[63,10947,3760],{},[14,10949,141],{"id":141},[37,10951,10952,10958],{},[40,10953,2302,10954,3770,10956,325],{},[63,10955,3695],{},[63,10957,3691],{},[40,10959,3775],{},[14,10961,156],{"id":156},[127,10963,10964,10968],{},[40,10965,3782,10966,3785],{},[63,10967,3691],{},[40,10969,3788],{},[10,10971,167],{},[14,10973,170],{"id":170},[10,10975,3795],{},[175,10977,177],{},{"title":61,"searchDepth":75,"depth":75,"links":10979},[10980,10981,10982,10983,10984,10985,10986,10987],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":3654,"description":3659},[188,3815,3322],{"id":3818,"title":3819,"body":10992,"category":188,"cover":189,"description":3824,"extension":190,"meta":11151,"navigation":78,"path":4023,"pinned":193,"publishedAt":194,"seo":11152,"slug":4025,"stem":4026,"summary":4027,"tags":11153,"updatedAt":194,"visible":78,"__hash__":4031},{"type":7,"value":10993,"toc":11139},[10994,10996,10998,11000,11002,11006,11012,11014,11026,11028,11030,11070,11072,11077,11079,11081,11095,11097,11099,11103,11105,11107,11117,11119,11131,11133,11135,11137],[10,10995,3824],{},[14,10997,16],{"id":16},[10,10999,3829],{},[14,11001,22],{"id":22},[10,11003,11004],{},[26,11005],{"alt":3836,"src":3837},[10,11007,11008,3843,11010,3847],{},[63,11009,3842],{},[63,11011,3846],{},[14,11013,35],{"id":35},[37,11015,11016,11022,11024],{},[40,11017,11018,3856,11020,3860],{},[63,11019,2771],{},[63,11021,3859],{},[40,11023,3863],{},[40,11025,3866],{},[14,11027,51],{"id":51},[10,11029,54],{},[56,11031,11032],{"className":58,"code":3873,"language":60,"meta":61,"style":61},[63,11033,11034,11038,11042,11046,11050,11054,11058,11062,11066],{"__ignoreMap":61},[66,11035,11036],{"class":68,"line":69},[66,11037,3880],{},[66,11039,11040],{"class":68,"line":75},[66,11041,3885],{},[66,11043,11044],{"class":68,"line":82},[66,11045,3890],{},[66,11047,11048],{"class":68,"line":88},[66,11049,79],{"emptyLinePlaceholder":78},[66,11051,11052],{"class":68,"line":94},[66,11053,3899],{},[66,11055,11056],{"class":68,"line":99},[66,11057,3904],{},[66,11059,11060],{"class":68,"line":105},[66,11061,3909],{},[66,11063,11064],{"class":68,"line":2457},[66,11065,3914],{},[66,11067,11068],{"class":68,"line":3917},[66,11069,3920],{},[10,11071,111],{},[56,11073,11075],{"className":11074,"code":3926,"language":117,"meta":61},[115],[63,11076,3926],{"__ignoreMap":61},[10,11078,122],{},[14,11080,125],{"id":125},[127,11082,11083,11087],{},[40,11084,11085,3940],{},[63,11086,3939],{},[40,11088,11089,3946,11091,3950,11093,3954],{},[63,11090,3945],{},[63,11092,3949],{},[63,11094,3953],{},[291,11096,2661],{"id":2661},[10,11098,3959],{},[10,11100,11101],{},[26,11102],{"alt":3964,"src":3965},[10,11104,3968],{},[14,11106,141],{"id":141},[37,11108,11109,11115],{},[40,11110,3975,11111,3978,11113,325],{},[63,11112,2771],{},[63,11114,3859],{},[40,11116,3983],{},[14,11118,156],{"id":156},[127,11120,11121,11123],{},[40,11122,3990],{},[40,11124,2302,11125,3996,11127,1120,11129,325],{},[63,11126,3995],{},[63,11128,3859],{},[63,11130,2771],{},[10,11132,167],{},[14,11134,170],{"id":170},[10,11136,4007],{},[175,11138,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11140},[11141,11142,11143,11144,11145,11148,11149,11150],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":11146},[11147],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":3819,"description":3824},[188,4029,4030],{"id":4033,"title":4034,"body":11155,"category":188,"cover":189,"description":4039,"extension":190,"meta":11327,"navigation":78,"path":4253,"pinned":193,"publishedAt":194,"seo":11328,"slug":4255,"stem":4256,"summary":4257,"tags":11329,"updatedAt":194,"visible":78,"__hash__":4260},{"type":7,"value":11156,"toc":11314},[11157,11159,11161,11163,11165,11169,11177,11179,11187,11189,11191,11235,11237,11242,11244,11246,11258,11260,11262,11266,11272,11274,11276,11280,11284,11286,11298,11300,11306,11308,11310,11312],[10,11158,4039],{},[14,11160,16],{"id":16},[10,11162,4044],{},[14,11164,22],{"id":22},[10,11166,11167],{},[26,11168],{"alt":4051,"src":4052},[10,11170,11171,2220,11173,2220,11175,4062],{},[63,11172,1119],{},[63,11174,4059],{},[63,11176,1123],{},[14,11178,35],{"id":35},[37,11180,11181,11183,11185],{},[40,11182,4069],{},[40,11184,4072],{},[40,11186,4075],{},[14,11188,51],{"id":51},[10,11190,54],{},[56,11192,11193],{"className":58,"code":4082,"language":60,"meta":61,"style":61},[63,11194,11195,11199,11203,11207,11211,11215,11219,11223,11227,11231],{"__ignoreMap":61},[66,11196,11197],{"class":68,"line":69},[66,11198,4089],{},[66,11200,11201],{"class":68,"line":75},[66,11202,79],{"emptyLinePlaceholder":78},[66,11204,11205],{"class":68,"line":82},[66,11206,4098],{},[66,11208,11209],{"class":68,"line":88},[66,11210,4103],{},[66,11212,11213],{"class":68,"line":94},[66,11214,4108],{},[66,11216,11217],{"class":68,"line":99},[66,11218,4113],{},[66,11220,11221],{"class":68,"line":105},[66,11222,1109],{},[66,11224,11225],{"class":68,"line":2457},[66,11226,4122],{},[66,11228,11229],{"class":68,"line":3917},[66,11230,79],{"emptyLinePlaceholder":78},[66,11232,11233],{"class":68,"line":4129},[66,11234,4132],{},[10,11236,111],{},[56,11238,11240],{"className":11239,"code":4138,"language":117,"meta":61},[115],[63,11241,4138],{"__ignoreMap":61},[10,11243,122],{},[14,11245,125],{"id":125},[127,11247,11248,11252],{},[40,11249,4149,11250,4153],{},[63,11251,4152],{},[40,11253,11254,4159,11256,4162],{},[63,11255,4158],{},[63,11257,1123],{},[291,11259,2661],{"id":2661},[10,11261,4167],{},[10,11263,11264],{},[26,11265],{"alt":4172,"src":4173},[10,11267,11268,4178,11270,4181],{},[63,11269,4152],{},[63,11271,4158],{},[291,11273,2661],{"id":4184},[10,11275,4187],{},[10,11277,11278],{},[26,11279],{"alt":4192,"src":4193},[10,11281,4196,11282,4199],{},[63,11283,1119],{},[14,11285,141],{"id":141},[37,11287,11288,11292],{},[40,11289,4206,11290,4209],{},[63,11291,4158],{},[40,11293,4212,11294,4215,11296,4219],{},[63,11295,1119],{},[63,11297,4218],{},[14,11299,156],{"id":156},[127,11301,11302,11304],{},[40,11303,4226],{},[40,11305,4229],{},[10,11307,167],{},[14,11309,170],{"id":170},[10,11311,4236],{},[175,11313,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11315},[11316,11317,11318,11319,11320,11324,11325,11326],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":11321},[11322,11323],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":4034,"description":4039},[188,1119,4259],{"id":4262,"title":4263,"body":11331,"category":188,"cover":189,"description":4268,"extension":190,"meta":11468,"navigation":78,"path":4434,"pinned":193,"publishedAt":194,"seo":11469,"slug":4436,"stem":4437,"summary":4438,"tags":11470,"updatedAt":194,"visible":78,"__hash__":4441},{"type":7,"value":11332,"toc":11456},[11333,11335,11337,11339,11341,11345,11349,11351,11361,11363,11365,11397,11399,11404,11406,11408,11418,11420,11422,11426,11430,11432,11438,11440,11448,11450,11452,11454],[10,11334,4268],{},[14,11336,16],{"id":16},[10,11338,4273],{},[14,11340,22],{"id":22},[10,11342,11343],{},[26,11344],{"alt":4280,"src":4281},[10,11346,11347,4287],{},[63,11348,4286],{},[14,11350,35],{"id":35},[37,11352,11353,11355,11357],{},[40,11354,4294],{},[40,11356,4297],{},[40,11358,4300,11359,4303],{},[63,11360,149],{},[14,11362,51],{"id":51},[10,11364,54],{},[56,11366,11367],{"className":58,"code":4310,"language":60,"meta":61,"style":61},[63,11368,11369,11373,11377,11381,11385,11389,11393],{"__ignoreMap":61},[66,11370,11371],{"class":68,"line":69},[66,11372,4317],{},[66,11374,11375],{"class":68,"line":75},[66,11376,79],{"emptyLinePlaceholder":78},[66,11378,11379],{"class":68,"line":82},[66,11380,4326],{},[66,11382,11383],{"class":68,"line":88},[66,11384,4331],{},[66,11386,11387],{"class":68,"line":94},[66,11388,4336],{},[66,11390,11391],{"class":68,"line":99},[66,11392,79],{"emptyLinePlaceholder":78},[66,11394,11395],{"class":68,"line":105},[66,11396,4345],{},[10,11398,111],{},[56,11400,11402],{"className":11401,"code":4351,"language":117,"meta":61},[115],[63,11403,4351],{"__ignoreMap":61},[10,11405,122],{},[14,11407,125],{"id":125},[127,11409,11410,11414],{},[40,11411,4362,11412,4366],{},[63,11413,4365],{},[40,11415,4369,11416,4372],{},[63,11417,4365],{},[291,11419,2661],{"id":2661},[10,11421,4377],{},[10,11423,11424],{},[26,11425],{"alt":4382,"src":4383},[10,11427,4386,11428,4389],{},[63,11429,4365],{},[14,11431,141],{"id":141},[37,11433,11434,11436],{},[40,11435,4396],{},[40,11437,4399],{},[14,11439,156],{"id":156},[127,11441,11442,11446],{},[40,11443,2302,11444,4408],{},[63,11445,4286],{},[40,11447,4411],{},[10,11449,167],{},[14,11451,170],{"id":170},[10,11453,4418],{},[175,11455,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11457},[11458,11459,11460,11461,11462,11465,11466,11467],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":11463},[11464],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":4263,"description":4268},[188,4286,4440],{"id":4443,"title":4444,"body":11472,"category":188,"cover":189,"description":4449,"extension":190,"meta":11597,"navigation":78,"path":4598,"pinned":193,"publishedAt":194,"seo":11598,"slug":4600,"stem":4601,"summary":4602,"tags":11599,"updatedAt":194,"visible":78,"__hash__":4605},{"type":7,"value":11473,"toc":11587},[11474,11476,11478,11480,11482,11486,11490,11492,11502,11504,11506,11538,11540,11545,11547,11549,11561,11563,11569,11571,11579,11581,11583,11585],[10,11475,4449],{},[14,11477,16],{"id":16},[10,11479,4454],{},[14,11481,22],{"id":22},[10,11483,11484],{},[26,11485],{"alt":4461,"src":4462},[10,11487,11488,4467],{},[63,11489,149],{},[14,11491,35],{"id":35},[37,11493,11494,11498,11500],{},[40,11495,11496,4477],{},[63,11497,4476],{},[40,11499,4480],{},[40,11501,4483],{},[14,11503,51],{"id":51},[10,11505,54],{},[56,11507,11508],{"className":58,"code":4490,"language":60,"meta":61,"style":61},[63,11509,11510,11514,11518,11522,11526,11530,11534],{"__ignoreMap":61},[66,11511,11512],{"class":68,"line":69},[66,11513,4497],{},[66,11515,11516],{"class":68,"line":75},[66,11517,79],{"emptyLinePlaceholder":78},[66,11519,11520],{"class":68,"line":82},[66,11521,4506],{},[66,11523,11524],{"class":68,"line":88},[66,11525,4511],{},[66,11527,11528],{"class":68,"line":94},[66,11529,79],{"emptyLinePlaceholder":78},[66,11531,11532],{"class":68,"line":99},[66,11533,4520],{},[66,11535,11536],{"class":68,"line":105},[66,11537,4525],{},[10,11539,111],{},[56,11541,11543],{"className":11542,"code":4531,"language":117,"meta":61},[115],[63,11544,4531],{"__ignoreMap":61},[10,11546,122],{},[14,11548,125],{"id":125},[127,11550,11551,11557],{},[40,11552,4542,11553,4545,11555,4549],{},[63,11554,149],{},[63,11556,4548],{},[40,11558,11559,4554],{},[63,11560,4476],{},[14,11562,141],{"id":141},[37,11564,11565,11567],{},[40,11566,4561],{},[40,11568,4564],{},[14,11570,156],{"id":156},[127,11572,11573,11575],{},[40,11574,4571],{},[40,11576,2302,11577,4577],{},[63,11578,4576],{},[10,11580,167],{},[14,11582,170],{"id":170},[10,11584,4584],{},[175,11586,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11588},[11589,11590,11591,11592,11593,11594,11595,11596],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":4444,"description":4449},[188,149,4604],{"id":4607,"title":4608,"body":11601,"category":188,"cover":189,"description":4613,"extension":190,"meta":11746,"navigation":78,"path":4788,"pinned":193,"publishedAt":194,"seo":11747,"slug":4790,"stem":4791,"summary":4792,"tags":11748,"updatedAt":194,"visible":78,"__hash__":4794},{"type":7,"value":11602,"toc":11736},[11603,11605,11607,11609,11611,11615,11621,11623,11637,11639,11641,11685,11687,11692,11694,11696,11706,11708,11720,11722,11728,11730,11732,11734],[10,11604,4613],{},[14,11606,16],{"id":16},[10,11608,4618],{},[14,11610,22],{"id":22},[10,11612,11613],{},[26,11614],{"alt":4625,"src":4626},[10,11616,11617,4632,11619,4636],{},[63,11618,4631],{},[63,11620,4635],{},[14,11622,35],{"id":35},[37,11624,11625,11627,11633],{},[40,11626,4643],{},[40,11628,11629,4648,11631,4651],{},[63,11630,4631],{},[63,11632,4286],{},[40,11634,4654,11635,4657],{},[63,11636,4635],{},[14,11638,51],{"id":51},[10,11640,54],{},[56,11642,11643],{"className":58,"code":4664,"language":60,"meta":61,"style":61},[63,11644,11645,11649,11653,11657,11661,11665,11669,11673,11677,11681],{"__ignoreMap":61},[66,11646,11647],{"class":68,"line":69},[66,11648,4671],{},[66,11650,11651],{"class":68,"line":75},[66,11652,79],{"emptyLinePlaceholder":78},[66,11654,11655],{"class":68,"line":82},[66,11656,4680],{},[66,11658,11659],{"class":68,"line":88},[66,11660,4685],{},[66,11662,11663],{"class":68,"line":94},[66,11664,4690],{},[66,11666,11667],{"class":68,"line":99},[66,11668,4695],{},[66,11670,11671],{"class":68,"line":105},[66,11672,4700],{},[66,11674,11675],{"class":68,"line":2457},[66,11676,4525],{},[66,11678,11679],{"class":68,"line":3917},[66,11680,79],{"emptyLinePlaceholder":78},[66,11682,11683],{"class":68,"line":4129},[66,11684,4713],{},[10,11686,111],{},[56,11688,11690],{"className":11689,"code":4719,"language":117,"meta":61},[115],[63,11691,4719],{"__ignoreMap":61},[10,11693,122],{},[14,11695,125],{"id":125},[127,11697,11698,11702],{},[40,11699,4730,11700,4733],{},[63,11701,4631],{},[40,11703,4736,11704,4739],{},[63,11705,4635],{},[14,11707,141],{"id":141},[37,11709,11710,11714],{},[40,11711,3431,11712,4748],{},[63,11713,4631],{},[40,11715,4751,11716,4754,11718,4757],{},[63,11717,4286],{},[63,11719,4631],{},[14,11721,156],{"id":156},[127,11723,11724,11726],{},[40,11725,4764],{},[40,11727,4767],{},[10,11729,167],{},[14,11731,170],{"id":170},[10,11733,4774],{},[175,11735,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11737},[11738,11739,11740,11741,11742,11743,11744,11745],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":4608,"description":4613},[188,4635,4631],{"id":4796,"title":4797,"body":11750,"category":188,"cover":189,"description":4802,"extension":190,"meta":11889,"navigation":78,"path":4974,"pinned":193,"publishedAt":194,"seo":11890,"slug":4976,"stem":4977,"summary":4978,"tags":11891,"updatedAt":194,"visible":78,"__hash__":4982},{"type":7,"value":11751,"toc":11877},[11752,11754,11756,11758,11760,11764,11766,11768,11784,11786,11788,11816,11818,11823,11825,11827,11839,11841,11843,11847,11849,11851,11861,11863,11869,11871,11873,11875],[10,11753,4802],{},[14,11755,16],{"id":16},[10,11757,4807],{},[14,11759,22],{"id":22},[10,11761,11762],{},[26,11763],{"alt":4814,"src":4815},[10,11765,4818],{},[14,11767,35],{"id":35},[37,11769,11770,11772,11774],{},[40,11771,4825],{},[40,11773,4828],{},[40,11775,4831,11776,2220,11778,4838,11780,2220,11782,325],{},[63,11777,4834],{},[63,11779,4837],{},[63,11781,4841],{},[63,11783,4844],{},[14,11785,51],{"id":51},[10,11787,54],{},[56,11789,11790],{"className":58,"code":4851,"language":60,"meta":61,"style":61},[63,11791,11792,11796,11800,11804,11808,11812],{"__ignoreMap":61},[66,11793,11794],{"class":68,"line":69},[66,11795,4858],{},[66,11797,11798],{"class":68,"line":75},[66,11799,79],{"emptyLinePlaceholder":78},[66,11801,11802],{"class":68,"line":82},[66,11803,4867],{},[66,11805,11806],{"class":68,"line":88},[66,11807,4872],{},[66,11809,11810],{"class":68,"line":94},[66,11811,4877],{},[66,11813,11814],{"class":68,"line":99},[66,11815,4882],{},[10,11817,111],{},[56,11819,11821],{"className":11820,"code":4888,"language":117,"meta":61},[115],[63,11822,4888],{"__ignoreMap":61},[10,11824,122],{},[14,11826,125],{"id":125},[127,11828,11829,11837],{},[40,11830,4899,11831,4902,11833,1120,11835,325],{},[63,11832,4834],{},[63,11834,4905],{},[63,11836,4908],{},[40,11838,4911],{},[291,11840,2661],{"id":2661},[10,11842,4916],{},[10,11844,11845],{},[26,11846],{"alt":4921,"src":4922},[10,11848,4925],{},[14,11850,141],{"id":141},[37,11852,11853,11859],{},[40,11854,4932,11855,972,11857,4938],{},[63,11856,4935],{},[63,11858,4841],{},[40,11860,4941],{},[14,11862,156],{"id":156},[127,11864,11865,11867],{},[40,11866,4948],{},[40,11868,4951],{},[10,11870,167],{},[14,11872,170],{"id":170},[10,11874,4958],{},[175,11876,177],{},{"title":61,"searchDepth":75,"depth":75,"links":11878},[11879,11880,11881,11882,11883,11886,11887,11888],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":11884},[11885],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":4797,"description":4802},[188,4980,4981],{"id":4,"title":5,"body":11893,"category":188,"cover":189,"description":12,"extension":190,"meta":12010,"navigation":78,"path":192,"pinned":193,"publishedAt":194,"seo":12011,"slug":196,"stem":197,"summary":198,"tags":12012,"updatedAt":194,"visible":78,"__hash__":202},{"type":7,"value":11894,"toc":12000},[11895,11897,11899,11901,11903,11907,11909,11911,11919,11921,11923,11955,11957,11962,11964,11966,11974,11976,11984,11986,11992,11994,11996,11998],[10,11896,12],{},[14,11898,16],{"id":16},[10,11900,19],{},[14,11902,22],{"id":22},[10,11904,11905],{},[26,11906],{"alt":28,"src":29},[10,11908,32],{},[14,11910,35],{"id":35},[37,11912,11913,11915,11917],{},[40,11914,42],{},[40,11916,45],{},[40,11918,48],{},[14,11920,51],{"id":51},[10,11922,54],{},[56,11924,11925],{"className":58,"code":59,"language":60,"meta":61,"style":61},[63,11926,11927,11931,11935,11939,11943,11947,11951],{"__ignoreMap":61},[66,11928,11929],{"class":68,"line":69},[66,11930,72],{},[66,11932,11933],{"class":68,"line":75},[66,11934,79],{"emptyLinePlaceholder":78},[66,11936,11937],{"class":68,"line":82},[66,11938,85],{},[66,11940,11941],{"class":68,"line":88},[66,11942,91],{},[66,11944,11945],{"class":68,"line":94},[66,11946,79],{"emptyLinePlaceholder":78},[66,11948,11949],{"class":68,"line":99},[66,11950,102],{},[66,11952,11953],{"class":68,"line":105},[66,11954,108],{},[10,11956,111],{},[56,11958,11960],{"className":11959,"code":116,"language":117,"meta":61},[115],[63,11961,116],{"__ignoreMap":61},[10,11963,122],{},[14,11965,125],{"id":125},[127,11967,11968,11970],{},[40,11969,131],{},[40,11971,134,11972,138],{},[63,11973,137],{},[14,11975,141],{"id":141},[37,11977,11978,11982],{},[40,11979,146,11980,150],{},[63,11981,149],{},[40,11983,153],{},[14,11985,156],{"id":156},[127,11987,11988,11990],{},[40,11989,161],{},[40,11991,164],{},[10,11993,167],{},[14,11995,170],{"id":170},[10,11997,173],{},[175,11999,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12001},[12002,12003,12004,12005,12006,12007,12008,12009],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5,"description":12},[188,200,201],{"id":5105,"title":5106,"body":12014,"category":188,"cover":189,"description":5111,"extension":190,"meta":12133,"navigation":78,"path":5255,"pinned":193,"publishedAt":194,"seo":12134,"slug":5257,"stem":5258,"summary":5259,"tags":12135,"updatedAt":194,"visible":78,"__hash__":5263},{"type":7,"value":12015,"toc":12123},[12016,12018,12020,12022,12024,12028,12030,12032,12040,12042,12044,12076,12078,12083,12085,12087,12097,12099,12105,12107,12115,12117,12119,12121],[10,12017,5111],{},[14,12019,16],{"id":16},[10,12021,5116],{},[14,12023,22],{"id":22},[10,12025,12026],{},[26,12027],{"alt":5123,"src":5124},[10,12029,5127],{},[14,12031,35],{"id":35},[37,12033,12034,12036,12038],{},[40,12035,5134],{},[40,12037,5137],{},[40,12039,5140],{},[14,12041,51],{"id":51},[10,12043,54],{},[56,12045,12046],{"className":58,"code":5147,"language":60,"meta":61,"style":61},[63,12047,12048,12052,12056,12060,12064,12068,12072],{"__ignoreMap":61},[66,12049,12050],{"class":68,"line":69},[66,12051,5154],{},[66,12053,12054],{"class":68,"line":75},[66,12055,5159],{},[66,12057,12058],{"class":68,"line":82},[66,12059,5164],{},[66,12061,12062],{"class":68,"line":88},[66,12063,79],{"emptyLinePlaceholder":78},[66,12065,12066],{"class":68,"line":94},[66,12067,5173],{},[66,12069,12070],{"class":68,"line":99},[66,12071,5178],{},[66,12073,12074],{"class":68,"line":105},[66,12075,5183],{},[10,12077,111],{},[56,12079,12081],{"className":12080,"code":5189,"language":117,"meta":61},[115],[63,12082,5189],{"__ignoreMap":61},[10,12084,122],{},[14,12086,125],{"id":125},[127,12088,12089,12093],{},[40,12090,901,12091,5203],{},[63,12092,5202],{},[40,12094,5206,12095,5210],{},[63,12096,5209],{},[14,12098,141],{"id":141},[37,12100,12101,12103],{},[40,12102,5217],{},[40,12104,5220],{},[14,12106,156],{"id":156},[127,12108,12109,12113],{},[40,12110,5227,12111,5231],{},[63,12112,5230],{},[40,12114,5234],{},[10,12116,167],{},[14,12118,170],{"id":170},[10,12120,5241],{},[175,12122,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12124},[12125,12126,12127,12128,12129,12130,12131,12132],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5106,"description":5111},[188,5261,5262],{"id":5265,"title":5266,"body":12137,"category":188,"cover":189,"description":5271,"extension":190,"meta":12282,"navigation":78,"path":5452,"pinned":193,"publishedAt":194,"seo":12283,"slug":5454,"stem":5455,"summary":5456,"tags":12284,"updatedAt":194,"visible":78,"__hash__":5460},{"type":7,"value":12138,"toc":12270},[12139,12141,12143,12145,12147,12151,12155,12157,12169,12171,12173,12201,12203,12208,12210,12212,12226,12228,12230,12234,12242,12244,12254,12256,12262,12264,12266,12268],[10,12140,5271],{},[14,12142,16],{"id":16},[10,12144,5276],{},[14,12146,22],{"id":22},[10,12148,12149],{},[26,12150],{"alt":5283,"src":5284},[10,12152,5287,12153,5291],{},[63,12154,5290],{},[14,12156,35],{"id":35},[37,12158,12159,12161,12163],{},[40,12160,5298],{},[40,12162,5301],{},[40,12164,5304,12165,5307,12167,325],{},[63,12166,5290],{},[63,12168,5310],{},[14,12170,51],{"id":51},[10,12172,54],{},[56,12174,12175],{"className":58,"code":5317,"language":60,"meta":61,"style":61},[63,12176,12177,12181,12185,12189,12193,12197],{"__ignoreMap":61},[66,12178,12179],{"class":68,"line":69},[66,12180,5324],{},[66,12182,12183],{"class":68,"line":75},[66,12184,5329],{},[66,12186,12187],{"class":68,"line":82},[66,12188,5334],{},[66,12190,12191],{"class":68,"line":88},[66,12192,79],{"emptyLinePlaceholder":78},[66,12194,12195],{"class":68,"line":94},[66,12196,5343],{},[66,12198,12199],{"class":68,"line":99},[66,12200,5348],{},[10,12202,111],{},[56,12204,12206],{"className":12205,"code":5354,"language":117,"meta":61},[115],[63,12207,5354],{"__ignoreMap":61},[10,12209,122],{},[14,12211,125],{"id":125},[127,12213,12214,12220],{},[40,12215,5365,12216,2220,12218,5371],{},[63,12217,5368],{},[63,12219,4365],{},[40,12221,12222,5377,12224,5381],{},[63,12223,5376],{},[63,12225,5380],{},[291,12227,2661],{"id":2661},[10,12229,5386],{},[10,12231,12232],{},[26,12233],{"alt":5391,"src":5392},[10,12235,12236,2220,12238,1120,12240,5402],{},[63,12237,5368],{},[63,12239,4365],{},[63,12241,5401],{},[14,12243,141],{"id":141},[37,12245,12246,12250],{},[40,12247,5409,12248,5413],{},[63,12249,5412],{},[40,12251,5416,12252,5419],{},[63,12253,5401],{},[14,12255,156],{"id":156},[127,12257,12258,12260],{},[40,12259,5426],{},[40,12261,5429],{},[10,12263,167],{},[14,12265,170],{"id":170},[10,12267,5436],{},[175,12269,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12271},[12272,12273,12274,12275,12276,12279,12280,12281],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":12277},[12278],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5266,"description":5271},[188,5458,5459],{"id":5462,"title":5463,"body":12286,"category":188,"cover":189,"description":5468,"extension":190,"meta":12435,"navigation":78,"path":5649,"pinned":193,"publishedAt":194,"seo":12436,"slug":5651,"stem":5652,"summary":5653,"tags":12437,"updatedAt":194,"visible":78,"__hash__":5657},{"type":7,"value":12287,"toc":12423},[12288,12290,12292,12294,12296,12300,12302,12304,12316,12318,12320,12364,12366,12371,12373,12375,12387,12389,12391,12395,12397,12399,12407,12409,12415,12417,12419,12421],[10,12289,5468],{},[14,12291,16],{"id":16},[10,12293,5473],{},[14,12295,22],{"id":22},[10,12297,12298],{},[26,12299],{"alt":5480,"src":5481},[10,12301,5484],{},[14,12303,35],{"id":35},[37,12305,12306,12308,12312],{},[40,12307,5491],{},[40,12309,12310,5497],{},[63,12311,5496],{},[40,12313,12314,5503],{},[63,12315,5502],{},[14,12317,51],{"id":51},[10,12319,54],{},[56,12321,12322],{"className":58,"code":5510,"language":60,"meta":61,"style":61},[63,12323,12324,12328,12332,12336,12340,12344,12348,12352,12356,12360],{"__ignoreMap":61},[66,12325,12326],{"class":68,"line":69},[66,12327,5517],{},[66,12329,12330],{"class":68,"line":75},[66,12331,5522],{},[66,12333,12334],{"class":68,"line":82},[66,12335,79],{"emptyLinePlaceholder":78},[66,12337,12338],{"class":68,"line":88},[66,12339,5531],{},[66,12341,12342],{"class":68,"line":94},[66,12343,5536],{},[66,12345,12346],{"class":68,"line":99},[66,12347,79],{"emptyLinePlaceholder":78},[66,12349,12350],{"class":68,"line":105},[66,12351,5545],{},[66,12353,12354],{"class":68,"line":2457},[66,12355,5550],{},[66,12357,12358],{"class":68,"line":3917},[66,12359,79],{"emptyLinePlaceholder":78},[66,12361,12362],{"class":68,"line":4129},[66,12363,5559],{},[10,12365,111],{},[56,12367,12369],{"className":12368,"code":5565,"language":117,"meta":61},[115],[63,12370,5565],{"__ignoreMap":61},[10,12372,122],{},[14,12374,125],{"id":125},[127,12376,12377,12381],{},[40,12378,5576,12379,5580],{},[63,12380,5579],{},[40,12382,12383,5586,12385,325],{},[63,12384,5585],{},[63,12386,5589],{},[291,12388,2661],{"id":2661},[10,12390,5594],{},[10,12392,12393],{},[26,12394],{"alt":5599,"src":5600},[10,12396,5603],{},[14,12398,141],{"id":141},[37,12400,12401,12405],{},[40,12402,5610,12403,5613],{},[63,12404,5310],{},[40,12406,5616],{},[14,12408,156],{"id":156},[127,12410,12411,12413],{},[40,12412,5623],{},[40,12414,5626],{},[10,12416,167],{},[14,12418,170],{"id":170},[10,12420,5633],{},[175,12422,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12424},[12425,12426,12427,12428,12429,12432,12433,12434],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":12430},[12431],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5463,"description":5468},[188,5655,5656],{"id":5659,"title":5660,"body":12439,"category":188,"cover":189,"description":5665,"extension":190,"meta":12600,"navigation":78,"path":5863,"pinned":193,"publishedAt":194,"seo":12601,"slug":5865,"stem":5866,"summary":5867,"tags":12602,"updatedAt":194,"visible":78,"__hash__":5871},{"type":7,"value":12440,"toc":12588},[12441,12443,12445,12447,12449,12453,12455,12457,12469,12471,12473,12525,12527,12532,12534,12536,12554,12556,12558,12562,12564,12566,12572,12574,12580,12582,12584,12586],[10,12442,5665],{},[14,12444,16],{"id":16},[10,12446,5670],{},[14,12448,22],{"id":22},[10,12450,12451],{},[26,12452],{"alt":5677,"src":5678},[10,12454,5681],{},[14,12456,35],{"id":35},[37,12458,12459,12461,12463],{},[40,12460,5688],{},[40,12462,5691],{},[40,12464,12465,2139,12467,5700],{},[63,12466,5696],{},[63,12468,5699],{},[14,12470,51],{"id":51},[10,12472,54],{},[56,12474,12475],{"className":58,"code":5707,"language":60,"meta":61,"style":61},[63,12476,12477,12481,12485,12489,12493,12497,12501,12505,12509,12513,12517,12521],{"__ignoreMap":61},[66,12478,12479],{"class":68,"line":69},[66,12480,5714],{},[66,12482,12483],{"class":68,"line":75},[66,12484,79],{"emptyLinePlaceholder":78},[66,12486,12487],{"class":68,"line":82},[66,12488,5723],{},[66,12490,12491],{"class":68,"line":88},[66,12492,5728],{},[66,12494,12495],{"class":68,"line":94},[66,12496,79],{"emptyLinePlaceholder":78},[66,12498,12499],{"class":68,"line":99},[66,12500,5737],{},[66,12502,12503],{"class":68,"line":105},[66,12504,5742],{},[66,12506,12507],{"class":68,"line":2457},[66,12508,5747],{},[66,12510,12511],{"class":68,"line":3917},[66,12512,79],{"emptyLinePlaceholder":78},[66,12514,12515],{"class":68,"line":4129},[66,12516,5756],{},[66,12518,12519],{"class":68,"line":5759},[66,12520,79],{"emptyLinePlaceholder":78},[66,12522,12523],{"class":68,"line":5764},[66,12524,5767],{},[10,12526,111],{},[56,12528,12530],{"className":12529,"code":5773,"language":117,"meta":61},[115],[63,12531,5773],{"__ignoreMap":61},[10,12533,122],{},[14,12535,125],{"id":125},[127,12537,12538,12548],{},[40,12539,12540,5787,12542,5791,12544,5794,12546,5798],{},[63,12541,5786],{},[63,12543,5790],{},[63,12545,5579],{},[63,12547,5797],{},[40,12549,12550,5803,12552,5806],{},[63,12551,4548],{},[63,12553,2171],{},[291,12555,2661],{"id":2661},[10,12557,5811],{},[10,12559,12560],{},[26,12561],{"alt":5816,"src":5817},[10,12563,5820],{},[14,12565,141],{"id":141},[37,12567,12568,12570],{},[40,12569,5827],{},[40,12571,5830],{},[14,12573,156],{"id":156},[127,12575,12576,12578],{},[40,12577,5837],{},[40,12579,5840],{},[10,12581,167],{},[14,12583,170],{"id":170},[10,12585,5847],{},[175,12587,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12589},[12590,12591,12592,12593,12594,12597,12598,12599],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":12595},[12596],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5660,"description":5665},[188,5869,5870],{"id":5873,"title":5874,"body":12604,"category":188,"cover":189,"description":5879,"extension":190,"meta":12727,"navigation":78,"path":6030,"pinned":193,"publishedAt":194,"seo":12728,"slug":6032,"stem":6033,"summary":6034,"tags":12729,"updatedAt":194,"visible":78,"__hash__":6038},{"type":7,"value":12605,"toc":12717},[12606,12608,12610,12612,12614,12618,12620,12622,12636,12638,12640,12668,12670,12675,12677,12679,12689,12691,12699,12701,12709,12711,12713,12715],[10,12607,5879],{},[14,12609,16],{"id":16},[10,12611,5884],{},[14,12613,22],{"id":22},[10,12615,12616],{},[26,12617],{"alt":5891,"src":5892},[10,12619,5895],{},[14,12621,35],{"id":35},[37,12623,12624,12626,12628],{},[40,12625,5902],{},[40,12627,5905],{},[40,12629,5908,12630,2220,12632,2220,12634,5916],{},[63,12631,2223],{},[63,12633,2389],{},[63,12635,5915],{},[14,12637,51],{"id":51},[10,12639,54],{},[56,12641,12642],{"className":58,"code":5923,"language":60,"meta":61,"style":61},[63,12643,12644,12648,12652,12656,12660,12664],{"__ignoreMap":61},[66,12645,12646],{"class":68,"line":69},[66,12647,5930],{},[66,12649,12650],{"class":68,"line":75},[66,12651,5935],{},[66,12653,12654],{"class":68,"line":82},[66,12655,5940],{},[66,12657,12658],{"class":68,"line":88},[66,12659,79],{"emptyLinePlaceholder":78},[66,12661,12662],{"class":68,"line":94},[66,12663,5949],{},[66,12665,12666],{"class":68,"line":99},[66,12667,5954],{},[10,12669,111],{},[56,12671,12673],{"className":12672,"code":5960,"language":117,"meta":61},[115],[63,12674,5960],{"__ignoreMap":61},[10,12676,122],{},[14,12678,125],{"id":125},[127,12680,12681,12687],{},[40,12682,5971,12683,5975,12685,5978],{},[63,12684,5974],{},[63,12686,2209],{},[40,12688,5981],{},[14,12690,141],{"id":141},[37,12692,12693,12697],{},[40,12694,5988,12695,5992],{},[63,12696,5991],{},[40,12698,5995],{},[14,12700,156],{"id":156},[127,12702,12703,12705],{},[40,12704,6002],{},[40,12706,6005,12707,6009],{},[63,12708,6008],{},[10,12710,167],{},[14,12712,170],{"id":170},[10,12714,6016],{},[175,12716,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12718},[12719,12720,12721,12722,12723,12724,12725,12726],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":5874,"description":5879},[188,6036,6037],{"id":6040,"title":6041,"body":12731,"category":188,"cover":189,"description":6046,"extension":190,"meta":12908,"navigation":78,"path":6274,"pinned":193,"publishedAt":194,"seo":12909,"slug":6276,"stem":6277,"summary":6278,"tags":12910,"updatedAt":194,"visible":78,"__hash__":6282},{"type":7,"value":12732,"toc":12896},[12733,12735,12737,12741,12743,12747,12753,12755,12767,12769,12773,12797,12801,12817,12823,12825,12830,12832,12834,12850,12852,12854,12858,12862,12864,12876,12878,12888,12890,12892,12894],[10,12734,6046],{},[14,12736,16],{"id":16},[10,12738,6051,12739,6054],{},[257,12740,5974],{},[14,12742,22],{"id":22},[10,12744,12745],{},[26,12746],{"alt":6061,"src":6062},[10,12748,6065,12749,6069,12751,6073],{},[63,12750,6068],{},[63,12752,6072],{},[14,12754,35],{"id":35},[37,12756,12757,12761,12763],{},[40,12758,6080,12759,6083],{},[63,12760,1134],{},[40,12762,6086],{},[40,12764,6089,12765,6093],{},[63,12766,6092],{},[14,12768,51],{"id":51},[10,12770,6098,12771,6102],{},[63,12772,6101],{},[56,12774,12775],{"className":58,"code":6105,"language":60,"meta":61,"style":61},[63,12776,12777,12781,12785,12789,12793],{"__ignoreMap":61},[66,12778,12779],{"class":68,"line":69},[66,12780,6112],{},[66,12782,12783],{"class":68,"line":75},[66,12784,6117],{},[66,12786,12787],{"class":68,"line":82},[66,12788,79],{"emptyLinePlaceholder":78},[66,12790,12791],{"class":68,"line":88},[66,12792,6126],{},[66,12794,12795],{"class":68,"line":94},[66,12796,6131],{},[10,12798,6134,12799,6138],{},[63,12800,6137],{},[56,12802,12803],{"className":58,"code":6141,"language":60,"meta":61,"style":61},[63,12804,12805,12809,12813],{"__ignoreMap":61},[66,12806,12807],{"class":68,"line":69},[66,12808,6148],{},[66,12810,12811],{"class":68,"line":75},[66,12812,79],{"emptyLinePlaceholder":78},[66,12814,12815],{"class":68,"line":82},[66,12816,6157],{},[10,12818,6160,12819,1120,12821,325],{},[63,12820,6163],{},[63,12822,6166],{},[10,12824,111],{},[56,12826,12828],{"className":12827,"code":6172,"language":117,"meta":61},[115],[63,12829,6172],{"__ignoreMap":61},[10,12831,122],{},[14,12833,125],{"id":125},[127,12835,12836,12842],{},[40,12837,6183,12838,6186,12840,6190],{},[63,12839,6101],{},[63,12841,6189],{},[40,12843,12844,6195,12846,6198,12848,6201],{},[63,12845,6137],{},[63,12847,6101],{},[63,12849,6137],{},[291,12851,2661],{"id":2661},[10,12853,6206],{},[10,12855,12856],{},[26,12857],{"alt":6211,"src":6212},[10,12859,6215,12860,6218],{},[63,12861,6189],{},[14,12863,141],{"id":141},[37,12865,12866,12872],{},[40,12867,6225,12868,1120,12870,325],{},[63,12869,6101],{},[63,12871,6137],{},[40,12873,6232,12874,6236],{},[63,12875,6235],{},[14,12877,156],{"id":156},[127,12879,12880,12884],{},[40,12881,2317,12882,6246],{},[63,12883,6245],{},[40,12885,6249,12886,325],{},[63,12887,6068],{},[10,12889,167],{},[14,12891,170],{"id":170},[10,12893,6258],{},[175,12895,177],{},{"title":61,"searchDepth":75,"depth":75,"links":12897},[12898,12899,12900,12901,12902,12905,12906,12907],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":12903},[12904],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":6041,"description":6046},[188,6280,6281],{"id":6284,"title":6285,"body":12912,"category":188,"cover":189,"description":6290,"extension":190,"meta":13051,"navigation":78,"path":6456,"pinned":193,"publishedAt":194,"seo":13052,"slug":6458,"stem":6459,"summary":6460,"tags":13053,"updatedAt":194,"visible":78,"__hash__":6463},{"type":7,"value":12913,"toc":13041},[12914,12916,12918,12920,12922,12926,12928,12930,12940,12942,12944,12984,12986,12991,12993,12995,13013,13015,13023,13025,13033,13035,13037,13039],[10,12915,6290],{},[14,12917,16],{"id":16},[10,12919,6295],{},[14,12921,22],{"id":22},[10,12923,12924],{},[26,12925],{"alt":6302,"src":6303},[10,12927,6306],{},[14,12929,35],{"id":35},[37,12931,12932,12936,12938],{},[40,12933,12934,6316],{},[63,12935,6315],{},[40,12937,6319],{},[40,12939,6322],{},[14,12941,51],{"id":51},[10,12943,1537],{},[56,12945,12946],{"className":554,"code":6329,"language":556,"meta":61,"style":61},[63,12947,12948,12958,12964,12970,12980],{"__ignoreMap":61},[66,12949,12950,12952,12954,12956],{"class":68,"line":69},[66,12951,654],{"class":563},[66,12953,596],{"class":566},[66,12955,6340],{"class":599},[66,12957,6343],{"class":599},[66,12959,12960,12962],{"class":68,"line":75},[66,12961,6348],{"class":566},[66,12963,6351],{"class":599},[66,12965,12966,12968],{"class":68,"line":82},[66,12967,60],{"class":563},[66,12969,567],{"class":566},[66,12971,12972,12974,12976,12978],{"class":68,"line":88},[66,12973,60],{"class":563},[66,12975,596],{"class":566},[66,12977,600],{"class":599},[66,12979,567],{"class":566},[66,12981,12982],{"class":68,"line":94},[66,12983,6372],{"class":563},[10,12985,111],{},[56,12987,12989],{"className":12988,"code":6378,"language":117,"meta":61},[115],[63,12990,6378],{"__ignoreMap":61},[10,12992,122],{},[14,12994,125],{"id":125},[127,12996,12997,13003],{},[40,12998,12999,6392,13001,6395],{},[63,13000,6391],{},[63,13002,654],{},[40,13004,6398,13005,2139,13007,6404,13009,3692,13011,6410],{},[63,13006,60],{},[63,13008,6403],{},[63,13010,6315],{},[63,13012,6409],{},[14,13014,141],{"id":141},[37,13016,13017,13019],{},[40,13018,6417],{},[40,13020,3431,13021,6422],{},[63,13022,6315],{},[14,13024,156],{"id":156},[127,13026,13027,13031],{},[40,13028,6429,13029,325],{},[63,13030,6432],{},[40,13032,6435],{},[10,13034,167],{},[14,13036,170],{"id":170},[10,13038,6442],{},[175,13040,1621],{},{"title":61,"searchDepth":75,"depth":75,"links":13042},[13043,13044,13045,13046,13047,13048,13049,13050],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":6285,"description":6290},[188,6462,223],{"id":6465,"title":6466,"body":13055,"category":188,"cover":189,"description":6471,"extension":190,"meta":13208,"navigation":78,"path":6660,"pinned":193,"publishedAt":194,"seo":13209,"slug":6662,"stem":6663,"summary":6664,"tags":13210,"updatedAt":194,"visible":78,"__hash__":6668},{"type":7,"value":13056,"toc":13198},[13057,13059,13061,13063,13065,13069,13075,13077,13093,13095,13097,13141,13143,13148,13150,13152,13164,13166,13180,13182,13190,13192,13194,13196],[10,13058,6471],{},[14,13060,16],{"id":16},[10,13062,6476],{},[14,13064,22],{"id":22},[10,13066,13067],{},[26,13068],{"alt":6483,"src":6484},[10,13070,13071,6490,13073,6493],{},[63,13072,6489],{},[63,13074,2399],{},[14,13076,35],{"id":35},[37,13078,13079,13081,13089],{},[40,13080,6500],{},[40,13082,13083,2220,13085,2220,13087,6512],{},[63,13084,6505],{},[63,13086,6508],{},[63,13088,6511],{},[40,13090,6515,13091,6519],{},[63,13092,6518],{},[14,13094,51],{"id":51},[10,13096,54],{},[56,13098,13099],{"className":58,"code":6526,"language":60,"meta":61,"style":61},[63,13100,13101,13105,13109,13113,13117,13121,13125,13129,13133,13137],{"__ignoreMap":61},[66,13102,13103],{"class":68,"line":69},[66,13104,6533],{},[66,13106,13107],{"class":68,"line":75},[66,13108,79],{"emptyLinePlaceholder":78},[66,13110,13111],{"class":68,"line":82},[66,13112,6542],{},[66,13114,13115],{"class":68,"line":88},[66,13116,6547],{},[66,13118,13119],{"class":68,"line":94},[66,13120,6552],{},[66,13122,13123],{"class":68,"line":99},[66,13124,79],{"emptyLinePlaceholder":78},[66,13126,13127],{"class":68,"line":105},[66,13128,6561],{},[66,13130,13131],{"class":68,"line":2457},[66,13132,6566],{},[66,13134,13135],{"class":68,"line":3917},[66,13136,6571],{},[66,13138,13139],{"class":68,"line":4129},[66,13140,6576],{},[10,13142,111],{},[56,13144,13146],{"className":13145,"code":6582,"language":117,"meta":61},[115],[63,13147,6582],{"__ignoreMap":61},[10,13149,122],{},[14,13151,125],{"id":125},[127,13153,13154,13158],{},[40,13155,13156,6596],{},[63,13157,6595],{},[40,13159,2302,13160,6601,13162,6604],{},[63,13161,2399],{},[63,13163,6489],{},[14,13165,141],{"id":141},[37,13167,13168,13174],{},[40,13169,3431,13170,6613,13172,6616],{},[63,13171,6489],{},[63,13173,6505],{},[40,13175,6619,13176,972,13178,6625],{},[63,13177,2399],{},[63,13179,6624],{},[14,13181,156],{"id":156},[127,13183,13184,13188],{},[40,13185,6632,13186,6636],{},[63,13187,6635],{},[40,13189,6639],{},[10,13191,167],{},[14,13193,170],{"id":170},[10,13195,6646],{},[175,13197,177],{},{"title":61,"searchDepth":75,"depth":75,"links":13199},[13200,13201,13202,13203,13204,13205,13206,13207],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":6466,"description":6471},[188,6666,6667],{"id":6670,"title":6671,"body":13212,"category":188,"cover":189,"description":6676,"extension":190,"meta":13359,"navigation":78,"path":6855,"pinned":193,"publishedAt":194,"seo":13360,"slug":6857,"stem":6858,"summary":6859,"tags":13361,"updatedAt":194,"visible":78,"__hash__":6863},{"type":7,"value":13213,"toc":13349},[13214,13216,13218,13220,13222,13226,13228,13230,13248,13250,13252,13300,13302,13307,13309,13311,13319,13321,13331,13333,13341,13343,13345,13347],[10,13215,6676],{},[14,13217,16],{"id":16},[10,13219,6681],{},[14,13221,22],{"id":22},[10,13223,13224],{},[26,13225],{"alt":6688,"src":6689},[10,13227,6692],{},[14,13229,35],{"id":35},[37,13231,13232,13236,13242],{},[40,13233,13234,6702],{},[63,13235,6701],{},[40,13237,13238,6708,13240,325],{},[63,13239,6707],{},[63,13241,6711],{},[40,13243,6714,13244,6718,13246,6722],{},[63,13245,6717],{},[63,13247,6721],{},[14,13249,51],{"id":51},[10,13251,54],{},[56,13253,13254],{"className":58,"code":6729,"language":60,"meta":61,"style":61},[63,13255,13256,13260,13264,13268,13272,13276,13280,13284,13288,13292,13296],{"__ignoreMap":61},[66,13257,13258],{"class":68,"line":69},[66,13259,6533],{},[66,13261,13262],{"class":68,"line":75},[66,13263,79],{"emptyLinePlaceholder":78},[66,13265,13266],{"class":68,"line":82},[66,13267,6744],{},[66,13269,13270],{"class":68,"line":88},[66,13271,6749],{},[66,13273,13274],{"class":68,"line":94},[66,13275,6754],{},[66,13277,13278],{"class":68,"line":99},[66,13279,6759],{},[66,13281,13282],{"class":68,"line":105},[66,13283,79],{"emptyLinePlaceholder":78},[66,13285,13286],{"class":68,"line":2457},[66,13287,6768],{},[66,13289,13290],{"class":68,"line":3917},[66,13291,6773],{},[66,13293,13294],{"class":68,"line":4129},[66,13295,6778],{},[66,13297,13298],{"class":68,"line":5759},[66,13299,6783],{},[10,13301,111],{},[56,13303,13305],{"className":13304,"code":6789,"language":117,"meta":61},[115],[63,13306,6789],{"__ignoreMap":61},[10,13308,122],{},[14,13310,125],{"id":125},[127,13312,13313,13317],{},[40,13314,6800,13315,6803],{},[63,13316,6717],{},[40,13318,6806],{},[14,13320,141],{"id":141},[37,13322,13323,13327],{},[40,13324,2302,13325,6815],{},[63,13326,6701],{},[40,13328,6818,13329,325],{},[63,13330,6821],{},[14,13332,156],{"id":156},[127,13334,13335,13337],{},[40,13336,6828],{},[40,13338,6831,13339,6834],{},[63,13340,299],{},[10,13342,167],{},[14,13344,170],{"id":170},[10,13346,6841],{},[175,13348,177],{},{"title":61,"searchDepth":75,"depth":75,"links":13350},[13351,13352,13353,13354,13355,13356,13357,13358],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":6671,"description":6676},[188,6861,6862],{"id":6865,"title":6866,"body":13363,"category":188,"cover":189,"description":6871,"extension":190,"meta":13506,"navigation":78,"path":7039,"pinned":193,"publishedAt":194,"seo":13507,"slug":7041,"stem":7042,"summary":7043,"tags":13508,"updatedAt":194,"visible":78,"__hash__":7047},{"type":7,"value":13364,"toc":13496},[13365,13367,13369,13371,13373,13377,13383,13385,13395,13397,13399,13451,13453,13458,13460,13462,13472,13474,13480,13482,13488,13490,13492,13494],[10,13366,6871],{},[14,13368,16],{"id":16},[10,13370,6876],{},[14,13372,22],{"id":22},[10,13374,13375],{},[26,13376],{"alt":6883,"src":6884},[10,13378,13379,6890,13381,6894],{},[63,13380,6889],{},[63,13382,6893],{},[14,13384,35],{"id":35},[37,13386,13387,13389,13393],{},[40,13388,6901],{},[40,13390,13391,6907],{},[63,13392,6906],{},[40,13394,6910],{},[14,13396,51],{"id":51},[10,13398,54],{},[56,13400,13401],{"className":58,"code":6917,"language":60,"meta":61,"style":61},[63,13402,13403,13407,13411,13415,13419,13423,13427,13431,13435,13439,13443,13447],{"__ignoreMap":61},[66,13404,13405],{"class":68,"line":69},[66,13406,6924],{},[66,13408,13409],{"class":68,"line":75},[66,13410,79],{"emptyLinePlaceholder":78},[66,13412,13413],{"class":68,"line":82},[66,13414,6933],{},[66,13416,13417],{"class":68,"line":88},[66,13418,79],{"emptyLinePlaceholder":78},[66,13420,13421],{"class":68,"line":94},[66,13422,6942],{},[66,13424,13425],{"class":68,"line":99},[66,13426,6947],{},[66,13428,13429],{"class":68,"line":105},[66,13430,6759],{},[66,13432,13433],{"class":68,"line":2457},[66,13434,79],{"emptyLinePlaceholder":78},[66,13436,13437],{"class":68,"line":3917},[66,13438,6960],{},[66,13440,13441],{"class":68,"line":4129},[66,13442,6965],{},[66,13444,13445],{"class":68,"line":5759},[66,13446,6778],{},[66,13448,13449],{"class":68,"line":5764},[66,13450,6974],{},[10,13452,111],{},[56,13454,13456],{"className":13455,"code":6980,"language":117,"meta":61},[115],[63,13457,6980],{"__ignoreMap":61},[10,13459,122],{},[14,13461,125],{"id":125},[127,13463,13464,13468],{},[40,13465,13466,6993],{},[63,13467,6889],{},[40,13469,13470,6998],{},[63,13471,6893],{},[14,13473,141],{"id":141},[37,13475,13476,13478],{},[40,13477,7005],{},[40,13479,7008],{},[14,13481,156],{"id":156},[127,13483,13484,13486],{},[40,13485,7015],{},[40,13487,7018],{},[10,13489,167],{},[14,13491,170],{"id":170},[10,13493,7025],{},[175,13495,177],{},{"title":61,"searchDepth":75,"depth":75,"links":13497},[13498,13499,13500,13501,13502,13503,13504,13505],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":6866,"description":6871},[188,7045,7046],{"id":7049,"title":7050,"body":13510,"category":188,"cover":189,"description":7055,"extension":190,"meta":13661,"navigation":78,"path":7240,"pinned":193,"publishedAt":194,"seo":13662,"slug":7242,"stem":7243,"summary":7244,"tags":13663,"updatedAt":194,"visible":78,"__hash__":7248},{"type":7,"value":13511,"toc":13651},[13512,13514,13516,13518,13520,13524,13528,13530,13544,13546,13548,13600,13602,13607,13609,13611,13623,13625,13635,13637,13643,13645,13647,13649],[10,13513,7055],{},[14,13515,16],{"id":16},[10,13517,7060],{},[14,13519,22],{"id":22},[10,13521,13522],{},[26,13523],{"alt":7067,"src":7068},[10,13525,13526,7074],{},[63,13527,7073],{},[14,13529,35],{"id":35},[37,13531,13532,13538,13542],{},[40,13533,2302,13534,7084,13536,7088],{},[63,13535,7083],{},[63,13537,7087],{},[40,13539,7091,13540,7095],{},[63,13541,7094],{},[40,13543,7098],{},[14,13545,51],{"id":51},[10,13547,54],{},[56,13549,13550],{"className":58,"code":7105,"language":60,"meta":61,"style":61},[63,13551,13552,13556,13560,13564,13568,13572,13576,13580,13584,13588,13592,13596],{"__ignoreMap":61},[66,13553,13554],{"class":68,"line":69},[66,13555,7112],{},[66,13557,13558],{"class":68,"line":75},[66,13559,79],{"emptyLinePlaceholder":78},[66,13561,13562],{"class":68,"line":82},[66,13563,7121],{},[66,13565,13566],{"class":68,"line":88},[66,13567,7126],{},[66,13569,13570],{"class":68,"line":94},[66,13571,7131],{},[66,13573,13574],{"class":68,"line":99},[66,13575,7136],{},[66,13577,13578],{"class":68,"line":105},[66,13579,7141],{},[66,13581,13582],{"class":68,"line":2457},[66,13583,79],{"emptyLinePlaceholder":78},[66,13585,13586],{"class":68,"line":3917},[66,13587,7150],{},[66,13589,13590],{"class":68,"line":4129},[66,13591,7155],{},[66,13593,13594],{"class":68,"line":5759},[66,13595,7160],{},[66,13597,13598],{"class":68,"line":5764},[66,13599,7165],{},[10,13601,111],{},[56,13603,13605],{"className":13604,"code":7171,"language":117,"meta":61},[115],[63,13606,7171],{"__ignoreMap":61},[10,13608,122],{},[14,13610,125],{"id":125},[127,13612,13613,13619],{},[40,13614,13615,7185,13617,7188],{},[63,13616,7184],{},[63,13618,7094],{},[40,13620,13621,7193],{},[63,13622,7073],{},[14,13624,141],{"id":141},[37,13626,13627,13629],{},[40,13628,7200],{},[40,13630,7203,13631,7206,13633,7209],{},[63,13632,7083],{},[63,13634,7087],{},[14,13636,156],{"id":156},[127,13638,13639,13641],{},[40,13640,7216],{},[40,13642,7219],{},[10,13644,167],{},[14,13646,170],{"id":170},[10,13648,7226],{},[175,13650,177],{},{"title":61,"searchDepth":75,"depth":75,"links":13652},[13653,13654,13655,13656,13657,13658,13659,13660],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":7050,"description":7055},[188,7246,7247],{"id":7250,"title":7251,"body":13665,"category":188,"cover":189,"description":7256,"extension":190,"meta":13879,"navigation":78,"path":7530,"pinned":193,"publishedAt":194,"seo":13880,"slug":7532,"stem":7533,"summary":7534,"tags":13881,"updatedAt":194,"visible":78,"__hash__":7538},{"type":7,"value":13666,"toc":13866},[13667,13669,13671,13673,13675,13679,13685,13687,13699,13701,13703,13763,13765,13770,13772,13774,13792,13794,13802,13806,13814,13816,13820,13824,13830,13832,13842,13844,13858,13860,13862,13864],[10,13668,7256],{},[14,13670,16],{"id":16},[10,13672,7261],{},[14,13674,22],{"id":22},[10,13676,13677],{},[26,13678],{"alt":7268,"src":7269},[10,13680,7272,13681,7276,13683,7280],{},[63,13682,7275],{},[63,13684,7279],{},[14,13686,35],{"id":35},[37,13688,13689,13693,13697],{},[40,13690,7287,13691,7290],{},[63,13692,7275],{},[40,13694,13695,7296],{},[63,13696,7295],{},[40,13698,7299],{},[14,13700,51],{"id":51},[10,13702,54],{},[56,13704,13705],{"className":58,"code":7306,"language":60,"meta":61,"style":61},[63,13706,13707,13711,13715,13719,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759],{"__ignoreMap":61},[66,13708,13709],{"class":68,"line":69},[66,13710,7313],{},[66,13712,13713],{"class":68,"line":75},[66,13714,7318],{},[66,13716,13717],{"class":68,"line":82},[66,13718,7323],{},[66,13720,13721],{"class":68,"line":88},[66,13722,7328],{},[66,13724,13725],{"class":68,"line":94},[66,13726,7333],{},[66,13728,13729],{"class":68,"line":99},[66,13730,79],{"emptyLinePlaceholder":78},[66,13732,13733],{"class":68,"line":105},[66,13734,7342],{},[66,13736,13737],{"class":68,"line":2457},[66,13738,7347],{},[66,13740,13741],{"class":68,"line":3917},[66,13742,7352],{},[66,13744,13745],{"class":68,"line":4129},[66,13746,7357],{},[66,13748,13749],{"class":68,"line":5759},[66,13750,1109],{},[66,13752,13753],{"class":68,"line":5764},[66,13754,7366],{},[66,13756,13757],{"class":68,"line":7369},[66,13758,7372],{},[66,13760,13761],{"class":68,"line":7375},[66,13762,7378],{},[10,13764,111],{},[56,13766,13768],{"className":13767,"code":7384,"language":117,"meta":61},[115],[63,13769,7384],{"__ignoreMap":61},[10,13771,122],{},[14,13773,125],{"id":125},[127,13775,13776,13784],{},[40,13777,13778,7397,13780,7400,13782,7404],{},[63,13779,3000],{},[63,13781,7295],{},[63,13783,7403],{},[40,13785,7407,13786,7410,13788,7413,13790,325],{},[63,13787,7275],{},[63,13789,1123],{},[63,13791,7279],{},[291,13793,2661],{"id":2661},[10,13795,13796,2220,13798,1120,13800,7426],{},[63,13797,7275],{},[63,13799,1123],{},[63,13801,7279],{},[10,13803,13804],{},[26,13805],{"alt":7431,"src":7432},[10,13807,13808,7437,13810,7440,13812,7443],{},[63,13809,7275],{},[63,13811,1123],{},[63,13813,7279],{},[291,13815,2661],{"id":4184},[10,13817,13818,7451],{},[63,13819,7450],{},[10,13821,13822],{},[26,13823],{"alt":7456,"src":7457},[10,13825,7460,13826,7463,13828,7466],{},[63,13827,7450],{},[63,13829,1123],{},[14,13831,141],{"id":141},[37,13833,13834,13838],{},[40,13835,7473,13836,7477],{},[63,13837,7476],{},[40,13839,7480,13840,7483],{},[63,13841,7450],{},[14,13843,156],{"id":156},[127,13845,13846,13854],{},[40,13847,7490,13848,7494,13850,1120,13852,325],{},[63,13849,7493],{},[63,13851,7497],{},[63,13853,7500],{},[40,13855,7503,13856,7506],{},[63,13857,6711],{},[10,13859,167],{},[14,13861,170],{"id":170},[10,13863,7513],{},[175,13865,177],{},{"title":61,"searchDepth":75,"depth":75,"links":13867},[13868,13869,13870,13871,13872,13876,13877,13878],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":13873},[13874,13875],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":7251,"description":7256},[188,7536,7537],{"id":7540,"title":7541,"body":13883,"category":188,"cover":189,"description":7546,"extension":190,"meta":14034,"navigation":78,"path":7723,"pinned":193,"publishedAt":194,"seo":14035,"slug":7725,"stem":7726,"summary":7727,"tags":14036,"updatedAt":194,"visible":78,"__hash__":7730},{"type":7,"value":13884,"toc":14024},[13885,13887,13889,13891,13893,13897,13901,13903,13915,13917,13919,13967,13969,13974,13976,13978,13988,13990,14000,14002,14016,14018,14020,14022],[10,13886,7546],{},[14,13888,16],{"id":16},[10,13890,7551],{},[14,13892,22],{"id":22},[10,13894,13895],{},[26,13896],{"alt":7558,"src":7559},[10,13898,7562,13899,7565],{},[63,13900,6721],{},[14,13902,35],{"id":35},[37,13904,13905,13909,13913],{},[40,13906,13907,7574],{},[63,13908,6721],{},[40,13910,13911,7580],{},[63,13912,7579],{},[40,13914,7583],{},[14,13916,51],{"id":51},[10,13918,54],{},[56,13920,13921],{"className":58,"code":7590,"language":60,"meta":61,"style":61},[63,13922,13923,13927,13931,13935,13939,13943,13947,13951,13955,13959,13963],{"__ignoreMap":61},[66,13924,13925],{"class":68,"line":69},[66,13926,6533],{},[66,13928,13929],{"class":68,"line":75},[66,13930,79],{"emptyLinePlaceholder":78},[66,13932,13933],{"class":68,"line":82},[66,13934,6744],{},[66,13936,13937],{"class":68,"line":88},[66,13938,79],{"emptyLinePlaceholder":78},[66,13940,13941],{"class":68,"line":94},[66,13942,7613],{},[66,13944,13945],{"class":68,"line":99},[66,13946,7618],{},[66,13948,13949],{"class":68,"line":105},[66,13950,79],{"emptyLinePlaceholder":78},[66,13952,13953],{"class":68,"line":2457},[66,13954,7627],{},[66,13956,13957],{"class":68,"line":3917},[66,13958,7632],{},[66,13960,13961],{"class":68,"line":4129},[66,13962,79],{"emptyLinePlaceholder":78},[66,13964,13965],{"class":68,"line":5759},[66,13966,7641],{},[10,13968,111],{},[56,13970,13972],{"className":13971,"code":7647,"language":117,"meta":61},[115],[63,13973,7647],{"__ignoreMap":61},[10,13975,122],{},[14,13977,125],{"id":125},[127,13979,13980,13986],{},[40,13981,7562,13982,7660,13984,325],{},[63,13983,6721],{},[63,13985,7663],{},[40,13987,7666],{},[14,13989,141],{"id":141},[37,13991,13992,13996],{},[40,13993,4751,13994,7675],{},[63,13995,6721],{},[40,13997,7678,13998,7681],{},[63,13999,6721],{},[14,14001,156],{"id":156},[127,14003,14004,14010],{},[40,14005,7688,14006,7692,14008,325],{},[63,14007,7691],{},[63,14009,6721],{},[40,14011,4751,14012,7699,14014,325],{},[63,14013,6721],{},[63,14015,7702],{},[10,14017,167],{},[14,14019,170],{"id":170},[10,14021,7709],{},[175,14023,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14025},[14026,14027,14028,14029,14030,14031,14032,14033],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":7541,"description":7546},[188,6721,7729],{"id":7732,"title":7733,"body":14038,"category":188,"cover":189,"description":7738,"extension":190,"meta":14209,"navigation":78,"path":7951,"pinned":193,"publishedAt":194,"seo":14210,"slug":7953,"stem":7954,"summary":7955,"tags":14211,"updatedAt":194,"visible":78,"__hash__":7959},{"type":7,"value":14039,"toc":14197},[14040,14042,14044,14046,14048,14052,14054,14056,14068,14070,14072,14128,14130,14135,14137,14139,14155,14157,14159,14163,14169,14171,14179,14181,14189,14191,14193,14195],[10,14041,7738],{},[14,14043,16],{"id":16},[10,14045,7743],{},[14,14047,22],{"id":22},[10,14049,14050],{},[26,14051],{"alt":7750,"src":7751},[10,14053,7754],{},[14,14055,35],{"id":35},[37,14057,14058,14062,14066],{},[40,14059,14060,7764],{},[63,14061,7763],{},[40,14063,14064,7770],{},[63,14065,7769],{},[40,14067,7773],{},[14,14069,51],{"id":51},[10,14071,54],{},[56,14073,14074],{"className":58,"code":7780,"language":60,"meta":61,"style":61},[63,14075,14076,14080,14084,14088,14092,14096,14100,14104,14108,14112,14116,14120,14124],{"__ignoreMap":61},[66,14077,14078],{"class":68,"line":69},[66,14079,7787],{},[66,14081,14082],{"class":68,"line":75},[66,14083,7792],{},[66,14085,14086],{"class":68,"line":82},[66,14087,7797],{},[66,14089,14090],{"class":68,"line":88},[66,14091,7802],{},[66,14093,14094],{"class":68,"line":94},[66,14095,79],{"emptyLinePlaceholder":78},[66,14097,14098],{"class":68,"line":99},[66,14099,7811],{},[66,14101,14102],{"class":68,"line":105},[66,14103,7816],{},[66,14105,14106],{"class":68,"line":2457},[66,14107,7821],{},[66,14109,14110],{"class":68,"line":3917},[66,14111,7826],{},[66,14113,14114],{"class":68,"line":4129},[66,14115,79],{"emptyLinePlaceholder":78},[66,14117,14118],{"class":68,"line":5759},[66,14119,7835],{},[66,14121,14122],{"class":68,"line":5764},[66,14123,7840],{},[66,14125,14126],{"class":68,"line":7369},[66,14127,7845],{},[10,14129,111],{},[56,14131,14133],{"className":14132,"code":7851,"language":117,"meta":61},[115],[63,14134,7851],{"__ignoreMap":61},[10,14136,122],{},[14,14138,125],{"id":125},[127,14140,14141,14147],{},[40,14142,7862,14143,7866,14145,7869],{},[63,14144,7865],{},[63,14146,7769],{},[40,14148,14149,7875,14151,7879,14153,7882],{},[63,14150,7874],{},[63,14152,7878],{},[63,14154,7763],{},[291,14156,2661],{"id":2661},[10,14158,7887],{},[10,14160,14161],{},[26,14162],{"alt":7892,"src":7893},[10,14164,7896,14165,1120,14167,7902],{},[63,14166,4548],{},[63,14168,7901],{},[14,14170,141],{"id":141},[37,14172,14173,14177],{},[40,14174,7909,14175,7912],{},[63,14176,7763],{},[40,14178,7915],{},[14,14180,156],{"id":156},[127,14182,14183,14187],{},[40,14184,5227,14185,7925],{},[63,14186,7924],{},[40,14188,7928],{},[10,14190,167],{},[14,14192,170],{"id":170},[10,14194,7935],{},[175,14196,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14198},[14199,14200,14201,14202,14203,14206,14207,14208],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":14204},[14205],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":7733,"description":7738},[188,7957,7958],{"id":7961,"title":7962,"body":14213,"category":188,"cover":189,"description":7967,"extension":190,"meta":14360,"navigation":78,"path":8146,"pinned":193,"publishedAt":194,"seo":14361,"slug":8148,"stem":8149,"summary":8150,"tags":14362,"updatedAt":194,"visible":78,"__hash__":8154},{"type":7,"value":14214,"toc":14350},[14215,14217,14219,14221,14223,14227,14229,14231,14239,14241,14243,14299,14301,14306,14308,14310,14322,14324,14330,14332,14342,14344,14346,14348],[10,14216,7967],{},[14,14218,16],{"id":16},[10,14220,7972],{},[14,14222,22],{"id":22},[10,14224,14225],{},[26,14226],{"alt":7979,"src":7980},[10,14228,7983],{},[14,14230,35],{"id":35},[37,14232,14233,14235,14237],{},[40,14234,7990],{},[40,14236,7993],{},[40,14238,7996],{},[14,14240,51],{"id":51},[10,14242,54],{},[56,14244,14245],{"className":58,"code":8003,"language":60,"meta":61,"style":61},[63,14246,14247,14251,14255,14259,14263,14267,14271,14275,14279,14283,14287,14291,14295],{"__ignoreMap":61},[66,14248,14249],{"class":68,"line":69},[66,14250,8010],{},[66,14252,14253],{"class":68,"line":75},[66,14254,8015],{},[66,14256,14257],{"class":68,"line":82},[66,14258,8020],{},[66,14260,14261],{"class":68,"line":88},[66,14262,79],{"emptyLinePlaceholder":78},[66,14264,14265],{"class":68,"line":94},[66,14266,8029],{},[66,14268,14269],{"class":68,"line":99},[66,14270,8034],{},[66,14272,14273],{"class":68,"line":105},[66,14274,8039],{},[66,14276,14277],{"class":68,"line":2457},[66,14278,79],{"emptyLinePlaceholder":78},[66,14280,14281],{"class":68,"line":3917},[66,14282,8048],{},[66,14284,14285],{"class":68,"line":4129},[66,14286,8053],{},[66,14288,14289],{"class":68,"line":5759},[66,14290,79],{"emptyLinePlaceholder":78},[66,14292,14293],{"class":68,"line":5764},[66,14294,8062],{},[66,14296,14297],{"class":68,"line":7369},[66,14298,8067],{},[10,14300,111],{},[56,14302,14304],{"className":14303,"code":8073,"language":117,"meta":61},[115],[63,14305,8073],{"__ignoreMap":61},[10,14307,122],{},[14,14309,125],{"id":125},[127,14311,14312,14318],{},[40,14313,14314,8087,14316,8091],{},[63,14315,8086],{},[63,14317,8090],{},[40,14319,8094,14320,8098],{},[63,14321,8097],{},[14,14323,141],{"id":141},[37,14325,14326,14328],{},[40,14327,8105],{},[40,14329,8108],{},[14,14331,156],{"id":156},[127,14333,14334,14340],{},[40,14335,8115,14336,8119,14338,325],{},[63,14337,8118],{},[63,14339,8122],{},[40,14341,8125],{},[10,14343,167],{},[14,14345,170],{"id":170},[10,14347,8132],{},[175,14349,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14351},[14352,14353,14354,14355,14356,14357,14358,14359],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":7962,"description":7967},[188,8152,8153],{"id":8156,"title":8157,"body":14364,"category":188,"cover":189,"description":8162,"extension":190,"meta":14527,"navigation":78,"path":8366,"pinned":193,"publishedAt":194,"seo":14528,"slug":8368,"stem":8369,"summary":8370,"tags":14529,"updatedAt":194,"visible":78,"__hash__":8374},{"type":7,"value":14365,"toc":14515},[14366,14368,14370,14372,14374,14378,14382,14384,14400,14402,14404,14448,14450,14455,14457,14459,14473,14475,14479,14483,14487,14489,14495,14497,14507,14509,14511,14513],[10,14367,8162],{},[14,14369,16],{"id":16},[10,14371,8167],{},[14,14373,22],{"id":22},[10,14375,14376],{},[26,14377],{"alt":8174,"src":8175},[10,14379,8178,14380,8182],{},[63,14381,8181],{},[14,14383,35],{"id":35},[37,14385,14386,14392,14398],{},[40,14387,14388,8192,14390,8196],{},[63,14389,8191],{},[63,14391,8195],{},[40,14393,8199,14394,8203,14396,8206],{},[63,14395,8202],{},[63,14397,149],{},[40,14399,8209],{},[14,14401,51],{"id":51},[10,14403,54],{},[56,14405,14406],{"className":58,"code":8216,"language":60,"meta":61,"style":61},[63,14407,14408,14412,14416,14420,14424,14428,14432,14436,14440,14444],{"__ignoreMap":61},[66,14409,14410],{"class":68,"line":69},[66,14411,8223],{},[66,14413,14414],{"class":68,"line":75},[66,14415,8228],{},[66,14417,14418],{"class":68,"line":82},[66,14419,8233],{},[66,14421,14422],{"class":68,"line":88},[66,14423,8238],{},[66,14425,14426],{"class":68,"line":94},[66,14427,8243],{},[66,14429,14430],{"class":68,"line":99},[66,14431,79],{"emptyLinePlaceholder":78},[66,14433,14434],{"class":68,"line":105},[66,14435,8252],{},[66,14437,14438],{"class":68,"line":2457},[66,14439,8257],{},[66,14441,14442],{"class":68,"line":3917},[66,14443,8257],{},[66,14445,14446],{"class":68,"line":4129},[66,14447,8257],{},[10,14449,111],{},[56,14451,14453],{"className":14452,"code":8271,"language":117,"meta":61},[115],[63,14454,8271],{"__ignoreMap":61},[10,14456,122],{},[14,14458,125],{"id":125},[127,14460,14461,14465],{},[40,14462,7862,14463,8285],{},[63,14464,8284],{},[40,14466,8288,14467,8291,14469,8294,14471,8298],{},[63,14468,8195],{},[63,14470,8181],{},[63,14472,8297],{},[291,14474,2661],{"id":2661},[10,14476,8303,14477,8306],{},[63,14478,8195],{},[10,14480,14481],{},[26,14482],{"alt":8311,"src":8312},[10,14484,8315,14485,8318],{},[63,14486,8181],{},[14,14488,141],{"id":141},[37,14490,14491,14493],{},[40,14492,8325],{},[40,14494,8328],{},[14,14496,156],{"id":156},[127,14498,14499,14501],{},[40,14500,8335],{},[40,14502,3975,14503,8340,14505,8343],{},[63,14504,149],{},[63,14506,8195],{},[10,14508,167],{},[14,14510,170],{"id":170},[10,14512,8350],{},[175,14514,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14516},[14517,14518,14519,14520,14521,14524,14525,14526],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":14522},[14523],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":8157,"description":8162},[188,8372,8373],{"id":8376,"title":8377,"body":14531,"category":188,"cover":189,"description":8382,"extension":190,"meta":14714,"navigation":78,"path":8607,"pinned":193,"publishedAt":194,"seo":14715,"slug":8609,"stem":8610,"summary":8611,"tags":14716,"updatedAt":194,"visible":78,"__hash__":8614},{"type":7,"value":14532,"toc":14702},[14533,14535,14537,14539,14541,14545,14547,14549,14563,14565,14567,14635,14637,14642,14644,14646,14660,14662,14664,14668,14674,14676,14684,14686,14694,14696,14698,14700],[10,14534,8382],{},[14,14536,16],{"id":16},[10,14538,8387],{},[14,14540,22],{"id":22},[10,14542,14543],{},[26,14544],{"alt":8394,"src":8395},[10,14546,8398],{},[14,14548,35],{"id":35},[37,14550,14551,14557,14559],{},[40,14552,14553,8408,14555,325],{},[63,14554,8407],{},[63,14556,8411],{},[40,14558,8414],{},[40,14560,14561,8420],{},[63,14562,8419],{},[14,14564,51],{"id":51},[10,14566,54],{},[56,14568,14569],{"className":58,"code":8427,"language":60,"meta":61,"style":61},[63,14570,14571,14575,14579,14583,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631],{"__ignoreMap":61},[66,14572,14573],{"class":68,"line":69},[66,14574,8434],{},[66,14576,14577],{"class":68,"line":75},[66,14578,79],{"emptyLinePlaceholder":78},[66,14580,14581],{"class":68,"line":82},[66,14582,8443],{},[66,14584,14585],{"class":68,"line":88},[66,14586,8448],{},[66,14588,14589],{"class":68,"line":94},[66,14590,8453],{},[66,14592,14593],{"class":68,"line":99},[66,14594,8458],{},[66,14596,14597],{"class":68,"line":105},[66,14598,8463],{},[66,14600,14601],{"class":68,"line":2457},[66,14602,8468],{},[66,14604,14605],{"class":68,"line":3917},[66,14606,8473],{},[66,14608,14609],{"class":68,"line":4129},[66,14610,8478],{},[66,14612,14613],{"class":68,"line":5759},[66,14614,79],{"emptyLinePlaceholder":78},[66,14616,14617],{"class":68,"line":5764},[66,14618,8487],{},[66,14620,14621],{"class":68,"line":7369},[66,14622,6112],{},[66,14624,14625],{"class":68,"line":7375},[66,14626,6117],{},[66,14628,14629],{"class":68,"line":8498},[66,14630,79],{"emptyLinePlaceholder":78},[66,14632,14633],{"class":68,"line":8503},[66,14634,8506],{},[10,14636,111],{},[56,14638,14640],{"className":14639,"code":8512,"language":117,"meta":61},[115],[63,14641,8512],{"__ignoreMap":61},[10,14643,122],{},[14,14645,125],{"id":125},[127,14647,14648,14658],{},[40,14649,8523,14650,8527,14652,8531,14654,8535,14656,325],{},[63,14651,8526],{},[63,14653,8530],{},[63,14655,8534],{},[63,14657,8526],{},[40,14659,8540],{},[291,14661,2661],{"id":2661},[10,14663,8545],{},[10,14665,14666],{},[26,14667],{"alt":8550,"src":8551},[10,14669,14670,8556,14672,325],{},[63,14671,8407],{},[63,14673,8411],{},[14,14675,141],{"id":141},[37,14677,14678,14682],{},[40,14679,8565,14680,325],{},[63,14681,5310],{},[40,14683,8570],{},[14,14685,156],{"id":156},[127,14687,14688,14690],{},[40,14689,8577],{},[40,14691,8580,14692,8584],{},[63,14693,8583],{},[10,14695,167],{},[14,14697,170],{"id":170},[10,14699,8591],{},[175,14701,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14703},[14704,14705,14706,14707,14708,14711,14712,14713],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":14709},[14710],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":8377,"description":8382},[188,8613,5261],{"id":8616,"title":8617,"body":14718,"category":188,"cover":189,"description":8622,"extension":190,"meta":14877,"navigation":78,"path":8810,"pinned":193,"publishedAt":194,"seo":14878,"slug":8812,"stem":8813,"summary":8814,"tags":14879,"updatedAt":194,"visible":78,"__hash__":8818},{"type":7,"value":14719,"toc":14865},[14720,14722,14724,14726,14728,14732,14734,14736,14744,14746,14748,14812,14814,14819,14821,14823,14831,14833,14835,14839,14841,14843,14849,14851,14857,14859,14861,14863],[10,14721,8622],{},[14,14723,16],{"id":16},[10,14725,8627],{},[14,14727,22],{"id":22},[10,14729,14730],{},[26,14731],{"alt":8634,"src":8635},[10,14733,8638],{},[14,14735,35],{"id":35},[37,14737,14738,14740,14742],{},[40,14739,8645],{},[40,14741,8648],{},[40,14743,8651],{},[14,14745,51],{"id":51},[10,14747,54],{},[56,14749,14750],{"className":58,"code":8658,"language":60,"meta":61,"style":61},[63,14751,14752,14756,14760,14764,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808],{"__ignoreMap":61},[66,14753,14754],{"class":68,"line":69},[66,14755,8665],{},[66,14757,14758],{"class":68,"line":75},[66,14759,8670],{},[66,14761,14762],{"class":68,"line":82},[66,14763,79],{"emptyLinePlaceholder":78},[66,14765,14766],{"class":68,"line":88},[66,14767,8679],{},[66,14769,14770],{"class":68,"line":94},[66,14771,79],{"emptyLinePlaceholder":78},[66,14773,14774],{"class":68,"line":99},[66,14775,8688],{},[66,14777,14778],{"class":68,"line":105},[66,14779,8693],{},[66,14781,14782],{"class":68,"line":2457},[66,14783,8698],{},[66,14785,14786],{"class":68,"line":3917},[66,14787,79],{"emptyLinePlaceholder":78},[66,14789,14790],{"class":68,"line":4129},[66,14791,8707],{},[66,14793,14794],{"class":68,"line":5759},[66,14795,8712],{},[66,14797,14798],{"class":68,"line":5764},[66,14799,8717],{},[66,14801,14802],{"class":68,"line":7369},[66,14803,79],{"emptyLinePlaceholder":78},[66,14805,14806],{"class":68,"line":7375},[66,14807,6126],{},[66,14809,14810],{"class":68,"line":8498},[66,14811,8730],{},[10,14813,111],{},[56,14815,14817],{"className":14816,"code":8736,"language":117,"meta":61},[115],[63,14818,8736],{"__ignoreMap":61},[10,14820,122],{},[14,14822,125],{"id":125},[127,14824,14825,14829],{},[40,14826,14827,8750],{},[63,14828,8749],{},[40,14830,8753],{},[291,14832,2661],{"id":2661},[10,14834,8758],{},[10,14836,14837],{},[26,14838],{"alt":8763,"src":8764},[10,14840,8767],{},[14,14842,141],{"id":141},[37,14844,14845,14847],{},[40,14846,8774],{},[40,14848,8777],{},[14,14850,156],{"id":156},[127,14852,14853,14855],{},[40,14854,8784],{},[40,14856,8787],{},[10,14858,167],{},[14,14860,170],{"id":170},[10,14862,8794],{},[175,14864,177],{},{"title":61,"searchDepth":75,"depth":75,"links":14866},[14867,14868,14869,14870,14871,14874,14875,14876],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":14872},[14873],{"id":2661,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":8617,"description":8622},[188,8816,8817],{"id":8820,"title":8821,"body":14881,"category":188,"cover":189,"description":8826,"extension":190,"meta":15119,"navigation":78,"path":9127,"pinned":193,"publishedAt":194,"seo":15120,"slug":9129,"stem":9130,"summary":9131,"tags":15121,"updatedAt":194,"visible":78,"__hash__":9135},{"type":7,"value":14882,"toc":15106},[14883,14885,14887,14889,14891,14895,14897,14899,14909,14911,14913,15029,15031,15036,15038,15040,15050,15052,15054,15058,15060,15062,15064,15068,15072,15074,15082,15084,15098,15100,15102,15104],[10,14884,8826],{},[14,14886,16],{"id":16},[10,14888,8831],{},[14,14890,22],{"id":22},[10,14892,14893],{},[26,14894],{"alt":8838,"src":8839},[10,14896,8842],{},[14,14898,35],{"id":35},[37,14900,14901,14903,14905],{},[40,14902,8849],{},[40,14904,8852],{},[40,14906,8855,14907,8859],{},[63,14908,8858],{},[14,14910,51],{"id":51},[10,14912,54],{},[56,14914,14915],{"className":58,"code":8866,"language":60,"meta":61,"style":61},[63,14916,14917,14921,14925,14929,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025],{"__ignoreMap":61},[66,14918,14919],{"class":68,"line":69},[66,14920,6924],{},[66,14922,14923],{"class":68,"line":75},[66,14924,6533],{},[66,14926,14927],{"class":68,"line":82},[66,14928,79],{"emptyLinePlaceholder":78},[66,14930,14931],{"class":68,"line":88},[66,14932,8885],{},[66,14934,14935],{"class":68,"line":94},[66,14936,8890],{},[66,14938,14939],{"class":68,"line":99},[66,14940,8895],{},[66,14942,14943],{"class":68,"line":105},[66,14944,8900],{},[66,14946,14947],{"class":68,"line":2457},[66,14948,79],{"emptyLinePlaceholder":78},[66,14950,14951],{"class":68,"line":3917},[66,14952,8909],{},[66,14954,14955],{"class":68,"line":4129},[66,14956,8914],{},[66,14958,14959],{"class":68,"line":5759},[66,14960,8919],{},[66,14962,14963],{"class":68,"line":5764},[66,14964,8924],{},[66,14966,14967],{"class":68,"line":7369},[66,14968,8929],{},[66,14970,14971],{"class":68,"line":7375},[66,14972,79],{"emptyLinePlaceholder":78},[66,14974,14975],{"class":68,"line":8498},[66,14976,8938],{},[66,14978,14979],{"class":68,"line":8503},[66,14980,8943],{},[66,14982,14983],{"class":68,"line":8946},[66,14984,8949],{},[66,14986,14987],{"class":68,"line":8952},[66,14988,79],{"emptyLinePlaceholder":78},[66,14990,14991],{"class":68,"line":8957},[66,14992,8960],{},[66,14994,14995],{"class":68,"line":8963},[66,14996,79],{"emptyLinePlaceholder":78},[66,14998,14999],{"class":68,"line":8968},[66,15000,7342],{},[66,15002,15003],{"class":68,"line":8973},[66,15004,8976],{},[66,15006,15007],{"class":68,"line":8979},[66,15008,8982],{},[66,15010,15011],{"class":68,"line":8985},[66,15012,8988],{},[66,15014,15015],{"class":68,"line":8991},[66,15016,7352],{},[66,15018,15019],{"class":68,"line":8996},[66,15020,8999],{},[66,15022,15023],{"class":68,"line":9002},[66,15024,1109],{},[66,15026,15027],{"class":68,"line":9007},[66,15028,9010],{},[10,15030,111],{},[56,15032,15034],{"className":15033,"code":9016,"language":117,"meta":61},[115],[63,15035,9016],{"__ignoreMap":61},[10,15037,122],{},[14,15039,125],{"id":125},[127,15041,15042,15046],{},[40,15043,9027,15044,9030],{},[63,15045,8858],{},[40,15047,15048,9035],{},[63,15049,8090],{},[291,15051,2661],{"id":2661},[10,15053,9040],{},[10,15055,15056],{},[26,15057],{"alt":9045,"src":9046},[10,15059,9049],{},[291,15061,2661],{"id":4184},[10,15063,9054],{},[10,15065,15066],{},[26,15067],{"alt":9059,"src":9060},[10,15069,9063,15070,9067],{},[63,15071,9066],{},[14,15073,141],{"id":141},[37,15075,15076,15078],{},[40,15077,9074],{},[40,15079,9077,15080,9080],{},[63,15081,9066],{},[14,15083,156],{"id":156},[127,15085,15086,15090,15092],{},[40,15087,9087,15088,9090],{},[63,15089,9066],{},[40,15091,9093],{},[40,15093,9096,15094,9100,15096,9103],{},[63,15095,9099],{},[63,15097,6068],{},[10,15099,167],{},[14,15101,170],{"id":170},[10,15103,9110],{},[175,15105,177],{},{"title":61,"searchDepth":75,"depth":75,"links":15107},[15108,15109,15110,15111,15112,15116,15117,15118],{"id":16,"depth":75,"text":16},{"id":22,"depth":75,"text":22},{"id":35,"depth":75,"text":35},{"id":51,"depth":75,"text":51},{"id":125,"depth":75,"text":125,"children":15113},[15114,15115],{"id":2661,"depth":82,"text":2661},{"id":4184,"depth":82,"text":2661},{"id":141,"depth":75,"text":141},{"id":156,"depth":75,"text":156},{"id":170,"depth":75,"text":170},{},{"title":8821,"description":8826},[188,9133,9134],{"id":1019,"title":1020,"body":15123,"category":188,"cover":1028,"description":61,"extension":190,"meta":15359,"navigation":78,"path":1345,"pinned":193,"publishedAt":1346,"seo":15360,"slug":1348,"stem":1349,"summary":1350,"tags":15361,"updatedAt":1346,"visible":78,"__hash__":1354},{"type":7,"value":15124,"toc":15344},[15125,15129,15131,15133,15135,15137,15157,15159,15164,15166,15168,15196,15202,15204,15208,15210,15230,15232,15242,15244,15246,15248,15250,15252,15254,15256,15258,15260,15280,15282,15284,15288,15290,15292,15294,15296,15300,15302,15320,15322,15324,15326,15328,15330,15332,15334,15336,15338,15340,15342],[10,15126,15127],{},[26,15128],{"alt":1027,"src":1028},[10,15130,1031],{},[10,15132,1034],{},[14,15134,1038],{"id":1037},[10,15136,1041],{},[56,15138,15139],{"className":58,"code":1044,"language":60,"meta":61,"style":61},[63,15140,15141,15145,15149,15153],{"__ignoreMap":61},[66,15142,15143],{"class":68,"line":69},[66,15144,1051],{},[66,15146,15147],{"class":68,"line":75},[66,15148,1056],{},[66,15150,15151],{"class":68,"line":82},[66,15152,79],{"emptyLinePlaceholder":78},[66,15154,15155],{"class":68,"line":88},[66,15156,1065],{},[10,15158,1068],{},[56,15160,15162],{"className":15161,"code":1072,"language":117,"meta":61},[115],[63,15163,1072],{"__ignoreMap":61},[10,15165,1077],{},[10,15167,1080],{},[56,15169,15170],{"className":58,"code":1083,"language":60,"meta":61,"style":61},[63,15171,15172,15176,15180,15184,15188,15192],{"__ignoreMap":61},[66,15173,15174],{"class":68,"line":69},[66,15175,1090],{},[66,15177,15178],{"class":68,"line":75},[66,15179,79],{"emptyLinePlaceholder":78},[66,15181,15182],{"class":68,"line":82},[66,15183,1099],{},[66,15185,15186],{"class":68,"line":88},[66,15187,1104],{},[66,15189,15190],{"class":68,"line":94},[66,15191,1109],{},[66,15193,15194],{"class":68,"line":99},[66,15195,1114],{},[10,15197,15198,1120,15200,1124],{},[63,15199,1119],{},[63,15201,1123],{},[14,15203,1128],{"id":1127},[10,15205,1131,15206,1135],{},[63,15207,1134],{},[10,15209,1138],{},[56,15211,15212],{"className":58,"code":1141,"language":60,"meta":61,"style":61},[63,15213,15214,15218,15222,15226],{"__ignoreMap":61},[66,15215,15216],{"class":68,"line":69},[66,15217,1148],{},[66,15219,15220],{"class":68,"line":75},[66,15221,1153],{},[66,15223,15224],{"class":68,"line":82},[66,15225,1158],{},[66,15227,15228],{"class":68,"line":88},[66,15229,1163],{},[10,15231,1166],{},[56,15233,15234],{"className":554,"code":1169,"language":556,"meta":61,"style":61},[63,15235,15236],{"__ignoreMap":61},[66,15237,15238,15240],{"class":68,"line":69},[66,15239,654],{"class":563},[66,15241,1178],{"class":599},[10,15243,1181],{},[14,15245,1185],{"id":1184},[291,15247,1188],{"id":1188},[10,15249,1191],{},[291,15251,1194],{"id":1194},[10,15253,1197],{},[291,15255,1200],{"id":1200},[10,15257,1203],{},[10,15259,1206],{},[56,15261,15262],{"className":58,"code":1209,"language":60,"meta":61,"style":61},[63,15263,15264,15268,15272,15276],{"__ignoreMap":61},[66,15265,15266],{"class":68,"line":69},[66,15267,1216],{},[66,15269,15270],{"class":68,"line":75},[66,15271,79],{"emptyLinePlaceholder":78},[66,15273,15274],{"class":68,"line":82},[66,15275,1225],{},[66,15277,15278],{"class":68,"line":88},[66,15279,1230],{},[10,15281,1233],{},[291,15283,1236],{"id":1236},[10,15285,1239,15286,1242],{},[63,15287,223],{},[10,15289,1245],{},[291,15291,1248],{"id":1248},[10,15293,1251],{},[14,15295,1255],{"id":1254},[10,15297,15298],{},[26,15299],{"alt":1260,"src":1261},[10,15301,1264],{},[37,15303,15304,15306,15308,15310,15312,15314,15316,15318],{},[40,15305,1269],{},[40,15307,1272],{},[40,15309,1275],{},[40,15311,1278],{},[40,15313,1281],{},[40,15315,1284],{},[40,15317,1287],{},[40,15319,1290],{},[10,15321,1293],{},[14,15323,1297],{"id":1296},[10,15325,1300],{},[10,15327,1303],{},[14,15329,1307],{"id":1306},[10,15331,1310],{},[10,15333,1313],{},[10,15335,1316],{},[14,15337,1319],{"id":1319},[10,15339,1322],{},[10,15341,1325],{},[175,15343,1328],{},{"title":61,"searchDepth":75,"depth":75,"links":15345},[15346,15347,15348,15355,15356,15357,15358],{"id":1037,"depth":75,"text":1038},{"id":1127,"depth":75,"text":1128},{"id":1184,"depth":75,"text":1185,"children":15349},[15350,15351,15352,15353,15354],{"id":1188,"depth":82,"text":1188},{"id":1194,"depth":82,"text":1194},{"id":1200,"depth":82,"text":1200},{"id":1236,"depth":82,"text":1236},{"id":1248,"depth":82,"text":1248},{"id":1254,"depth":75,"text":1255},{"id":1296,"depth":75,"text":1297},{"id":1306,"depth":75,"text":1307},{"id":1319,"depth":75,"text":1319},{},{"title":1020,"description":61},[188,1352,1353],{"id":205,"title":206,"body":15363,"category":188,"cover":189,"description":61,"extension":190,"meta":15942,"navigation":78,"path":1008,"pinned":193,"publishedAt":1009,"seo":15943,"slug":1011,"stem":1012,"summary":1013,"tags":15944,"updatedAt":1009,"visible":78,"__hash__":1017},{"type":7,"value":15364,"toc":15918},[15365,15367,15369,15371,15375,15377,15379,15403,15415,15417,15419,15424,15428,15432,15444,15448,15452,15456,15458,15492,15494,15498,15502,15504,15526,15556,15568,15578,15586,15588,15594,15604,15606,15611,15615,15617,15631,15637,15657,15659,15661,15663,15673,15677,15679,15688,15692,15694,15696,15716,15720,15722,15724,15726,15728,15748,15750,15752,15754,15780,15782,15798,15800,15816,15820,15822,15824,15844,15846,15848,15850,15854,15864,15866,15868,15870,15880,15888,15890,15892,15906,15916],[14,15366,211],{"id":211},[10,15368,214],{},[10,15370,217],{},[10,15372,220,15373,224],{},[63,15374,223],{},[14,15376,227],{"id":227},[10,15378,230],{},[232,15380,15381,15383],{},[10,15382,236],{},[232,15384,15385,15391,15393,15397,15399],{},[10,15386,241,15387,245,15389,249],{},[63,15388,244],{},[63,15390,248],{},[10,15392,252],{},[10,15394,255,15395,260],{},[257,15396,259],{},[10,15398,263],{},[10,15400,15401],{},[26,15402],{"alt":268,"src":269},[232,15404,15405,15407],{},[10,15406,274],{},[232,15408,15409,15411],{},[10,15410,279],{},[10,15412,15413],{},[26,15414],{"alt":284,"src":285},[14,15416,289],{"id":288},[291,15418,294],{"id":293},[10,15420,297,15421,305],{},[299,15422,304],{"href":301,"rel":15423},[303],[232,15425,15426],{},[10,15427,310],{},[10,15429,15430],{},[26,15431],{"alt":315,"src":316},[37,15433,15434,15438,15442],{},[40,15435,321,15436,325],{},[257,15437,324],{},[40,15439,328,15440,325],{},[257,15441,331],{},[40,15443,334],{},[10,15445,15446],{},[26,15447],{"alt":339,"src":340},[232,15449,15450],{},[10,15451,345],{},[10,15453,15454],{},[26,15455],{"alt":350,"src":351},[291,15457,355],{"id":354},[232,15459,15460,15464,15468,15488],{},[232,15461,15462],{},[10,15463,362],{},[10,15465,365,15466,369],{},[257,15467,368],{},[56,15469,15470],{"className":58,"code":372,"language":60,"meta":61,"style":61},[63,15471,15472,15476,15480,15484],{"__ignoreMap":61},[66,15473,15474],{"class":68,"line":69},[66,15475,379],{},[66,15477,15478],{"class":68,"line":75},[66,15479,384],{},[66,15481,15482],{"class":68,"line":82},[66,15483,389],{},[66,15485,15486],{"class":68,"line":88},[66,15487,394],{},[10,15489,397,15490,401],{},[257,15491,400],{},[10,15493,404],{},[10,15495,407,15496,410],{},[63,15497,60],{},[10,15499,15500],{},[26,15501],{"alt":415,"src":416},[10,15503,419],{},[232,15505,15506,15508,15512],{},[10,15507,424],{},[10,15509,15510],{},[257,15511,429],{},[232,15513,15514,15518,15522],{},[10,15515,434,15516,437],{},[63,15517,60],{},[10,15519,440,15520,443],{},[63,15521,60],{},[10,15523,446,15524,450],{},[257,15525,449],{},[232,15527,15528,15530,15534],{},[10,15529,455],{},[10,15531,15532],{},[257,15533,460],{},[232,15535,15536,15542,15550,15552],{},[10,15537,15538,468,15540,472],{},[63,15539,467],{},[63,15541,471],{},[10,15543,475,15544,478,15546,482,15548,486],{},[63,15545,467],{},[257,15547,481],{},[257,15549,485],{},[10,15551,489],{},[10,15553,15554,495],{},[257,15555,494],{},[232,15557,15558,15560],{},[10,15559,500],{},[232,15561,15562,15566],{},[10,15563,505,15564,509],{},[257,15565,508],{},[10,15567,512],{},[232,15569,15570,15574],{},[10,15571,517,15572],{},[257,15573,520],{},[10,15575,15576],{},[26,15577],{"alt":525,"src":526},[232,15579,15580,15582],{},[10,15581,531],{},[10,15583,15584],{},[26,15585],{"alt":525,"src":536},[291,15587,540],{"id":539},[10,15589,543,15590,547,15592,551],{},[63,15591,546],{},[63,15593,550],{},[56,15595,15596],{"className":554,"code":555,"language":556,"meta":61,"style":61},[63,15597,15598],{"__ignoreMap":61},[66,15599,15600,15602],{"class":68,"line":69},[66,15601,60],{"class":563},[66,15603,567],{"class":566},[10,15605,570],{},[56,15607,15609],{"className":15608,"code":574,"language":117,"meta":61},[115],[63,15610,574],{"__ignoreMap":61},[10,15612,15613],{},[26,15614],{"alt":525,"src":581},[10,15616,584],{},[56,15618,15619],{"className":554,"code":587,"language":556,"meta":61,"style":61},[63,15620,15621],{"__ignoreMap":61},[66,15622,15623,15625,15627,15629],{"class":68,"line":69},[66,15624,60],{"class":563},[66,15626,596],{"class":566},[66,15628,600],{"class":599},[66,15630,567],{"class":566},[10,15632,605,15633,608,15635,612],{},[63,15634,60],{},[63,15636,611],{},[56,15638,15639],{"className":554,"code":615,"language":556,"meta":61,"style":61},[63,15640,15641,15647],{"__ignoreMap":61},[66,15642,15643,15645],{"class":68,"line":69},[66,15644,471],{"class":563},[66,15646,567],{"class":566},[66,15648,15649,15651,15653,15655],{"class":68,"line":75},[66,15650,471],{"class":563},[66,15652,596],{"class":566},[66,15654,600],{"class":599},[66,15656,567],{"class":566},[14,15658,637],{"id":636},[291,15660,641],{"id":640},[10,15662,644],{},[56,15664,15665],{"className":554,"code":647,"language":556,"meta":61,"style":61},[63,15666,15667],{"__ignoreMap":61},[66,15668,15669,15671],{"class":68,"line":69},[66,15670,654],{"class":563},[66,15672,567],{"class":566},[10,15674,659,15675,663],{},[63,15676,662],{},[291,15678,667],{"id":666},[10,15680,297,15681,675,15684,325,15686,682],{},[299,15682,674],{"href":672,"rel":15683},[303],[257,15685,678],{},[63,15687,681],{},[10,15689,685,15690,689],{},[63,15691,688],{},[291,15693,693],{"id":692},[10,15695,696],{},[56,15697,15698],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,15699,15700,15706],{"__ignoreMap":61},[66,15701,15702,15704],{"class":68,"line":69},[66,15703,654],{"class":563},[66,15705,567],{"class":566},[66,15707,15708,15710,15712,15714],{"class":68,"line":75},[66,15709,654],{"class":563},[66,15711,596],{"class":566},[66,15713,600],{"class":599},[66,15715,567],{"class":566},[10,15717,720,15718,723],{},[63,15719,654],{},[14,15721,727],{"id":726},[10,15723,730],{},[291,15725,734],{"id":733},[10,15727,737],{},[56,15729,15730],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,15731,15732,15738],{"__ignoreMap":61},[66,15733,15734,15736],{"class":68,"line":69},[66,15735,654],{"class":563},[66,15737,567],{"class":566},[66,15739,15740,15742,15744,15746],{"class":68,"line":75},[66,15741,654],{"class":563},[66,15743,596],{"class":566},[66,15745,600],{"class":599},[66,15747,567],{"class":566},[10,15749,760],{},[291,15751,764],{"id":763},[10,15753,767],{},[56,15755,15756],{"className":554,"code":770,"language":556,"meta":61,"style":61},[63,15757,15758,15766],{"__ignoreMap":61},[66,15759,15760,15762,15764],{"class":68,"line":69},[66,15761,777],{"class":563},[66,15763,780],{"class":599},[66,15765,783],{"class":599},[66,15767,15768,15770,15772,15774,15776,15778],{"class":68,"line":75},[66,15769,777],{"class":563},[66,15771,780],{"class":599},[66,15773,792],{"class":599},[66,15775,795],{"class":599},[66,15777,798],{"class":599},[66,15779,801],{"class":599},[10,15781,804],{},[56,15783,15784],{"className":554,"code":807,"language":556,"meta":61,"style":61},[63,15785,15786],{"__ignoreMap":61},[66,15787,15788,15790,15792,15794,15796],{"class":68,"line":69},[66,15789,777],{"class":563},[66,15791,816],{"class":599},[66,15793,792],{"class":599},[66,15795,795],{"class":599},[66,15797,823],{"class":599},[10,15799,826],{},[56,15801,15802],{"className":554,"code":829,"language":556,"meta":61,"style":61},[63,15803,15804],{"__ignoreMap":61},[66,15805,15806,15808,15810,15812,15814],{"class":68,"line":69},[66,15807,777],{"class":563},[66,15809,838],{"class":599},[66,15811,841],{"class":566},[66,15813,844],{"class":599},[66,15815,847],{"class":599},[10,15817,15818,852],{},[63,15819,777],{},[291,15821,856],{"id":855},[10,15823,859],{},[56,15825,15826],{"className":554,"code":699,"language":556,"meta":61,"style":61},[63,15827,15828,15834],{"__ignoreMap":61},[66,15829,15830,15832],{"class":68,"line":69},[66,15831,654],{"class":563},[66,15833,567],{"class":566},[66,15835,15836,15838,15840,15842],{"class":68,"line":75},[66,15837,654],{"class":563},[66,15839,596],{"class":566},[66,15841,600],{"class":599},[66,15843,567],{"class":566},[10,15845,882],{},[14,15847,885],{"id":885},[291,15849,889],{"id":888},[10,15851,892,15852,896],{},[63,15853,895],{},[127,15855,15856,15860,15862],{},[40,15857,901,15858,904],{},[63,15859,611],{},[40,15861,907],{},[40,15863,910],{},[10,15865,913],{},[291,15867,917],{"id":916},[10,15869,920],{},[56,15871,15872],{"className":554,"code":647,"language":556,"meta":61,"style":61},[63,15873,15874],{"__ignoreMap":61},[66,15875,15876,15878],{"class":68,"line":69},[66,15877,654],{"class":563},[66,15879,567],{"class":566},[10,15881,933,15882,936,15884,939,15886,325],{},[63,15883,654],{},[63,15885,60],{},[63,15887,654],{},[291,15889,945],{"id":944},[10,15891,948],{},[56,15893,15894],{"className":554,"code":951,"language":556,"meta":61,"style":61},[63,15895,15896],{"__ignoreMap":61},[66,15897,15898,15900,15902,15904],{"class":68,"line":69},[66,15899,654],{"class":563},[66,15901,596],{"class":566},[66,15903,600],{"class":599},[66,15905,567],{"class":566},[10,15907,966,15908,969,15910,972,15912,975,15914,979],{},[63,15909,654],{},[63,15911,60],{},[63,15913,471],{},[63,15915,978],{},[175,15917,982],{},{"title":61,"searchDepth":75,"depth":75,"links":15919},[15920,15921,15922,15927,15932,15937],{"id":211,"depth":75,"text":211},{"id":227,"depth":75,"text":227},{"id":288,"depth":75,"text":289,"children":15923},[15924,15925,15926],{"id":293,"depth":82,"text":294},{"id":354,"depth":82,"text":355},{"id":539,"depth":82,"text":540},{"id":636,"depth":75,"text":637,"children":15928},[15929,15930,15931],{"id":640,"depth":82,"text":641},{"id":666,"depth":82,"text":667},{"id":692,"depth":82,"text":693},{"id":726,"depth":75,"text":727,"children":15933},[15934,15935,15936],{"id":733,"depth":82,"text":734},{"id":763,"depth":82,"text":764},{"id":855,"depth":82,"text":856},{"id":885,"depth":75,"text":885,"children":15938},[15939,15940,15941],{"id":888,"depth":82,"text":889},{"id":916,"depth":82,"text":917},{"id":944,"depth":82,"text":945},{},{"title":206,"description":61},[188,1015,1016],1786973365354]