[{"data":1,"prerenderedAt":15977},["ShallowReactive",2],{"post-python-function-arguments":3,"sidebar-posts":251,"post-related-source":9168},{"id":4,"title":5,"body":6,"category":236,"cover":237,"description":12,"extension":238,"meta":239,"navigation":90,"path":240,"pinned":241,"publishedAt":242,"seo":243,"slug":244,"stem":245,"summary":246,"tags":247,"updatedAt":242,"visible":90,"__hash__":250},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":8,"toc":224},"minimark",[9,13,17,20,23,30,33,36,56,59,62,132,135,143,146,149,169,173,176,182,185,188,200,203,211,214,217,220],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[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\u002F24-argument-binding.svg",[10,31,32],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,50],"ul",{},[40,41,42],"li",{},"必需参数应放在有默认值的参数之前。",[40,44,45,49],{},[46,47,48],"code",{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,51,52,55],{},[46,53,54],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,57,58],{"id":58},"跟着示例运行",[10,60,61],{},"把下面代码保存到本课脚本并运行：",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-python shiki shiki-themes github-dark","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","python","",[46,70,71,79,85,92,98,104,109,115,121,126],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,78],{},"def build_title(name, level=\"基础\"):\n",[72,80,82],{"class":74,"line":81},2,[72,83,84],{},"    return name + \"｜\" + level\n",[72,86,88],{"class":74,"line":87},3,[72,89,91],{"emptyLinePlaceholder":90},true,"\n",[72,93,95],{"class":74,"line":94},4,[72,96,97],{},"print(build_title(\"Python\"))\n",[72,99,101],{"class":74,"line":100},5,[72,102,103],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[72,105,107],{"class":74,"line":106},6,[72,108,91],{"emptyLinePlaceholder":90},[72,110,112],{"class":74,"line":111},7,[72,113,114],{},"def total(*numbers):\n",[72,116,118],{"class":74,"line":117},8,[72,119,120],{},"    return sum(numbers)\n",[72,122,124],{"class":74,"line":123},9,[72,125,91],{"emptyLinePlaceholder":90},[72,127,129],{"class":74,"line":128},10,[72,130,131],{},"print(total(10, 20, 30))\n",[10,133,134],{},"预期结果：",[63,136,141],{"className":137,"code":139,"language":140,"meta":68},[138],"language-text","Python｜基础\n异常处理｜进阶\n60\n","text",[46,142,139],{"__ignoreMap":68},[10,144,145],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,147,148],{"id":148},"按执行顺序拆开看",[150,151,152,159],"ol",{},[40,153,154,155,158],{},"第一次调用只提供必需参数，",[46,156,157],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,160,161,164,165,168],{},[46,162,163],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[46,166,167],{},"sum()","。",[170,171,172],"h3",{"id":172},"再看一个具体细节",[10,174,175],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,177,178],{},[26,179],{"alt":180,"src":181},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,183,184],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,186,187],{"id":187},"初学者容易混淆的地方",[37,189,190,197],{},[40,191,192,193,196],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[46,194,195],{},"None"," 再在函数内创建。",[40,198,199],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,201,202],{"id":202},"练习",[150,204,205,208],{},[40,206,207],{},"给问候函数增加默认称呼。",[40,209,210],{},"编写接收任意数量分数并返回总分的函数。",[10,212,213],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,215,216],{"id":216},"本篇边界",[10,218,219],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,222,223],"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":68,"searchDepth":81,"depth":81,"links":225},[226,227,228,229,230,233,234,235],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":231},[232],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",false,"2026-08-17",{"title":5,"description":12},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[236,248,249],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",[252,1064,1401,1535,1687,1866,2054,2219,2403,2584,2776,3007,3191,3368,3525,3696,3861,4075,4303,4485,4649,4838,5026,5181,5341,5537,5690,5904,6071,6315,6496,6701,6896,7080,7281,7571,7763,7992,8187,8407,8647,8851],{"id":253,"title":254,"body":255,"category":236,"cover":237,"description":68,"extension":238,"meta":1053,"navigation":90,"path":1054,"pinned":241,"publishedAt":1055,"seo":1056,"slug":1057,"stem":1058,"summary":1059,"tags":1060,"updatedAt":1055,"visible":90,"__hash__":1063},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":256,"toc":1029},[257,260,263,266,273,276,279,318,334,338,342,353,358,364,381,387,392,398,402,448,451,457,463,466,497,542,559,573,583,587,598,614,617,623,628,631,649,659,680,684,688,691,703,710,714,729,736,740,743,764,770,774,777,781,784,804,807,811,814,848,851,870,873,894,899,903,906,926,929,932,936,943,957,960,964,967,977,988,992,995,1010,1026],[14,258,259],{"id":259},"引言",[10,261,262],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,264,265],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,267,268,269,272],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[46,270,271],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,274,275],{"id":275},"扫盲",[10,277,278],{},"那么这里有几个概念：",[280,281,282,285],"blockquote",{},[10,283,284],{},"为什么需要安装python解释器？",[280,286,287,298,301,309,312],{},[10,288,289,290,293,294,297],{},"我们写的代码，电脑其实看不懂，电脑只认识",[46,291,292],{},"0","和",[46,295,296],{},"1","组成的机器指令。",[10,299,300],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,302,303,304,308],{},"这样，我们就能用",[305,306,307],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,310,311],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,313,314],{},[26,315],{"alt":316,"src":317},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[280,319,320,323],{},[10,321,322],{},"pip又是什么？",[280,324,325,328],{},[10,326,327],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,329,330],{},[26,331],{"alt":332,"src":333},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,335,337],{"id":336},"windows-安装","Windows 安装",[170,339,341],{"id":340},"_1-下载官方安装程序","1. 下载官方安装程序",[10,343,344,345,352],{},"打开 ",[346,347,351],"a",{"href":348,"rel":349},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[350],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[280,354,355],{},[10,356,357],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,359,360],{},[26,361],{"alt":362,"src":363},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,365,366,372,378],{},[40,367,368,369,168],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[305,370,371],{},"Windows installer (64-bit)",[40,373,374,375,168],{},"搭载 ARM 处理器的 Windows 设备选择 ",[305,376,377],{},"Windows installer (ARM64)",[40,379,380],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,382,383],{},[26,384],{"alt":385,"src":386},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[280,388,389],{},[10,390,391],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,393,394],{},[26,395],{"alt":396,"src":397},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[170,399,401],{"id":400},"_2-安装并加入-path","2. 安装并加入 PATH",[280,403,404,409,416,441],{},[280,405,406],{},[10,407,408],{},"PATH 环境变量",[10,410,411,412,415],{},"Windows 有一个特殊的变量叫 ",[305,413,414],{},"PATH","，它里面存了一串文件夹路径，比如：",[63,417,419],{"className":65,"code":418,"language":67,"meta":68,"style":68},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[46,420,421,426,431,436],{"__ignoreMap":68},[72,422,423],{"class":74,"line":75},[72,424,425],{},"D:\\Python313\\\n",[72,427,428],{"class":74,"line":81},[72,429,430],{},"D:\\Python313\\Scripts\\\n",[72,432,433],{"class":74,"line":87},[72,434,435],{},"C:\\Windows\\System32\\\n",[72,437,438],{"class":74,"line":94},[72,439,440],{},"...\n",[10,442,443,444,447],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[305,445,446],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,449,450],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,452,453,454,456],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[46,455,67],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,458,459],{},[26,460],{"alt":461,"src":462},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,464,465],{},"对安装界面最底部的两个勾选项分别解释 :",[280,467,468,471,476],{},[10,469,470],{},"Add python.exe to PATH",[10,472,473],{},[305,474,475],{},"把 Python 添加到系统环境变量",[280,477,478,484,490],{},[10,479,480,481,483],{},"勾选后，你可以在命令行任意位置直接输入 ",[46,482,67],{}," 就能运行",[10,485,486,487,489],{},"不勾选的话，命令行输入 ",[46,488,67],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,491,492,493,496],{},"必须",[305,494,495],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[280,498,499,502,507],{},[10,500,501],{},"Use admin privileges when installing py.exe",[10,503,504],{},[305,505,506],{},"使用管理员权限安装 py.exe（Python 启动器）",[280,508,509,519,533,536],{},[10,510,511,514,515,518],{},[46,512,513],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[46,516,517],{},"py"," 来启动 Python。",[10,520,521,522,524,525,528,529,532],{},"勾选后，",[46,523,513],{}," 会安装到",[305,526,527],{},"系统级目录","，电脑上",[305,530,531],{},"所有用户账户","都能用",[10,534,535],{},"不勾选，只有当前用户能用",[10,537,538,541],{},[305,539,540],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[280,543,544,547],{},[10,545,546],{},"操作建议",[280,548,549,556],{},[10,550,551,552,555],{},"两个都勾上之后，再点 ",[305,553,554],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,557,558],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[280,560,561,567],{},[10,562,563,564],{},"Python 安装的",[305,565,566],{},"可选功能页",[10,568,569],{},[26,570],{"alt":571,"src":572},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[280,574,575,578],{},[10,576,577],{},"高级选项页",[10,579,580],{},[26,581],{"alt":571,"src":582},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[170,584,586],{"id":585},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,588,589,590,593,594,597],{},"按 ",[46,591,592],{},"Win + R","，输入 ",[46,595,596],{},"cmd"," 并回车，然后执行：",[63,599,603],{"className":600,"code":601,"language":602,"meta":68,"style":68},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[46,604,605],{"__ignoreMap":68},[72,606,607,610],{"class":74,"line":75},[72,608,67],{"class":609},"svObZ",[72,611,613],{"class":612},"sDLfK"," --version\n",[10,615,616],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[63,618,621],{"className":619,"code":620,"language":140,"meta":68},[138],"Python 3.x.x\n",[46,622,620],{"__ignoreMap":68},[10,624,625],{},[26,626],{"alt":571,"src":627},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,629,630],{},"继续检查 pip：",[63,632,634],{"className":600,"code":633,"language":602,"meta":68,"style":68},"python -m pip --version\n",[46,635,636],{"__ignoreMap":68},[72,637,638,640,643,647],{"class":74,"line":75},[72,639,67],{"class":609},[72,641,642],{"class":612}," -m",[72,644,646],{"class":645},"sU2Wk"," pip",[72,648,613],{"class":612},[10,650,651,652,654,655,658],{},"如果 ",[46,653,67],{}," 无法识别，但 ",[46,656,657],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[63,660,662],{"className":600,"code":661,"language":602,"meta":68,"style":68},"py --version\npy -m pip --version\n",[46,663,664,670],{"__ignoreMap":68},[72,665,666,668],{"class":74,"line":75},[72,667,517],{"class":609},[72,669,613],{"class":612},[72,671,672,674,676,678],{"class":74,"line":81},[72,673,517],{"class":609},[72,675,642],{"class":612},[72,677,646],{"class":645},[72,679,613],{"class":612},[14,681,683],{"id":682},"macos-安装","macOS 安装",[170,685,687],{"id":686},"_1-先检查现有环境","1. 先检查现有环境",[10,689,690],{},"打开“终端”应用，执行：",[63,692,694],{"className":600,"code":693,"language":602,"meta":68,"style":68},"python3 --version\n",[46,695,696],{"__ignoreMap":68},[72,697,698,701],{"class":74,"line":75},[72,699,700],{"class":609},"python3",[72,702,613],{"class":612},[10,704,705,706,709],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[46,707,708],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[170,711,713],{"id":712},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,715,344,716,721,722,168,725,728],{},[346,717,720],{"href":718,"rel":719},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[350],"Python macOS 下载页","，下载当前稳定版的 ",[305,723,724],{},"macOS 64-bit universal2 installer",[46,726,727],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,730,731,732,735],{},"下载完成后打开 ",[46,733,734],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[170,737,739],{"id":738},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,741,742],{},"安装完成后重新打开终端，执行：",[63,744,746],{"className":600,"code":745,"language":602,"meta":68,"style":68},"python3 --version\npython3 -m pip --version\n",[46,747,748,754],{"__ignoreMap":68},[72,749,750,752],{"class":74,"line":75},[72,751,700],{"class":609},[72,753,613],{"class":612},[72,755,756,758,760,762],{"class":74,"line":81},[72,757,700],{"class":609},[72,759,642],{"class":612},[72,761,646],{"class":645},[72,763,613],{"class":612},[10,765,766,767,769],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[46,768,700],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,771,773],{"id":772},"linux-安装","Linux 安装",[10,775,776],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[170,778,780],{"id":779},"_1-检查是否已经安装","1. 检查是否已经安装",[10,782,783],{},"打开终端，执行：",[63,785,786],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,787,788,794],{"__ignoreMap":68},[72,789,790,792],{"class":74,"line":75},[72,791,700],{"class":609},[72,793,613],{"class":612},[72,795,796,798,800,802],{"class":74,"line":81},[72,797,700],{"class":609},[72,799,642],{"class":612},[72,801,646],{"class":645},[72,803,613],{"class":612},[10,805,806],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[170,808,810],{"id":809},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,812,813],{},"Ubuntu 或 Debian：",[63,815,817],{"className":600,"code":816,"language":602,"meta":68,"style":68},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[46,818,819,830],{"__ignoreMap":68},[72,820,821,824,827],{"class":74,"line":75},[72,822,823],{"class":609},"sudo",[72,825,826],{"class":645}," apt",[72,828,829],{"class":645}," update\n",[72,831,832,834,836,839,842,845],{"class":74,"line":81},[72,833,823],{"class":609},[72,835,826],{"class":645},[72,837,838],{"class":645}," install",[72,840,841],{"class":645}," python3",[72,843,844],{"class":645}," python3-pip",[72,846,847],{"class":645}," python3-venv\n",[10,849,850],{},"Fedora：",[63,852,854],{"className":600,"code":853,"language":602,"meta":68,"style":68},"sudo dnf install python3 python3-pip\n",[46,855,856],{"__ignoreMap":68},[72,857,858,860,863,865,867],{"class":74,"line":75},[72,859,823],{"class":609},[72,861,862],{"class":645}," dnf",[72,864,838],{"class":645},[72,866,841],{"class":645},[72,868,869],{"class":645}," python3-pip\n",[10,871,872],{},"Arch Linux：",[63,874,876],{"className":600,"code":875,"language":602,"meta":68,"style":68},"sudo pacman -S python python-pip\n",[46,877,878],{"__ignoreMap":68},[72,879,880,882,885,888,891],{"class":74,"line":75},[72,881,823],{"class":609},[72,883,884],{"class":645}," pacman",[72,886,887],{"class":612}," -S",[72,889,890],{"class":645}," python",[72,892,893],{"class":645}," python-pip\n",[10,895,896,898],{},[46,897,823],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[170,900,902],{"id":901},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,904,905],{},"安装结束后执行：",[63,907,908],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,909,910,916],{"__ignoreMap":68},[72,911,912,914],{"class":74,"line":75},[72,913,700],{"class":609},[72,915,613],{"class":612},[72,917,918,920,922,924],{"class":74,"line":81},[72,919,700],{"class":609},[72,921,642],{"class":612},[72,923,646],{"class":645},[72,925,613],{"class":612},[10,927,928],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,930,931],{"id":931},"常见问题",[170,933,935],{"id":934},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,937,938,939,942],{},"先关闭当前命令提示符并重新打开，再执行 ",[46,940,941],{},"python --version","。如果仍然失败，按下面的顺序检查：",[150,944,945,951,954],{},[40,946,947,948,950],{},"执行 ",[46,949,657],{},"，确认 Python Launcher 是否可用。",[40,952,953],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,955,956],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,958,959],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[170,961,963],{"id":962},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,965,966],{},"先尝试：",[63,968,969],{"className":600,"code":693,"language":602,"meta":68,"style":68},[46,970,971],{"__ignoreMap":68},[72,972,973,975],{"class":74,"line":75},[72,974,700],{"class":609},[72,976,613],{"class":612},[10,978,979,980,982,983,985,986,168],{},"在这两个系统中，只有 ",[46,981,700],{}," 命令而没有 ",[46,984,67],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[46,987,700],{},[170,989,991],{"id":990},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,993,994],{},"先使用模块方式检查：",[63,996,998],{"className":600,"code":997,"language":602,"meta":68,"style":68},"python3 -m pip --version\n",[46,999,1000],{"__ignoreMap":68},[72,1001,1002,1004,1006,1008],{"class":74,"line":75},[72,1003,700],{"class":609},[72,1005,642],{"class":612},[72,1007,646],{"class":645},[72,1009,613],{"class":612},[10,1011,1012,1013,1015,1016,1018,1019,1021,1022,1025],{},"Windows 用户将命令中的 ",[46,1014,700],{}," 换成 ",[46,1017,67],{}," 或 ",[46,1020,517],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[46,1023,1024],{},"python3-pip","；不要直接使用其他系统的安装命令。",[221,1027,1028],{},"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":68,"searchDepth":81,"depth":81,"links":1030},[1031,1032,1033,1038,1043,1048],{"id":259,"depth":81,"text":259},{"id":275,"depth":81,"text":275},{"id":336,"depth":81,"text":337,"children":1034},[1035,1036,1037],{"id":340,"depth":87,"text":341},{"id":400,"depth":87,"text":401},{"id":585,"depth":87,"text":586},{"id":682,"depth":81,"text":683,"children":1039},[1040,1041,1042],{"id":686,"depth":87,"text":687},{"id":712,"depth":87,"text":713},{"id":738,"depth":87,"text":739},{"id":772,"depth":81,"text":773,"children":1044},[1045,1046,1047],{"id":779,"depth":87,"text":780},{"id":809,"depth":87,"text":810},{"id":901,"depth":87,"text":902},{"id":931,"depth":81,"text":931,"children":1049},[1050,1051,1052],{"id":934,"depth":87,"text":935},{"id":962,"depth":87,"text":963},{"id":990,"depth":87,"text":991},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":254,"description":68},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[236,1061,1062],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1065,"title":1066,"body":1067,"category":236,"cover":1074,"description":68,"extension":238,"meta":1390,"navigation":90,"path":1391,"pinned":241,"publishedAt":1392,"seo":1393,"slug":1394,"stem":1395,"summary":1396,"tags":1397,"updatedAt":1392,"visible":90,"__hash__":1400},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1068,"toc":1375},[1069,1075,1078,1081,1085,1088,1112,1115,1121,1124,1127,1161,1171,1175,1182,1185,1210,1213,1225,1228,1232,1235,1238,1241,1244,1247,1250,1253,1277,1280,1283,1289,1292,1295,1298,1302,1308,1311,1337,1340,1344,1347,1350,1354,1357,1360,1363,1366,1369,1372],[10,1070,1071],{},[26,1072],{"alt":1073,"src":1074},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1076,1077],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1079,1080],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1082,1084],{"id":1083},"python-代码是什么样的","Python 代码是什么样的",[10,1086,1087],{},"下面是一段简单的 Python 代码：",[63,1089,1091],{"className":65,"code":1090,"language":67,"meta":68,"style":68},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[46,1092,1093,1098,1103,1107],{"__ignoreMap":68},[72,1094,1095],{"class":74,"line":75},[72,1096,1097],{},"name = \"Python\"\n",[72,1099,1100],{"class":74,"line":81},[72,1101,1102],{},"year = 2026\n",[72,1104,1105],{"class":74,"line":87},[72,1106,91],{"emptyLinePlaceholder":90},[72,1108,1109],{"class":74,"line":94},[72,1110,1111],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1113,1114],{},"运行结果：",[63,1116,1119],{"className":1117,"code":1118,"language":140,"meta":68},[138],"正在学习 Python，当前年份是 2026\n",[46,1120,1118],{"__ignoreMap":68},[10,1122,1123],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1125,1126],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[63,1128,1130],{"className":65,"code":1129,"language":67,"meta":68,"style":68},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[46,1131,1132,1137,1141,1146,1151,1156],{"__ignoreMap":68},[72,1133,1134],{"class":74,"line":75},[72,1135,1136],{},"score = 85\n",[72,1138,1139],{"class":74,"line":81},[72,1140,91],{"emptyLinePlaceholder":90},[72,1142,1143],{"class":74,"line":87},[72,1144,1145],{},"if score >= 60:\n",[72,1147,1148],{"class":74,"line":94},[72,1149,1150],{},"    print(\"成绩合格\")\n",[72,1152,1153],{"class":74,"line":100},[72,1154,1155],{},"else:\n",[72,1157,1158],{"class":74,"line":106},[72,1159,1160],{},"    print(\"需要继续学习\")\n",[10,1162,1163,1166,1167,1170],{},[46,1164,1165],{},"if"," 和 ",[46,1168,1169],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1172,1174],{"id":1173},"python-如何运行代码","Python 如何运行代码",[10,1176,1177,1178,1181],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[46,1179,1180],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1183,1184],{},"交互式环境适合快速验证一个表达式：",[63,1186,1188],{"className":65,"code":1187,"language":67,"meta":68,"style":68},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[46,1189,1190,1195,1200,1205],{"__ignoreMap":68},[72,1191,1192],{"class":74,"line":75},[72,1193,1194],{},">>> 10 + 20\n",[72,1196,1197],{"class":74,"line":81},[72,1198,1199],{},"30\n",[72,1201,1202],{"class":74,"line":87},[72,1203,1204],{},">>> \"Python\".lower()\n",[72,1206,1207],{"class":74,"line":94},[72,1208,1209],{},"'python'\n",[10,1211,1212],{},"需要保存和重复运行的程序，则可以写入文件：",[63,1214,1216],{"className":600,"code":1215,"language":602,"meta":68,"style":68},"python3 hello.py\n",[46,1217,1218],{"__ignoreMap":68},[72,1219,1220,1222],{"class":74,"line":75},[72,1221,700],{"class":609},[72,1223,1224],{"class":645}," hello.py\n",[10,1226,1227],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1229,1231],{"id":1230},"python-的特点","Python 的特点",[170,1233,1234],{"id":1234},"语法相对简洁",[10,1236,1237],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[170,1239,1240],{"id":1240},"支持多种编程方式",[10,1242,1243],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[170,1245,1246],{"id":1246},"标准库比较完整",[10,1248,1249],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1251,1252],{},"例如，获取当前时间：",[63,1254,1256],{"className":65,"code":1255,"language":67,"meta":68,"style":68},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[46,1257,1258,1263,1267,1272],{"__ignoreMap":68},[72,1259,1260],{"class":74,"line":75},[72,1261,1262],{},"from datetime import datetime\n",[72,1264,1265],{"class":74,"line":81},[72,1266,91],{"emptyLinePlaceholder":90},[72,1268,1269],{"class":74,"line":87},[72,1270,1271],{},"now = datetime.now()\n",[72,1273,1274],{"class":74,"line":94},[72,1275,1276],{},"print(now)\n",[10,1278,1279],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[170,1281,1282],{"id":1282},"第三方工具丰富",[10,1284,1285,1286,1288],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[46,1287,271],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1290,1291],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[170,1293,1294],{"id":1294},"支持多个操作系统",[10,1296,1297],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1299,1301],{"id":1300},"python-可以做什么","Python 可以做什么",[10,1303,1304],{},[26,1305],{"alt":1306,"src":1307},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1309,1310],{},"Python 的应用范围比较广，常见方向包括：",[37,1312,1313,1316,1319,1322,1325,1328,1331,1334],{},[40,1314,1315],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1317,1318],{},"开发网站后端和 API 服务；",[40,1320,1321],{},"进行数据清洗、统计分析和图表展示；",[40,1323,1324],{},"编写网络爬虫和信息采集工具；",[40,1326,1327],{},"开发自动化测试程序；",[40,1329,1330],{},"进行机器学习和人工智能开发；",[40,1332,1333],{},"编写运维、监控和辅助开发工具；",[40,1335,1336],{},"开发部分桌面应用和插件。",[10,1338,1339],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1341,1343],{"id":1342},"python-的发展","Python 的发展",[10,1345,1346],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1348,1349],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1351,1353],{"id":1352},"python-也有局限","Python 也有局限",[10,1355,1356],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1358,1359],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1361,1362],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1364,1365],{"id":1365},"写在最后",[10,1367,1368],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1370,1371],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[221,1373,1374],{},"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":68,"searchDepth":81,"depth":81,"links":1376},[1377,1378,1379,1386,1387,1388,1389],{"id":1083,"depth":81,"text":1084},{"id":1173,"depth":81,"text":1174},{"id":1230,"depth":81,"text":1231,"children":1380},[1381,1382,1383,1384,1385],{"id":1234,"depth":87,"text":1234},{"id":1240,"depth":87,"text":1240},{"id":1246,"depth":87,"text":1246},{"id":1282,"depth":87,"text":1282},{"id":1294,"depth":87,"text":1294},{"id":1300,"depth":81,"text":1301},{"id":1342,"depth":81,"text":1343},{"id":1352,"depth":81,"text":1353},{"id":1365,"depth":81,"text":1365},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1066,"description":68},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[236,1398,1399],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1402,"title":1403,"body":1404,"category":236,"cover":237,"description":1408,"extension":238,"meta":1526,"navigation":90,"path":1527,"pinned":241,"publishedAt":242,"seo":1528,"slug":1529,"stem":1530,"summary":1531,"tags":1532,"updatedAt":242,"visible":90,"__hash__":1534},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1405,"toc":1516},[1406,1409,1411,1414,1416,1422,1427,1429,1443,1445,1447,1456,1458,1464,1466,1468,1484,1486,1497,1499,1507,1509,1511,1514],[10,1407,1408],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1410,16],{"id":16},[10,1412,1413],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1415,22],{"id":22},[10,1417,1418],{},[26,1419],{"alt":1420,"src":1421},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1423,1424,1426],{},[46,1425,1180],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1428,35],{"id":35},[37,1430,1431,1437,1440],{},[40,1432,1433,1434,1436],{},"源代码是人编写的文本，通常保存在 ",[46,1435,1180],{}," 文件中。",[40,1438,1439],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1441,1442],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1444,58],{"id":58},[10,1446,61],{},[63,1448,1450],{"className":65,"code":1449,"language":67,"meta":68,"style":68},"print(\"你好，Python\")\n",[46,1451,1452],{"__ignoreMap":68},[72,1453,1454],{"class":74,"line":75},[72,1455,1449],{},[10,1457,134],{},[63,1459,1462],{"className":1460,"code":1461,"language":140,"meta":68},[138],"你好，Python\n",[46,1463,1461],{"__ignoreMap":68},[10,1465,145],{},[14,1467,148],{"id":148},[150,1469,1470,1477],{},[40,1471,1472,1473,1476],{},"终端启动解释器后，解释器读取 ",[46,1474,1475],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1478,1479,1480,1483],{},"字符串对象先准备好，再交给 ",[46,1481,1482],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1485,187],{"id":187},[37,1487,1488,1491],{},[40,1489,1490],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1492,1493,1494,1496],{},"认为 ",[46,1495,1180],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1498,202],{"id":202},[150,1500,1501,1504],{},[40,1502,1503],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1505,1506],{},"把示例文字改成自己的学习目标并重新运行。",[10,1508,213],{},[14,1510,216],{"id":216},[10,1512,1513],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1515,223],{},{"title":68,"searchDepth":81,"depth":81,"links":1517},[1518,1519,1520,1521,1522,1523,1524,1525],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1403,"description":1408},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[236,1398,1533],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1536,"title":1537,"body":1538,"category":236,"cover":237,"description":1542,"extension":238,"meta":1678,"navigation":90,"path":1679,"pinned":241,"publishedAt":242,"seo":1680,"slug":1681,"stem":1682,"summary":1683,"tags":1684,"updatedAt":242,"visible":90,"__hash__":1686},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1539,"toc":1668},[1540,1543,1545,1548,1550,1556,1562,1564,1579,1581,1584,1604,1606,1612,1614,1616,1629,1631,1645,1647,1658,1660,1662,1665],[10,1541,1542],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1544,16],{"id":16},[10,1546,1547],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1549,22],{"id":22},[10,1551,1552],{},[26,1553],{"alt":1554,"src":1555},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1557,1558,1559,1561],{},"终端收到 ",[46,1560,700],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1563,35],{"id":35},[37,1565,1566,1569,1572],{},[40,1567,1568],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1570,1571],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1573,1574,1575,1578],{},"检查 pip 时使用 ",[46,1576,1577],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1580,58],{"id":58},[10,1582,1583],{},"在 macOS 终端执行：",[63,1585,1586],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,1587,1588,1594],{"__ignoreMap":68},[72,1589,1590,1592],{"class":74,"line":75},[72,1591,700],{"class":609},[72,1593,613],{"class":612},[72,1595,1596,1598,1600,1602],{"class":74,"line":81},[72,1597,700],{"class":609},[72,1599,642],{"class":612},[72,1601,646],{"class":645},[72,1603,613],{"class":612},[10,1605,134],{},[63,1607,1610],{"className":1608,"code":1609,"language":140,"meta":68},[138],"Python 3.14.x\npip 版本信息与安装路径\n",[46,1611,1609],{"__ignoreMap":68},[10,1613,145],{},[14,1615,148],{"id":148},[150,1617,1618,1624],{},[40,1619,1620,1623],{},[46,1621,1622],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1625,1626,1628],{},[46,1627,708],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1630,187],{"id":187},[37,1632,1633,1639],{},[40,1634,1635,1636,1638],{},"看到系统已有 ",[46,1637,700],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1640,1641,1642,1644],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[46,1643,700],{},"，不修改系统自带工具。",[14,1646,202],{"id":202},[150,1648,1649,1655],{},[40,1650,947,1651,1654],{},[46,1652,1653],{},"which python3","，记录当前解释器路径。",[40,1656,1657],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1659,213],{},[14,1661,216],{"id":216},[10,1663,1664],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1666,1667],{},"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":68,"searchDepth":81,"depth":81,"links":1669},[1670,1671,1672,1673,1674,1675,1676,1677],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1537,"description":1542},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[236,1685,1061],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1688,"title":1689,"body":1690,"category":236,"cover":237,"description":1855,"extension":238,"meta":1856,"navigation":90,"path":1857,"pinned":241,"publishedAt":242,"seo":1858,"slug":1859,"stem":1860,"summary":1861,"tags":1862,"updatedAt":242,"visible":90,"__hash__":1865},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1691,"toc":1845},[1692,1698,1700,1703,1705,1711,1714,1716,1740,1742,1744,1771,1773,1779,1781,1783,1801,1803,1817,1819,1833,1835,1837,1843],[10,1693,1694,1695,1697],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[46,1696,1180],{}," 脚本。",[14,1699,16],{"id":16},[10,1701,1702],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1704,22],{"id":22},[10,1706,1707],{},[26,1708],{"alt":1709,"src":1710},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1712,1713],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1715,35],{"id":35},[37,1717,1718,1727,1734],{},[40,1719,1720,1721,1723,1724,168],{},"在终端输入 ",[46,1722,700],{}," 进入 REPL，提示符通常是 ",[46,1725,1726],{},">>>",[40,1728,1729,1730,1733],{},"输入 ",[46,1731,1732],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1735,1736,1737,1739],{},"需要保存、复查或多次运行的代码应写入 ",[46,1738,1180],{}," 文件。",[14,1741,58],{"id":58},[10,1743,61],{},[63,1745,1749],{"className":1746,"code":1747,"language":1748,"meta":68,"style":68},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[46,1750,1751,1756,1761,1766],{"__ignoreMap":68},[72,1752,1753],{"class":74,"line":75},[72,1754,1755],{},">>> 2 + 3\n",[72,1757,1758],{"class":74,"line":81},[72,1759,1760],{},"5\n",[72,1762,1763],{"class":74,"line":87},[72,1764,1765],{},">>> \"python\".upper()\n",[72,1767,1768],{"class":74,"line":94},[72,1769,1770],{},"'PYTHON'\n",[10,1772,134],{},[63,1774,1777],{"className":1775,"code":1776,"language":140,"meta":68},[138],"REPL 会直接显示表达式结果\n",[46,1778,1776],{"__ignoreMap":68},[10,1780,145],{},[14,1782,148],{"id":148},[150,1784,1785,1795],{},[40,1786,1787,1788,1791,1792,168],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[46,1789,1790],{},"2 + 3"," 能直接看到 ",[46,1793,1794],{},"5",[40,1796,1797,1798,1800],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[46,1799,1482],{}," 才会写到标准输出。",[14,1802,187],{"id":187},[37,1804,1805,1814],{},[40,1806,1807,1808,1810,1811,1813],{},"把提示符 ",[46,1809,1726],{}," 复制进 ",[46,1812,1180],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1815,1816],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1818,202],{"id":202},[150,1820,1821,1827],{},[40,1822,1823,1824,168],{},"在 REPL 计算 ",[46,1825,1826],{},"12 * 8",[40,1828,1829,1830,1832],{},"把同一表达式写入脚本；观察脚本中不调用 ",[46,1831,1482],{}," 时是否显示结果。",[10,1834,213],{},[14,1836,216],{"id":216},[10,1838,1839,1840,1842],{},"本篇目标是根据任务选择 REPL 或 ",[46,1841,1180],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1844,223],{},{"title":68,"searchDepth":81,"depth":81,"links":1846},[1847,1848,1849,1850,1851,1852,1853,1854],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1689,"description":1855},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[236,1863,1864],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1867,"title":1868,"body":1869,"category":236,"cover":237,"description":1873,"extension":238,"meta":2044,"navigation":90,"path":2045,"pinned":241,"publishedAt":242,"seo":2046,"slug":2047,"stem":2048,"summary":2049,"tags":2050,"updatedAt":242,"visible":90,"__hash__":2053},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1870,"toc":2034},[1871,1874,1876,1879,1881,1887,1893,1895,1913,1915,1917,1962,1964,1970,1972,1974,1996,1998,2010,2012,2024,2026,2028,2031],[10,1872,1873],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1875,16],{"id":16},[10,1877,1878],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1880,22],{"id":22},[10,1882,1883],{},[26,1884],{"alt":1885,"src":1886},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1888,1889,1892],{},[46,1890,1891],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1894,35],{"id":35},[37,1896,1897,1900,1910],{},[40,1898,1899],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1901,1902,1905,1906,1909],{},[46,1903,1904],{},"pwd"," 显示当前目录，",[46,1907,1908],{},"ls"," 显示目录里的文件。",[40,1911,1912],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1914,58],{"id":58},[10,1916,1583],{},[63,1918,1920],{"className":600,"code":1919,"language":602,"meta":68,"style":68},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[46,1921,1922,1930,1937,1942,1956],{"__ignoreMap":68},[72,1923,1924,1927],{"class":74,"line":75},[72,1925,1926],{"class":609},"mkdir",[72,1928,1929],{"class":645}," python-study\n",[72,1931,1932,1935],{"class":74,"line":81},[72,1933,1934],{"class":612},"cd",[72,1936,1929],{"class":645},[72,1938,1939],{"class":74,"line":87},[72,1940,1941],{"class":612},"pwd\n",[72,1943,1944,1947,1950,1954],{"class":74,"line":94},[72,1945,1946],{"class":612},"printf",[72,1948,1949],{"class":645}," 'print(\"项目已经运行\")\\n'",[72,1951,1953],{"class":1952},"snl16"," >",[72,1955,1224],{"class":645},[72,1957,1958,1960],{"class":74,"line":100},[72,1959,700],{"class":609},[72,1961,1224],{"class":645},[10,1963,134],{},[63,1965,1968],{"className":1966,"code":1967,"language":140,"meta":68},[138],"项目已经运行\n",[46,1969,1967],{"__ignoreMap":68},[10,1971,145],{},[14,1973,148],{"id":148},[150,1975,1976,1987],{},[40,1977,1978,1980,1981,1983,1984,1986],{},[46,1979,1926],{}," 创建目录，",[46,1982,1934],{}," 改变终端当前目录，",[46,1985,1904],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1988,1989,1991,1992,1995],{},[46,1990,1891],{}," 会在当前目录寻找 ",[46,1993,1994],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1997,187],{"id":187},[37,1999,2000,2007],{},[40,2001,2002,2003,1166,2005,168],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[46,2004,1904],{},[46,2006,1908],{},[40,2008,2009],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2011,202],{"id":202},[150,2013,2014,2021],{},[40,2015,2016,2017,2020],{},"新建 ",[46,2018,2019],{},"lesson01.py"," 并输出课程编号。",[40,2022,2023],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2025,213],{},[14,2027,216],{"id":216},[10,2029,2030],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2032,2033],{},"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":68,"searchDepth":81,"depth":81,"links":2035},[2036,2037,2038,2039,2040,2041,2042,2043],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1868,"description":1873},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[236,2051,2052],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2055,"title":2056,"body":2057,"category":236,"cover":237,"description":2061,"extension":238,"meta":2209,"navigation":90,"path":2210,"pinned":241,"publishedAt":242,"seo":2211,"slug":2212,"stem":2213,"summary":2214,"tags":2215,"updatedAt":242,"visible":90,"__hash__":2218},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2058,"toc":2199},[2059,2062,2064,2067,2069,2075,2086,2088,2108,2110,2112,2132,2134,2140,2142,2144,2163,2165,2173,2175,2190,2192,2194,2197],[10,2060,2061],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2063,16],{"id":16},[10,2065,2066],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2068,22],{"id":22},[10,2070,2071],{},[26,2072],{"alt":2073,"src":2074},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2076,2077,2078,168,2080,2083,2084,168],{},"Python 先计算表达式，再把得到的对象交给 ",[46,2079,1482],{},[46,2081,2082],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[46,2085,1790],{},[14,2087,35],{"id":35},[37,2089,2090,2096,2105],{},[40,2091,2092,2095],{},[46,2093,2094],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2097,2098,2101,2102,168],{},[46,2099,2100],{},"7 + 5"," 是表达式，运行时先求值得到 ",[46,2103,2104],{},"12",[40,2106,2107],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2109,58],{"id":58},[10,2111,61],{},[63,2113,2115],{"className":65,"code":2114,"language":67,"meta":68,"style":68},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[46,2116,2117,2122,2127],{"__ignoreMap":68},[72,2118,2119],{"class":74,"line":75},[72,2120,2121],{},"print(42)\n",[72,2123,2124],{"class":74,"line":81},[72,2125,2126],{},"print(7 + 5)\n",[72,2128,2129],{"class":74,"line":87},[72,2130,2131],{},"print(\"Python 基础课\")\n",[10,2133,134],{},[63,2135,2138],{"className":2136,"code":2137,"language":140,"meta":68},[138],"42\n12\nPython 基础课\n",[46,2139,2137],{"__ignoreMap":68},[10,2141,145],{},[14,2143,148],{"id":148},[150,2145,2146,2154],{},[40,2147,2148,2151,2152,168],{},[46,2149,2150],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[46,2153,2104],{},[40,2155,2156,2158,2159,2162],{},[46,2157,1482],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[46,2160,2161],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2164,187],{"id":187},[37,2166,2167,2170],{},[40,2168,2169],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2171,2172],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2174,202],{"id":202},[150,2176,2177,2180],{},[40,2178,2179],{},"分别输出一个整数、一个小数和一段文本。",[40,2181,2182,2183,2185,2186,2189],{},"比较 ",[46,2184,2082],{}," 与 ",[46,2187,2188],{},"print(\"2 + 3\")"," 的结果。",[10,2191,213],{},[14,2193,216],{"id":216},[10,2195,2196],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2198,223],{},{"title":68,"searchDepth":81,"depth":81,"links":2200},[2201,2202,2203,2204,2205,2206,2207,2208],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2056,"description":2061},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[236,2216,2217],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2220,"title":2221,"body":2222,"category":236,"cover":237,"description":2226,"extension":238,"meta":2393,"navigation":90,"path":2394,"pinned":241,"publishedAt":242,"seo":2395,"slug":2396,"stem":2397,"summary":2398,"tags":2399,"updatedAt":242,"visible":90,"__hash__":2402},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2223,"toc":2383},[2224,2227,2229,2232,2234,2240,2243,2245,2271,2273,2275,2303,2305,2311,2313,2315,2339,2341,2357,2359,2374,2376,2378,2381],[10,2225,2226],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2228,16],{"id":16},[10,2230,2231],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2233,22],{"id":22},[10,2235,2236],{},[26,2237],{"alt":2238,"src":2239},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2241,2242],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2244,35],{"id":35},[37,2246,2247,2250,2260],{},[40,2248,2249],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2251,2252,2253,2185,2256,2259],{},"变量名区分大小写，",[46,2254,2255],{},"score",[46,2257,2258],{},"Score"," 是两个名字。",[40,2261,2262,2263,2266,2267,2270],{},"使用能表达含义的名称；不要用 ",[46,2264,2265],{},"list","、",[46,2268,2269],{},"str"," 等内置名称作为普通变量名。",[14,2272,58],{"id":58},[10,2274,61],{},[63,2276,2278],{"className":65,"code":2277,"language":67,"meta":68,"style":68},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[46,2279,2280,2285,2290,2294,2299],{"__ignoreMap":68},[72,2281,2282],{"class":74,"line":75},[72,2283,2284],{},"score = 90\n",[72,2286,2287],{"class":74,"line":81},[72,2288,2289],{},"print(score)\n",[72,2291,2292],{"class":74,"line":87},[72,2293,91],{"emptyLinePlaceholder":90},[72,2295,2296],{"class":74,"line":94},[72,2297,2298],{},"score = 95\n",[72,2300,2301],{"class":74,"line":100},[72,2302,2289],{},[10,2304,134],{},[63,2306,2309],{"className":2307,"code":2308,"language":140,"meta":68},[138],"90\n95\n",[46,2310,2308],{"__ignoreMap":68},[10,2312,145],{},[14,2314,148],{"id":148},[150,2316,2317,2326],{},[40,2318,947,2319,2322,2323,2325],{},[46,2320,2321],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[46,2324,2255],{}," 再绑定到它。",[40,2327,947,2328,2331,2332,2335,2336,168],{},[46,2329,2330],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[46,2333,2334],{},"90"," 没有被改造成 ",[46,2337,2338],{},"95",[14,2340,187],{"id":187},[37,2342,2343,2346],{},[40,2344,2345],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2347,2348,2349,2266,2351,2266,2353,2356],{},"使用 ",[46,2350,2265],{},[46,2352,2269],{},[46,2354,2355],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2358,202],{"id":202},[150,2360,2361,2371],{},[40,2362,2363,2364,1166,2367,2370],{},"创建 ",[46,2365,2366],{},"course_name",[46,2368,2369],{},"lesson_count"," 两个变量并输出。",[40,2372,2373],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2375,213],{},[14,2377,216],{"id":216},[10,2379,2380],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2382,223],{},{"title":68,"searchDepth":81,"depth":81,"links":2384},[2385,2386,2387,2388,2389,2390,2391,2392],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2221,"description":2226},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[236,2400,2401],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2404,"title":2405,"body":2406,"category":236,"cover":237,"description":2410,"extension":238,"meta":2574,"navigation":90,"path":2575,"pinned":241,"publishedAt":242,"seo":2576,"slug":2577,"stem":2578,"summary":2579,"tags":2580,"updatedAt":242,"visible":90,"__hash__":2583},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2407,"toc":2564},[2408,2411,2413,2416,2418,2424,2427,2429,2458,2460,2462,2506,2508,2514,2516,2518,2532,2534,2545,2547,2555,2557,2559,2562],[10,2409,2410],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2412,16],{"id":16},[10,2414,2415],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2417,22],{"id":22},[10,2419,2420],{},[26,2421],{"alt":2422,"src":2423},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2425,2426],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2428,35],{"id":35},[37,2430,2431,2441,2455],{},[40,2432,2433,2436,2437,2440],{},[46,2434,2435],{},"int"," 表示整数，",[46,2438,2439],{},"float"," 表示浮点数。",[40,2442,2443,2446,2447,2450,2451,2454],{},[46,2444,2445],{},"\u002F"," 总是进行真除法；",[46,2448,2449],{},"\u002F\u002F"," 是向下取整除法，",[46,2452,2453],{},"%"," 得到余数。",[40,2456,2457],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2459,58],{"id":58},[10,2461,61],{},[63,2463,2465],{"className":65,"code":2464,"language":67,"meta":68,"style":68},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[46,2466,2467,2472,2477,2482,2486,2491,2496,2501],{"__ignoreMap":68},[72,2468,2469],{"class":74,"line":75},[72,2470,2471],{},"price = 25\n",[72,2473,2474],{"class":74,"line":81},[72,2475,2476],{},"count = 4\n",[72,2478,2479],{"class":74,"line":87},[72,2480,2481],{},"discount = 0.9\n",[72,2483,2484],{"class":74,"line":94},[72,2485,91],{"emptyLinePlaceholder":90},[72,2487,2488],{"class":74,"line":100},[72,2489,2490],{},"total = price * count * discount\n",[72,2492,2493],{"class":74,"line":106},[72,2494,2495],{},"average = total \u002F count\n",[72,2497,2498],{"class":74,"line":111},[72,2499,2500],{},"print(total)\n",[72,2502,2503],{"class":74,"line":117},[72,2504,2505],{},"print(average)\n",[10,2507,134],{},[63,2509,2512],{"className":2510,"code":2511,"language":140,"meta":68},[138],"90.0\n22.5\n",[46,2513,2511],{"__ignoreMap":68},[10,2515,145],{},[14,2517,148],{"id":148},[150,2519,2520,2526],{},[40,2521,2522,2525],{},[46,2523,2524],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2527,2528,2531],{},[46,2529,2530],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2533,187],{"id":187},[37,2535,2536,2542],{},[40,2537,2538,2539,168],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[46,2540,2541],{},"decimal.Decimal",[40,2543,2544],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2546,202],{"id":202},[150,2548,2549,2552],{},[40,2550,2551],{},"计算 137 除以 10 的商和余数。",[40,2553,2554],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2556,213],{},[14,2558,216],{"id":216},[10,2560,2561],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2563,223],{},{"title":68,"searchDepth":81,"depth":81,"links":2565},[2566,2567,2568,2569,2570,2571,2572,2573],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2405,"description":2410},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[236,2581,2582],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2585,"title":2586,"body":2587,"category":236,"cover":237,"description":2591,"extension":238,"meta":2766,"navigation":90,"path":2767,"pinned":241,"publishedAt":242,"seo":2768,"slug":2769,"stem":2770,"summary":2771,"tags":2772,"updatedAt":242,"visible":90,"__hash__":2775},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2588,"toc":2754},[2589,2592,2594,2597,2599,2605,2615,2617,2628,2630,2632,2662,2664,2670,2672,2674,2704,2706,2709,2715,2718,2720,2728,2730,2745,2747,2749,2752],[10,2590,2591],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2593,16],{"id":16},[10,2595,2596],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2598,22],{"id":22},[10,2600,2601],{},[26,2602],{"alt":2603,"src":2604},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2606,2607,2608,2611,2612,168],{},"切片 ",[46,2609,2610],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[46,2613,2614],{},"stop - start",[14,2616,35],{"id":35},[37,2618,2619,2622,2625],{},[40,2620,2621],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2623,2624],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2626,2627],{},"切片会创建新的字符串，不会修改原字符串。",[14,2629,58],{"id":58},[10,2631,61],{},[63,2633,2635],{"className":65,"code":2634,"language":67,"meta":68,"style":68},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[46,2636,2637,2642,2647,2652,2657],{"__ignoreMap":68},[72,2638,2639],{"class":74,"line":75},[72,2640,2641],{},"language = \"Python\"\n",[72,2643,2644],{"class":74,"line":81},[72,2645,2646],{},"print(language[0])\n",[72,2648,2649],{"class":74,"line":87},[72,2650,2651],{},"print(language[-1])\n",[72,2653,2654],{"class":74,"line":94},[72,2655,2656],{},"print(language[0:3])\n",[72,2658,2659],{"class":74,"line":100},[72,2660,2661],{},"print(language + \" 3.14\")\n",[10,2663,134],{},[63,2665,2668],{"className":2666,"code":2667,"language":140,"meta":68},[138],"P\nn\nPyt\nPython 3.14\n",[46,2669,2667],{"__ignoreMap":68},[10,2671,145],{},[14,2673,148],{"id":148},[150,2675,2676,2690],{},[40,2677,2678,2679,2681,2682,2685,2686,2689],{},"字符串 ",[46,2680,236],{}," 的正索引从 ",[46,2683,2684],{},"P"," 的 0 开始，负索引从末尾 ",[46,2687,2688],{},"n"," 的 -1 开始。",[40,2691,2692,2695,2696,2699,2700,2703],{},[46,2693,2694],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[46,2697,2698],{},"Pyt","；索引 3 的 ",[46,2701,2702],{},"h"," 不在结果中。",[170,2705,172],{"id":172},[10,2707,2708],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2710,2711],{},[26,2712],{"alt":2713,"src":2714},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2716,2717],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2719,187],{"id":187},[37,2721,2722,2725],{},[40,2723,2724],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2726,2727],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2729,202],{"id":202},[150,2731,2732,2742],{},[40,2733,2734,2735,2738,2739,168],{},"从 ",[46,2736,2737],{},"\"programming\""," 中切出 ",[46,2740,2741],{},"\"gram\"",[40,2743,2744],{},"使用负索引取得字符串倒数第二个字符。",[10,2746,213],{},[14,2748,216],{"id":216},[10,2750,2751],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2753,223],{},{"title":68,"searchDepth":81,"depth":81,"links":2755},[2756,2757,2758,2759,2760,2763,2764,2765],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":2761},[2762],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2586,"description":2591},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[236,2773,2774],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2777,"title":2778,"body":2779,"category":236,"cover":237,"description":2783,"extension":238,"meta":2997,"navigation":90,"path":2998,"pinned":241,"publishedAt":242,"seo":2999,"slug":3000,"stem":3001,"summary":3002,"tags":3003,"updatedAt":242,"visible":90,"__hash__":3006},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2780,"toc":2985},[2781,2784,2786,2789,2791,2797,2807,2809,2842,2844,2846,2890,2892,2898,2900,2902,2923,2925,2928,2934,2942,2944,2958,2960,2976,2978,2980,2983],[10,2782,2783],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2785,16],{"id":16},[10,2787,2788],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2790,22],{"id":22},[10,2792,2793],{},[26,2794],{"alt":2795,"src":2796},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2798,2799,2800,1018,2803,2806],{},"比较表达式先产生 ",[46,2801,2802],{},"True",[46,2804,2805],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2808,35],{"id":35},[37,2810,2811,2825,2839],{},[40,2812,2813,2816,2817,2820,2821,2824],{},[46,2814,2815],{},"=="," 判断是否相等，",[46,2818,2819],{},"!="," 判断是否不等；单个 ",[46,2822,2823],{},"="," 是赋值。",[40,2826,2827,2830,2831,2834,2835,2838],{},[46,2828,2829],{},"and"," 要求两侧都为真，",[46,2832,2833],{},"or"," 只需一侧为真，",[46,2836,2837],{},"not"," 取反。",[40,2840,2841],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2843,58],{"id":58},[10,2845,61],{},[63,2847,2849],{"className":65,"code":2848,"language":67,"meta":68,"style":68},"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",[46,2850,2851,2856,2861,2865,2870,2875,2880,2885],{"__ignoreMap":68},[72,2852,2853],{"class":74,"line":75},[72,2854,2855],{},"age = 20\n",[72,2857,2858],{"class":74,"line":81},[72,2859,2860],{},"has_ticket = True\n",[72,2862,2863],{"class":74,"line":87},[72,2864,91],{"emptyLinePlaceholder":90},[72,2866,2867],{"class":74,"line":94},[72,2868,2869],{},"is_adult = age >= 18\n",[72,2871,2872],{"class":74,"line":100},[72,2873,2874],{},"can_enter = is_adult and has_ticket\n",[72,2876,2877],{"class":74,"line":106},[72,2878,2879],{},"print(is_adult)\n",[72,2881,2882],{"class":74,"line":111},[72,2883,2884],{},"print(can_enter)\n",[72,2886,2887],{"class":74,"line":117},[72,2888,2889],{},"print(not has_ticket)\n",[10,2891,134],{},[63,2893,2896],{"className":2894,"code":2895,"language":140,"meta":68},[138],"True\nTrue\nFalse\n",[46,2897,2895],{"__ignoreMap":68},[10,2899,145],{},[14,2901,148],{"id":148},[150,2903,2904,2914],{},[40,2905,2906,2909,2910,2913],{},[46,2907,2908],{},"age >= 18"," 先产生布尔值并绑定给 ",[46,2911,2912],{},"is_adult","，这一步没有任何分支跳转。",[40,2915,2916,2919,2920,2922],{},[46,2917,2918],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[46,2921,2837],{}," 只对紧随其后的值取反。",[170,2924,172],{"id":172},[10,2926,2927],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2929,2930],{},[26,2931],{"alt":2932,"src":2933},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2935,2936,2938,2939,2941],{},[46,2937,2829],{}," 只有“真、真”得到真；",[46,2940,2833],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2943,187],{"id":187},[37,2945,2946,2955],{},[40,2947,2948,2949,2951,2952,2954],{},"用单个等号判断相等。",[46,2950,2823],{}," 是赋值，",[46,2953,2815],{}," 才是相等比较。",[40,2956,2957],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2959,202],{"id":202},[150,2961,2962,2969],{},[40,2963,2964,2965,2968],{},"判断数字 ",[46,2966,2967],{},"15"," 是否同时大于 10 且小于 20。",[40,2970,2971,2972,2975],{},"分别修改年龄和票据状态，记录 ",[46,2973,2974],{},"can_enter"," 的四种组合结果。",[10,2977,213],{},[14,2979,216],{"id":216},[10,2981,2982],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2984,223],{},{"title":68,"searchDepth":81,"depth":81,"links":2986},[2987,2988,2989,2990,2991,2994,2995,2996],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":2992},[2993],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2778,"description":2783},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[236,3004,3005],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3008,"title":3009,"body":3010,"category":236,"cover":237,"description":3014,"extension":238,"meta":3182,"navigation":90,"path":3183,"pinned":241,"publishedAt":242,"seo":3184,"slug":3185,"stem":3186,"summary":3187,"tags":3188,"updatedAt":242,"visible":90,"__hash__":3190},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3011,"toc":3172},[3012,3015,3017,3020,3022,3028,3046,3048,3061,3063,3065,3099,3101,3107,3109,3111,3133,3135,3147,3149,3163,3165,3167,3170],[10,3013,3014],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3016,16],{"id":16},[10,3018,3019],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3021,22],{"id":22},[10,3023,3024],{},[26,3025],{"alt":3026,"src":3027},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3029,3030,3033,3034,3037,3038,3041,3042,3045],{},[46,3031,3032],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[46,3035,3036],{},"18","，程序首先得到的也是 ",[46,3039,3040],{},"\"18\"","，需要 ",[46,3043,3044],{},"int()"," 后才能按整数参与计算。",[14,3047,35],{"id":35},[37,3049,3050,3053,3058],{},[40,3051,3052],{},"提示文字应告诉用户需要输入什么。",[40,3054,3055,3057],{},[46,3056,3044],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3059,3060],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3062,58],{"id":58},[10,3064,61],{},[63,3066,3068],{"className":65,"code":3067,"language":67,"meta":68,"style":68},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[46,3069,3070,3075,3080,3085,3089,3094],{"__ignoreMap":68},[72,3071,3072],{"class":74,"line":75},[72,3073,3074],{},"name = input(\"请输入姓名：\")\n",[72,3076,3077],{"class":74,"line":81},[72,3078,3079],{},"age_text = input(\"请输入年龄：\")\n",[72,3081,3082],{"class":74,"line":87},[72,3083,3084],{},"age = int(age_text)\n",[72,3086,3087],{"class":74,"line":94},[72,3088,91],{"emptyLinePlaceholder":90},[72,3090,3091],{"class":74,"line":100},[72,3092,3093],{},"print(\"你好，\" + name)\n",[72,3095,3096],{"class":74,"line":106},[72,3097,3098],{},"print(age + 1)\n",[10,3100,134],{},[63,3102,3105],{"className":3103,"code":3104,"language":140,"meta":68},[138],"根据输入显示姓名，并输出下一年的年龄\n",[46,3106,3104],{"__ignoreMap":68},[10,3108,145],{},[14,3110,148],{"id":148},[150,3112,3113,3123],{},[40,3114,3115,3116,3118,3119,3122],{},"两次 ",[46,3117,3032],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[46,3120,3121],{},"age_text"," 用来提醒这仍是文本。",[40,3124,3125,3128,3129,3132],{},[46,3126,3127],{},"int(age_text)"," 创建整数对象，后面的 ",[46,3130,3131],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3134,187],{"id":187},[37,3136,3137,3144],{},[40,3138,3139,3140,3143],{},"直接计算 ",[46,3141,3142],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3145,3146],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3148,202],{"id":202},[150,3150,3151,3154],{},[40,3152,3153],{},"接收两个整数并输出它们的和。",[40,3155,1729,3156,3159,3160,3162],{},[46,3157,3158],{},"18.5"," 给 ",[46,3161,3044],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3164,213],{},[14,3166,216],{"id":216},[10,3168,3169],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3171,223],{},{"title":68,"searchDepth":81,"depth":81,"links":3173},[3174,3175,3176,3177,3178,3179,3180,3181],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3009,"description":3014},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[236,2355,3189],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3192,"title":3193,"body":3194,"category":236,"cover":237,"description":3198,"extension":238,"meta":3358,"navigation":90,"path":3359,"pinned":241,"publishedAt":242,"seo":3360,"slug":3361,"stem":3362,"summary":3363,"tags":3364,"updatedAt":242,"visible":90,"__hash__":3367},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3195,"toc":3348},[3196,3199,3201,3204,3206,3212,3219,3221,3235,3237,3239,3278,3280,3286,3288,3290,3309,3311,3326,3328,3339,3341,3343,3346],[10,3197,3198],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3200,16],{"id":16},[10,3202,3203],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3205,22],{"id":22},[10,3207,3208],{},[26,3209],{"alt":3210,"src":3211},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3213,3214,3215,3218],{},"列表为元素维护从 0 开始的位置索引。修改 ",[46,3216,3217],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3220,35],{"id":35},[37,3222,3223,3226,3229],{},[40,3224,3225],{},"列表使用方括号，元素之间用逗号分隔。",[40,3227,3228],{},"列表可变，可以替换、追加和删除元素。",[40,3230,3231,3232,168],{},"访问不存在的索引会产生 ",[46,3233,3234],{},"IndexError",[14,3236,58],{"id":58},[10,3238,61],{},[63,3240,3242],{"className":65,"code":3241,"language":67,"meta":68,"style":68},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[46,3243,3244,3249,3254,3258,3263,3268,3273],{"__ignoreMap":68},[72,3245,3246],{"class":74,"line":75},[72,3247,3248],{},"scores = [82, 90, 76]\n",[72,3250,3251],{"class":74,"line":81},[72,3252,3253],{},"print(scores[0])\n",[72,3255,3256],{"class":74,"line":87},[72,3257,91],{"emptyLinePlaceholder":90},[72,3259,3260],{"class":74,"line":94},[72,3261,3262],{},"scores[1] = 95\n",[72,3264,3265],{"class":74,"line":100},[72,3266,3267],{},"scores.append(88)\n",[72,3269,3270],{"class":74,"line":106},[72,3271,3272],{},"print(scores)\n",[72,3274,3275],{"class":74,"line":111},[72,3276,3277],{},"print(len(scores))\n",[10,3279,134],{},[63,3281,3284],{"className":3282,"code":3283,"language":140,"meta":68},[138],"82\n[82, 95, 76, 88]\n4\n",[46,3285,3283],{"__ignoreMap":68},[10,3287,145],{},[14,3289,148],{"id":148},[150,3291,3292,3295],{},[40,3293,3294],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3296,3297,3300,3301,3304,3305,3308],{},[46,3298,3299],{},"scores[1] = 95"," 替换第二个位置，",[46,3302,3303],{},"append(88)"," 在末尾增加新位置，",[46,3306,3307],{},"len()"," 因而从 3 变为 4。",[14,3310,187],{"id":187},[37,3312,3313,3323],{},[40,3314,3315,3316,3319,3320,168],{},"访问 ",[46,3317,3318],{},"scores[len(scores)]","。最后一个合法正索引是 ",[46,3321,3322],{},"len(scores) - 1",[40,3324,3325],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3327,202],{"id":202},[150,3329,3330,3333],{},[40,3331,3332],{},"建立三项学习任务列表，再追加第四项。",[40,3334,3335,3336,3338],{},"修改第二项，并用 ",[46,3337,3307],{}," 检查元素数量。",[10,3340,213],{},[14,3342,216],{"id":216},[10,3344,3345],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3347,223],{},{"title":68,"searchDepth":81,"depth":81,"links":3349},[3350,3351,3352,3353,3354,3355,3356,3357],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3193,"description":3198},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[236,3365,3366],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3369,"title":3370,"body":3371,"category":236,"cover":237,"description":3375,"extension":238,"meta":3516,"navigation":90,"path":3517,"pinned":241,"publishedAt":242,"seo":3518,"slug":3519,"stem":3520,"summary":3521,"tags":3522,"updatedAt":242,"visible":90,"__hash__":3524},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3372,"toc":3506},[3373,3376,3378,3381,3383,3389,3392,3394,3405,3407,3409,3443,3445,3451,3453,3455,3469,3471,3483,3485,3497,3499,3501,3504],[10,3374,3375],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3377,16],{"id":16},[10,3379,3380],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3382,22],{"id":22},[10,3384,3385],{},[26,3386],{"alt":3387,"src":3388},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3390,3391],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3393,35],{"id":35},[37,3395,3396,3399,3402],{},[40,3397,3398],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3400,3401],{},"只有一个元素的元组必须保留尾随逗号。",[40,3403,3404],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3406,58],{"id":58},[10,3408,61],{},[63,3410,3412],{"className":65,"code":3411,"language":67,"meta":68,"style":68},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[46,3413,3414,3419,3424,3429,3433,3438],{"__ignoreMap":68},[72,3415,3416],{"class":74,"line":75},[72,3417,3418],{},"point = (120, 80)\n",[72,3420,3421],{"class":74,"line":81},[72,3422,3423],{},"print(point[0])\n",[72,3425,3426],{"class":74,"line":87},[72,3427,3428],{},"print(point[1])\n",[72,3430,3431],{"class":74,"line":94},[72,3432,91],{"emptyLinePlaceholder":90},[72,3434,3435],{"class":74,"line":100},[72,3436,3437],{},"single = (5,)\n",[72,3439,3440],{"class":74,"line":106},[72,3441,3442],{},"print(single)\n",[10,3444,134],{},[63,3446,3449],{"className":3447,"code":3448,"language":140,"meta":68},[138],"120\n80\n(5,)\n",[46,3450,3448],{"__ignoreMap":68},[10,3452,145],{},[14,3454,148],{"id":148},[150,3456,3457,3463],{},[40,3458,3459,3462],{},[46,3460,3461],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3464,3465,3468],{},[46,3466,3467],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3470,187],{"id":187},[37,3472,3473,3480],{},[40,3474,3475,3476,3479],{},"把 ",[46,3477,3478],{},"(5)"," 当作元组，实际它仍是整数。",[40,3481,3482],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3484,202],{"id":202},[150,3486,3487,3490],{},[40,3488,3489],{},"用元组表示宽度和高度。",[40,3491,2182,3492,2185,3494,3496],{},[46,3493,3478],{},[46,3495,3467],{}," 的类型。",[10,3498,213],{},[14,3500,216],{"id":216},[10,3502,3503],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3505,223],{},{"title":68,"searchDepth":81,"depth":81,"links":3507},[3508,3509,3510,3511,3512,3513,3514,3515],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3370,"description":3375},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[236,3523,3366],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3526,"title":3527,"body":3528,"category":236,"cover":237,"description":3532,"extension":238,"meta":3687,"navigation":90,"path":3688,"pinned":241,"publishedAt":242,"seo":3689,"slug":3690,"stem":3691,"summary":3692,"tags":3693,"updatedAt":242,"visible":90,"__hash__":3695},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3529,"toc":3677},[3530,3533,3535,3538,3540,3546,3556,3558,3572,3574,3576,3610,3612,3618,3620,3622,3637,3639,3658,3660,3668,3670,3672,3675],[10,3531,3532],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3534,16],{"id":16},[10,3536,3537],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3539,22],{"id":22},[10,3541,3542],{},[26,3543],{"alt":3544,"src":3545},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3547,3548,3549,3552,3553,3555],{},"字典通过键定位值，不使用连续位置表达含义。",[46,3550,3551],{},"student[\"score\"]"," 读取的是键 ",[46,3554,2255],{}," 对应的值，而不是“第几个元素”。",[14,3557,35],{"id":35},[37,3559,3560,3563,3569],{},[40,3561,3562],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3564,2348,3565,3568],{},[46,3566,3567],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3570,3571],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3573,58],{"id":58},[10,3575,61],{},[63,3577,3579],{"className":65,"code":3578,"language":67,"meta":68,"style":68},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[46,3580,3581,3586,3591,3595,3600,3605],{"__ignoreMap":68},[72,3582,3583],{"class":74,"line":75},[72,3584,3585],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[72,3587,3588],{"class":74,"line":81},[72,3589,3590],{},"print(student[\"name\"])\n",[72,3592,3593],{"class":74,"line":87},[72,3594,91],{"emptyLinePlaceholder":90},[72,3596,3597],{"class":74,"line":94},[72,3598,3599],{},"student[\"score\"] = 95\n",[72,3601,3602],{"class":74,"line":100},[72,3603,3604],{},"student[\"city\"] = \"郑州\"\n",[72,3606,3607],{"class":74,"line":106},[72,3608,3609],{},"print(student)\n",[10,3611,134],{},[63,3613,3616],{"className":3614,"code":3615,"language":140,"meta":68},[138],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[46,3617,3615],{"__ignoreMap":68},[10,3619,145],{},[14,3621,148],{"id":148},[150,3623,3624,3627],{},[40,3625,3626],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3628,3629,3630,3632,3633,3636],{},"给已有键 ",[46,3631,2255],{}," 赋值会更新映射，给新键 ",[46,3634,3635],{},"city"," 赋值会增加映射。",[14,3638,187],{"id":187},[37,3640,3641,3648],{},[40,3642,3643,3644,3647],{},"按位置理解字典并尝试 ",[46,3645,3646],{},"student[0]","，而实际键是字符串。",[40,3649,3650,3651,3654,3655,168],{},"直接读取不确定存在的键并忽略 ",[46,3652,3653],{},"KeyError","；后续可根据场景使用成员检查或 ",[46,3656,3657],{},"get()",[14,3659,202],{"id":202},[150,3661,3662,3665],{},[40,3663,3664],{},"建立一本书的标题、作者和页数字典。",[40,3666,3667],{},"添加分类键，再修改页数。",[10,3669,213],{},[14,3671,216],{"id":216},[10,3673,3674],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3676,223],{},{"title":68,"searchDepth":81,"depth":81,"links":3678},[3679,3680,3681,3682,3683,3684,3685,3686],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3527,"description":3532},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[236,3694,3366],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3697,"title":3698,"body":3699,"category":236,"cover":237,"description":3703,"extension":238,"meta":3852,"navigation":90,"path":3853,"pinned":241,"publishedAt":242,"seo":3854,"slug":3855,"stem":3856,"summary":3857,"tags":3858,"updatedAt":242,"visible":90,"__hash__":3860},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3700,"toc":3842},[3701,3704,3706,3709,3711,3717,3720,3722,3741,3743,3745,3779,3781,3787,3789,3791,3806,3808,3820,3822,3833,3835,3837,3840],[10,3702,3703],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3705,16],{"id":16},[10,3707,3708],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3710,22],{"id":22},[10,3712,3713],{},[26,3714],{"alt":3715,"src":3716},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3718,3719],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3721,35],{"id":35},[37,3723,3724,3727,3730],{},[40,3725,3726],{},"集合中的元素不重复。",[40,3728,3729],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3731,3732,3733,3736,3737,3740],{},"创建空集合必须写 ",[46,3734,3735],{},"set()","；",[46,3738,3739],{},"{}"," 创建的是空字典。",[14,3742,58],{"id":58},[10,3744,61],{},[63,3746,3748],{"className":65,"code":3747,"language":67,"meta":68,"style":68},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[46,3749,3750,3755,3760,3764,3769,3774],{"__ignoreMap":68},[72,3751,3752],{"class":74,"line":75},[72,3753,3754],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[72,3756,3757],{"class":74,"line":81},[72,3758,3759],{},"right = {\"Python\", \"Docker\"}\n",[72,3761,3762],{"class":74,"line":87},[72,3763,91],{"emptyLinePlaceholder":90},[72,3765,3766],{"class":74,"line":94},[72,3767,3768],{},"print(left & right)\n",[72,3770,3771],{"class":74,"line":100},[72,3772,3773],{},"print(left | right)\n",[72,3775,3776],{"class":74,"line":106},[72,3777,3778],{},"print(\"Git\" in left)\n",[10,3780,134],{},[63,3782,3785],{"className":3783,"code":3784,"language":140,"meta":68},[138],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[46,3786,3784],{"__ignoreMap":68},[10,3788,145],{},[14,3790,148],{"id":148},[150,3792,3793,3796],{},[40,3794,3795],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3797,3798,3801,3802,3805],{},[46,3799,3800],{},"&"," 计算交集，",[46,3803,3804],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3807,187],{"id":187},[37,3809,3810,3817],{},[40,3811,2348,3812,3814,3815,168],{},[46,3813,3739],{}," 创建空集合，实际得到空字典；空集合应写 ",[46,3816,3735],{},[40,3818,3819],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3821,202],{"id":202},[150,3823,3824,3830],{},[40,3825,3826,3827,3829],{},"把包含重复标签的列表交给 ",[46,3828,3735],{}," 去重。",[40,3831,3832],{},"计算两组课程标签的交集和差集。",[10,3834,213],{},[14,3836,216],{"id":216},[10,3838,3839],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3841,223],{},{"title":68,"searchDepth":81,"depth":81,"links":3843},[3844,3845,3846,3847,3848,3849,3850,3851],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3698,"description":3703},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[236,3859,3366],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3862,"title":3863,"body":3864,"category":236,"cover":237,"description":3868,"extension":238,"meta":4065,"navigation":90,"path":4066,"pinned":241,"publishedAt":242,"seo":4067,"slug":4068,"stem":4069,"summary":4070,"tags":4071,"updatedAt":242,"visible":90,"__hash__":4074},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3865,"toc":4053},[3866,3869,3871,3874,3876,3882,3892,3894,3911,3913,3915,3964,3966,3972,3974,3976,3998,4000,4003,4009,4012,4014,4027,4029,4044,4046,4048,4051],[10,3867,3868],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3870,16],{"id":16},[10,3872,3873],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3875,22],{"id":22},[10,3877,3878],{},[26,3879],{"alt":3880,"src":3881},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3883,3884,3887,3888,3891],{},[46,3885,3886],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[46,3889,3890],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3893,35],{"id":35},[37,3895,3896,3905,3908],{},[40,3897,3898,3900,3901,3904],{},[46,3899,2815],{}," 比较内容是否相等，",[46,3902,3903],{},"is"," 比较是否为同一个对象。",[40,3906,3907],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3909,3910],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3912,58],{"id":58},[10,3914,61],{},[63,3916,3918],{"className":65,"code":3917,"language":67,"meta":68,"style":68},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[46,3919,3920,3925,3930,3935,3939,3944,3949,3954,3959],{"__ignoreMap":68},[72,3921,3922],{"class":74,"line":75},[72,3923,3924],{},"tasks = [\"变量\", \"字符串\"]\n",[72,3926,3927],{"class":74,"line":81},[72,3928,3929],{},"shared = tasks\n",[72,3931,3932],{"class":74,"line":87},[72,3933,3934],{},"backup = tasks.copy()\n",[72,3936,3937],{"class":74,"line":94},[72,3938,91],{"emptyLinePlaceholder":90},[72,3940,3941],{"class":74,"line":100},[72,3942,3943],{},"tasks.append(\"列表\")\n",[72,3945,3946],{"class":74,"line":106},[72,3947,3948],{},"print(shared)\n",[72,3950,3951],{"class":74,"line":111},[72,3952,3953],{},"print(backup)\n",[72,3955,3956],{"class":74,"line":117},[72,3957,3958],{},"print(tasks is shared)\n",[72,3960,3961],{"class":74,"line":123},[72,3962,3963],{},"print(tasks is backup)\n",[10,3965,134],{},[63,3967,3970],{"className":3968,"code":3969,"language":140,"meta":68},[138],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[46,3971,3969],{"__ignoreMap":68},[10,3973,145],{},[14,3975,148],{"id":148},[150,3977,3978,3984],{},[40,3979,3980,3983],{},[46,3981,3982],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3985,3986,3989,3990,3993,3994,3997],{},[46,3987,3988],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[46,3991,3992],{},"shared"," 能观察到变化，",[46,3995,3996],{},"backup"," 不会。",[170,3999,172],{"id":172},[10,4001,4002],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4004,4005],{},[26,4006],{"alt":4007,"src":4008},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4010,4011],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4013,187],{"id":187},[37,4015,4016,4024],{},[40,4017,4018,4019,4021,4022,168],{},"用 ",[46,4020,2815],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[46,4023,3903],{},[40,4025,4026],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4028,202],{"id":202},[150,4030,4031,4034],{},[40,4032,4033],{},"让两个变量引用同一个字典并修改其中一个。",[40,4035,2348,4036,4039,4040,1166,4042,168],{},[46,4037,4038],{},"copy()"," 创建外层副本，再比较 ",[46,4041,3903],{},[46,4043,2815],{},[10,4045,213],{},[14,4047,216],{"id":216},[10,4049,4050],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4052,223],{},{"title":68,"searchDepth":81,"depth":81,"links":4054},[4055,4056,4057,4058,4059,4062,4063,4064],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":4060},[4061],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3863,"description":3868},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[236,4072,4073],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4076,"title":4077,"body":4078,"category":236,"cover":237,"description":4082,"extension":238,"meta":4294,"navigation":90,"path":4295,"pinned":241,"publishedAt":242,"seo":4296,"slug":4297,"stem":4298,"summary":4299,"tags":4300,"updatedAt":242,"visible":90,"__hash__":4302},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4079,"toc":4281},[4080,4083,4085,4088,4090,4096,4106,4108,4119,4121,4123,4175,4177,4183,4185,4187,4205,4207,4210,4216,4224,4227,4230,4236,4242,4244,4262,4264,4272,4274,4276,4279],[10,4081,4082],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4084,16],{"id":16},[10,4086,4087],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4089,22],{"id":22},[10,4091,4092],{},[26,4093],{"alt":4094,"src":4095},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4097,4098,2266,4100,2266,4103,4105],{},[46,4099,1165],{},[46,4101,4102],{},"elif",[46,4104,1169],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4107,35],{"id":35},[37,4109,4110,4113,4116],{},[40,4111,4112],{},"冒号表示接下来开始一个代码块。",[40,4114,4115],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4117,4118],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4120,58],{"id":58},[10,4122,61],{},[63,4124,4126],{"className":65,"code":4125,"language":67,"meta":68,"style":68},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[46,4127,4128,4133,4137,4142,4147,4152,4157,4161,4166,4170],{"__ignoreMap":68},[72,4129,4130],{"class":74,"line":75},[72,4131,4132],{},"score = int(input(\"请输入分数：\"))\n",[72,4134,4135],{"class":74,"line":81},[72,4136,91],{"emptyLinePlaceholder":90},[72,4138,4139],{"class":74,"line":87},[72,4140,4141],{},"if score >= 90:\n",[72,4143,4144],{"class":74,"line":94},[72,4145,4146],{},"    level = \"优秀\"\n",[72,4148,4149],{"class":74,"line":100},[72,4150,4151],{},"elif score >= 60:\n",[72,4153,4154],{"class":74,"line":106},[72,4155,4156],{},"    level = \"合格\"\n",[72,4158,4159],{"class":74,"line":111},[72,4160,1155],{},[72,4162,4163],{"class":74,"line":117},[72,4164,4165],{},"    level = \"需要继续学习\"\n",[72,4167,4168],{"class":74,"line":123},[72,4169,91],{"emptyLinePlaceholder":90},[72,4171,4172],{"class":74,"line":128},[72,4173,4174],{},"print(level)\n",[10,4176,134],{},[63,4178,4181],{"className":4179,"code":4180,"language":140,"meta":68},[138],"输入 85 时输出：合格\n",[46,4182,4180],{"__ignoreMap":68},[10,4184,145],{},[14,4186,148],{"id":148},[150,4188,4189,4196],{},[40,4190,4191,4192,4195],{},"输入先转换为整数，程序从 ",[46,4193,4194],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4197,4198,4201,4202,4204],{},[46,4199,4200],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[46,4203,1169],{}," 被跳过；最终三个分支只会选择一个。",[170,4206,172],{"id":172},[10,4208,4209],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4211,4212],{},[26,4213],{"alt":4214,"src":4215},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4217,4218,4220,4221,4223],{},[46,4219,4194],{}," 必须放在 ",[46,4222,4200],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[170,4225,172],{"id":4226},"再看一个具体细节-1",[10,4228,4229],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4231,4232],{},[26,4233],{"alt":4234,"src":4235},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4237,4238,4239,4241],{},"同一缩进层级属于同一个代码块；回到 ",[46,4240,1165],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4243,187],{"id":187},[37,4245,4246,4252],{},[40,4247,4248,4249,4251],{},"先写 ",[46,4250,4200],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4253,4254,4255,4257,4258,4261],{},"混用多个独立 ",[46,4256,1165],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[46,4259,4260],{},"if\u002Felif\u002Felse"," 链。",[14,4263,202],{"id":202},[150,4265,4266,4269],{},[40,4267,4268],{},"根据温度输出“冷、适中、热”三个等级。",[40,4270,4271],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4273,213],{},[14,4275,216],{"id":216},[10,4277,4278],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4280,223],{},{"title":68,"searchDepth":81,"depth":81,"links":4282},[4283,4284,4285,4286,4287,4291,4292,4293],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":4288},[4289,4290],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4077,"description":4082},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[236,1165,4301],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4304,"title":4305,"body":4306,"category":236,"cover":237,"description":4310,"extension":238,"meta":4476,"navigation":90,"path":4477,"pinned":241,"publishedAt":242,"seo":4478,"slug":4479,"stem":4480,"summary":4481,"tags":4482,"updatedAt":242,"visible":90,"__hash__":4484},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4307,"toc":4464},[4308,4311,4313,4316,4318,4324,4330,4332,4347,4349,4351,4389,4391,4397,4399,4401,4416,4418,4421,4427,4433,4435,4443,4445,4455,4457,4459,4462],[10,4309,4310],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4312,16],{"id":16},[10,4314,4315],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4317,22],{"id":22},[10,4319,4320],{},[26,4321],{"alt":4322,"src":4323},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4325,4326,4329],{},[46,4327,4328],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4331,35],{"id":35},[37,4333,4334,4337,4340],{},[40,4335,4336],{},"进入循环前先准备参与条件判断的状态。",[40,4338,4339],{},"循环体中必须有机会让条件变为假。",[40,4341,4342,4343,4346],{},"能够预先确定遍历对象时，后续介绍的 ",[46,4344,4345],{},"for"," 通常更直接。",[14,4348,58],{"id":58},[10,4350,61],{},[63,4352,4354],{"className":65,"code":4353,"language":67,"meta":68,"style":68},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[46,4355,4356,4361,4365,4370,4375,4380,4384],{"__ignoreMap":68},[72,4357,4358],{"class":74,"line":75},[72,4359,4360],{},"count = 1\n",[72,4362,4363],{"class":74,"line":81},[72,4364,91],{"emptyLinePlaceholder":90},[72,4366,4367],{"class":74,"line":87},[72,4368,4369],{},"while count \u003C= 3:\n",[72,4371,4372],{"class":74,"line":94},[72,4373,4374],{},"    print(\"第\", count, \"次练习\")\n",[72,4376,4377],{"class":74,"line":100},[72,4378,4379],{},"    count = count + 1\n",[72,4381,4382],{"class":74,"line":106},[72,4383,91],{"emptyLinePlaceholder":90},[72,4385,4386],{"class":74,"line":111},[72,4387,4388],{},"print(\"练习结束\")\n",[10,4390,134],{},[63,4392,4395],{"className":4393,"code":4394,"language":140,"meta":68},[138],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[46,4396,4394],{"__ignoreMap":68},[10,4398,145],{},[14,4400,148],{"id":148},[150,4402,4403,4410],{},[40,4404,4405,4406,4409],{},"进入循环前 ",[46,4407,4408],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4411,4412,4413,4415],{},"循环体末尾把 ",[46,4414,4408],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[170,4417,172],{"id":172},[10,4419,4420],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4422,4423],{},[26,4424],{"alt":4425,"src":4426},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4428,4429,4430,4432],{},"第4次检查时 ",[46,4431,4408],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4434,187],{"id":187},[37,4436,4437,4440],{},[40,4438,4439],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4441,4442],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4444,202],{"id":202},[150,4446,4447,4452],{},[40,4448,2348,4449,4451],{},[46,4450,4328],{}," 输出 1 到 5。",[40,4453,4454],{},"计算 1 到 10 的累加和。",[10,4456,213],{},[14,4458,216],{"id":216},[10,4460,4461],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4463,223],{},{"title":68,"searchDepth":81,"depth":81,"links":4465},[4466,4467,4468,4469,4470,4473,4474,4475],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":4471},[4472],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4305,"description":4310},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[236,4328,4483],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4486,"title":4487,"body":4488,"category":236,"cover":237,"description":4492,"extension":238,"meta":4640,"navigation":90,"path":4641,"pinned":241,"publishedAt":242,"seo":4642,"slug":4643,"stem":4644,"summary":4645,"tags":4646,"updatedAt":242,"visible":90,"__hash__":4648},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4489,"toc":4630},[4490,4493,4495,4498,4500,4506,4511,4513,4527,4529,4531,4569,4571,4577,4579,4581,4598,4600,4608,4610,4621,4623,4625,4628],[10,4491,4492],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4494,16],{"id":16},[10,4496,4497],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4499,22],{"id":22},[10,4501,4502],{},[26,4503],{"alt":4504,"src":4505},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4507,4508,4510],{},[46,4509,4345],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4512,35],{"id":35},[37,4514,4515,4521,4524],{},[40,4516,4517,4520],{},[46,4518,4519],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4522,4523],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4525,4526],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4528,58],{"id":58},[10,4530,61],{},[63,4532,4534],{"className":65,"code":4533,"language":67,"meta":68,"style":68},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[46,4535,4536,4541,4545,4550,4555,4559,4564],{"__ignoreMap":68},[72,4537,4538],{"class":74,"line":75},[72,4539,4540],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[72,4542,4543],{"class":74,"line":81},[72,4544,91],{"emptyLinePlaceholder":90},[72,4546,4547],{"class":74,"line":87},[72,4548,4549],{},"for course in courses:\n",[72,4551,4552],{"class":74,"line":94},[72,4553,4554],{},"    print(course)\n",[72,4556,4557],{"class":74,"line":100},[72,4558,91],{"emptyLinePlaceholder":90},[72,4560,4561],{"class":74,"line":106},[72,4562,4563],{},"for number in range(1, 4):\n",[72,4565,4566],{"class":74,"line":111},[72,4567,4568],{},"    print(number)\n",[10,4570,134],{},[63,4572,4575],{"className":4573,"code":4574,"language":140,"meta":68},[138],"变量\n字符串\n列表\n1\n2\n3\n",[46,4576,4574],{"__ignoreMap":68},[10,4578,145],{},[14,4580,148],{"id":148},[150,4582,4583,4593],{},[40,4584,4585,4586,4588,4589,4592],{},"第一个 ",[46,4587,4345],{}," 依次从列表取得字符串，循环变量 ",[46,4590,4591],{},"course"," 每轮重新绑定。",[40,4594,4595,4597],{},[46,4596,4519],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4599,187],{"id":187},[37,4601,4602,4605],{},[40,4603,4604],{},"只需要元素却手工维护索引，增加越界风险。",[40,4606,4607],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4609,202],{"id":202},[150,4611,4612,4615],{},[40,4613,4614],{},"逐项输出一个字符串中的字符。",[40,4616,2348,4617,4620],{},[46,4618,4619],{},"range()"," 输出 2、4、6、8。",[10,4622,213],{},[14,4624,216],{"id":216},[10,4626,4627],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4629,223],{},{"title":68,"searchDepth":81,"depth":81,"links":4631},[4632,4633,4634,4635,4636,4637,4638,4639],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4487,"description":4492},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[236,4345,4647],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4650,"title":4651,"body":4652,"category":236,"cover":237,"description":4656,"extension":238,"meta":4830,"navigation":90,"path":4831,"pinned":241,"publishedAt":242,"seo":4832,"slug":4833,"stem":4834,"summary":4835,"tags":4836,"updatedAt":242,"visible":90,"__hash__":4837},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4653,"toc":4820},[4654,4657,4659,4662,4664,4670,4680,4682,4701,4703,4705,4757,4759,4765,4767,4769,4783,4785,4801,4803,4811,4813,4815,4818],[10,4655,4656],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4658,16],{"id":16},[10,4660,4661],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4663,22],{"id":22},[10,4665,4666],{},[26,4667],{"alt":4668,"src":4669},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4671,4672,4675,4676,4679],{},[46,4673,4674],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[46,4677,4678],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4681,35],{"id":35},[37,4683,4684,4687,4695],{},[40,4685,4686],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4688,4689,4691,4692,4694],{},[46,4690,4674],{}," 前要确认不会跳过 ",[46,4693,4328],{}," 循环中的状态更新。",[40,4696,4697,4698,4700],{},"多层嵌套中 ",[46,4699,4678],{}," 只结束它所在的最内层循环。",[14,4702,58],{"id":58},[10,4704,61],{},[63,4706,4708],{"className":65,"code":4707,"language":67,"meta":68,"style":68},"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",[46,4709,4710,4715,4719,4724,4729,4734,4739,4744,4748,4752],{"__ignoreMap":68},[72,4711,4712],{"class":74,"line":75},[72,4713,4714],{},"numbers = [3, -1, 0, 8, 12]\n",[72,4716,4717],{"class":74,"line":81},[72,4718,91],{"emptyLinePlaceholder":90},[72,4720,4721],{"class":74,"line":87},[72,4722,4723],{},"for number in numbers:\n",[72,4725,4726],{"class":74,"line":94},[72,4727,4728],{},"    if number \u003C 0:\n",[72,4730,4731],{"class":74,"line":100},[72,4732,4733],{},"        continue\n",[72,4735,4736],{"class":74,"line":106},[72,4737,4738],{},"    if number == 0:\n",[72,4740,4741],{"class":74,"line":111},[72,4742,4743],{},"        break\n",[72,4745,4746],{"class":74,"line":117},[72,4747,4568],{},[72,4749,4750],{"class":74,"line":123},[72,4751,91],{"emptyLinePlaceholder":90},[72,4753,4754],{"class":74,"line":128},[72,4755,4756],{},"print(\"循环结束\")\n",[10,4758,134],{},[63,4760,4763],{"className":4761,"code":4762,"language":140,"meta":68},[138],"3\n循环结束\n",[46,4764,4762],{"__ignoreMap":68},[10,4766,145],{},[14,4768,148],{"id":148},[150,4770,4771,4777],{},[40,4772,4773,4774,4776],{},"遇到 -1 时 ",[46,4775,4674],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4778,4779,4780,4782],{},"遇到 0 时 ",[46,4781,4678],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4784,187],{"id":187},[37,4786,4787,4792],{},[40,4788,3475,4789,4791],{},[46,4790,4674],{}," 当作结束循环，实际它只跳到下一轮。",[40,4793,4794,4795,4797,4798,4800],{},"在 ",[46,4796,4328],{}," 中把状态更新放在可能被 ",[46,4799,4674],{}," 跳过的位置，造成无限循环。",[14,4802,202],{"id":202},[150,4804,4805,4808],{},[40,4806,4807],{},"跳过列表中的空字符串并输出其他内容。",[40,4809,4810],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4812,213],{},[14,4814,216],{"id":216},[10,4816,4817],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4819,223],{},{"title":68,"searchDepth":81,"depth":81,"links":4821},[4822,4823,4824,4825,4826,4827,4828,4829],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4651,"description":4656},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[236,4678,4674],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4839,"title":4840,"body":4841,"category":236,"cover":237,"description":4845,"extension":238,"meta":5016,"navigation":90,"path":5017,"pinned":241,"publishedAt":242,"seo":5018,"slug":5019,"stem":5020,"summary":5021,"tags":5022,"updatedAt":242,"visible":90,"__hash__":5025},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4842,"toc":5004},[4843,4846,4848,4851,4853,4859,4862,4864,4888,4890,4892,4926,4928,4934,4936,4938,4955,4957,4960,4966,4969,4971,4985,4987,4995,4997,4999,5002],[10,4844,4845],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4847,16],{"id":16},[10,4849,4850],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4852,22],{"id":22},[10,4854,4855],{},[26,4856],{"alt":4857,"src":4858},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4860,4861],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4863,35],{"id":35},[37,4865,4866,4869,4872],{},[40,4867,4868],{},"每增加一层嵌套，阅读成本都会上升。",[40,4870,4871],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4873,4874,4875,2266,4878,4881,4882,2266,4885,168],{},"变量名使用 ",[46,4876,4877],{},"row",[46,4879,4880],{},"cell"," 等层级含义，避免全部写成 ",[46,4883,4884],{},"i",[46,4886,4887],{},"j",[14,4889,58],{"id":58},[10,4891,61],{},[63,4893,4895],{"className":65,"code":4894,"language":67,"meta":68,"style":68},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[46,4896,4897,4902,4906,4911,4916,4921],{"__ignoreMap":68},[72,4898,4899],{"class":74,"line":75},[72,4900,4901],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[72,4903,4904],{"class":74,"line":81},[72,4905,91],{"emptyLinePlaceholder":90},[72,4907,4908],{"class":74,"line":87},[72,4909,4910],{},"for row in table:\n",[72,4912,4913],{"class":74,"line":94},[72,4914,4915],{},"    for cell in row:\n",[72,4917,4918],{"class":74,"line":100},[72,4919,4920],{},"        print(cell)\n",[72,4922,4923],{"class":74,"line":106},[72,4924,4925],{},"    print(\"一行结束\")\n",[10,4927,134],{},[63,4929,4932],{"className":4930,"code":4931,"language":140,"meta":68},[138],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[46,4933,4931],{"__ignoreMap":68},[10,4935,145],{},[14,4937,148],{"id":148},[150,4939,4940,4952],{},[40,4941,4942,4943,4945,4946,1166,4949,168],{},"外层变量 ",[46,4944,4877],{}," 先引用第一行列表，内层才依次处理 ",[46,4947,4948],{},"A1",[46,4950,4951],{},"A2",[40,4953,4954],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[170,4956,172],{"id":172},[10,4958,4959],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4961,4962],{},[26,4963],{"alt":4964,"src":4965},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4967,4968],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4970,187],{"id":187},[37,4972,4973,4982],{},[40,4974,4975,4976,1018,4979,4981],{},"把两层循环变量都叫 ",[46,4977,4978],{},"item",[46,4980,4884],{},"，难以确认当前层级。",[40,4983,4984],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4986,202],{"id":202},[150,4988,4989,4992],{},[40,4990,4991],{},"打印一个 2×3 数字表。",[40,4993,4994],{},"在内层增加条件，只输出大于 3 的元素。",[10,4996,213],{},[14,4998,216],{"id":216},[10,5000,5001],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5003,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5005},[5006,5007,5008,5009,5010,5013,5014,5015],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":5011},[5012],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4840,"description":4845},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[236,5023,5024],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5027,"title":5028,"body":5029,"category":236,"cover":237,"description":5033,"extension":238,"meta":5171,"navigation":90,"path":5172,"pinned":241,"publishedAt":242,"seo":5173,"slug":5174,"stem":5175,"summary":5176,"tags":5177,"updatedAt":242,"visible":90,"__hash__":5180},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5030,"toc":5161},[5031,5034,5036,5039,5041,5047,5050,5052,5063,5065,5067,5105,5107,5113,5115,5117,5129,5131,5142,5144,5152,5154,5156,5159],[10,5032,5033],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5035,16],{"id":16},[10,5037,5038],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5040,22],{"id":22},[10,5042,5043],{},[26,5044],{"alt":5045,"src":5046},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5048,5049],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5051,35],{"id":35},[37,5053,5054,5057,5060],{},[40,5055,5056],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5058,5059],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5061,5062],{},"推导式创建新列表，不修改输入列表。",[14,5064,58],{"id":58},[10,5066,61],{},[63,5068,5070],{"className":65,"code":5069,"language":67,"meta":68,"style":68},"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",[46,5071,5072,5077,5081,5086,5091,5095,5100],{"__ignoreMap":68},[72,5073,5074],{"class":74,"line":75},[72,5075,5076],{},"numbers = [1, 2, 3, 4, 5]\n",[72,5078,5079],{"class":74,"line":81},[72,5080,91],{"emptyLinePlaceholder":90},[72,5082,5083],{"class":74,"line":87},[72,5084,5085],{},"squares = [number * number for number in numbers]\n",[72,5087,5088],{"class":74,"line":94},[72,5089,5090],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[72,5092,5093],{"class":74,"line":100},[72,5094,91],{"emptyLinePlaceholder":90},[72,5096,5097],{"class":74,"line":106},[72,5098,5099],{},"print(squares)\n",[72,5101,5102],{"class":74,"line":111},[72,5103,5104],{},"print(even_squares)\n",[10,5106,134],{},[63,5108,5111],{"className":5109,"code":5110,"language":140,"meta":68},[138],"[1, 4, 9, 16, 25]\n[4, 16]\n",[46,5112,5110],{"__ignoreMap":68},[10,5114,145],{},[14,5116,148],{"id":148},[150,5118,5119,5122],{},[40,5120,5121],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5123,5124,5125,5128],{},"第二条先用 ",[46,5126,5127],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5130,187],{"id":187},[37,5132,5133,5139],{},[40,5134,5135,5136,5138],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[46,5137,4345],{}," 开始找输入。",[40,5140,5141],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5143,202],{"id":202},[150,5145,5146,5149],{},[40,5147,5148],{},"把字符串列表转换为长度列表。",[40,5150,5151],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5153,213],{},[14,5155,216],{"id":216},[10,5157,5158],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5160,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5162},[5163,5164,5165,5166,5167,5168,5169,5170],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5028,"description":5033},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[236,5178,5179],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5182,"title":5183,"body":5184,"category":236,"cover":237,"description":5188,"extension":238,"meta":5331,"navigation":90,"path":5332,"pinned":241,"publishedAt":242,"seo":5333,"slug":5334,"stem":5335,"summary":5336,"tags":5337,"updatedAt":242,"visible":90,"__hash__":5340},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5185,"toc":5321},[5186,5189,5191,5194,5196,5202,5205,5207,5218,5220,5222,5261,5263,5269,5271,5273,5288,5290,5298,5300,5312,5314,5316,5319],[10,5187,5188],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5190,16],{"id":16},[10,5192,5193],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5195,22],{"id":22},[10,5197,5198],{},[26,5199],{"alt":5200,"src":5201},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5203,5204],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5206,35],{"id":35},[37,5208,5209,5212,5215],{},[40,5210,5211],{},"函数名描述动作，使用小写字母和下划线。",[40,5213,5214],{},"函数定义要先执行，之后才能调用。",[40,5216,5217],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5219,58],{"id":58},[10,5221,61],{},[63,5223,5225],{"className":65,"code":5224,"language":67,"meta":68,"style":68},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[46,5226,5227,5232,5237,5242,5246,5251,5256],{"__ignoreMap":68},[72,5228,5229],{"class":74,"line":75},[72,5230,5231],{},"def show_progress():\n",[72,5233,5234],{"class":74,"line":81},[72,5235,5236],{},"    print(\"正在学习函数\")\n",[72,5238,5239],{"class":74,"line":87},[72,5240,5241],{},"    print(\"本节完成 50%\")\n",[72,5243,5244],{"class":74,"line":94},[72,5245,91],{"emptyLinePlaceholder":90},[72,5247,5248],{"class":74,"line":100},[72,5249,5250],{},"print(\"调用前\")\n",[72,5252,5253],{"class":74,"line":106},[72,5254,5255],{},"show_progress()\n",[72,5257,5258],{"class":74,"line":111},[72,5259,5260],{},"print(\"调用后\")\n",[10,5262,134],{},[63,5264,5267],{"className":5265,"code":5266,"language":140,"meta":68},[138],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[46,5268,5266],{"__ignoreMap":68},[10,5270,145],{},[14,5272,148],{"id":148},[150,5274,5275,5281],{},[40,5276,947,5277,5280],{},[46,5278,5279],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5282,5283,5284,5287],{},"运行到 ",[46,5285,5286],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5289,187],{"id":187},[37,5291,5292,5295],{},[40,5293,5294],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5296,5297],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5299,202],{"id":202},[150,5301,5302,5309],{},[40,5303,5304,5305,5308],{},"定义 ",[46,5306,5307],{},"show_plan()"," 输出两行学习计划。",[40,5310,5311],{},"连续调用同一个函数两次，观察执行顺序。",[10,5313,213],{},[14,5315,216],{"id":216},[10,5317,5318],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5320,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5322},[5323,5324,5325,5326,5327,5328,5329,5330],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5183,"description":5188},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[236,5338,5339],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5342,"title":5343,"body":5344,"category":236,"cover":237,"description":5348,"extension":238,"meta":5527,"navigation":90,"path":5528,"pinned":241,"publishedAt":242,"seo":5529,"slug":5530,"stem":5531,"summary":5532,"tags":5533,"updatedAt":242,"visible":90,"__hash__":5536},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5345,"toc":5515},[5346,5349,5351,5354,5356,5362,5369,5371,5387,5389,5391,5425,5427,5433,5435,5437,5458,5460,5463,5469,5479,5481,5496,5498,5506,5508,5510,5513],[10,5347,5348],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5350,16],{"id":16},[10,5352,5353],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5355,22],{"id":22},[10,5357,5358],{},[26,5359],{"alt":5360,"src":5361},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5363,5364,5365,5368],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[46,5366,5367],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5370,35],{"id":35},[37,5372,5373,5376,5379],{},[40,5374,5375],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5377,5378],{},"局部变量默认只在函数内部可见。",[40,5380,5381,5382,5384,5385,168],{},"没有显式 ",[46,5383,5367],{}," 的函数会返回 ",[46,5386,195],{},[14,5388,58],{"id":58},[10,5390,61],{},[63,5392,5394],{"className":65,"code":5393,"language":67,"meta":68,"style":68},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[46,5395,5396,5401,5406,5411,5415,5420],{"__ignoreMap":68},[72,5397,5398],{"class":74,"line":75},[72,5399,5400],{},"def calculate_total(price, count):\n",[72,5402,5403],{"class":74,"line":81},[72,5404,5405],{},"    total = price * count\n",[72,5407,5408],{"class":74,"line":87},[72,5409,5410],{},"    return total\n",[72,5412,5413],{"class":74,"line":94},[72,5414,91],{"emptyLinePlaceholder":90},[72,5416,5417],{"class":74,"line":100},[72,5418,5419],{},"result = calculate_total(25, 4)\n",[72,5421,5422],{"class":74,"line":106},[72,5423,5424],{},"print(result)\n",[10,5426,134],{},[63,5428,5431],{"className":5429,"code":5430,"language":140,"meta":68},[138],"100\n",[46,5432,5430],{"__ignoreMap":68},[10,5434,145],{},[14,5436,148],{"id":148},[150,5438,5439,5448],{},[40,5440,5441,5442,2266,5445,5447],{},"调用时 25 和 4 分别绑定到 ",[46,5443,5444],{},"price",[46,5446,4408],{},"，它们只在本次函数调用的局部范围中使用。",[40,5449,5450,5453,5454,5457],{},[46,5451,5452],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[46,5455,5456],{},"result"," 并输出。",[170,5459,172],{"id":172},[10,5461,5462],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5464,5465],{},[26,5466],{"alt":5467,"src":5468},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5470,5471,2266,5473,1166,5475,5478],{},[46,5472,5444],{},[46,5474,4408],{},[46,5476,5477],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5480,187],{"id":187},[37,5482,5483,5490],{},[40,5484,5485,5486,5489],{},"在函数内部只 ",[46,5487,5488],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5491,5492,5493,5495],{},"试图在函数外直接访问局部变量 ",[46,5494,5477],{},"，它的名字只在调用期间的局部作用域存在。",[14,5497,202],{"id":202},[150,5499,5500,5503],{},[40,5501,5502],{},"编写计算长方形面积的函数。",[40,5504,5505],{},"让函数返回结果后在调用方加上单位再输出。",[10,5507,213],{},[14,5509,216],{"id":216},[10,5511,5512],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5514,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5516},[5517,5518,5519,5520,5521,5524,5525,5526],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":5522},[5523],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5343,"description":5348},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[236,5534,5535],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":4,"title":5,"body":5538,"category":236,"cover":237,"description":12,"extension":238,"meta":5687,"navigation":90,"path":240,"pinned":241,"publishedAt":242,"seo":5688,"slug":244,"stem":245,"summary":246,"tags":5689,"updatedAt":242,"visible":90,"__hash__":250},{"type":7,"value":5539,"toc":5675},[5540,5542,5544,5546,5548,5552,5554,5556,5568,5570,5572,5616,5618,5623,5625,5627,5639,5641,5643,5647,5649,5651,5659,5661,5667,5669,5671,5673],[10,5541,12],{},[14,5543,16],{"id":16},[10,5545,19],{},[14,5547,22],{"id":22},[10,5549,5550],{},[26,5551],{"alt":28,"src":29},[10,5553,32],{},[14,5555,35],{"id":35},[37,5557,5558,5560,5564],{},[40,5559,42],{},[40,5561,5562,49],{},[46,5563,48],{},[40,5565,5566,55],{},[46,5567,54],{},[14,5569,58],{"id":58},[10,5571,61],{},[63,5573,5574],{"className":65,"code":66,"language":67,"meta":68,"style":68},[46,5575,5576,5580,5584,5588,5592,5596,5600,5604,5608,5612],{"__ignoreMap":68},[72,5577,5578],{"class":74,"line":75},[72,5579,78],{},[72,5581,5582],{"class":74,"line":81},[72,5583,84],{},[72,5585,5586],{"class":74,"line":87},[72,5587,91],{"emptyLinePlaceholder":90},[72,5589,5590],{"class":74,"line":94},[72,5591,97],{},[72,5593,5594],{"class":74,"line":100},[72,5595,103],{},[72,5597,5598],{"class":74,"line":106},[72,5599,91],{"emptyLinePlaceholder":90},[72,5601,5602],{"class":74,"line":111},[72,5603,114],{},[72,5605,5606],{"class":74,"line":117},[72,5607,120],{},[72,5609,5610],{"class":74,"line":123},[72,5611,91],{"emptyLinePlaceholder":90},[72,5613,5614],{"class":74,"line":128},[72,5615,131],{},[10,5617,134],{},[63,5619,5621],{"className":5620,"code":139,"language":140,"meta":68},[138],[46,5622,139],{"__ignoreMap":68},[10,5624,145],{},[14,5626,148],{"id":148},[150,5628,5629,5633],{},[40,5630,154,5631,158],{},[46,5632,157],{},[40,5634,5635,164,5637,168],{},[46,5636,163],{},[46,5638,167],{},[170,5640,172],{"id":172},[10,5642,175],{},[10,5644,5645],{},[26,5646],{"alt":180,"src":181},[10,5648,184],{},[14,5650,187],{"id":187},[37,5652,5653,5657],{},[40,5654,192,5655,196],{},[46,5656,195],{},[40,5658,199],{},[14,5660,202],{"id":202},[150,5662,5663,5665],{},[40,5664,207],{},[40,5666,210],{},[10,5668,213],{},[14,5670,216],{"id":216},[10,5672,219],{},[221,5674,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5676},[5677,5678,5679,5680,5681,5684,5685,5686],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":5682},[5683],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5,"description":12},[236,248,249],{"id":5691,"title":5692,"body":5693,"category":236,"cover":237,"description":5697,"extension":238,"meta":5894,"navigation":90,"path":5895,"pinned":241,"publishedAt":242,"seo":5896,"slug":5897,"stem":5898,"summary":5899,"tags":5900,"updatedAt":242,"visible":90,"__hash__":5903},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5694,"toc":5882},[5695,5698,5700,5703,5705,5711,5714,5716,5733,5735,5737,5800,5802,5808,5810,5812,5839,5841,5844,5850,5853,5855,5863,5865,5873,5875,5877,5880],[10,5696,5697],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5699,16],{"id":16},[10,5701,5702],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5704,22],{"id":22},[10,5706,5707],{},[26,5708],{"alt":5709,"src":5710},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5712,5713],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5715,35],{"id":35},[37,5717,5718,5721,5724],{},[40,5719,5720],{},"函数内部赋值默认创建局部变量。",[40,5722,5723],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5725,5726,2185,5729,5732],{},[46,5727,5728],{},"global",[46,5730,5731],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5734,58],{"id":58},[10,5736,61],{},[63,5738,5740],{"className":65,"code":5739,"language":67,"meta":68,"style":68},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[46,5741,5742,5747,5751,5756,5761,5765,5770,5775,5780,5784,5789,5794],{"__ignoreMap":68},[72,5743,5744],{"class":74,"line":75},[72,5745,5746],{},"course = \"Python\"\n",[72,5748,5749],{"class":74,"line":81},[72,5750,91],{"emptyLinePlaceholder":90},[72,5752,5753],{"class":74,"line":87},[72,5754,5755],{},"def outer():\n",[72,5757,5758],{"class":74,"line":94},[72,5759,5760],{},"    level = \"基础\"\n",[72,5762,5763],{"class":74,"line":100},[72,5764,91],{"emptyLinePlaceholder":90},[72,5766,5767],{"class":74,"line":106},[72,5768,5769],{},"    def show():\n",[72,5771,5772],{"class":74,"line":111},[72,5773,5774],{},"        lesson = \"作用域\"\n",[72,5776,5777],{"class":74,"line":117},[72,5778,5779],{},"        print(course, level, lesson)\n",[72,5781,5782],{"class":74,"line":123},[72,5783,91],{"emptyLinePlaceholder":90},[72,5785,5786],{"class":74,"line":128},[72,5787,5788],{},"    show()\n",[72,5790,5792],{"class":74,"line":5791},11,[72,5793,91],{"emptyLinePlaceholder":90},[72,5795,5797],{"class":74,"line":5796},12,[72,5798,5799],{},"outer()\n",[10,5801,134],{},[63,5803,5806],{"className":5804,"code":5805,"language":140,"meta":68},[138],"Python 基础 作用域\n",[46,5807,5805],{"__ignoreMap":68},[10,5809,145],{},[14,5811,148],{"id":148},[150,5813,5814,5831],{},[40,5815,5816,5819,5820,5823,5824,5826,5827,5830],{},[46,5817,5818],{},"show()"," 中查找 ",[46,5821,5822],{},"lesson"," 时先在局部找到，查找 ",[46,5825,157],{}," 时到外层 ",[46,5828,5829],{},"outer()"," 找到。",[40,5832,5833,5835,5836,5838],{},[46,5834,4591],{}," 在局部和外层都不存在，继续到模块全局找到；",[46,5837,2217],{}," 最后在内置作用域找到。",[170,5840,172],{"id":172},[10,5842,5843],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5845,5846],{},[26,5847],{"alt":5848,"src":5849},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5851,5852],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5854,187],{"id":187},[37,5856,5857,5860],{},[40,5858,5859],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5861,5862],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5864,202],{"id":202},[150,5866,5867,5870],{},[40,5868,5869],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5871,5872],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5874,213],{},[14,5876,216],{"id":216},[10,5878,5879],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5881,223],{},{"title":68,"searchDepth":81,"depth":81,"links":5883},[5884,5885,5886,5887,5888,5891,5892,5893],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":5889},[5890],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5692,"description":5697},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[236,5901,5902],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5905,"title":5906,"body":5907,"category":236,"cover":237,"description":5911,"extension":238,"meta":6061,"navigation":90,"path":6062,"pinned":241,"publishedAt":242,"seo":6063,"slug":6064,"stem":6065,"summary":6066,"tags":6067,"updatedAt":242,"visible":90,"__hash__":6070},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5908,"toc":6051},[5909,5912,5914,5917,5919,5925,5928,5930,5949,5951,5953,5987,5989,5995,5997,5999,6014,6016,6028,6030,6042,6044,6046,6049],[10,5910,5911],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5913,16],{"id":16},[10,5915,5916],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5918,22],{"id":22},[10,5920,5921],{},[26,5922],{"alt":5923,"src":5924},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5926,5927],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5929,35],{"id":35},[37,5931,5932,5935,5938],{},[40,5933,5934],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5936,5937],{},"注解表达接口意图，不代替输入校验和测试。",[40,5939,5940,5941,2266,5943,2266,5945,5948],{},"基础注解优先使用 ",[46,5942,2269],{},[46,5944,2435],{},[46,5946,5947],{},"list[str]"," 等直接写法。",[14,5950,58],{"id":58},[10,5952,61],{},[63,5954,5956],{"className":65,"code":5955,"language":67,"meta":68,"style":68},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[46,5957,5958,5963,5968,5973,5977,5982],{"__ignoreMap":68},[72,5959,5960],{"class":74,"line":75},[72,5961,5962],{},"def format_score(name: str, score: int) -> str:\n",[72,5964,5965],{"class":74,"line":81},[72,5966,5967],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[72,5969,5970],{"class":74,"line":87},[72,5971,5972],{},"    return name + \"：\" + str(score)\n",[72,5974,5975],{"class":74,"line":94},[72,5976,91],{"emptyLinePlaceholder":90},[72,5978,5979],{"class":74,"line":100},[72,5980,5981],{},"print(format_score(\"小郑\", 95))\n",[72,5983,5984],{"class":74,"line":106},[72,5985,5986],{},"print(format_score.__doc__)\n",[10,5988,134],{},[63,5990,5993],{"className":5991,"code":5992,"language":140,"meta":68},[138],"小郑：95\n返回带姓名的分数文本。\n",[46,5994,5992],{"__ignoreMap":68},[10,5996,145],{},[14,5998,148],{"id":148},[150,6000,6001,6011],{},[40,6002,6003,6004,6007,6008,6010],{},"函数签名说明 ",[46,6005,6006],{},"name"," 预期为字符串、",[46,6009,2255],{}," 预期为整数，返回值预期为字符串。",[40,6012,6013],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6015,187],{"id":187},[37,6017,6018,6025],{},[40,6019,6020,6021,6024],{},"认为加了 ",[46,6022,6023],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6026,6027],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6029,202],{"id":202},[150,6031,6032,6035],{},[40,6033,6034],{},"为面积函数补充参数和返回值注解。",[40,6036,6037,6038,6041],{},"通过 ",[46,6039,6040],{},"函数名.__doc__"," 查看文档字符串。",[10,6043,213],{},[14,6045,216],{"id":216},[10,6047,6048],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6050,223],{},{"title":68,"searchDepth":81,"depth":81,"links":6052},[6053,6054,6055,6056,6057,6058,6059,6060],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5906,"description":5911},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[236,6068,6069],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6072,"title":6073,"body":6074,"category":236,"cover":237,"description":6078,"extension":238,"meta":6305,"navigation":90,"path":6306,"pinned":241,"publishedAt":242,"seo":6307,"slug":6308,"stem":6309,"summary":6310,"tags":6311,"updatedAt":242,"visible":90,"__hash__":6314},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6075,"toc":6293},[6076,6079,6081,6087,6089,6095,6106,6108,6126,6128,6135,6164,6171,6190,6199,6201,6207,6209,6211,6234,6236,6239,6245,6251,6253,6269,6271,6284,6286,6288,6291],[10,6077,6078],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6080,16],{"id":16},[10,6082,6083,6084,6086],{},"本篇只处理“模块、import 与 ",[305,6085,6006],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6088,22],{"id":22},[10,6090,6091],{},[26,6092],{"alt":6093,"src":6094},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6096,6097,6098,6101,6102,6105],{},"同一个文件直接运行时 ",[46,6099,6100],{},"__name__"," 等于 ",[46,6103,6104],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6107,35],{"id":35},[37,6109,6110,6116,6119],{},[40,6111,6112,6113,6115],{},"一个 ",[46,6114,1180],{}," 文件就是一个模块。",[40,6117,6118],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6120,6121,6122,6125],{},"避免使用 ",[46,6123,6124],{},"from module import *","，它会让名字来源不清楚。",[14,6127,58],{"id":58},[10,6129,6130,6131,6134],{},"先在同一个目录中创建两个文件。把函数放进 ",[46,6132,6133],{},"calculator.py","：",[63,6136,6138],{"className":65,"code":6137,"language":67,"meta":68,"style":68},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[46,6139,6140,6145,6150,6154,6159],{"__ignoreMap":68},[72,6141,6142],{"class":74,"line":75},[72,6143,6144],{},"def add(left, right):\n",[72,6146,6147],{"class":74,"line":81},[72,6148,6149],{},"    return left + right\n",[72,6151,6152],{"class":74,"line":87},[72,6153,91],{"emptyLinePlaceholder":90},[72,6155,6156],{"class":74,"line":94},[72,6157,6158],{},"if __name__ == \"__main__\":\n",[72,6160,6161],{"class":74,"line":100},[72,6162,6163],{},"    print(add(2, 3))\n",[10,6165,6166,6167,6170],{},"再创建 ",[46,6168,6169],{},"app.py","，从模块中导入函数：",[63,6172,6174],{"className":65,"code":6173,"language":67,"meta":68,"style":68},"from calculator import add\n\nprint(add(10, 20))\n",[46,6175,6176,6181,6185],{"__ignoreMap":68},[72,6177,6178],{"class":74,"line":75},[72,6179,6180],{},"from calculator import add\n",[72,6182,6183],{"class":74,"line":81},[72,6184,91],{"emptyLinePlaceholder":90},[72,6186,6187],{"class":74,"line":87},[72,6188,6189],{},"print(add(10, 20))\n",[10,6191,6192,6193,1166,6196,168],{},"分别执行 ",[46,6194,6195],{},"python3 calculator.py",[46,6197,6198],{},"python3 app.py",[10,6200,134],{},[63,6202,6205],{"className":6203,"code":6204,"language":140,"meta":68},[138],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[46,6206,6204],{"__ignoreMap":68},[10,6208,145],{},[14,6210,148],{"id":148},[150,6212,6213,6223],{},[40,6214,6215,6216,6218,6219,6222],{},"直接运行 ",[46,6217,6133],{}," 时，模块名是 ",[46,6220,6221],{},"__main__","，入口代码输出 5。",[40,6224,6225,6227,6228,6230,6231,6233],{},[46,6226,6169],{}," 导入模块时，",[46,6229,6133],{}," 的函数定义会执行，但入口判断为假；随后 ",[46,6232,6169],{}," 调用函数输出 30。",[170,6235,172],{"id":172},[10,6237,6238],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6240,6241],{},[26,6242],{"alt":6243,"src":6244},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6246,6247,6248,6250],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[46,6249,6221],{}," 保护下的演示代码。",[14,6252,187],{"id":187},[37,6254,6255,6262],{},[40,6256,6257,6258,1166,6260,168],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[46,6259,6133],{},[46,6261,6169],{},[40,6263,6264,6265,6268],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[46,6266,6267],{},"json.py","，导致导入目标被遮蔽。",[14,6270,202],{"id":202},[150,6272,6273,6279],{},[40,6274,2363,6275,6278],{},[46,6276,6277],{},"text_tools.py"," 并导出一个格式化函数。",[40,6280,6281,6282,168],{},"分别直接运行模块和从另一个脚本导入，输出 ",[46,6283,6100],{},[10,6285,213],{},[14,6287,216],{"id":216},[10,6289,6290],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6292,223],{},{"title":68,"searchDepth":81,"depth":81,"links":6294},[6295,6296,6297,6298,6299,6302,6303,6304],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":6300},[6301],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6073,"description":6078},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[236,6312,6313],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6316,"title":6317,"body":6318,"category":236,"cover":237,"description":6322,"extension":238,"meta":6487,"navigation":90,"path":6488,"pinned":241,"publishedAt":242,"seo":6489,"slug":6490,"stem":6491,"summary":6492,"tags":6493,"updatedAt":242,"visible":90,"__hash__":6495},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6319,"toc":6477},[6320,6323,6325,6328,6330,6336,6339,6341,6355,6357,6359,6405,6407,6413,6415,6417,6443,6445,6455,6457,6468,6470,6472,6475],[10,6321,6322],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6324,16],{"id":16},[10,6326,6327],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6329,22],{"id":22},[10,6331,6332],{},[26,6333],{"alt":6334,"src":6335},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6337,6338],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6340,35],{"id":35},[37,6342,6343,6349,6352],{},[40,6344,6345,6348],{},[46,6346,6347],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6350,6351],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6353,6354],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6356,58],{"id":58},[10,6358,1583],{},[63,6360,6362],{"className":600,"code":6361,"language":602,"meta":68,"style":68},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[46,6363,6364,6376,6384,6390,6400],{"__ignoreMap":68},[72,6365,6366,6368,6370,6373],{"class":74,"line":75},[72,6367,700],{"class":609},[72,6369,642],{"class":612},[72,6371,6372],{"class":645}," venv",[72,6374,6375],{"class":645}," .venv\n",[72,6377,6378,6381],{"class":74,"line":81},[72,6379,6380],{"class":612},"source",[72,6382,6383],{"class":645}," .venv\u002Fbin\u002Factivate\n",[72,6385,6386,6388],{"class":74,"line":87},[72,6387,67],{"class":609},[72,6389,613],{"class":612},[72,6391,6392,6394,6396,6398],{"class":74,"line":94},[72,6393,67],{"class":609},[72,6395,642],{"class":612},[72,6397,646],{"class":645},[72,6399,613],{"class":612},[72,6401,6402],{"class":74,"line":100},[72,6403,6404],{"class":609},"deactivate\n",[10,6406,134],{},[63,6408,6411],{"className":6409,"code":6410,"language":140,"meta":68},[138],"Python 和 pip 的路径应指向当前项目的 .venv\n",[46,6412,6410],{"__ignoreMap":68},[10,6414,145],{},[14,6416,148],{"id":148},[150,6418,6419,6428],{},[40,6420,6421,6424,6425,6427],{},[46,6422,6423],{},"venv"," 根据当前 ",[46,6426,700],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6429,6430,6431,2185,6433,6436,6437,3736,6439,6442],{},"激活后 ",[46,6432,67],{},[46,6434,6435],{},"python -m pip"," 优先指向 ",[46,6438,6347],{},[46,6440,6441],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6444,187],{"id":187},[37,6446,6447,6450],{},[40,6448,6449],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6451,3475,6452,6454],{},[46,6453,6347],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6456,202],{"id":202},[150,6458,6459,6465],{},[40,6460,6461,6462,168],{},"创建虚拟环境并记录激活前后的 ",[46,6463,6464],{},"which python",[40,6466,6467],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6469,213],{},[14,6471,216],{"id":216},[10,6473,6474],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6476,1667],{},{"title":68,"searchDepth":81,"depth":81,"links":6478},[6479,6480,6481,6482,6483,6484,6485,6486],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6317,"description":6322},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[236,6494,271],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6497,"title":6498,"body":6499,"category":236,"cover":237,"description":6503,"extension":238,"meta":6691,"navigation":90,"path":6692,"pinned":241,"publishedAt":242,"seo":6693,"slug":6694,"stem":6695,"summary":6696,"tags":6697,"updatedAt":242,"visible":90,"__hash__":6700},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6500,"toc":6681},[6501,6504,6506,6509,6511,6517,6526,6528,6552,6554,6556,6609,6611,6617,6619,6621,6637,6639,6658,6660,6672,6674,6676,6679],[10,6502,6503],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6505,16],{"id":16},[10,6507,6508],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6510,22],{"id":22},[10,6512,6513],{},[26,6514],{"alt":6515,"src":6516},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6518,6519,6522,6523,6525],{},[46,6520,6521],{},"Path"," 使用 ",[46,6524,2445],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6527,35],{"id":35},[37,6529,6530,6533,6545],{},[40,6531,6532],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6534,6535,2266,6538,2266,6541,6544],{},[46,6536,6537],{},"exists()",[46,6539,6540],{},"is_file()",[46,6542,6543],{},"is_dir()"," 检查真实文件系统状态。",[40,6546,6547,6548,6551],{},"创建目录前明确目标；",[46,6549,6550],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6553,58],{"id":58},[10,6555,61],{},[63,6557,6559],{"className":65,"code":6558,"language":67,"meta":68,"style":68},"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",[46,6560,6561,6566,6570,6575,6580,6585,6589,6594,6599,6604],{"__ignoreMap":68},[72,6562,6563],{"class":74,"line":75},[72,6564,6565],{},"from pathlib import Path\n",[72,6567,6568],{"class":74,"line":81},[72,6569,91],{"emptyLinePlaceholder":90},[72,6571,6572],{"class":74,"line":87},[72,6573,6574],{},"project = Path.cwd()\n",[72,6576,6577],{"class":74,"line":94},[72,6578,6579],{},"data_dir = project \u002F \"data\"\n",[72,6581,6582],{"class":74,"line":100},[72,6583,6584],{},"file_path = data_dir \u002F \"records.json\"\n",[72,6586,6587],{"class":74,"line":106},[72,6588,91],{"emptyLinePlaceholder":90},[72,6590,6591],{"class":74,"line":111},[72,6592,6593],{},"print(project)\n",[72,6595,6596],{"class":74,"line":117},[72,6597,6598],{},"print(file_path.name)\n",[72,6600,6601],{"class":74,"line":123},[72,6602,6603],{},"print(file_path.suffix)\n",[72,6605,6606],{"class":74,"line":128},[72,6607,6608],{},"print(file_path.exists())\n",[10,6610,134],{},[63,6612,6615],{"className":6613,"code":6614,"language":140,"meta":68},[138],"显示当前项目路径、records.json、.json 和存在状态\n",[46,6616,6614],{"__ignoreMap":68},[10,6618,145],{},[14,6620,148],{"id":148},[150,6622,6623,6629],{},[40,6624,6625,6628],{},[46,6626,6627],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6630,2348,6631,6633,6634,6636],{},[46,6632,2445],{}," 组合路径片段只创建新的 ",[46,6635,6521],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6638,187],{"id":187},[37,6640,6641,6649],{},[40,6642,3475,6643,6645,6646,6648],{},[46,6644,6521],{}," 对象存在当成真实文件存在，仍需调用 ",[46,6647,6537],{}," 等方法确认。",[40,6650,6651,6652,1018,6654,6657],{},"手工拼接 ",[46,6653,2445],{},[46,6655,6656],{},"\\"," 分隔符，降低跨平台可读性。",[14,6659,202],{"id":202},[150,6661,6662,6669],{},[40,6663,6664,6665,6668],{},"组合 ",[46,6666,6667],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6670,6671],{},"输出路径的父目录、文件名和扩展名。",[10,6673,213],{},[14,6675,216],{"id":216},[10,6677,6678],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6680,223],{},{"title":68,"searchDepth":81,"depth":81,"links":6682},[6683,6684,6685,6686,6687,6688,6689,6690],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6498,"description":6503},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[236,6698,6699],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6702,"title":6703,"body":6704,"category":236,"cover":237,"description":6708,"extension":238,"meta":6886,"navigation":90,"path":6887,"pinned":241,"publishedAt":242,"seo":6888,"slug":6889,"stem":6890,"summary":6891,"tags":6892,"updatedAt":242,"visible":90,"__hash__":6895},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6705,"toc":6876},[6706,6709,6711,6714,6716,6722,6725,6727,6755,6757,6759,6816,6818,6824,6826,6828,6839,6841,6854,6856,6867,6869,6871,6874],[10,6707,6708],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6710,16],{"id":16},[10,6712,6713],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6715,22],{"id":22},[10,6717,6718],{},[26,6719],{"alt":6720,"src":6721},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6723,6724],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6726,35],{"id":35},[37,6728,6729,6735,6744],{},[40,6730,6731,6734],{},[46,6732,6733],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6736,6737,6740,6741,168],{},[46,6738,6739],{},"r"," 模式读取不存在文件会产生 ",[46,6742,6743],{},"FileNotFoundError",[40,6745,6746,6747,6750,6751,6754],{},"本篇显式调用 ",[46,6748,6749],{},"close()","；第 34 篇会用 ",[46,6752,6753],{},"with"," 更可靠地管理关闭动作。",[14,6756,58],{"id":58},[10,6758,61],{},[63,6760,6762],{"className":65,"code":6761,"language":67,"meta":68,"style":68},"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",[46,6763,6764,6768,6772,6777,6782,6787,6792,6796,6801,6806,6811],{"__ignoreMap":68},[72,6765,6766],{"class":74,"line":75},[72,6767,6565],{},[72,6769,6770],{"class":74,"line":81},[72,6771,91],{"emptyLinePlaceholder":90},[72,6773,6774],{"class":74,"line":87},[72,6775,6776],{},"file_path = Path(\"notes.txt\")\n",[72,6778,6779],{"class":74,"line":94},[72,6780,6781],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[72,6783,6784],{"class":74,"line":100},[72,6785,6786],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[72,6788,6789],{"class":74,"line":106},[72,6790,6791],{},"writer.close()\n",[72,6793,6794],{"class":74,"line":111},[72,6795,91],{"emptyLinePlaceholder":90},[72,6797,6798],{"class":74,"line":117},[72,6799,6800],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[72,6802,6803],{"class":74,"line":123},[72,6804,6805],{},"content = reader.read()\n",[72,6807,6808],{"class":74,"line":128},[72,6809,6810],{},"reader.close()\n",[72,6812,6813],{"class":74,"line":5791},[72,6814,6815],{},"print(content)\n",[10,6817,134],{},[63,6819,6822],{"className":6820,"code":6821,"language":140,"meta":68},[138],"变量\n循环\n函数\n",[46,6823,6821],{"__ignoreMap":68},[10,6825,145],{},[14,6827,148],{"id":148},[150,6829,6830,6836],{},[40,6831,6832,6833,6835],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[46,6834,6749],{}," 确保缓冲内容交给文件系统。",[40,6837,6838],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6840,187],{"id":187},[37,6842,6843,6848],{},[40,6844,2348,6845,6847],{},[46,6846,6733],{}," 模式打开重要文件却未确认覆盖风险。",[40,6849,6850,6851,168],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[46,6852,6853],{},"encoding=\"utf-8\"",[14,6855,202],{"id":202},[150,6857,6858,6861],{},[40,6859,6860],{},"写入三行学习记录并读取。",[40,6862,6863,6864,6866],{},"改用 ",[46,6865,346],{}," 模式追加一行，确认原内容仍保留。",[10,6868,213],{},[14,6870,216],{"id":216},[10,6872,6873],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6875,223],{},{"title":68,"searchDepth":81,"depth":81,"links":6877},[6878,6879,6880,6881,6882,6883,6884,6885],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6703,"description":6708},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[236,6893,6894],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6897,"title":6898,"body":6899,"category":236,"cover":237,"description":6903,"extension":238,"meta":7070,"navigation":90,"path":7071,"pinned":241,"publishedAt":242,"seo":7072,"slug":7073,"stem":7074,"summary":7075,"tags":7076,"updatedAt":242,"visible":90,"__hash__":7079},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6900,"toc":7060},[6901,6904,6906,6909,6911,6917,6927,6929,6943,6945,6947,7007,7009,7015,7017,7019,7031,7033,7041,7043,7051,7053,7055,7058],[10,6902,6903],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6905,16],{"id":16},[10,6907,6908],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6910,22],{"id":22},[10,6912,6913],{},[26,6914],{"alt":6915,"src":6916},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6918,6919,6922,6923,6926],{},[46,6920,6921],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[46,6924,6925],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6928,35],{"id":35},[37,6930,6931,6934,6940],{},[40,6932,6933],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6935,6936,6939],{},[46,6937,6938],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6941,6942],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6944,58],{"id":58},[10,6946,61],{},[63,6948,6950],{"className":65,"code":6949,"language":67,"meta":68,"style":68},"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",[46,6951,6952,6957,6961,6966,6970,6975,6980,6984,6988,6993,6998,7002],{"__ignoreMap":68},[72,6953,6954],{"class":74,"line":75},[72,6955,6956],{},"import json\n",[72,6958,6959],{"class":74,"line":81},[72,6960,91],{"emptyLinePlaceholder":90},[72,6962,6963],{"class":74,"line":87},[72,6964,6965],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[72,6967,6968],{"class":74,"line":94},[72,6969,91],{"emptyLinePlaceholder":90},[72,6971,6972],{"class":74,"line":100},[72,6973,6974],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[72,6976,6977],{"class":74,"line":106},[72,6978,6979],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[72,6981,6982],{"class":74,"line":111},[72,6983,6791],{},[72,6985,6986],{"class":74,"line":117},[72,6987,91],{"emptyLinePlaceholder":90},[72,6989,6990],{"class":74,"line":123},[72,6991,6992],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[72,6994,6995],{"class":74,"line":128},[72,6996,6997],{},"loaded = json.load(reader)\n",[72,6999,7000],{"class":74,"line":5791},[72,7001,6810],{},[72,7003,7004],{"class":74,"line":5796},[72,7005,7006],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7008,134],{},[63,7010,7013],{"className":7011,"code":7012,"language":140,"meta":68},[138],"Python 60\n",[46,7014,7012],{"__ignoreMap":68},[10,7016,145],{},[14,7018,148],{"id":148},[150,7020,7021,7026],{},[40,7022,7023,7025],{},[46,7024,6921],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7027,7028,7030],{},[46,7029,6925],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7032,187],{"id":187},[37,7034,7035,7038],{},[40,7036,7037],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7039,7040],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7042,202],{"id":202},[150,7044,7045,7048],{},[40,7046,7047],{},"保存包含两条学习记录的列表。",[40,7049,7050],{},"读取后修改进度，再重新写回文件。",[10,7052,213],{},[14,7054,216],{"id":216},[10,7056,7057],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7059,223],{},{"title":68,"searchDepth":81,"depth":81,"links":7061},[7062,7063,7064,7065,7066,7067,7068,7069],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6898,"description":6903},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[236,7077,7078],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7081,"title":7082,"body":7083,"category":236,"cover":237,"description":7087,"extension":238,"meta":7271,"navigation":90,"path":7272,"pinned":241,"publishedAt":242,"seo":7273,"slug":7274,"stem":7275,"summary":7276,"tags":7277,"updatedAt":242,"visible":90,"__hash__":7280},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7084,"toc":7261},[7085,7088,7090,7093,7095,7101,7107,7109,7131,7133,7135,7198,7200,7206,7208,7210,7226,7228,7242,7244,7252,7254,7256,7259],[10,7086,7087],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7089,16],{"id":16},[10,7091,7092],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7094,22],{"id":22},[10,7096,7097],{},[26,7098],{"alt":7099,"src":7100},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7102,7103,7106],{},[46,7104,7105],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7108,35],{"id":35},[37,7110,7111,7121,7128],{},[40,7112,2348,7113,7116,7117,7120],{},[46,7114,7115],{},"newline=\"\""," 让 ",[46,7118,7119],{},"csv"," 模块正确处理换行。",[40,7122,7123,7124,7127],{},"字段顺序由 ",[46,7125,7126],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7129,7130],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7132,58],{"id":58},[10,7134,61],{},[63,7136,7138],{"className":65,"code":7137,"language":67,"meta":68,"style":68},"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",[46,7139,7140,7145,7149,7154,7159,7164,7169,7174,7178,7183,7188,7193],{"__ignoreMap":68},[72,7141,7142],{"class":74,"line":75},[72,7143,7144],{},"import csv\n",[72,7146,7147],{"class":74,"line":81},[72,7148,91],{"emptyLinePlaceholder":90},[72,7150,7151],{"class":74,"line":87},[72,7152,7153],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[72,7155,7156],{"class":74,"line":94},[72,7157,7158],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[72,7160,7161],{"class":74,"line":100},[72,7162,7163],{},"writer.writeheader()\n",[72,7165,7166],{"class":74,"line":106},[72,7167,7168],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[72,7170,7171],{"class":74,"line":111},[72,7172,7173],{},"writer_file.close()\n",[72,7175,7176],{"class":74,"line":117},[72,7177,91],{"emptyLinePlaceholder":90},[72,7179,7180],{"class":74,"line":123},[72,7181,7182],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[72,7184,7185],{"class":74,"line":128},[72,7186,7187],{},"for row in csv.DictReader(reader_file):\n",[72,7189,7190],{"class":74,"line":5791},[72,7191,7192],{},"    print(row[\"name\"], row[\"score\"])\n",[72,7194,7195],{"class":74,"line":5796},[72,7196,7197],{},"reader_file.close()\n",[10,7199,134],{},[63,7201,7204],{"className":7202,"code":7203,"language":140,"meta":68},[138],"小郑 95\n",[46,7205,7203],{"__ignoreMap":68},[10,7207,145],{},[14,7209,148],{"id":148},[150,7211,7212,7221],{},[40,7213,7214,7217,7218,7220],{},[46,7215,7216],{},"DictWriter"," 按 ",[46,7219,7126],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7222,7223,7225],{},[46,7224,7105],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7227,187],{"id":187},[37,7229,7230,7233],{},[40,7231,7232],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7234,7235,7236,7238,7239,7241],{},"在 macOS 以外环境忽略 ",[46,7237,7115],{}," 可能出现额外空行；统一交给 ",[46,7240,7119],{}," 模块管理换行。",[14,7243,202],{"id":202},[150,7245,7246,7249],{},[40,7247,7248],{},"写入三名学习者的课程和分数。",[40,7250,7251],{},"读取 CSV 后把分数字符串转换为整数。",[10,7253,213],{},[14,7255,216],{"id":216},[10,7257,7258],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7260,223],{},{"title":68,"searchDepth":81,"depth":81,"links":7262},[7263,7264,7265,7266,7267,7268,7269,7270],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7082,"description":7087},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[236,7278,7279],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7282,"title":7283,"body":7284,"category":236,"cover":237,"description":7288,"extension":238,"meta":7561,"navigation":90,"path":7562,"pinned":241,"publishedAt":242,"seo":7563,"slug":7564,"stem":7565,"summary":7566,"tags":7567,"updatedAt":242,"visible":90,"__hash__":7570},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7285,"toc":7548},[7286,7289,7291,7294,7296,7302,7313,7315,7332,7334,7336,7411,7413,7419,7421,7423,7448,7450,7459,7465,7476,7478,7484,7490,7499,7501,7516,7518,7539,7541,7543,7546],[10,7287,7288],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7290,16],{"id":16},[10,7292,7293],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7295,22],{"id":22},[10,7297,7298],{},[26,7299],{"alt":7300,"src":7301},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7303,7304,7305,7308,7309,7312],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[46,7306,7307],{},"except","；无论是否异常，",[46,7310,7311],{},"finally"," 都会在离开结构前执行。",[14,7314,35],{"id":35},[37,7316,7317,7323,7329],{},[40,7318,7319,7320,7322],{},"只捕获能够处理的具体异常，不使用空的 ",[46,7321,7307],{}," 吞掉全部错误。",[40,7324,7325,7328],{},[46,7326,7327],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7330,7331],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7333,58],{"id":58},[10,7335,61],{},[63,7337,7339],{"className":65,"code":7338,"language":67,"meta":68,"style":68},"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",[46,7340,7341,7346,7351,7356,7361,7366,7370,7375,7380,7385,7390,7394,7399,7405],{"__ignoreMap":68},[72,7342,7343],{"class":74,"line":75},[72,7344,7345],{},"def parse_age(text):\n",[72,7347,7348],{"class":74,"line":81},[72,7349,7350],{},"    age = int(text)\n",[72,7352,7353],{"class":74,"line":87},[72,7354,7355],{},"    if age \u003C 0:\n",[72,7357,7358],{"class":74,"line":94},[72,7359,7360],{},"        raise ValueError(\"年龄不能为负数\")\n",[72,7362,7363],{"class":74,"line":100},[72,7364,7365],{},"    return age\n",[72,7367,7368],{"class":74,"line":106},[72,7369,91],{"emptyLinePlaceholder":90},[72,7371,7372],{"class":74,"line":111},[72,7373,7374],{},"try:\n",[72,7376,7377],{"class":74,"line":117},[72,7378,7379],{},"    age = parse_age(\"18\")\n",[72,7381,7382],{"class":74,"line":123},[72,7383,7384],{},"except ValueError as error:\n",[72,7386,7387],{"class":74,"line":128},[72,7388,7389],{},"    print(\"输入错误：\", error)\n",[72,7391,7392],{"class":74,"line":5791},[72,7393,1155],{},[72,7395,7396],{"class":74,"line":5796},[72,7397,7398],{},"    print(\"年龄：\", age)\n",[72,7400,7402],{"class":74,"line":7401},13,[72,7403,7404],{},"finally:\n",[72,7406,7408],{"class":74,"line":7407},14,[72,7409,7410],{},"    print(\"处理结束\")\n",[10,7412,134],{},[63,7414,7417],{"className":7415,"code":7416,"language":140,"meta":68},[138],"年龄： 18\n处理结束\n",[46,7418,7416],{"__ignoreMap":68},[10,7420,145],{},[14,7422,148],{"id":148},[150,7424,7425,7437],{},[40,7426,7427,7429,7430,7432,7433,7436],{},[46,7428,3044],{}," 或主动 ",[46,7431,7327],{}," 都可能产生 ",[46,7434,7435],{},"ValueError","，控制流立即离开当前正常路径。",[40,7438,7439,7440,7442,7443,7445,7446,168],{},"有异常时进入匹配的 ",[46,7441,7307],{},"；没有异常时执行 ",[46,7444,1169],{},"；两种情况最后都会执行 ",[46,7447,7311],{},[170,7449,172],{"id":172},[10,7451,7452,2266,7454,1166,7456,7458],{},[46,7453,7307],{},[46,7455,1169],{},[46,7457,7311],{}," 的职责不同，不能只看它们出现的顺序。",[10,7460,7461],{},[26,7462],{"alt":7463,"src":7464},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7466,7467,7469,7470,7472,7473,7475],{},[46,7468,7307],{}," 处理匹配异常，",[46,7471,1169],{}," 只在无异常时运行，",[46,7474,7311],{}," 负责两条路径都需要的清理动作。",[170,7477,172],{"id":4226},[10,7479,7480,7483],{},[46,7481,7482],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7485,7486],{},[26,7487],{"alt":7488,"src":7489},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7491,7492,7493,7495,7496,7498],{},"只把可能产生预期异常的操作放进 ",[46,7494,7482],{},"，后续正常业务放进 ",[46,7497,1169],{},"，错误边界会更清楚。",[14,7500,187],{"id":187},[37,7502,7503,7510],{},[40,7504,7505,7506,7509],{},"使用裸 ",[46,7507,7508],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7511,7512,7513,7515],{},"把整个程序包在一个巨大 ",[46,7514,7482],{}," 中，无法判断究竟哪一步允许失败。",[14,7517,202],{"id":202},[150,7519,7520,7533],{},[40,7521,7522,7523,7526,7527,1166,7530,168],{},"让 ",[46,7524,7525],{},"parse_age"," 分别处理 ",[46,7528,7529],{},"\"abc\"",[46,7531,7532],{},"\"-1\"",[40,7534,7535,7536,7538],{},"为文件读取捕获 ",[46,7537,6743],{}," 并给出清晰提示。",[10,7540,213],{},[14,7542,216],{"id":216},[10,7544,7545],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7547,223],{},{"title":68,"searchDepth":81,"depth":81,"links":7549},[7550,7551,7552,7553,7554,7558,7559,7560],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":7555},[7556,7557],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7283,"description":7288},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[236,7568,7569],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7572,"title":7573,"body":7574,"category":236,"cover":237,"description":7578,"extension":238,"meta":7754,"navigation":90,"path":7755,"pinned":241,"publishedAt":242,"seo":7756,"slug":7757,"stem":7758,"summary":7759,"tags":7760,"updatedAt":242,"visible":90,"__hash__":7762},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7575,"toc":7744},[7576,7579,7581,7584,7586,7592,7598,7600,7616,7618,7620,7674,7676,7682,7684,7686,7699,7701,7714,7716,7735,7737,7739,7742],[10,7577,7578],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7580,16],{"id":16},[10,7582,7583],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7585,22],{"id":22},[10,7587,7588],{},[26,7589],{"alt":7590,"src":7591},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7593,7594,7595,7597],{},"进入 ",[46,7596,6753],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7599,35],{"id":35},[37,7601,7602,7607,7613],{},[40,7603,7604,7606],{},[46,7605,6753],{}," 把资源获取和释放配成一个清晰边界。",[40,7608,7609,7612],{},[46,7610,7611],{},"as file"," 得到的是上下文返回的资源对象。",[40,7614,7615],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7617,58],{"id":58},[10,7619,61],{},[63,7621,7623],{"className":65,"code":7622,"language":67,"meta":68,"style":68},"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",[46,7624,7625,7629,7633,7637,7641,7646,7651,7655,7660,7665,7669],{"__ignoreMap":68},[72,7626,7627],{"class":74,"line":75},[72,7628,6565],{},[72,7630,7631],{"class":74,"line":81},[72,7632,91],{"emptyLinePlaceholder":90},[72,7634,7635],{"class":74,"line":87},[72,7636,6776],{},[72,7638,7639],{"class":74,"line":94},[72,7640,91],{"emptyLinePlaceholder":90},[72,7642,7643],{"class":74,"line":100},[72,7644,7645],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,7647,7648],{"class":74,"line":106},[72,7649,7650],{},"    file.write(\"上下文管理器\\n\")\n",[72,7652,7653],{"class":74,"line":111},[72,7654,91],{"emptyLinePlaceholder":90},[72,7656,7657],{"class":74,"line":117},[72,7658,7659],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[72,7661,7662],{"class":74,"line":123},[72,7663,7664],{},"    print(file.read())\n",[72,7666,7667],{"class":74,"line":128},[72,7668,91],{"emptyLinePlaceholder":90},[72,7670,7671],{"class":74,"line":5791},[72,7672,7673],{},"print(file.closed)\n",[10,7675,134],{},[63,7677,7680],{"className":7678,"code":7679,"language":140,"meta":68},[138],"上下文管理器\n\nTrue\n",[46,7681,7679],{"__ignoreMap":68},[10,7683,145],{},[14,7685,148],{"id":148},[150,7687,7688,7696],{},[40,7689,7594,7690,7692,7693,168],{},[46,7691,6753],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[46,7694,7695],{},"file",[40,7697,7698],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7700,187],{"id":187},[37,7702,7703,7708],{},[40,7704,4794,7705,7707],{},[46,7706,6753],{}," 代码块外继续读写已经关闭的文件对象。",[40,7709,7710,7711,7713],{},"误以为 ",[46,7712,6753],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7715,202],{"id":202},[150,7717,7718,7727],{},[40,7719,7720,7721,7724,7725,168],{},"把第 30 篇的手动 ",[46,7722,7723],{},"open\u002Fclose"," 改写为 ",[46,7726,6753],{},[40,7728,4794,7729,7731,7732,168],{},[46,7730,6753],{}," 块后检查 ",[46,7733,7734],{},"file.closed",[10,7736,213],{},[14,7738,216],{"id":216},[10,7740,7741],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7743,223],{},{"title":68,"searchDepth":81,"depth":81,"links":7745},[7746,7747,7748,7749,7750,7751,7752,7753],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7573,"description":7578},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[236,6753,7761],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7764,"title":7765,"body":7766,"category":236,"cover":237,"description":7770,"extension":238,"meta":7982,"navigation":90,"path":7983,"pinned":241,"publishedAt":242,"seo":7984,"slug":7985,"stem":7986,"summary":7987,"tags":7988,"updatedAt":242,"visible":90,"__hash__":7991},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7767,"toc":7970},[7768,7771,7773,7776,7778,7784,7787,7789,7806,7808,7810,7878,7880,7886,7888,7890,7915,7917,7920,7926,7935,7937,7948,7950,7961,7963,7965,7968],[10,7769,7770],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7772,16],{"id":16},[10,7774,7775],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7777,22],{"id":22},[10,7779,7780],{},[26,7781],{"alt":7782,"src":7783},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7785,7786],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7788,35],{"id":35},[37,7790,7791,7797,7803],{},[40,7792,7793,7796],{},[46,7794,7795],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7798,7799,7802],{},[46,7800,7801],{},"__init__"," 在实例创建过程中初始化属性。",[40,7804,7805],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7807,58],{"id":58},[10,7809,61],{},[63,7811,7813],{"className":65,"code":7812,"language":67,"meta":68,"style":68},"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",[46,7814,7815,7820,7825,7830,7835,7839,7844,7849,7854,7859,7863,7868,7873],{"__ignoreMap":68},[72,7816,7817],{"class":74,"line":75},[72,7818,7819],{},"class LearningRecord:\n",[72,7821,7822],{"class":74,"line":81},[72,7823,7824],{},"    def __init__(self, course, progress=0):\n",[72,7826,7827],{"class":74,"line":87},[72,7828,7829],{},"        self.course = course\n",[72,7831,7832],{"class":74,"line":94},[72,7833,7834],{},"        self.progress = progress\n",[72,7836,7837],{"class":74,"line":100},[72,7838,91],{"emptyLinePlaceholder":90},[72,7840,7841],{"class":74,"line":106},[72,7842,7843],{},"    def advance(self, amount):\n",[72,7845,7846],{"class":74,"line":111},[72,7847,7848],{},"        self.progress = self.progress + amount\n",[72,7850,7851],{"class":74,"line":117},[72,7852,7853],{},"        if self.progress > 100:\n",[72,7855,7856],{"class":74,"line":123},[72,7857,7858],{},"            self.progress = 100\n",[72,7860,7861],{"class":74,"line":128},[72,7862,91],{"emptyLinePlaceholder":90},[72,7864,7865],{"class":74,"line":5791},[72,7866,7867],{},"record = LearningRecord(\"Python\", 40)\n",[72,7869,7870],{"class":74,"line":5796},[72,7871,7872],{},"record.advance(15)\n",[72,7874,7875],{"class":74,"line":7401},[72,7876,7877],{},"print(record.course, record.progress)\n",[10,7879,134],{},[63,7881,7884],{"className":7882,"code":7883,"language":140,"meta":68},[138],"Python 55\n",[46,7885,7883],{"__ignoreMap":68},[10,7887,145],{},[14,7889,148],{"id":148},[150,7891,7892,7902],{},[40,7893,7894,7895,7898,7899,7901],{},"调用 ",[46,7896,7897],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[46,7900,7801],{}," 把课程和进度保存在该实例属性中。",[40,7903,7904,7907,7908,7911,7912,7914],{},[46,7905,7906],{},"record.advance(15)"," 自动把 ",[46,7909,7910],{},"record"," 作为 ",[46,7913,7795],{},"，方法更新同一实例的进度并限制上限。",[170,7916,172],{"id":172},[10,7918,7919],{},"类是共同定义，实例则各自保存状态。",[10,7921,7922],{},[26,7923],{"alt":7924,"src":7925},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7927,7928,7929,1166,7931,7934],{},"两个实例共享同一套方法定义，但 ",[46,7930,4591],{},[46,7932,7933],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7936,187],{"id":187},[37,7938,7939,7945],{},[40,7940,7941,7942,7944],{},"调用实例方法时手工再传一次 ",[46,7943,7795],{},"。通过实例调用时 Python 会自动绑定。",[40,7946,7947],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7949,202],{"id":202},[150,7951,7952,7958],{},[40,7953,5304,7954,7957],{},[46,7955,7956],{},"Book"," 类，保存标题和阅读页数。",[40,7959,7960],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7962,213],{},[14,7964,216],{"id":216},[10,7966,7967],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7969,223],{},{"title":68,"searchDepth":81,"depth":81,"links":7971},[7972,7973,7974,7975,7976,7979,7980,7981],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":7977},[7978],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7765,"description":7770},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[236,7989,7990],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7993,"title":7994,"body":7995,"category":236,"cover":237,"description":7999,"extension":238,"meta":8177,"navigation":90,"path":8178,"pinned":241,"publishedAt":242,"seo":8179,"slug":8180,"stem":8181,"summary":8182,"tags":8183,"updatedAt":242,"visible":90,"__hash__":8186},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7996,"toc":8167},[7997,8000,8002,8005,8007,8013,8016,8018,8029,8031,8033,8100,8102,8108,8110,8112,8131,8133,8141,8143,8158,8160,8162,8165],[10,7998,7999],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8001,16],{"id":16},[10,8003,8004],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8006,22],{"id":22},[10,8008,8009],{},[26,8010],{"alt":8011,"src":8012},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8014,8015],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8017,35],{"id":35},[37,8019,8020,8023,8026],{},[40,8021,8022],{},"封装让对象通过方法维护自己的有效状态。",[40,8024,8025],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8027,8028],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8030,58],{"id":58},[10,8032,61],{},[63,8034,8036],{"className":65,"code":8035,"language":67,"meta":68,"style":68},"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",[46,8037,8038,8043,8048,8053,8057,8062,8067,8072,8076,8081,8086,8090,8095],{"__ignoreMap":68},[72,8039,8040],{"class":74,"line":75},[72,8041,8042],{},"class Storage:\n",[72,8044,8045],{"class":74,"line":81},[72,8046,8047],{},"    def save(self, text):\n",[72,8049,8050],{"class":74,"line":87},[72,8051,8052],{},"        print(\"保存：\", text)\n",[72,8054,8055],{"class":74,"line":94},[72,8056,91],{"emptyLinePlaceholder":90},[72,8058,8059],{"class":74,"line":100},[72,8060,8061],{},"class LearningService:\n",[72,8063,8064],{"class":74,"line":106},[72,8065,8066],{},"    def __init__(self, storage):\n",[72,8068,8069],{"class":74,"line":111},[72,8070,8071],{},"        self.storage = storage\n",[72,8073,8074],{"class":74,"line":117},[72,8075,91],{"emptyLinePlaceholder":90},[72,8077,8078],{"class":74,"line":123},[72,8079,8080],{},"    def finish_lesson(self, title):\n",[72,8082,8083],{"class":74,"line":128},[72,8084,8085],{},"        self.storage.save(title)\n",[72,8087,8088],{"class":74,"line":5791},[72,8089,91],{"emptyLinePlaceholder":90},[72,8091,8092],{"class":74,"line":5796},[72,8093,8094],{},"service = LearningService(Storage())\n",[72,8096,8097],{"class":74,"line":7401},[72,8098,8099],{},"service.finish_lesson(\"异常处理\")\n",[10,8101,134],{},[63,8103,8106],{"className":8104,"code":8105,"language":140,"meta":68},[138],"保存： 异常处理\n",[46,8107,8105],{"__ignoreMap":68},[10,8109,145],{},[14,8111,148],{"id":148},[150,8113,8114,8124],{},[40,8115,8116,8119,8120,8123],{},[46,8117,8118],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[46,8121,8122],{},"save()"," 的协作对象。",[40,8125,8126,8127,8130],{},"调用业务方法时，服务把保存动作委托给 ",[46,8128,8129],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8132,187],{"id":187},[37,8134,8135,8138],{},[40,8136,8137],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8139,8140],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8142,202],{"id":202},[150,8144,8145,8155],{},[40,8146,8147,8148,8151,8152,168],{},"用组合让 ",[46,8149,8150],{},"OrderService"," 使用一个 ",[46,8153,8154],{},"Notifier",[40,8156,8157],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8159,213],{},[14,8161,216],{"id":216},[10,8163,8164],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8166,223],{},{"title":68,"searchDepth":81,"depth":81,"links":8168},[8169,8170,8171,8172,8173,8174,8175,8176],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7994,"description":7999},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[236,8184,8185],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8188,"title":8189,"body":8190,"category":236,"cover":237,"description":8194,"extension":238,"meta":8397,"navigation":90,"path":8398,"pinned":241,"publishedAt":242,"seo":8399,"slug":8400,"stem":8401,"summary":8402,"tags":8403,"updatedAt":242,"visible":90,"__hash__":8406},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8191,"toc":8385},[8192,8195,8197,8200,8202,8208,8215,8217,8242,8244,8246,8298,8300,8306,8308,8310,8331,8333,8339,8345,8351,8353,8361,8363,8376,8378,8380,8383],[10,8193,8194],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8196,16],{"id":16},[10,8198,8199],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8201,22],{"id":22},[10,8203,8204],{},[26,8205],{"alt":8206,"src":8207},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8209,8210,8211,8214],{},"生成器运行到 ",[46,8212,8213],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8216,35],{"id":35},[37,8218,8219,8229,8239],{},[40,8220,8221,8224,8225,8228],{},[46,8222,8223],{},"iter()"," 从可迭代对象取得迭代器，",[46,8226,8227],{},"next()"," 请求下一个值。",[40,8230,8231,8232,8235,8236,8238],{},"没有更多值时迭代器抛出 ",[46,8233,8234],{},"StopIteration","，",[46,8237,4345],{}," 会自动处理。",[40,8240,8241],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8243,58],{"id":58},[10,8245,61],{},[63,8247,8249],{"className":65,"code":8248,"language":67,"meta":68,"style":68},"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",[46,8250,8251,8256,8261,8266,8271,8276,8280,8285,8290,8294],{"__ignoreMap":68},[72,8252,8253],{"class":74,"line":75},[72,8254,8255],{},"def countdown(start):\n",[72,8257,8258],{"class":74,"line":81},[72,8259,8260],{},"    current = start\n",[72,8262,8263],{"class":74,"line":87},[72,8264,8265],{},"    while current > 0:\n",[72,8267,8268],{"class":74,"line":94},[72,8269,8270],{},"        yield current\n",[72,8272,8273],{"class":74,"line":100},[72,8274,8275],{},"        current = current - 1\n",[72,8277,8278],{"class":74,"line":106},[72,8279,91],{"emptyLinePlaceholder":90},[72,8281,8282],{"class":74,"line":111},[72,8283,8284],{},"iterator = countdown(3)\n",[72,8286,8287],{"class":74,"line":117},[72,8288,8289],{},"print(next(iterator))\n",[72,8291,8292],{"class":74,"line":123},[72,8293,8289],{},[72,8295,8296],{"class":74,"line":128},[72,8297,8289],{},[10,8299,134],{},[63,8301,8304],{"className":8302,"code":8303,"language":140,"meta":68},[138],"3\n2\n1\n",[46,8305,8303],{"__ignoreMap":68},[10,8307,145],{},[14,8309,148],{"id":148},[150,8311,8312,8318],{},[40,8313,7894,8314,8317],{},[46,8315,8316],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8319,8320,8321,8323,8324,8326,8327,8330],{},"每次 ",[46,8322,8227],{}," 运行到下一个 ",[46,8325,8213],{}," 并暂停，局部变量 ",[46,8328,8329],{},"current"," 和执行位置被保留。",[170,8332,172],{"id":172},[10,8334,8335,8336,8338],{},"生成器的暂停位置可以展开成多次 ",[46,8337,8227],{}," 的时间线。",[10,8340,8341],{},[26,8342],{"alt":8343,"src":8344},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8346,8347,8348,8350],{},"每次请求只推进到下一个 ",[46,8349,8213],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8352,187],{"id":187},[37,8354,8355,8358],{},[40,8356,8357],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8359,8360],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8362,202],{"id":202},[150,8364,8365,8368],{},[40,8366,8367],{},"编写产生 1 到指定上限偶数的生成器。",[40,8369,4018,8370,8372,8373,8375],{},[46,8371,4345],{}," 遍历生成器，比较手动 ",[46,8374,8227],{}," 的差异。",[10,8377,213],{},[14,8379,216],{"id":216},[10,8381,8382],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8384,223],{},{"title":68,"searchDepth":81,"depth":81,"links":8386},[8387,8388,8389,8390,8391,8394,8395,8396],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":8392},[8393],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8189,"description":8194},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[236,8404,8405],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8408,"title":8409,"body":8410,"category":236,"cover":237,"description":8414,"extension":238,"meta":8638,"navigation":90,"path":8639,"pinned":241,"publishedAt":242,"seo":8640,"slug":8641,"stem":8642,"summary":8643,"tags":8644,"updatedAt":242,"visible":90,"__hash__":8646},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8411,"toc":8626},[8412,8415,8417,8420,8422,8428,8431,8433,8453,8455,8457,8539,8541,8547,8549,8551,8573,8575,8578,8584,8591,8593,8603,8605,8617,8619,8621,8624],[10,8413,8414],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8416,16],{"id":16},[10,8418,8419],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8421,22],{"id":22},[10,8423,8424],{},[26,8425],{"alt":8426,"src":8427},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8429,8430],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8432,35],{"id":35},[37,8434,8435,8444,8447],{},[40,8436,8437,8440,8441,168],{},[46,8438,8439],{},"@trace"," 等价于 ",[46,8442,8443],{},"add = trace(add)",[40,8445,8446],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8448,8449,8452],{},[46,8450,8451],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8454,58],{"id":58},[10,8456,61],{},[63,8458,8460],{"className":65,"code":8459,"language":67,"meta":68,"style":68},"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",[46,8461,8462,8467,8471,8476,8481,8486,8491,8496,8501,8506,8511,8515,8520,8524,8528,8533],{"__ignoreMap":68},[72,8463,8464],{"class":74,"line":75},[72,8465,8466],{},"from functools import wraps\n",[72,8468,8469],{"class":74,"line":81},[72,8470,91],{"emptyLinePlaceholder":90},[72,8472,8473],{"class":74,"line":87},[72,8474,8475],{},"def trace(function):\n",[72,8477,8478],{"class":74,"line":94},[72,8479,8480],{},"    @wraps(function)\n",[72,8482,8483],{"class":74,"line":100},[72,8484,8485],{},"    def wrapper(*args, **kwargs):\n",[72,8487,8488],{"class":74,"line":106},[72,8489,8490],{},"        print(\"开始：\", function.__name__)\n",[72,8492,8493],{"class":74,"line":111},[72,8494,8495],{},"        result = function(*args, **kwargs)\n",[72,8497,8498],{"class":74,"line":117},[72,8499,8500],{},"        print(\"结束：\", function.__name__)\n",[72,8502,8503],{"class":74,"line":123},[72,8504,8505],{},"        return result\n",[72,8507,8508],{"class":74,"line":128},[72,8509,8510],{},"    return wrapper\n",[72,8512,8513],{"class":74,"line":5791},[72,8514,91],{"emptyLinePlaceholder":90},[72,8516,8517],{"class":74,"line":5796},[72,8518,8519],{},"@trace\n",[72,8521,8522],{"class":74,"line":7401},[72,8523,6144],{},[72,8525,8526],{"class":74,"line":7407},[72,8527,6149],{},[72,8529,8531],{"class":74,"line":8530},15,[72,8532,91],{"emptyLinePlaceholder":90},[72,8534,8536],{"class":74,"line":8535},16,[72,8537,8538],{},"print(add(2, 3))\n",[10,8540,134],{},[63,8542,8545],{"className":8543,"code":8544,"language":140,"meta":68},[138],"开始： add\n结束： add\n5\n",[46,8546,8544],{"__ignoreMap":68},[10,8548,145],{},[14,8550,148],{"id":148},[150,8552,8553,8570],{},[40,8554,8555,8556,8559,8560,8563,8564,8567,8568,168],{},"解释器执行定义时，把原 ",[46,8557,8558],{},"add"," 函数交给 ",[46,8561,8562],{},"trace","，返回的 ",[46,8565,8566],{},"wrapper"," 重新绑定到名字 ",[46,8569,8558],{},[40,8571,8572],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[170,8574,172],{"id":172},[10,8576,8577],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8579,8580],{},[26,8581],{"alt":8582,"src":8583},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8585,8586,8588,8589,168],{},[46,8587,8439],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[46,8590,8443],{},[14,8592,187],{"id":187},[37,8594,8595,8600],{},[40,8596,8597,8598,168],{},"包装函数忘记返回原函数结果，调用方得到 ",[46,8599,195],{},[40,8601,8602],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8604,202],{"id":202},[150,8606,8607,8610],{},[40,8608,8609],{},"编写只记录调用次数的简单装饰器。",[40,8611,8612,8613,8616],{},"删除包装函数的 ",[46,8614,8615],{},"return result","，观察调用方得到什么。",[10,8618,213],{},[14,8620,216],{"id":216},[10,8622,8623],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8625,223],{},{"title":68,"searchDepth":81,"depth":81,"links":8627},[8628,8629,8630,8631,8632,8635,8636,8637],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":8633},[8634],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8409,"description":8414},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[236,8645,5338],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8648,"title":8649,"body":8650,"category":236,"cover":237,"description":8654,"extension":238,"meta":8841,"navigation":90,"path":8842,"pinned":241,"publishedAt":242,"seo":8843,"slug":8844,"stem":8845,"summary":8846,"tags":8847,"updatedAt":242,"visible":90,"__hash__":8850},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8651,"toc":8829},[8652,8655,8657,8660,8662,8668,8671,8673,8684,8686,8688,8763,8765,8771,8773,8775,8786,8788,8791,8797,8800,8802,8810,8812,8820,8822,8824,8827],[10,8653,8654],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8656,16],{"id":16},[10,8658,8659],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8661,22],{"id":22},[10,8663,8664],{},[26,8665],{"alt":8666,"src":8667},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8669,8670],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8672,35],{"id":35},[37,8674,8675,8678,8681],{},[40,8676,8677],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8679,8680],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8682,8683],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8685,58],{"id":58},[10,8687,61],{},[63,8689,8691],{"className":65,"code":8690,"language":67,"meta":68,"style":68},"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",[46,8692,8693,8698,8703,8707,8712,8716,8721,8726,8731,8735,8740,8745,8750,8754,8758],{"__ignoreMap":68},[72,8694,8695],{"class":74,"line":75},[72,8696,8697],{},"import logging\n",[72,8699,8700],{"class":74,"line":81},[72,8701,8702],{},"import unittest\n",[72,8704,8705],{"class":74,"line":87},[72,8706,91],{"emptyLinePlaceholder":90},[72,8708,8709],{"class":74,"line":94},[72,8710,8711],{},"logging.basicConfig(level=logging.INFO)\n",[72,8713,8714],{"class":74,"line":100},[72,8715,91],{"emptyLinePlaceholder":90},[72,8717,8718],{"class":74,"line":106},[72,8719,8720],{},"def clamp_progress(value):\n",[72,8722,8723],{"class":74,"line":111},[72,8724,8725],{},"    logging.info(\"检查进度：%s\", value)\n",[72,8727,8728],{"class":74,"line":117},[72,8729,8730],{},"    return max(0, min(100, value))\n",[72,8732,8733],{"class":74,"line":123},[72,8734,91],{"emptyLinePlaceholder":90},[72,8736,8737],{"class":74,"line":128},[72,8738,8739],{},"class ProgressTest(unittest.TestCase):\n",[72,8741,8742],{"class":74,"line":5791},[72,8743,8744],{},"    def test_upper_limit(self):\n",[72,8746,8747],{"class":74,"line":5796},[72,8748,8749],{},"        self.assertEqual(clamp_progress(120), 100)\n",[72,8751,8752],{"class":74,"line":7401},[72,8753,91],{"emptyLinePlaceholder":90},[72,8755,8756],{"class":74,"line":7407},[72,8757,6158],{},[72,8759,8760],{"class":74,"line":8530},[72,8761,8762],{},"    unittest.main()\n",[10,8764,134],{},[63,8766,8769],{"className":8767,"code":8768,"language":140,"meta":68},[138],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[46,8770,8768],{"__ignoreMap":68},[10,8772,145],{},[14,8774,148],{"id":148},[150,8776,8777,8783],{},[40,8778,8779,8782],{},[46,8780,8781],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8784,8785],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[170,8787,172],{"id":172},[10,8789,8790],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8792,8793],{},[26,8794],{"alt":8795,"src":8796},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8798,8799],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8801,187],{"id":187},[37,8803,8804,8807],{},[40,8805,8806],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8808,8809],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8811,202],{"id":202},[150,8813,8814,8817],{},[40,8815,8816],{},"为负数进度增加测试。",[40,8818,8819],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8821,213],{},[14,8823,216],{"id":216},[10,8825,8826],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8828,223],{},{"title":68,"searchDepth":81,"depth":81,"links":8830},[8831,8832,8833,8834,8835,8838,8839,8840],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":8836},[8837],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8649,"description":8654},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[236,8848,8849],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8852,"title":8853,"body":8854,"category":236,"cover":237,"description":8858,"extension":238,"meta":9158,"navigation":90,"path":9159,"pinned":241,"publishedAt":242,"seo":9160,"slug":9161,"stem":9162,"summary":9163,"tags":9164,"updatedAt":242,"visible":90,"__hash__":9167},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8855,"toc":9145},[8856,8859,8861,8864,8866,8872,8875,8877,8892,8894,8896,9043,9045,9051,9053,9055,9068,9070,9073,9079,9082,9084,9087,9093,9100,9102,9113,9115,9136,9138,9140,9143],[10,8857,8858],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8860,16],{"id":16},[10,8862,8863],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8865,22],{"id":22},[10,8867,8868],{},[26,8869],{"alt":8870,"src":8871},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8873,8874],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8876,35],{"id":35},[37,8878,8879,8882,8885],{},[40,8880,8881],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8883,8884],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8886,8887,8888,8891],{},"实际扩展前先为 ",[46,8889,8890],{},"add()"," 和存储边界补充测试。",[14,8893,58],{"id":58},[10,8895,61],{},[63,8897,8899],{"className":65,"code":8898,"language":67,"meta":68,"style":68},"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",[46,8900,8901,8905,8909,8913,8918,8923,8928,8933,8937,8942,8947,8952,8957,8962,8966,8971,8976,8982,8987,8993,8998,9003,9009,9015,9021,9026,9032,9037],{"__ignoreMap":68},[72,8902,8903],{"class":74,"line":75},[72,8904,6956],{},[72,8906,8907],{"class":74,"line":81},[72,8908,6565],{},[72,8910,8911],{"class":74,"line":87},[72,8912,91],{"emptyLinePlaceholder":90},[72,8914,8915],{"class":74,"line":94},[72,8916,8917],{},"class LearningRecords:\n",[72,8919,8920],{"class":74,"line":100},[72,8921,8922],{},"    def __init__(self, file_path):\n",[72,8924,8925],{"class":74,"line":106},[72,8926,8927],{},"        self.file_path = Path(file_path)\n",[72,8929,8930],{"class":74,"line":111},[72,8931,8932],{},"        self.items = []\n",[72,8934,8935],{"class":74,"line":117},[72,8936,91],{"emptyLinePlaceholder":90},[72,8938,8939],{"class":74,"line":123},[72,8940,8941],{},"    def add(self, title):\n",[72,8943,8944],{"class":74,"line":128},[72,8945,8946],{},"        title = title.strip()\n",[72,8948,8949],{"class":74,"line":5791},[72,8950,8951],{},"        if not title:\n",[72,8953,8954],{"class":74,"line":5796},[72,8955,8956],{},"            raise ValueError(\"课程名称不能为空\")\n",[72,8958,8959],{"class":74,"line":7401},[72,8960,8961],{},"        self.items.append({\"title\": title, \"done\": False})\n",[72,8963,8964],{"class":74,"line":7407},[72,8965,91],{"emptyLinePlaceholder":90},[72,8967,8968],{"class":74,"line":8530},[72,8969,8970],{},"    def save(self):\n",[72,8972,8973],{"class":74,"line":8535},[72,8974,8975],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,8977,8979],{"class":74,"line":8978},17,[72,8980,8981],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[72,8983,8985],{"class":74,"line":8984},18,[72,8986,91],{"emptyLinePlaceholder":90},[72,8988,8990],{"class":74,"line":8989},19,[72,8991,8992],{},"records = LearningRecords(\"learning-records.json\")\n",[72,8994,8996],{"class":74,"line":8995},20,[72,8997,91],{"emptyLinePlaceholder":90},[72,8999,9001],{"class":74,"line":9000},21,[72,9002,7374],{},[72,9004,9006],{"class":74,"line":9005},22,[72,9007,9008],{},"    title = input(\"输入已学习课程：\")\n",[72,9010,9012],{"class":74,"line":9011},23,[72,9013,9014],{},"    records.add(title)\n",[72,9016,9018],{"class":74,"line":9017},24,[72,9019,9020],{},"    records.save()\n",[72,9022,9024],{"class":74,"line":9023},25,[72,9025,7384],{},[72,9027,9029],{"class":74,"line":9028},26,[72,9030,9031],{},"    print(\"无法保存：\", error)\n",[72,9033,9035],{"class":74,"line":9034},27,[72,9036,1155],{},[72,9038,9040],{"class":74,"line":9039},28,[72,9041,9042],{},"    print(\"已保存 1 条学习记录\")\n",[10,9044,134],{},[63,9046,9049],{"className":9047,"code":9048,"language":140,"meta":68},[138],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[46,9050,9048],{"__ignoreMap":68},[10,9052,145],{},[14,9054,148],{"id":148},[150,9056,9057,9063],{},[40,9058,9059,9060,9062],{},"输入层取得课程名后，",[46,9061,8890],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9064,9065,9067],{},[46,9066,8122],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[170,9069,172],{"id":172},[10,9071,9072],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9074,9075],{},[26,9076],{"alt":9077,"src":9078},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9080,9081],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[170,9083,172],{"id":4226},[10,9085,9086],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9088,9089],{},[26,9090],{"alt":9091,"src":9092},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9094,9095,9096,9099],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[46,9097,9098],{},"load()"," 把文件状态恢复到内存。",[14,9101,187],{"id":187},[37,9103,9104,9107],{},[40,9105,9106],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9108,9109,9110,9112],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[46,9111,9098],{}," 是下一项必要扩展。",[14,9114,202],{"id":202},[150,9116,9117,9123,9126],{},[40,9118,9119,9120,9122],{},"增加 ",[46,9121,9098],{},"，文件不存在时从空列表开始。",[40,9124,9125],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9127,9128,9129,9132,9133,9135],{},"把输入循环放进 ",[46,9130,9131],{},"main()","，通过 ",[46,9134,6100],{}," 控制程序入口。",[10,9137,213],{},[14,9139,216],{"id":216},[10,9141,9142],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,9144,223],{},{"title":68,"searchDepth":81,"depth":81,"links":9146},[9147,9148,9149,9150,9151,9155,9156,9157],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":9152},[9153,9154],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8853,"description":8858},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[236,9165,9166],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9169,9272,9391,9522,9665,9790,9927,10064,10205,10374,10511,10644,10767,10896,11023,11186,11362,11503,11632,11781,11924,12045,12168,12317,12470,12635,12762,12943,13086,13243,13394,13541,13696,13914,14069,14244,14395,14562,14749,14912,15154,15394],{"id":1402,"title":1403,"body":9170,"category":236,"cover":237,"description":1408,"extension":238,"meta":9269,"navigation":90,"path":1527,"pinned":241,"publishedAt":242,"seo":9270,"slug":1529,"stem":1530,"summary":1531,"tags":9271,"updatedAt":242,"visible":90,"__hash__":1534},{"type":7,"value":9171,"toc":9259},[9172,9174,9176,9178,9180,9184,9188,9190,9200,9202,9204,9212,9214,9219,9221,9223,9233,9235,9243,9245,9251,9253,9255,9257],[10,9173,1408],{},[14,9175,16],{"id":16},[10,9177,1413],{},[14,9179,22],{"id":22},[10,9181,9182],{},[26,9183],{"alt":1420,"src":1421},[10,9185,9186,1426],{},[46,9187,1180],{},[14,9189,35],{"id":35},[37,9191,9192,9196,9198],{},[40,9193,1433,9194,1436],{},[46,9195,1180],{},[40,9197,1439],{},[40,9199,1442],{},[14,9201,58],{"id":58},[10,9203,61],{},[63,9205,9206],{"className":65,"code":1449,"language":67,"meta":68,"style":68},[46,9207,9208],{"__ignoreMap":68},[72,9209,9210],{"class":74,"line":75},[72,9211,1449],{},[10,9213,134],{},[63,9215,9217],{"className":9216,"code":1461,"language":140,"meta":68},[138],[46,9218,1461],{"__ignoreMap":68},[10,9220,145],{},[14,9222,148],{"id":148},[150,9224,9225,9229],{},[40,9226,1472,9227,1476],{},[46,9228,1475],{},[40,9230,1479,9231,1483],{},[46,9232,1482],{},[14,9234,187],{"id":187},[37,9236,9237,9239],{},[40,9238,1490],{},[40,9240,1493,9241,1496],{},[46,9242,1180],{},[14,9244,202],{"id":202},[150,9246,9247,9249],{},[40,9248,1503],{},[40,9250,1506],{},[10,9252,213],{},[14,9254,216],{"id":216},[10,9256,1513],{},[221,9258,223],{},{"title":68,"searchDepth":81,"depth":81,"links":9260},[9261,9262,9263,9264,9265,9266,9267,9268],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":1403,"description":1408},[236,1398,1533],{"id":1536,"title":1537,"body":9273,"category":236,"cover":237,"description":1542,"extension":238,"meta":9388,"navigation":90,"path":1679,"pinned":241,"publishedAt":242,"seo":9389,"slug":1681,"stem":1682,"summary":1683,"tags":9390,"updatedAt":242,"visible":90,"__hash__":1686},{"type":7,"value":9274,"toc":9378},[9275,9277,9279,9281,9283,9287,9291,9293,9303,9305,9307,9327,9329,9334,9336,9338,9348,9350,9360,9362,9370,9372,9374,9376],[10,9276,1542],{},[14,9278,16],{"id":16},[10,9280,1547],{},[14,9282,22],{"id":22},[10,9284,9285],{},[26,9286],{"alt":1554,"src":1555},[10,9288,1558,9289,1561],{},[46,9290,700],{},[14,9292,35],{"id":35},[37,9294,9295,9297,9299],{},[40,9296,1568],{},[40,9298,1571],{},[40,9300,1574,9301,1578],{},[46,9302,1577],{},[14,9304,58],{"id":58},[10,9306,1583],{},[63,9308,9309],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,9310,9311,9317],{"__ignoreMap":68},[72,9312,9313,9315],{"class":74,"line":75},[72,9314,700],{"class":609},[72,9316,613],{"class":612},[72,9318,9319,9321,9323,9325],{"class":74,"line":81},[72,9320,700],{"class":609},[72,9322,642],{"class":612},[72,9324,646],{"class":645},[72,9326,613],{"class":612},[10,9328,134],{},[63,9330,9332],{"className":9331,"code":1609,"language":140,"meta":68},[138],[46,9333,1609],{"__ignoreMap":68},[10,9335,145],{},[14,9337,148],{"id":148},[150,9339,9340,9344],{},[40,9341,9342,1623],{},[46,9343,1622],{},[40,9345,9346,1628],{},[46,9347,708],{},[14,9349,187],{"id":187},[37,9351,9352,9356],{},[40,9353,1635,9354,1638],{},[46,9355,700],{},[40,9357,1641,9358,1644],{},[46,9359,700],{},[14,9361,202],{"id":202},[150,9363,9364,9368],{},[40,9365,947,9366,1654],{},[46,9367,1653],{},[40,9369,1657],{},[10,9371,213],{},[14,9373,216],{"id":216},[10,9375,1664],{},[221,9377,1667],{},{"title":68,"searchDepth":81,"depth":81,"links":9379},[9380,9381,9382,9383,9384,9385,9386,9387],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":1537,"description":1542},[236,1685,1061],{"id":1688,"title":1689,"body":9392,"category":236,"cover":237,"description":1855,"extension":238,"meta":9519,"navigation":90,"path":1857,"pinned":241,"publishedAt":242,"seo":9520,"slug":1859,"stem":1860,"summary":1861,"tags":9521,"updatedAt":242,"visible":90,"__hash__":1865},{"type":7,"value":9393,"toc":9509},[9394,9398,9400,9402,9404,9408,9410,9412,9428,9430,9432,9452,9454,9459,9461,9463,9475,9477,9487,9489,9499,9501,9503,9507],[10,9395,1694,9396,1697],{},[46,9397,1180],{},[14,9399,16],{"id":16},[10,9401,1702],{},[14,9403,22],{"id":22},[10,9405,9406],{},[26,9407],{"alt":1709,"src":1710},[10,9409,1713],{},[14,9411,35],{"id":35},[37,9413,9414,9420,9424],{},[40,9415,1720,9416,1723,9418,168],{},[46,9417,700],{},[46,9419,1726],{},[40,9421,1729,9422,1733],{},[46,9423,1732],{},[40,9425,1736,9426,1739],{},[46,9427,1180],{},[14,9429,58],{"id":58},[10,9431,61],{},[63,9433,9434],{"className":1746,"code":1747,"language":1748,"meta":68,"style":68},[46,9435,9436,9440,9444,9448],{"__ignoreMap":68},[72,9437,9438],{"class":74,"line":75},[72,9439,1755],{},[72,9441,9442],{"class":74,"line":81},[72,9443,1760],{},[72,9445,9446],{"class":74,"line":87},[72,9447,1765],{},[72,9449,9450],{"class":74,"line":94},[72,9451,1770],{},[10,9453,134],{},[63,9455,9457],{"className":9456,"code":1776,"language":140,"meta":68},[138],[46,9458,1776],{"__ignoreMap":68},[10,9460,145],{},[14,9462,148],{"id":148},[150,9464,9465,9471],{},[40,9466,1787,9467,1791,9469,168],{},[46,9468,1790],{},[46,9470,1794],{},[40,9472,1797,9473,1800],{},[46,9474,1482],{},[14,9476,187],{"id":187},[37,9478,9479,9485],{},[40,9480,1807,9481,1810,9483,1813],{},[46,9482,1726],{},[46,9484,1180],{},[40,9486,1816],{},[14,9488,202],{"id":202},[150,9490,9491,9495],{},[40,9492,1823,9493,168],{},[46,9494,1826],{},[40,9496,1829,9497,1832],{},[46,9498,1482],{},[10,9500,213],{},[14,9502,216],{"id":216},[10,9504,1839,9505,1842],{},[46,9506,1180],{},[221,9508,223],{},{"title":68,"searchDepth":81,"depth":81,"links":9510},[9511,9512,9513,9514,9515,9516,9517,9518],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":1689,"description":1855},[236,1863,1864],{"id":1867,"title":1868,"body":9523,"category":236,"cover":237,"description":1873,"extension":238,"meta":9662,"navigation":90,"path":2045,"pinned":241,"publishedAt":242,"seo":9663,"slug":2047,"stem":2048,"summary":2049,"tags":9664,"updatedAt":242,"visible":90,"__hash__":2053},{"type":7,"value":9524,"toc":9652},[9525,9527,9529,9531,9533,9537,9541,9543,9555,9557,9559,9595,9597,9602,9604,9606,9622,9624,9634,9636,9644,9646,9648,9650],[10,9526,1873],{},[14,9528,16],{"id":16},[10,9530,1878],{},[14,9532,22],{"id":22},[10,9534,9535],{},[26,9536],{"alt":1885,"src":1886},[10,9538,9539,1892],{},[46,9540,1891],{},[14,9542,35],{"id":35},[37,9544,9545,9547,9553],{},[40,9546,1899],{},[40,9548,9549,1905,9551,1909],{},[46,9550,1904],{},[46,9552,1908],{},[40,9554,1912],{},[14,9556,58],{"id":58},[10,9558,1583],{},[63,9560,9561],{"className":600,"code":1919,"language":602,"meta":68,"style":68},[46,9562,9563,9569,9575,9579,9589],{"__ignoreMap":68},[72,9564,9565,9567],{"class":74,"line":75},[72,9566,1926],{"class":609},[72,9568,1929],{"class":645},[72,9570,9571,9573],{"class":74,"line":81},[72,9572,1934],{"class":612},[72,9574,1929],{"class":645},[72,9576,9577],{"class":74,"line":87},[72,9578,1941],{"class":612},[72,9580,9581,9583,9585,9587],{"class":74,"line":94},[72,9582,1946],{"class":612},[72,9584,1949],{"class":645},[72,9586,1953],{"class":1952},[72,9588,1224],{"class":645},[72,9590,9591,9593],{"class":74,"line":100},[72,9592,700],{"class":609},[72,9594,1224],{"class":645},[10,9596,134],{},[63,9598,9600],{"className":9599,"code":1967,"language":140,"meta":68},[138],[46,9601,1967],{"__ignoreMap":68},[10,9603,145],{},[14,9605,148],{"id":148},[150,9607,9608,9616],{},[40,9609,9610,1980,9612,1983,9614,1986],{},[46,9611,1926],{},[46,9613,1934],{},[46,9615,1904],{},[40,9617,9618,1991,9620,1995],{},[46,9619,1891],{},[46,9621,1994],{},[14,9623,187],{"id":187},[37,9625,9626,9632],{},[40,9627,2002,9628,1166,9630,168],{},[46,9629,1904],{},[46,9631,1908],{},[40,9633,2009],{},[14,9635,202],{"id":202},[150,9637,9638,9642],{},[40,9639,2016,9640,2020],{},[46,9641,2019],{},[40,9643,2023],{},[10,9645,213],{},[14,9647,216],{"id":216},[10,9649,2030],{},[221,9651,2033],{},{"title":68,"searchDepth":81,"depth":81,"links":9653},[9654,9655,9656,9657,9658,9659,9660,9661],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":1868,"description":1873},[236,2051,2052],{"id":2055,"title":2056,"body":9666,"category":236,"cover":237,"description":2061,"extension":238,"meta":9787,"navigation":90,"path":2210,"pinned":241,"publishedAt":242,"seo":9788,"slug":2212,"stem":2213,"summary":2214,"tags":9789,"updatedAt":242,"visible":90,"__hash__":2218},{"type":7,"value":9667,"toc":9777},[9668,9670,9672,9674,9676,9680,9688,9690,9704,9706,9708,9724,9726,9731,9733,9735,9749,9751,9757,9759,9769,9771,9773,9775],[10,9669,2061],{},[14,9671,16],{"id":16},[10,9673,2066],{},[14,9675,22],{"id":22},[10,9677,9678],{},[26,9679],{"alt":2073,"src":2074},[10,9681,2077,9682,168,9684,2083,9686,168],{},[46,9683,1482],{},[46,9685,2082],{},[46,9687,1790],{},[14,9689,35],{"id":35},[37,9691,9692,9696,9702],{},[40,9693,9694,2095],{},[46,9695,2094],{},[40,9697,9698,2101,9700,168],{},[46,9699,2100],{},[46,9701,2104],{},[40,9703,2107],{},[14,9705,58],{"id":58},[10,9707,61],{},[63,9709,9710],{"className":65,"code":2114,"language":67,"meta":68,"style":68},[46,9711,9712,9716,9720],{"__ignoreMap":68},[72,9713,9714],{"class":74,"line":75},[72,9715,2121],{},[72,9717,9718],{"class":74,"line":81},[72,9719,2126],{},[72,9721,9722],{"class":74,"line":87},[72,9723,2131],{},[10,9725,134],{},[63,9727,9729],{"className":9728,"code":2137,"language":140,"meta":68},[138],[46,9730,2137],{"__ignoreMap":68},[10,9732,145],{},[14,9734,148],{"id":148},[150,9736,9737,9743],{},[40,9738,9739,2151,9741,168],{},[46,9740,2150],{},[46,9742,2104],{},[40,9744,9745,2158,9747,2162],{},[46,9746,1482],{},[46,9748,2161],{},[14,9750,187],{"id":187},[37,9752,9753,9755],{},[40,9754,2169],{},[40,9756,2172],{},[14,9758,202],{"id":202},[150,9760,9761,9763],{},[40,9762,2179],{},[40,9764,2182,9765,2185,9767,2189],{},[46,9766,2082],{},[46,9768,2188],{},[10,9770,213],{},[14,9772,216],{"id":216},[10,9774,2196],{},[221,9776,223],{},{"title":68,"searchDepth":81,"depth":81,"links":9778},[9779,9780,9781,9782,9783,9784,9785,9786],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":2056,"description":2061},[236,2216,2217],{"id":2220,"title":2221,"body":9791,"category":236,"cover":237,"description":2226,"extension":238,"meta":9924,"navigation":90,"path":2394,"pinned":241,"publishedAt":242,"seo":9925,"slug":2396,"stem":2397,"summary":2398,"tags":9926,"updatedAt":242,"visible":90,"__hash__":2402},{"type":7,"value":9792,"toc":9914},[9793,9795,9797,9799,9801,9805,9807,9809,9825,9827,9829,9853,9855,9860,9862,9864,9880,9882,9894,9896,9906,9908,9910,9912],[10,9794,2226],{},[14,9796,16],{"id":16},[10,9798,2231],{},[14,9800,22],{"id":22},[10,9802,9803],{},[26,9804],{"alt":2238,"src":2239},[10,9806,2242],{},[14,9808,35],{"id":35},[37,9810,9811,9813,9819],{},[40,9812,2249],{},[40,9814,2252,9815,2185,9817,2259],{},[46,9816,2255],{},[46,9818,2258],{},[40,9820,2262,9821,2266,9823,2270],{},[46,9822,2265],{},[46,9824,2269],{},[14,9826,58],{"id":58},[10,9828,61],{},[63,9830,9831],{"className":65,"code":2277,"language":67,"meta":68,"style":68},[46,9832,9833,9837,9841,9845,9849],{"__ignoreMap":68},[72,9834,9835],{"class":74,"line":75},[72,9836,2284],{},[72,9838,9839],{"class":74,"line":81},[72,9840,2289],{},[72,9842,9843],{"class":74,"line":87},[72,9844,91],{"emptyLinePlaceholder":90},[72,9846,9847],{"class":74,"line":94},[72,9848,2298],{},[72,9850,9851],{"class":74,"line":100},[72,9852,2289],{},[10,9854,134],{},[63,9856,9858],{"className":9857,"code":2308,"language":140,"meta":68},[138],[46,9859,2308],{"__ignoreMap":68},[10,9861,145],{},[14,9863,148],{"id":148},[150,9865,9866,9872],{},[40,9867,947,9868,2322,9870,2325],{},[46,9869,2321],{},[46,9871,2255],{},[40,9873,947,9874,2331,9876,2335,9878,168],{},[46,9875,2330],{},[46,9877,2334],{},[46,9879,2338],{},[14,9881,187],{"id":187},[37,9883,9884,9886],{},[40,9885,2345],{},[40,9887,2348,9888,2266,9890,2266,9892,2356],{},[46,9889,2265],{},[46,9891,2269],{},[46,9893,2355],{},[14,9895,202],{"id":202},[150,9897,9898,9904],{},[40,9899,2363,9900,1166,9902,2370],{},[46,9901,2366],{},[46,9903,2369],{},[40,9905,2373],{},[10,9907,213],{},[14,9909,216],{"id":216},[10,9911,2380],{},[221,9913,223],{},{"title":68,"searchDepth":81,"depth":81,"links":9915},[9916,9917,9918,9919,9920,9921,9922,9923],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":2221,"description":2226},[236,2400,2401],{"id":2404,"title":2405,"body":9928,"category":236,"cover":237,"description":2410,"extension":238,"meta":10061,"navigation":90,"path":2575,"pinned":241,"publishedAt":242,"seo":10062,"slug":2577,"stem":2578,"summary":2579,"tags":10063,"updatedAt":242,"visible":90,"__hash__":2583},{"type":7,"value":9929,"toc":10051},[9930,9932,9934,9936,9938,9942,9944,9946,9964,9966,9968,10004,10006,10011,10013,10015,10025,10027,10035,10037,10043,10045,10047,10049],[10,9931,2410],{},[14,9933,16],{"id":16},[10,9935,2415],{},[14,9937,22],{"id":22},[10,9939,9940],{},[26,9941],{"alt":2422,"src":2423},[10,9943,2426],{},[14,9945,35],{"id":35},[37,9947,9948,9954,9962],{},[40,9949,9950,2436,9952,2440],{},[46,9951,2435],{},[46,9953,2439],{},[40,9955,9956,2446,9958,2450,9960,2454],{},[46,9957,2445],{},[46,9959,2449],{},[46,9961,2453],{},[40,9963,2457],{},[14,9965,58],{"id":58},[10,9967,61],{},[63,9969,9970],{"className":65,"code":2464,"language":67,"meta":68,"style":68},[46,9971,9972,9976,9980,9984,9988,9992,9996,10000],{"__ignoreMap":68},[72,9973,9974],{"class":74,"line":75},[72,9975,2471],{},[72,9977,9978],{"class":74,"line":81},[72,9979,2476],{},[72,9981,9982],{"class":74,"line":87},[72,9983,2481],{},[72,9985,9986],{"class":74,"line":94},[72,9987,91],{"emptyLinePlaceholder":90},[72,9989,9990],{"class":74,"line":100},[72,9991,2490],{},[72,9993,9994],{"class":74,"line":106},[72,9995,2495],{},[72,9997,9998],{"class":74,"line":111},[72,9999,2500],{},[72,10001,10002],{"class":74,"line":117},[72,10003,2505],{},[10,10005,134],{},[63,10007,10009],{"className":10008,"code":2511,"language":140,"meta":68},[138],[46,10010,2511],{"__ignoreMap":68},[10,10012,145],{},[14,10014,148],{"id":148},[150,10016,10017,10021],{},[40,10018,10019,2525],{},[46,10020,2524],{},[40,10022,10023,2531],{},[46,10024,2530],{},[14,10026,187],{"id":187},[37,10028,10029,10033],{},[40,10030,2538,10031,168],{},[46,10032,2541],{},[40,10034,2544],{},[14,10036,202],{"id":202},[150,10038,10039,10041],{},[40,10040,2551],{},[40,10042,2554],{},[10,10044,213],{},[14,10046,216],{"id":216},[10,10048,2561],{},[221,10050,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10052},[10053,10054,10055,10056,10057,10058,10059,10060],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":2405,"description":2410},[236,2581,2582],{"id":2585,"title":2586,"body":10065,"category":236,"cover":237,"description":2591,"extension":238,"meta":10202,"navigation":90,"path":2767,"pinned":241,"publishedAt":242,"seo":10203,"slug":2769,"stem":2770,"summary":2771,"tags":10204,"updatedAt":242,"visible":90,"__hash__":2775},{"type":7,"value":10066,"toc":10190},[10067,10069,10071,10073,10075,10079,10085,10087,10095,10097,10099,10123,10125,10130,10132,10134,10152,10154,10156,10160,10162,10164,10170,10172,10182,10184,10186,10188],[10,10068,2591],{},[14,10070,16],{"id":16},[10,10072,2596],{},[14,10074,22],{"id":22},[10,10076,10077],{},[26,10078],{"alt":2603,"src":2604},[10,10080,2607,10081,2611,10083,168],{},[46,10082,2610],{},[46,10084,2614],{},[14,10086,35],{"id":35},[37,10088,10089,10091,10093],{},[40,10090,2621],{},[40,10092,2624],{},[40,10094,2627],{},[14,10096,58],{"id":58},[10,10098,61],{},[63,10100,10101],{"className":65,"code":2634,"language":67,"meta":68,"style":68},[46,10102,10103,10107,10111,10115,10119],{"__ignoreMap":68},[72,10104,10105],{"class":74,"line":75},[72,10106,2641],{},[72,10108,10109],{"class":74,"line":81},[72,10110,2646],{},[72,10112,10113],{"class":74,"line":87},[72,10114,2651],{},[72,10116,10117],{"class":74,"line":94},[72,10118,2656],{},[72,10120,10121],{"class":74,"line":100},[72,10122,2661],{},[10,10124,134],{},[63,10126,10128],{"className":10127,"code":2667,"language":140,"meta":68},[138],[46,10129,2667],{"__ignoreMap":68},[10,10131,145],{},[14,10133,148],{"id":148},[150,10135,10136,10144],{},[40,10137,2678,10138,2681,10140,2685,10142,2689],{},[46,10139,236],{},[46,10141,2684],{},[46,10143,2688],{},[40,10145,10146,2695,10148,2699,10150,2703],{},[46,10147,2694],{},[46,10149,2698],{},[46,10151,2702],{},[170,10153,172],{"id":172},[10,10155,2708],{},[10,10157,10158],{},[26,10159],{"alt":2713,"src":2714},[10,10161,2717],{},[14,10163,187],{"id":187},[37,10165,10166,10168],{},[40,10167,2724],{},[40,10169,2727],{},[14,10171,202],{"id":202},[150,10173,10174,10180],{},[40,10175,2734,10176,2738,10178,168],{},[46,10177,2737],{},[46,10179,2741],{},[40,10181,2744],{},[10,10183,213],{},[14,10185,216],{"id":216},[10,10187,2751],{},[221,10189,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10191},[10192,10193,10194,10195,10196,10199,10200,10201],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":10197},[10198],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":2586,"description":2591},[236,2773,2774],{"id":2777,"title":2778,"body":10206,"category":236,"cover":237,"description":2783,"extension":238,"meta":10371,"navigation":90,"path":2998,"pinned":241,"publishedAt":242,"seo":10372,"slug":3000,"stem":3001,"summary":3002,"tags":10373,"updatedAt":242,"visible":90,"__hash__":3006},{"type":7,"value":10207,"toc":10359},[10208,10210,10212,10214,10216,10220,10226,10228,10248,10250,10252,10288,10290,10295,10297,10299,10313,10315,10317,10321,10327,10329,10339,10341,10351,10353,10355,10357],[10,10209,2783],{},[14,10211,16],{"id":16},[10,10213,2788],{},[14,10215,22],{"id":22},[10,10217,10218],{},[26,10219],{"alt":2795,"src":2796},[10,10221,2799,10222,1018,10224,2806],{},[46,10223,2802],{},[46,10225,2805],{},[14,10227,35],{"id":35},[37,10229,10230,10238,10246],{},[40,10231,10232,2816,10234,2820,10236,2824],{},[46,10233,2815],{},[46,10235,2819],{},[46,10237,2823],{},[40,10239,10240,2830,10242,2834,10244,2838],{},[46,10241,2829],{},[46,10243,2833],{},[46,10245,2837],{},[40,10247,2841],{},[14,10249,58],{"id":58},[10,10251,61],{},[63,10253,10254],{"className":65,"code":2848,"language":67,"meta":68,"style":68},[46,10255,10256,10260,10264,10268,10272,10276,10280,10284],{"__ignoreMap":68},[72,10257,10258],{"class":74,"line":75},[72,10259,2855],{},[72,10261,10262],{"class":74,"line":81},[72,10263,2860],{},[72,10265,10266],{"class":74,"line":87},[72,10267,91],{"emptyLinePlaceholder":90},[72,10269,10270],{"class":74,"line":94},[72,10271,2869],{},[72,10273,10274],{"class":74,"line":100},[72,10275,2874],{},[72,10277,10278],{"class":74,"line":106},[72,10279,2879],{},[72,10281,10282],{"class":74,"line":111},[72,10283,2884],{},[72,10285,10286],{"class":74,"line":117},[72,10287,2889],{},[10,10289,134],{},[63,10291,10293],{"className":10292,"code":2895,"language":140,"meta":68},[138],[46,10294,2895],{"__ignoreMap":68},[10,10296,145],{},[14,10298,148],{"id":148},[150,10300,10301,10307],{},[40,10302,10303,2909,10305,2913],{},[46,10304,2908],{},[46,10306,2912],{},[40,10308,10309,2919,10311,2922],{},[46,10310,2918],{},[46,10312,2837],{},[170,10314,172],{"id":172},[10,10316,2927],{},[10,10318,10319],{},[26,10320],{"alt":2932,"src":2933},[10,10322,10323,2938,10325,2941],{},[46,10324,2829],{},[46,10326,2833],{},[14,10328,187],{"id":187},[37,10330,10331,10337],{},[40,10332,2948,10333,2951,10335,2954],{},[46,10334,2823],{},[46,10336,2815],{},[40,10338,2957],{},[14,10340,202],{"id":202},[150,10342,10343,10347],{},[40,10344,2964,10345,2968],{},[46,10346,2967],{},[40,10348,2971,10349,2975],{},[46,10350,2974],{},[10,10352,213],{},[14,10354,216],{"id":216},[10,10356,2982],{},[221,10358,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10360},[10361,10362,10363,10364,10365,10368,10369,10370],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":10366},[10367],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":2778,"description":2783},[236,3004,3005],{"id":3008,"title":3009,"body":10375,"category":236,"cover":237,"description":3014,"extension":238,"meta":10508,"navigation":90,"path":3183,"pinned":241,"publishedAt":242,"seo":10509,"slug":3185,"stem":3186,"summary":3187,"tags":10510,"updatedAt":242,"visible":90,"__hash__":3190},{"type":7,"value":10376,"toc":10498},[10377,10379,10381,10383,10385,10389,10399,10401,10411,10413,10415,10443,10445,10450,10452,10454,10468,10470,10478,10480,10490,10492,10494,10496],[10,10378,3014],{},[14,10380,16],{"id":16},[10,10382,3019],{},[14,10384,22],{"id":22},[10,10386,10387],{},[26,10388],{"alt":3026,"src":3027},[10,10390,10391,3033,10393,3037,10395,3041,10397,3045],{},[46,10392,3032],{},[46,10394,3036],{},[46,10396,3040],{},[46,10398,3044],{},[14,10400,35],{"id":35},[37,10402,10403,10405,10409],{},[40,10404,3052],{},[40,10406,10407,3057],{},[46,10408,3044],{},[40,10410,3060],{},[14,10412,58],{"id":58},[10,10414,61],{},[63,10416,10417],{"className":65,"code":3067,"language":67,"meta":68,"style":68},[46,10418,10419,10423,10427,10431,10435,10439],{"__ignoreMap":68},[72,10420,10421],{"class":74,"line":75},[72,10422,3074],{},[72,10424,10425],{"class":74,"line":81},[72,10426,3079],{},[72,10428,10429],{"class":74,"line":87},[72,10430,3084],{},[72,10432,10433],{"class":74,"line":94},[72,10434,91],{"emptyLinePlaceholder":90},[72,10436,10437],{"class":74,"line":100},[72,10438,3093],{},[72,10440,10441],{"class":74,"line":106},[72,10442,3098],{},[10,10444,134],{},[63,10446,10448],{"className":10447,"code":3104,"language":140,"meta":68},[138],[46,10449,3104],{"__ignoreMap":68},[10,10451,145],{},[14,10453,148],{"id":148},[150,10455,10456,10462],{},[40,10457,3115,10458,3118,10460,3122],{},[46,10459,3032],{},[46,10461,3121],{},[40,10463,10464,3128,10466,3132],{},[46,10465,3127],{},[46,10467,3131],{},[14,10469,187],{"id":187},[37,10471,10472,10476],{},[40,10473,3139,10474,3143],{},[46,10475,3142],{},[40,10477,3146],{},[14,10479,202],{"id":202},[150,10481,10482,10484],{},[40,10483,3153],{},[40,10485,1729,10486,3159,10488,3162],{},[46,10487,3158],{},[46,10489,3044],{},[10,10491,213],{},[14,10493,216],{"id":216},[10,10495,3169],{},[221,10497,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10499},[10500,10501,10502,10503,10504,10505,10506,10507],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3009,"description":3014},[236,2355,3189],{"id":3192,"title":3193,"body":10512,"category":236,"cover":237,"description":3198,"extension":238,"meta":10641,"navigation":90,"path":3359,"pinned":241,"publishedAt":242,"seo":10642,"slug":3361,"stem":3362,"summary":3363,"tags":10643,"updatedAt":242,"visible":90,"__hash__":3367},{"type":7,"value":10513,"toc":10631},[10514,10516,10518,10520,10522,10526,10530,10532,10542,10544,10546,10578,10580,10585,10587,10589,10601,10603,10613,10615,10623,10625,10627,10629],[10,10515,3198],{},[14,10517,16],{"id":16},[10,10519,3203],{},[14,10521,22],{"id":22},[10,10523,10524],{},[26,10525],{"alt":3210,"src":3211},[10,10527,3214,10528,3218],{},[46,10529,3217],{},[14,10531,35],{"id":35},[37,10533,10534,10536,10538],{},[40,10535,3225],{},[40,10537,3228],{},[40,10539,3231,10540,168],{},[46,10541,3234],{},[14,10543,58],{"id":58},[10,10545,61],{},[63,10547,10548],{"className":65,"code":3241,"language":67,"meta":68,"style":68},[46,10549,10550,10554,10558,10562,10566,10570,10574],{"__ignoreMap":68},[72,10551,10552],{"class":74,"line":75},[72,10553,3248],{},[72,10555,10556],{"class":74,"line":81},[72,10557,3253],{},[72,10559,10560],{"class":74,"line":87},[72,10561,91],{"emptyLinePlaceholder":90},[72,10563,10564],{"class":74,"line":94},[72,10565,3262],{},[72,10567,10568],{"class":74,"line":100},[72,10569,3267],{},[72,10571,10572],{"class":74,"line":106},[72,10573,3272],{},[72,10575,10576],{"class":74,"line":111},[72,10577,3277],{},[10,10579,134],{},[63,10581,10583],{"className":10582,"code":3283,"language":140,"meta":68},[138],[46,10584,3283],{"__ignoreMap":68},[10,10586,145],{},[14,10588,148],{"id":148},[150,10590,10591,10593],{},[40,10592,3294],{},[40,10594,10595,3300,10597,3304,10599,3308],{},[46,10596,3299],{},[46,10598,3303],{},[46,10600,3307],{},[14,10602,187],{"id":187},[37,10604,10605,10611],{},[40,10606,3315,10607,3319,10609,168],{},[46,10608,3318],{},[46,10610,3322],{},[40,10612,3325],{},[14,10614,202],{"id":202},[150,10616,10617,10619],{},[40,10618,3332],{},[40,10620,3335,10621,3338],{},[46,10622,3307],{},[10,10624,213],{},[14,10626,216],{"id":216},[10,10628,3345],{},[221,10630,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10632},[10633,10634,10635,10636,10637,10638,10639,10640],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3193,"description":3198},[236,3365,3366],{"id":3369,"title":3370,"body":10645,"category":236,"cover":237,"description":3375,"extension":238,"meta":10764,"navigation":90,"path":3517,"pinned":241,"publishedAt":242,"seo":10765,"slug":3519,"stem":3520,"summary":3521,"tags":10766,"updatedAt":242,"visible":90,"__hash__":3524},{"type":7,"value":10646,"toc":10754},[10647,10649,10651,10653,10655,10659,10661,10663,10671,10673,10675,10703,10705,10710,10712,10714,10724,10726,10734,10736,10746,10748,10750,10752],[10,10648,3375],{},[14,10650,16],{"id":16},[10,10652,3380],{},[14,10654,22],{"id":22},[10,10656,10657],{},[26,10658],{"alt":3387,"src":3388},[10,10660,3391],{},[14,10662,35],{"id":35},[37,10664,10665,10667,10669],{},[40,10666,3398],{},[40,10668,3401],{},[40,10670,3404],{},[14,10672,58],{"id":58},[10,10674,61],{},[63,10676,10677],{"className":65,"code":3411,"language":67,"meta":68,"style":68},[46,10678,10679,10683,10687,10691,10695,10699],{"__ignoreMap":68},[72,10680,10681],{"class":74,"line":75},[72,10682,3418],{},[72,10684,10685],{"class":74,"line":81},[72,10686,3423],{},[72,10688,10689],{"class":74,"line":87},[72,10690,3428],{},[72,10692,10693],{"class":74,"line":94},[72,10694,91],{"emptyLinePlaceholder":90},[72,10696,10697],{"class":74,"line":100},[72,10698,3437],{},[72,10700,10701],{"class":74,"line":106},[72,10702,3442],{},[10,10704,134],{},[63,10706,10708],{"className":10707,"code":3448,"language":140,"meta":68},[138],[46,10709,3448],{"__ignoreMap":68},[10,10711,145],{},[14,10713,148],{"id":148},[150,10715,10716,10720],{},[40,10717,10718,3462],{},[46,10719,3461],{},[40,10721,10722,3468],{},[46,10723,3467],{},[14,10725,187],{"id":187},[37,10727,10728,10732],{},[40,10729,3475,10730,3479],{},[46,10731,3478],{},[40,10733,3482],{},[14,10735,202],{"id":202},[150,10737,10738,10740],{},[40,10739,3489],{},[40,10741,2182,10742,2185,10744,3496],{},[46,10743,3478],{},[46,10745,3467],{},[10,10747,213],{},[14,10749,216],{"id":216},[10,10751,3503],{},[221,10753,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10755},[10756,10757,10758,10759,10760,10761,10762,10763],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3370,"description":3375},[236,3523,3366],{"id":3526,"title":3527,"body":10768,"category":236,"cover":237,"description":3532,"extension":238,"meta":10893,"navigation":90,"path":3688,"pinned":241,"publishedAt":242,"seo":10894,"slug":3690,"stem":3691,"summary":3692,"tags":10895,"updatedAt":242,"visible":90,"__hash__":3695},{"type":7,"value":10769,"toc":10883},[10770,10772,10774,10776,10778,10782,10788,10790,10800,10802,10804,10832,10834,10839,10841,10843,10853,10855,10867,10869,10875,10877,10879,10881],[10,10771,3532],{},[14,10773,16],{"id":16},[10,10775,3537],{},[14,10777,22],{"id":22},[10,10779,10780],{},[26,10781],{"alt":3544,"src":3545},[10,10783,3548,10784,3552,10786,3555],{},[46,10785,3551],{},[46,10787,2255],{},[14,10789,35],{"id":35},[37,10791,10792,10794,10798],{},[40,10793,3562],{},[40,10795,2348,10796,3568],{},[46,10797,3567],{},[40,10799,3571],{},[14,10801,58],{"id":58},[10,10803,61],{},[63,10805,10806],{"className":65,"code":3578,"language":67,"meta":68,"style":68},[46,10807,10808,10812,10816,10820,10824,10828],{"__ignoreMap":68},[72,10809,10810],{"class":74,"line":75},[72,10811,3585],{},[72,10813,10814],{"class":74,"line":81},[72,10815,3590],{},[72,10817,10818],{"class":74,"line":87},[72,10819,91],{"emptyLinePlaceholder":90},[72,10821,10822],{"class":74,"line":94},[72,10823,3599],{},[72,10825,10826],{"class":74,"line":100},[72,10827,3604],{},[72,10829,10830],{"class":74,"line":106},[72,10831,3609],{},[10,10833,134],{},[63,10835,10837],{"className":10836,"code":3615,"language":140,"meta":68},[138],[46,10838,3615],{"__ignoreMap":68},[10,10840,145],{},[14,10842,148],{"id":148},[150,10844,10845,10847],{},[40,10846,3626],{},[40,10848,3629,10849,3632,10851,3636],{},[46,10850,2255],{},[46,10852,3635],{},[14,10854,187],{"id":187},[37,10856,10857,10861],{},[40,10858,3643,10859,3647],{},[46,10860,3646],{},[40,10862,3650,10863,3654,10865,168],{},[46,10864,3653],{},[46,10866,3657],{},[14,10868,202],{"id":202},[150,10870,10871,10873],{},[40,10872,3664],{},[40,10874,3667],{},[10,10876,213],{},[14,10878,216],{"id":216},[10,10880,3674],{},[221,10882,223],{},{"title":68,"searchDepth":81,"depth":81,"links":10884},[10885,10886,10887,10888,10889,10890,10891,10892],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3527,"description":3532},[236,3694,3366],{"id":3697,"title":3698,"body":10897,"category":236,"cover":237,"description":3703,"extension":238,"meta":11020,"navigation":90,"path":3853,"pinned":241,"publishedAt":242,"seo":11021,"slug":3855,"stem":3856,"summary":3857,"tags":11022,"updatedAt":242,"visible":90,"__hash__":3860},{"type":7,"value":10898,"toc":11010},[10899,10901,10903,10905,10907,10911,10913,10915,10927,10929,10931,10959,10961,10966,10968,10970,10980,10982,10992,10994,11002,11004,11006,11008],[10,10900,3703],{},[14,10902,16],{"id":16},[10,10904,3708],{},[14,10906,22],{"id":22},[10,10908,10909],{},[26,10910],{"alt":3715,"src":3716},[10,10912,3719],{},[14,10914,35],{"id":35},[37,10916,10917,10919,10921],{},[40,10918,3726],{},[40,10920,3729],{},[40,10922,3732,10923,3736,10925,3740],{},[46,10924,3735],{},[46,10926,3739],{},[14,10928,58],{"id":58},[10,10930,61],{},[63,10932,10933],{"className":65,"code":3747,"language":67,"meta":68,"style":68},[46,10934,10935,10939,10943,10947,10951,10955],{"__ignoreMap":68},[72,10936,10937],{"class":74,"line":75},[72,10938,3754],{},[72,10940,10941],{"class":74,"line":81},[72,10942,3759],{},[72,10944,10945],{"class":74,"line":87},[72,10946,91],{"emptyLinePlaceholder":90},[72,10948,10949],{"class":74,"line":94},[72,10950,3768],{},[72,10952,10953],{"class":74,"line":100},[72,10954,3773],{},[72,10956,10957],{"class":74,"line":106},[72,10958,3778],{},[10,10960,134],{},[63,10962,10964],{"className":10963,"code":3784,"language":140,"meta":68},[138],[46,10965,3784],{"__ignoreMap":68},[10,10967,145],{},[14,10969,148],{"id":148},[150,10971,10972,10974],{},[40,10973,3795],{},[40,10975,10976,3801,10978,3805],{},[46,10977,3800],{},[46,10979,3804],{},[14,10981,187],{"id":187},[37,10983,10984,10990],{},[40,10985,2348,10986,3814,10988,168],{},[46,10987,3739],{},[46,10989,3735],{},[40,10991,3819],{},[14,10993,202],{"id":202},[150,10995,10996,11000],{},[40,10997,3826,10998,3829],{},[46,10999,3735],{},[40,11001,3832],{},[10,11003,213],{},[14,11005,216],{"id":216},[10,11007,3839],{},[221,11009,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11011},[11012,11013,11014,11015,11016,11017,11018,11019],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3698,"description":3703},[236,3859,3366],{"id":3862,"title":3863,"body":11024,"category":236,"cover":237,"description":3868,"extension":238,"meta":11183,"navigation":90,"path":4066,"pinned":241,"publishedAt":242,"seo":11184,"slug":4068,"stem":4069,"summary":4070,"tags":11185,"updatedAt":242,"visible":90,"__hash__":4074},{"type":7,"value":11025,"toc":11171},[11026,11028,11030,11032,11034,11038,11044,11046,11058,11060,11062,11102,11104,11109,11111,11113,11127,11129,11131,11135,11137,11139,11149,11151,11163,11165,11167,11169],[10,11027,3868],{},[14,11029,16],{"id":16},[10,11031,3873],{},[14,11033,22],{"id":22},[10,11035,11036],{},[26,11037],{"alt":3880,"src":3881},[10,11039,11040,3887,11042,3891],{},[46,11041,3886],{},[46,11043,3890],{},[14,11045,35],{"id":35},[37,11047,11048,11054,11056],{},[40,11049,11050,3900,11052,3904],{},[46,11051,2815],{},[46,11053,3903],{},[40,11055,3907],{},[40,11057,3910],{},[14,11059,58],{"id":58},[10,11061,61],{},[63,11063,11064],{"className":65,"code":3917,"language":67,"meta":68,"style":68},[46,11065,11066,11070,11074,11078,11082,11086,11090,11094,11098],{"__ignoreMap":68},[72,11067,11068],{"class":74,"line":75},[72,11069,3924],{},[72,11071,11072],{"class":74,"line":81},[72,11073,3929],{},[72,11075,11076],{"class":74,"line":87},[72,11077,3934],{},[72,11079,11080],{"class":74,"line":94},[72,11081,91],{"emptyLinePlaceholder":90},[72,11083,11084],{"class":74,"line":100},[72,11085,3943],{},[72,11087,11088],{"class":74,"line":106},[72,11089,3948],{},[72,11091,11092],{"class":74,"line":111},[72,11093,3953],{},[72,11095,11096],{"class":74,"line":117},[72,11097,3958],{},[72,11099,11100],{"class":74,"line":123},[72,11101,3963],{},[10,11103,134],{},[63,11105,11107],{"className":11106,"code":3969,"language":140,"meta":68},[138],[46,11108,3969],{"__ignoreMap":68},[10,11110,145],{},[14,11112,148],{"id":148},[150,11114,11115,11119],{},[40,11116,11117,3983],{},[46,11118,3982],{},[40,11120,11121,3989,11123,3993,11125,3997],{},[46,11122,3988],{},[46,11124,3992],{},[46,11126,3996],{},[170,11128,172],{"id":172},[10,11130,4002],{},[10,11132,11133],{},[26,11134],{"alt":4007,"src":4008},[10,11136,4011],{},[14,11138,187],{"id":187},[37,11140,11141,11147],{},[40,11142,4018,11143,4021,11145,168],{},[46,11144,2815],{},[46,11146,3903],{},[40,11148,4026],{},[14,11150,202],{"id":202},[150,11152,11153,11155],{},[40,11154,4033],{},[40,11156,2348,11157,4039,11159,1166,11161,168],{},[46,11158,4038],{},[46,11160,3903],{},[46,11162,2815],{},[10,11164,213],{},[14,11166,216],{"id":216},[10,11168,4050],{},[221,11170,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11172},[11173,11174,11175,11176,11177,11180,11181,11182],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":11178},[11179],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":3863,"description":3868},[236,4072,4073],{"id":4076,"title":4077,"body":11187,"category":236,"cover":237,"description":4082,"extension":238,"meta":11359,"navigation":90,"path":4295,"pinned":241,"publishedAt":242,"seo":11360,"slug":4297,"stem":4298,"summary":4299,"tags":11361,"updatedAt":242,"visible":90,"__hash__":4302},{"type":7,"value":11188,"toc":11346},[11189,11191,11193,11195,11197,11201,11209,11211,11219,11221,11223,11267,11269,11274,11276,11278,11290,11292,11294,11298,11304,11306,11308,11312,11316,11318,11330,11332,11338,11340,11342,11344],[10,11190,4082],{},[14,11192,16],{"id":16},[10,11194,4087],{},[14,11196,22],{"id":22},[10,11198,11199],{},[26,11200],{"alt":4094,"src":4095},[10,11202,11203,2266,11205,2266,11207,4105],{},[46,11204,1165],{},[46,11206,4102],{},[46,11208,1169],{},[14,11210,35],{"id":35},[37,11212,11213,11215,11217],{},[40,11214,4112],{},[40,11216,4115],{},[40,11218,4118],{},[14,11220,58],{"id":58},[10,11222,61],{},[63,11224,11225],{"className":65,"code":4125,"language":67,"meta":68,"style":68},[46,11226,11227,11231,11235,11239,11243,11247,11251,11255,11259,11263],{"__ignoreMap":68},[72,11228,11229],{"class":74,"line":75},[72,11230,4132],{},[72,11232,11233],{"class":74,"line":81},[72,11234,91],{"emptyLinePlaceholder":90},[72,11236,11237],{"class":74,"line":87},[72,11238,4141],{},[72,11240,11241],{"class":74,"line":94},[72,11242,4146],{},[72,11244,11245],{"class":74,"line":100},[72,11246,4151],{},[72,11248,11249],{"class":74,"line":106},[72,11250,4156],{},[72,11252,11253],{"class":74,"line":111},[72,11254,1155],{},[72,11256,11257],{"class":74,"line":117},[72,11258,4165],{},[72,11260,11261],{"class":74,"line":123},[72,11262,91],{"emptyLinePlaceholder":90},[72,11264,11265],{"class":74,"line":128},[72,11266,4174],{},[10,11268,134],{},[63,11270,11272],{"className":11271,"code":4180,"language":140,"meta":68},[138],[46,11273,4180],{"__ignoreMap":68},[10,11275,145],{},[14,11277,148],{"id":148},[150,11279,11280,11284],{},[40,11281,4191,11282,4195],{},[46,11283,4194],{},[40,11285,11286,4201,11288,4204],{},[46,11287,4200],{},[46,11289,1169],{},[170,11291,172],{"id":172},[10,11293,4209],{},[10,11295,11296],{},[26,11297],{"alt":4214,"src":4215},[10,11299,11300,4220,11302,4223],{},[46,11301,4194],{},[46,11303,4200],{},[170,11305,172],{"id":4226},[10,11307,4229],{},[10,11309,11310],{},[26,11311],{"alt":4234,"src":4235},[10,11313,4238,11314,4241],{},[46,11315,1165],{},[14,11317,187],{"id":187},[37,11319,11320,11324],{},[40,11321,4248,11322,4251],{},[46,11323,4200],{},[40,11325,4254,11326,4257,11328,4261],{},[46,11327,1165],{},[46,11329,4260],{},[14,11331,202],{"id":202},[150,11333,11334,11336],{},[40,11335,4268],{},[40,11337,4271],{},[10,11339,213],{},[14,11341,216],{"id":216},[10,11343,4278],{},[221,11345,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11347},[11348,11349,11350,11351,11352,11356,11357,11358],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":11353},[11354,11355],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":4077,"description":4082},[236,1165,4301],{"id":4304,"title":4305,"body":11363,"category":236,"cover":237,"description":4310,"extension":238,"meta":11500,"navigation":90,"path":4477,"pinned":241,"publishedAt":242,"seo":11501,"slug":4479,"stem":4480,"summary":4481,"tags":11502,"updatedAt":242,"visible":90,"__hash__":4484},{"type":7,"value":11364,"toc":11488},[11365,11367,11369,11371,11373,11377,11381,11383,11393,11395,11397,11429,11431,11436,11438,11440,11450,11452,11454,11458,11462,11464,11470,11472,11480,11482,11484,11486],[10,11366,4310],{},[14,11368,16],{"id":16},[10,11370,4315],{},[14,11372,22],{"id":22},[10,11374,11375],{},[26,11376],{"alt":4322,"src":4323},[10,11378,11379,4329],{},[46,11380,4328],{},[14,11382,35],{"id":35},[37,11384,11385,11387,11389],{},[40,11386,4336],{},[40,11388,4339],{},[40,11390,4342,11391,4346],{},[46,11392,4345],{},[14,11394,58],{"id":58},[10,11396,61],{},[63,11398,11399],{"className":65,"code":4353,"language":67,"meta":68,"style":68},[46,11400,11401,11405,11409,11413,11417,11421,11425],{"__ignoreMap":68},[72,11402,11403],{"class":74,"line":75},[72,11404,4360],{},[72,11406,11407],{"class":74,"line":81},[72,11408,91],{"emptyLinePlaceholder":90},[72,11410,11411],{"class":74,"line":87},[72,11412,4369],{},[72,11414,11415],{"class":74,"line":94},[72,11416,4374],{},[72,11418,11419],{"class":74,"line":100},[72,11420,4379],{},[72,11422,11423],{"class":74,"line":106},[72,11424,91],{"emptyLinePlaceholder":90},[72,11426,11427],{"class":74,"line":111},[72,11428,4388],{},[10,11430,134],{},[63,11432,11434],{"className":11433,"code":4394,"language":140,"meta":68},[138],[46,11435,4394],{"__ignoreMap":68},[10,11437,145],{},[14,11439,148],{"id":148},[150,11441,11442,11446],{},[40,11443,4405,11444,4409],{},[46,11445,4408],{},[40,11447,4412,11448,4415],{},[46,11449,4408],{},[170,11451,172],{"id":172},[10,11453,4420],{},[10,11455,11456],{},[26,11457],{"alt":4425,"src":4426},[10,11459,4429,11460,4432],{},[46,11461,4408],{},[14,11463,187],{"id":187},[37,11465,11466,11468],{},[40,11467,4439],{},[40,11469,4442],{},[14,11471,202],{"id":202},[150,11473,11474,11478],{},[40,11475,2348,11476,4451],{},[46,11477,4328],{},[40,11479,4454],{},[10,11481,213],{},[14,11483,216],{"id":216},[10,11485,4461],{},[221,11487,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11489},[11490,11491,11492,11493,11494,11497,11498,11499],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":11495},[11496],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":4305,"description":4310},[236,4328,4483],{"id":4486,"title":4487,"body":11504,"category":236,"cover":237,"description":4492,"extension":238,"meta":11629,"navigation":90,"path":4641,"pinned":241,"publishedAt":242,"seo":11630,"slug":4643,"stem":4644,"summary":4645,"tags":11631,"updatedAt":242,"visible":90,"__hash__":4648},{"type":7,"value":11505,"toc":11619},[11506,11508,11510,11512,11514,11518,11522,11524,11534,11536,11538,11570,11572,11577,11579,11581,11593,11595,11601,11603,11611,11613,11615,11617],[10,11507,4492],{},[14,11509,16],{"id":16},[10,11511,4497],{},[14,11513,22],{"id":22},[10,11515,11516],{},[26,11517],{"alt":4504,"src":4505},[10,11519,11520,4510],{},[46,11521,4345],{},[14,11523,35],{"id":35},[37,11525,11526,11530,11532],{},[40,11527,11528,4520],{},[46,11529,4519],{},[40,11531,4523],{},[40,11533,4526],{},[14,11535,58],{"id":58},[10,11537,61],{},[63,11539,11540],{"className":65,"code":4533,"language":67,"meta":68,"style":68},[46,11541,11542,11546,11550,11554,11558,11562,11566],{"__ignoreMap":68},[72,11543,11544],{"class":74,"line":75},[72,11545,4540],{},[72,11547,11548],{"class":74,"line":81},[72,11549,91],{"emptyLinePlaceholder":90},[72,11551,11552],{"class":74,"line":87},[72,11553,4549],{},[72,11555,11556],{"class":74,"line":94},[72,11557,4554],{},[72,11559,11560],{"class":74,"line":100},[72,11561,91],{"emptyLinePlaceholder":90},[72,11563,11564],{"class":74,"line":106},[72,11565,4563],{},[72,11567,11568],{"class":74,"line":111},[72,11569,4568],{},[10,11571,134],{},[63,11573,11575],{"className":11574,"code":4574,"language":140,"meta":68},[138],[46,11576,4574],{"__ignoreMap":68},[10,11578,145],{},[14,11580,148],{"id":148},[150,11582,11583,11589],{},[40,11584,4585,11585,4588,11587,4592],{},[46,11586,4345],{},[46,11588,4591],{},[40,11590,11591,4597],{},[46,11592,4519],{},[14,11594,187],{"id":187},[37,11596,11597,11599],{},[40,11598,4604],{},[40,11600,4607],{},[14,11602,202],{"id":202},[150,11604,11605,11607],{},[40,11606,4614],{},[40,11608,2348,11609,4620],{},[46,11610,4619],{},[10,11612,213],{},[14,11614,216],{"id":216},[10,11616,4627],{},[221,11618,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11620},[11621,11622,11623,11624,11625,11626,11627,11628],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":4487,"description":4492},[236,4345,4647],{"id":4650,"title":4651,"body":11633,"category":236,"cover":237,"description":4656,"extension":238,"meta":11778,"navigation":90,"path":4831,"pinned":241,"publishedAt":242,"seo":11779,"slug":4833,"stem":4834,"summary":4835,"tags":11780,"updatedAt":242,"visible":90,"__hash__":4837},{"type":7,"value":11634,"toc":11768},[11635,11637,11639,11641,11643,11647,11653,11655,11669,11671,11673,11717,11719,11724,11726,11728,11738,11740,11752,11754,11760,11762,11764,11766],[10,11636,4656],{},[14,11638,16],{"id":16},[10,11640,4661],{},[14,11642,22],{"id":22},[10,11644,11645],{},[26,11646],{"alt":4668,"src":4669},[10,11648,11649,4675,11651,4679],{},[46,11650,4674],{},[46,11652,4678],{},[14,11654,35],{"id":35},[37,11656,11657,11659,11665],{},[40,11658,4686],{},[40,11660,11661,4691,11663,4694],{},[46,11662,4674],{},[46,11664,4328],{},[40,11666,4697,11667,4700],{},[46,11668,4678],{},[14,11670,58],{"id":58},[10,11672,61],{},[63,11674,11675],{"className":65,"code":4707,"language":67,"meta":68,"style":68},[46,11676,11677,11681,11685,11689,11693,11697,11701,11705,11709,11713],{"__ignoreMap":68},[72,11678,11679],{"class":74,"line":75},[72,11680,4714],{},[72,11682,11683],{"class":74,"line":81},[72,11684,91],{"emptyLinePlaceholder":90},[72,11686,11687],{"class":74,"line":87},[72,11688,4723],{},[72,11690,11691],{"class":74,"line":94},[72,11692,4728],{},[72,11694,11695],{"class":74,"line":100},[72,11696,4733],{},[72,11698,11699],{"class":74,"line":106},[72,11700,4738],{},[72,11702,11703],{"class":74,"line":111},[72,11704,4743],{},[72,11706,11707],{"class":74,"line":117},[72,11708,4568],{},[72,11710,11711],{"class":74,"line":123},[72,11712,91],{"emptyLinePlaceholder":90},[72,11714,11715],{"class":74,"line":128},[72,11716,4756],{},[10,11718,134],{},[63,11720,11722],{"className":11721,"code":4762,"language":140,"meta":68},[138],[46,11723,4762],{"__ignoreMap":68},[10,11725,145],{},[14,11727,148],{"id":148},[150,11729,11730,11734],{},[40,11731,4773,11732,4776],{},[46,11733,4674],{},[40,11735,4779,11736,4782],{},[46,11737,4678],{},[14,11739,187],{"id":187},[37,11741,11742,11746],{},[40,11743,3475,11744,4791],{},[46,11745,4674],{},[40,11747,4794,11748,4797,11750,4800],{},[46,11749,4328],{},[46,11751,4674],{},[14,11753,202],{"id":202},[150,11755,11756,11758],{},[40,11757,4807],{},[40,11759,4810],{},[10,11761,213],{},[14,11763,216],{"id":216},[10,11765,4817],{},[221,11767,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11769},[11770,11771,11772,11773,11774,11775,11776,11777],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":4651,"description":4656},[236,4678,4674],{"id":4839,"title":4840,"body":11782,"category":236,"cover":237,"description":4845,"extension":238,"meta":11921,"navigation":90,"path":5017,"pinned":241,"publishedAt":242,"seo":11922,"slug":5019,"stem":5020,"summary":5021,"tags":11923,"updatedAt":242,"visible":90,"__hash__":5025},{"type":7,"value":11783,"toc":11909},[11784,11786,11788,11790,11792,11796,11798,11800,11816,11818,11820,11848,11850,11855,11857,11859,11871,11873,11875,11879,11881,11883,11893,11895,11901,11903,11905,11907],[10,11785,4845],{},[14,11787,16],{"id":16},[10,11789,4850],{},[14,11791,22],{"id":22},[10,11793,11794],{},[26,11795],{"alt":4857,"src":4858},[10,11797,4861],{},[14,11799,35],{"id":35},[37,11801,11802,11804,11806],{},[40,11803,4868],{},[40,11805,4871],{},[40,11807,4874,11808,2266,11810,4881,11812,2266,11814,168],{},[46,11809,4877],{},[46,11811,4880],{},[46,11813,4884],{},[46,11815,4887],{},[14,11817,58],{"id":58},[10,11819,61],{},[63,11821,11822],{"className":65,"code":4894,"language":67,"meta":68,"style":68},[46,11823,11824,11828,11832,11836,11840,11844],{"__ignoreMap":68},[72,11825,11826],{"class":74,"line":75},[72,11827,4901],{},[72,11829,11830],{"class":74,"line":81},[72,11831,91],{"emptyLinePlaceholder":90},[72,11833,11834],{"class":74,"line":87},[72,11835,4910],{},[72,11837,11838],{"class":74,"line":94},[72,11839,4915],{},[72,11841,11842],{"class":74,"line":100},[72,11843,4920],{},[72,11845,11846],{"class":74,"line":106},[72,11847,4925],{},[10,11849,134],{},[63,11851,11853],{"className":11852,"code":4931,"language":140,"meta":68},[138],[46,11854,4931],{"__ignoreMap":68},[10,11856,145],{},[14,11858,148],{"id":148},[150,11860,11861,11869],{},[40,11862,4942,11863,4945,11865,1166,11867,168],{},[46,11864,4877],{},[46,11866,4948],{},[46,11868,4951],{},[40,11870,4954],{},[170,11872,172],{"id":172},[10,11874,4959],{},[10,11876,11877],{},[26,11878],{"alt":4964,"src":4965},[10,11880,4968],{},[14,11882,187],{"id":187},[37,11884,11885,11891],{},[40,11886,4975,11887,1018,11889,4981],{},[46,11888,4978],{},[46,11890,4884],{},[40,11892,4984],{},[14,11894,202],{"id":202},[150,11896,11897,11899],{},[40,11898,4991],{},[40,11900,4994],{},[10,11902,213],{},[14,11904,216],{"id":216},[10,11906,5001],{},[221,11908,223],{},{"title":68,"searchDepth":81,"depth":81,"links":11910},[11911,11912,11913,11914,11915,11918,11919,11920],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":11916},[11917],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":4840,"description":4845},[236,5023,5024],{"id":5027,"title":5028,"body":11925,"category":236,"cover":237,"description":5033,"extension":238,"meta":12042,"navigation":90,"path":5172,"pinned":241,"publishedAt":242,"seo":12043,"slug":5174,"stem":5175,"summary":5176,"tags":12044,"updatedAt":242,"visible":90,"__hash__":5180},{"type":7,"value":11926,"toc":12032},[11927,11929,11931,11933,11935,11939,11941,11943,11951,11953,11955,11987,11989,11994,11996,11998,12006,12008,12016,12018,12024,12026,12028,12030],[10,11928,5033],{},[14,11930,16],{"id":16},[10,11932,5038],{},[14,11934,22],{"id":22},[10,11936,11937],{},[26,11938],{"alt":5045,"src":5046},[10,11940,5049],{},[14,11942,35],{"id":35},[37,11944,11945,11947,11949],{},[40,11946,5056],{},[40,11948,5059],{},[40,11950,5062],{},[14,11952,58],{"id":58},[10,11954,61],{},[63,11956,11957],{"className":65,"code":5069,"language":67,"meta":68,"style":68},[46,11958,11959,11963,11967,11971,11975,11979,11983],{"__ignoreMap":68},[72,11960,11961],{"class":74,"line":75},[72,11962,5076],{},[72,11964,11965],{"class":74,"line":81},[72,11966,91],{"emptyLinePlaceholder":90},[72,11968,11969],{"class":74,"line":87},[72,11970,5085],{},[72,11972,11973],{"class":74,"line":94},[72,11974,5090],{},[72,11976,11977],{"class":74,"line":100},[72,11978,91],{"emptyLinePlaceholder":90},[72,11980,11981],{"class":74,"line":106},[72,11982,5099],{},[72,11984,11985],{"class":74,"line":111},[72,11986,5104],{},[10,11988,134],{},[63,11990,11992],{"className":11991,"code":5110,"language":140,"meta":68},[138],[46,11993,5110],{"__ignoreMap":68},[10,11995,145],{},[14,11997,148],{"id":148},[150,11999,12000,12002],{},[40,12001,5121],{},[40,12003,5124,12004,5128],{},[46,12005,5127],{},[14,12007,187],{"id":187},[37,12009,12010,12014],{},[40,12011,5135,12012,5138],{},[46,12013,4345],{},[40,12015,5141],{},[14,12017,202],{"id":202},[150,12019,12020,12022],{},[40,12021,5148],{},[40,12023,5151],{},[10,12025,213],{},[14,12027,216],{"id":216},[10,12029,5158],{},[221,12031,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12033},[12034,12035,12036,12037,12038,12039,12040,12041],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5028,"description":5033},[236,5178,5179],{"id":5182,"title":5183,"body":12046,"category":236,"cover":237,"description":5188,"extension":238,"meta":12165,"navigation":90,"path":5332,"pinned":241,"publishedAt":242,"seo":12166,"slug":5334,"stem":5335,"summary":5336,"tags":12167,"updatedAt":242,"visible":90,"__hash__":5340},{"type":7,"value":12047,"toc":12155},[12048,12050,12052,12054,12056,12060,12062,12064,12072,12074,12076,12108,12110,12115,12117,12119,12129,12131,12137,12139,12147,12149,12151,12153],[10,12049,5188],{},[14,12051,16],{"id":16},[10,12053,5193],{},[14,12055,22],{"id":22},[10,12057,12058],{},[26,12059],{"alt":5200,"src":5201},[10,12061,5204],{},[14,12063,35],{"id":35},[37,12065,12066,12068,12070],{},[40,12067,5211],{},[40,12069,5214],{},[40,12071,5217],{},[14,12073,58],{"id":58},[10,12075,61],{},[63,12077,12078],{"className":65,"code":5224,"language":67,"meta":68,"style":68},[46,12079,12080,12084,12088,12092,12096,12100,12104],{"__ignoreMap":68},[72,12081,12082],{"class":74,"line":75},[72,12083,5231],{},[72,12085,12086],{"class":74,"line":81},[72,12087,5236],{},[72,12089,12090],{"class":74,"line":87},[72,12091,5241],{},[72,12093,12094],{"class":74,"line":94},[72,12095,91],{"emptyLinePlaceholder":90},[72,12097,12098],{"class":74,"line":100},[72,12099,5250],{},[72,12101,12102],{"class":74,"line":106},[72,12103,5255],{},[72,12105,12106],{"class":74,"line":111},[72,12107,5260],{},[10,12109,134],{},[63,12111,12113],{"className":12112,"code":5266,"language":140,"meta":68},[138],[46,12114,5266],{"__ignoreMap":68},[10,12116,145],{},[14,12118,148],{"id":148},[150,12120,12121,12125],{},[40,12122,947,12123,5280],{},[46,12124,5279],{},[40,12126,5283,12127,5287],{},[46,12128,5286],{},[14,12130,187],{"id":187},[37,12132,12133,12135],{},[40,12134,5294],{},[40,12136,5297],{},[14,12138,202],{"id":202},[150,12140,12141,12145],{},[40,12142,5304,12143,5308],{},[46,12144,5307],{},[40,12146,5311],{},[10,12148,213],{},[14,12150,216],{"id":216},[10,12152,5318],{},[221,12154,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12156},[12157,12158,12159,12160,12161,12162,12163,12164],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5183,"description":5188},[236,5338,5339],{"id":5342,"title":5343,"body":12169,"category":236,"cover":237,"description":5348,"extension":238,"meta":12314,"navigation":90,"path":5528,"pinned":241,"publishedAt":242,"seo":12315,"slug":5530,"stem":5531,"summary":5532,"tags":12316,"updatedAt":242,"visible":90,"__hash__":5536},{"type":7,"value":12170,"toc":12302},[12171,12173,12175,12177,12179,12183,12187,12189,12201,12203,12205,12233,12235,12240,12242,12244,12258,12260,12262,12266,12274,12276,12286,12288,12294,12296,12298,12300],[10,12172,5348],{},[14,12174,16],{"id":16},[10,12176,5353],{},[14,12178,22],{"id":22},[10,12180,12181],{},[26,12182],{"alt":5360,"src":5361},[10,12184,5364,12185,5368],{},[46,12186,5367],{},[14,12188,35],{"id":35},[37,12190,12191,12193,12195],{},[40,12192,5375],{},[40,12194,5378],{},[40,12196,5381,12197,5384,12199,168],{},[46,12198,5367],{},[46,12200,195],{},[14,12202,58],{"id":58},[10,12204,61],{},[63,12206,12207],{"className":65,"code":5393,"language":67,"meta":68,"style":68},[46,12208,12209,12213,12217,12221,12225,12229],{"__ignoreMap":68},[72,12210,12211],{"class":74,"line":75},[72,12212,5400],{},[72,12214,12215],{"class":74,"line":81},[72,12216,5405],{},[72,12218,12219],{"class":74,"line":87},[72,12220,5410],{},[72,12222,12223],{"class":74,"line":94},[72,12224,91],{"emptyLinePlaceholder":90},[72,12226,12227],{"class":74,"line":100},[72,12228,5419],{},[72,12230,12231],{"class":74,"line":106},[72,12232,5424],{},[10,12234,134],{},[63,12236,12238],{"className":12237,"code":5430,"language":140,"meta":68},[138],[46,12239,5430],{"__ignoreMap":68},[10,12241,145],{},[14,12243,148],{"id":148},[150,12245,12246,12252],{},[40,12247,5441,12248,2266,12250,5447],{},[46,12249,5444],{},[46,12251,4408],{},[40,12253,12254,5453,12256,5457],{},[46,12255,5452],{},[46,12257,5456],{},[170,12259,172],{"id":172},[10,12261,5462],{},[10,12263,12264],{},[26,12265],{"alt":5467,"src":5468},[10,12267,12268,2266,12270,1166,12272,5478],{},[46,12269,5444],{},[46,12271,4408],{},[46,12273,5477],{},[14,12275,187],{"id":187},[37,12277,12278,12282],{},[40,12279,5485,12280,5489],{},[46,12281,5488],{},[40,12283,5492,12284,5495],{},[46,12285,5477],{},[14,12287,202],{"id":202},[150,12289,12290,12292],{},[40,12291,5502],{},[40,12293,5505],{},[10,12295,213],{},[14,12297,216],{"id":216},[10,12299,5512],{},[221,12301,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12303},[12304,12305,12306,12307,12308,12311,12312,12313],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":12309},[12310],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5343,"description":5348},[236,5534,5535],{"id":4,"title":5,"body":12318,"category":236,"cover":237,"description":12,"extension":238,"meta":12467,"navigation":90,"path":240,"pinned":241,"publishedAt":242,"seo":12468,"slug":244,"stem":245,"summary":246,"tags":12469,"updatedAt":242,"visible":90,"__hash__":250},{"type":7,"value":12319,"toc":12455},[12320,12322,12324,12326,12328,12332,12334,12336,12348,12350,12352,12396,12398,12403,12405,12407,12419,12421,12423,12427,12429,12431,12439,12441,12447,12449,12451,12453],[10,12321,12],{},[14,12323,16],{"id":16},[10,12325,19],{},[14,12327,22],{"id":22},[10,12329,12330],{},[26,12331],{"alt":28,"src":29},[10,12333,32],{},[14,12335,35],{"id":35},[37,12337,12338,12340,12344],{},[40,12339,42],{},[40,12341,12342,49],{},[46,12343,48],{},[40,12345,12346,55],{},[46,12347,54],{},[14,12349,58],{"id":58},[10,12351,61],{},[63,12353,12354],{"className":65,"code":66,"language":67,"meta":68,"style":68},[46,12355,12356,12360,12364,12368,12372,12376,12380,12384,12388,12392],{"__ignoreMap":68},[72,12357,12358],{"class":74,"line":75},[72,12359,78],{},[72,12361,12362],{"class":74,"line":81},[72,12363,84],{},[72,12365,12366],{"class":74,"line":87},[72,12367,91],{"emptyLinePlaceholder":90},[72,12369,12370],{"class":74,"line":94},[72,12371,97],{},[72,12373,12374],{"class":74,"line":100},[72,12375,103],{},[72,12377,12378],{"class":74,"line":106},[72,12379,91],{"emptyLinePlaceholder":90},[72,12381,12382],{"class":74,"line":111},[72,12383,114],{},[72,12385,12386],{"class":74,"line":117},[72,12387,120],{},[72,12389,12390],{"class":74,"line":123},[72,12391,91],{"emptyLinePlaceholder":90},[72,12393,12394],{"class":74,"line":128},[72,12395,131],{},[10,12397,134],{},[63,12399,12401],{"className":12400,"code":139,"language":140,"meta":68},[138],[46,12402,139],{"__ignoreMap":68},[10,12404,145],{},[14,12406,148],{"id":148},[150,12408,12409,12413],{},[40,12410,154,12411,158],{},[46,12412,157],{},[40,12414,12415,164,12417,168],{},[46,12416,163],{},[46,12418,167],{},[170,12420,172],{"id":172},[10,12422,175],{},[10,12424,12425],{},[26,12426],{"alt":180,"src":181},[10,12428,184],{},[14,12430,187],{"id":187},[37,12432,12433,12437],{},[40,12434,192,12435,196],{},[46,12436,195],{},[40,12438,199],{},[14,12440,202],{"id":202},[150,12442,12443,12445],{},[40,12444,207],{},[40,12446,210],{},[10,12448,213],{},[14,12450,216],{"id":216},[10,12452,219],{},[221,12454,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12456},[12457,12458,12459,12460,12461,12464,12465,12466],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":12462},[12463],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5,"description":12},[236,248,249],{"id":5691,"title":5692,"body":12471,"category":236,"cover":237,"description":5697,"extension":238,"meta":12632,"navigation":90,"path":5895,"pinned":241,"publishedAt":242,"seo":12633,"slug":5897,"stem":5898,"summary":5899,"tags":12634,"updatedAt":242,"visible":90,"__hash__":5903},{"type":7,"value":12472,"toc":12620},[12473,12475,12477,12479,12481,12485,12487,12489,12501,12503,12505,12557,12559,12564,12566,12568,12586,12588,12590,12594,12596,12598,12604,12606,12612,12614,12616,12618],[10,12474,5697],{},[14,12476,16],{"id":16},[10,12478,5702],{},[14,12480,22],{"id":22},[10,12482,12483],{},[26,12484],{"alt":5709,"src":5710},[10,12486,5713],{},[14,12488,35],{"id":35},[37,12490,12491,12493,12495],{},[40,12492,5720],{},[40,12494,5723],{},[40,12496,12497,2185,12499,5732],{},[46,12498,5728],{},[46,12500,5731],{},[14,12502,58],{"id":58},[10,12504,61],{},[63,12506,12507],{"className":65,"code":5739,"language":67,"meta":68,"style":68},[46,12508,12509,12513,12517,12521,12525,12529,12533,12537,12541,12545,12549,12553],{"__ignoreMap":68},[72,12510,12511],{"class":74,"line":75},[72,12512,5746],{},[72,12514,12515],{"class":74,"line":81},[72,12516,91],{"emptyLinePlaceholder":90},[72,12518,12519],{"class":74,"line":87},[72,12520,5755],{},[72,12522,12523],{"class":74,"line":94},[72,12524,5760],{},[72,12526,12527],{"class":74,"line":100},[72,12528,91],{"emptyLinePlaceholder":90},[72,12530,12531],{"class":74,"line":106},[72,12532,5769],{},[72,12534,12535],{"class":74,"line":111},[72,12536,5774],{},[72,12538,12539],{"class":74,"line":117},[72,12540,5779],{},[72,12542,12543],{"class":74,"line":123},[72,12544,91],{"emptyLinePlaceholder":90},[72,12546,12547],{"class":74,"line":128},[72,12548,5788],{},[72,12550,12551],{"class":74,"line":5791},[72,12552,91],{"emptyLinePlaceholder":90},[72,12554,12555],{"class":74,"line":5796},[72,12556,5799],{},[10,12558,134],{},[63,12560,12562],{"className":12561,"code":5805,"language":140,"meta":68},[138],[46,12563,5805],{"__ignoreMap":68},[10,12565,145],{},[14,12567,148],{"id":148},[150,12569,12570,12580],{},[40,12571,12572,5819,12574,5823,12576,5826,12578,5830],{},[46,12573,5818],{},[46,12575,5822],{},[46,12577,157],{},[46,12579,5829],{},[40,12581,12582,5835,12584,5838],{},[46,12583,4591],{},[46,12585,2217],{},[170,12587,172],{"id":172},[10,12589,5843],{},[10,12591,12592],{},[26,12593],{"alt":5848,"src":5849},[10,12595,5852],{},[14,12597,187],{"id":187},[37,12599,12600,12602],{},[40,12601,5859],{},[40,12603,5862],{},[14,12605,202],{"id":202},[150,12607,12608,12610],{},[40,12609,5869],{},[40,12611,5872],{},[10,12613,213],{},[14,12615,216],{"id":216},[10,12617,5879],{},[221,12619,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12621},[12622,12623,12624,12625,12626,12629,12630,12631],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":12627},[12628],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5692,"description":5697},[236,5901,5902],{"id":5905,"title":5906,"body":12636,"category":236,"cover":237,"description":5911,"extension":238,"meta":12759,"navigation":90,"path":6062,"pinned":241,"publishedAt":242,"seo":12760,"slug":6064,"stem":6065,"summary":6066,"tags":12761,"updatedAt":242,"visible":90,"__hash__":6070},{"type":7,"value":12637,"toc":12749},[12638,12640,12642,12644,12646,12650,12652,12654,12668,12670,12672,12700,12702,12707,12709,12711,12721,12723,12731,12733,12741,12743,12745,12747],[10,12639,5911],{},[14,12641,16],{"id":16},[10,12643,5916],{},[14,12645,22],{"id":22},[10,12647,12648],{},[26,12649],{"alt":5923,"src":5924},[10,12651,5927],{},[14,12653,35],{"id":35},[37,12655,12656,12658,12660],{},[40,12657,5934],{},[40,12659,5937],{},[40,12661,5940,12662,2266,12664,2266,12666,5948],{},[46,12663,2269],{},[46,12665,2435],{},[46,12667,5947],{},[14,12669,58],{"id":58},[10,12671,61],{},[63,12673,12674],{"className":65,"code":5955,"language":67,"meta":68,"style":68},[46,12675,12676,12680,12684,12688,12692,12696],{"__ignoreMap":68},[72,12677,12678],{"class":74,"line":75},[72,12679,5962],{},[72,12681,12682],{"class":74,"line":81},[72,12683,5967],{},[72,12685,12686],{"class":74,"line":87},[72,12687,5972],{},[72,12689,12690],{"class":74,"line":94},[72,12691,91],{"emptyLinePlaceholder":90},[72,12693,12694],{"class":74,"line":100},[72,12695,5981],{},[72,12697,12698],{"class":74,"line":106},[72,12699,5986],{},[10,12701,134],{},[63,12703,12705],{"className":12704,"code":5992,"language":140,"meta":68},[138],[46,12706,5992],{"__ignoreMap":68},[10,12708,145],{},[14,12710,148],{"id":148},[150,12712,12713,12719],{},[40,12714,6003,12715,6007,12717,6010],{},[46,12716,6006],{},[46,12718,2255],{},[40,12720,6013],{},[14,12722,187],{"id":187},[37,12724,12725,12729],{},[40,12726,6020,12727,6024],{},[46,12728,6023],{},[40,12730,6027],{},[14,12732,202],{"id":202},[150,12734,12735,12737],{},[40,12736,6034],{},[40,12738,6037,12739,6041],{},[46,12740,6040],{},[10,12742,213],{},[14,12744,216],{"id":216},[10,12746,6048],{},[221,12748,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12750},[12751,12752,12753,12754,12755,12756,12757,12758],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":5906,"description":5911},[236,6068,6069],{"id":6072,"title":6073,"body":12763,"category":236,"cover":237,"description":6078,"extension":238,"meta":12940,"navigation":90,"path":6306,"pinned":241,"publishedAt":242,"seo":12941,"slug":6308,"stem":6309,"summary":6310,"tags":12942,"updatedAt":242,"visible":90,"__hash__":6314},{"type":7,"value":12764,"toc":12928},[12765,12767,12769,12773,12775,12779,12785,12787,12799,12801,12805,12829,12833,12849,12855,12857,12862,12864,12866,12882,12884,12886,12890,12894,12896,12908,12910,12920,12922,12924,12926],[10,12766,6078],{},[14,12768,16],{"id":16},[10,12770,6083,12771,6086],{},[305,12772,6006],{},[14,12774,22],{"id":22},[10,12776,12777],{},[26,12778],{"alt":6093,"src":6094},[10,12780,6097,12781,6101,12783,6105],{},[46,12782,6100],{},[46,12784,6104],{},[14,12786,35],{"id":35},[37,12788,12789,12793,12795],{},[40,12790,6112,12791,6115],{},[46,12792,1180],{},[40,12794,6118],{},[40,12796,6121,12797,6125],{},[46,12798,6124],{},[14,12800,58],{"id":58},[10,12802,6130,12803,6134],{},[46,12804,6133],{},[63,12806,12807],{"className":65,"code":6137,"language":67,"meta":68,"style":68},[46,12808,12809,12813,12817,12821,12825],{"__ignoreMap":68},[72,12810,12811],{"class":74,"line":75},[72,12812,6144],{},[72,12814,12815],{"class":74,"line":81},[72,12816,6149],{},[72,12818,12819],{"class":74,"line":87},[72,12820,91],{"emptyLinePlaceholder":90},[72,12822,12823],{"class":74,"line":94},[72,12824,6158],{},[72,12826,12827],{"class":74,"line":100},[72,12828,6163],{},[10,12830,6166,12831,6170],{},[46,12832,6169],{},[63,12834,12835],{"className":65,"code":6173,"language":67,"meta":68,"style":68},[46,12836,12837,12841,12845],{"__ignoreMap":68},[72,12838,12839],{"class":74,"line":75},[72,12840,6180],{},[72,12842,12843],{"class":74,"line":81},[72,12844,91],{"emptyLinePlaceholder":90},[72,12846,12847],{"class":74,"line":87},[72,12848,6189],{},[10,12850,6192,12851,1166,12853,168],{},[46,12852,6195],{},[46,12854,6198],{},[10,12856,134],{},[63,12858,12860],{"className":12859,"code":6204,"language":140,"meta":68},[138],[46,12861,6204],{"__ignoreMap":68},[10,12863,145],{},[14,12865,148],{"id":148},[150,12867,12868,12874],{},[40,12869,6215,12870,6218,12872,6222],{},[46,12871,6133],{},[46,12873,6221],{},[40,12875,12876,6227,12878,6230,12880,6233],{},[46,12877,6169],{},[46,12879,6133],{},[46,12881,6169],{},[170,12883,172],{"id":172},[10,12885,6238],{},[10,12887,12888],{},[26,12889],{"alt":6243,"src":6244},[10,12891,6247,12892,6250],{},[46,12893,6221],{},[14,12895,187],{"id":187},[37,12897,12898,12904],{},[40,12899,6257,12900,1166,12902,168],{},[46,12901,6133],{},[46,12903,6169],{},[40,12905,6264,12906,6268],{},[46,12907,6267],{},[14,12909,202],{"id":202},[150,12911,12912,12916],{},[40,12913,2363,12914,6278],{},[46,12915,6277],{},[40,12917,6281,12918,168],{},[46,12919,6100],{},[10,12921,213],{},[14,12923,216],{"id":216},[10,12925,6290],{},[221,12927,223],{},{"title":68,"searchDepth":81,"depth":81,"links":12929},[12930,12931,12932,12933,12934,12937,12938,12939],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":12935},[12936],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":6073,"description":6078},[236,6312,6313],{"id":6316,"title":6317,"body":12944,"category":236,"cover":237,"description":6322,"extension":238,"meta":13083,"navigation":90,"path":6488,"pinned":241,"publishedAt":242,"seo":13084,"slug":6490,"stem":6491,"summary":6492,"tags":13085,"updatedAt":242,"visible":90,"__hash__":6495},{"type":7,"value":12945,"toc":13073},[12946,12948,12950,12952,12954,12958,12960,12962,12972,12974,12976,13016,13018,13023,13025,13027,13045,13047,13055,13057,13065,13067,13069,13071],[10,12947,6322],{},[14,12949,16],{"id":16},[10,12951,6327],{},[14,12953,22],{"id":22},[10,12955,12956],{},[26,12957],{"alt":6334,"src":6335},[10,12959,6338],{},[14,12961,35],{"id":35},[37,12963,12964,12968,12970],{},[40,12965,12966,6348],{},[46,12967,6347],{},[40,12969,6351],{},[40,12971,6354],{},[14,12973,58],{"id":58},[10,12975,1583],{},[63,12977,12978],{"className":600,"code":6361,"language":602,"meta":68,"style":68},[46,12979,12980,12990,12996,13002,13012],{"__ignoreMap":68},[72,12981,12982,12984,12986,12988],{"class":74,"line":75},[72,12983,700],{"class":609},[72,12985,642],{"class":612},[72,12987,6372],{"class":645},[72,12989,6375],{"class":645},[72,12991,12992,12994],{"class":74,"line":81},[72,12993,6380],{"class":612},[72,12995,6383],{"class":645},[72,12997,12998,13000],{"class":74,"line":87},[72,12999,67],{"class":609},[72,13001,613],{"class":612},[72,13003,13004,13006,13008,13010],{"class":74,"line":94},[72,13005,67],{"class":609},[72,13007,642],{"class":612},[72,13009,646],{"class":645},[72,13011,613],{"class":612},[72,13013,13014],{"class":74,"line":100},[72,13015,6404],{"class":609},[10,13017,134],{},[63,13019,13021],{"className":13020,"code":6410,"language":140,"meta":68},[138],[46,13022,6410],{"__ignoreMap":68},[10,13024,145],{},[14,13026,148],{"id":148},[150,13028,13029,13035],{},[40,13030,13031,6424,13033,6427],{},[46,13032,6423],{},[46,13034,700],{},[40,13036,6430,13037,2185,13039,6436,13041,3736,13043,6442],{},[46,13038,67],{},[46,13040,6435],{},[46,13042,6347],{},[46,13044,6441],{},[14,13046,187],{"id":187},[37,13048,13049,13051],{},[40,13050,6449],{},[40,13052,3475,13053,6454],{},[46,13054,6347],{},[14,13056,202],{"id":202},[150,13058,13059,13063],{},[40,13060,6461,13061,168],{},[46,13062,6464],{},[40,13064,6467],{},[10,13066,213],{},[14,13068,216],{"id":216},[10,13070,6474],{},[221,13072,1667],{},{"title":68,"searchDepth":81,"depth":81,"links":13074},[13075,13076,13077,13078,13079,13080,13081,13082],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":6317,"description":6322},[236,6494,271],{"id":6497,"title":6498,"body":13087,"category":236,"cover":237,"description":6503,"extension":238,"meta":13240,"navigation":90,"path":6692,"pinned":241,"publishedAt":242,"seo":13241,"slug":6694,"stem":6695,"summary":6696,"tags":13242,"updatedAt":242,"visible":90,"__hash__":6700},{"type":7,"value":13088,"toc":13230},[13089,13091,13093,13095,13097,13101,13107,13109,13125,13127,13129,13173,13175,13180,13182,13184,13196,13198,13212,13214,13222,13224,13226,13228],[10,13090,6503],{},[14,13092,16],{"id":16},[10,13094,6508],{},[14,13096,22],{"id":22},[10,13098,13099],{},[26,13100],{"alt":6515,"src":6516},[10,13102,13103,6522,13105,6525],{},[46,13104,6521],{},[46,13106,2445],{},[14,13108,35],{"id":35},[37,13110,13111,13113,13121],{},[40,13112,6532],{},[40,13114,13115,2266,13117,2266,13119,6544],{},[46,13116,6537],{},[46,13118,6540],{},[46,13120,6543],{},[40,13122,6547,13123,6551],{},[46,13124,6550],{},[14,13126,58],{"id":58},[10,13128,61],{},[63,13130,13131],{"className":65,"code":6558,"language":67,"meta":68,"style":68},[46,13132,13133,13137,13141,13145,13149,13153,13157,13161,13165,13169],{"__ignoreMap":68},[72,13134,13135],{"class":74,"line":75},[72,13136,6565],{},[72,13138,13139],{"class":74,"line":81},[72,13140,91],{"emptyLinePlaceholder":90},[72,13142,13143],{"class":74,"line":87},[72,13144,6574],{},[72,13146,13147],{"class":74,"line":94},[72,13148,6579],{},[72,13150,13151],{"class":74,"line":100},[72,13152,6584],{},[72,13154,13155],{"class":74,"line":106},[72,13156,91],{"emptyLinePlaceholder":90},[72,13158,13159],{"class":74,"line":111},[72,13160,6593],{},[72,13162,13163],{"class":74,"line":117},[72,13164,6598],{},[72,13166,13167],{"class":74,"line":123},[72,13168,6603],{},[72,13170,13171],{"class":74,"line":128},[72,13172,6608],{},[10,13174,134],{},[63,13176,13178],{"className":13177,"code":6614,"language":140,"meta":68},[138],[46,13179,6614],{"__ignoreMap":68},[10,13181,145],{},[14,13183,148],{"id":148},[150,13185,13186,13190],{},[40,13187,13188,6628],{},[46,13189,6627],{},[40,13191,2348,13192,6633,13194,6636],{},[46,13193,2445],{},[46,13195,6521],{},[14,13197,187],{"id":187},[37,13199,13200,13206],{},[40,13201,3475,13202,6645,13204,6648],{},[46,13203,6521],{},[46,13205,6537],{},[40,13207,6651,13208,1018,13210,6657],{},[46,13209,2445],{},[46,13211,6656],{},[14,13213,202],{"id":202},[150,13215,13216,13220],{},[40,13217,6664,13218,6668],{},[46,13219,6667],{},[40,13221,6671],{},[10,13223,213],{},[14,13225,216],{"id":216},[10,13227,6678],{},[221,13229,223],{},{"title":68,"searchDepth":81,"depth":81,"links":13231},[13232,13233,13234,13235,13236,13237,13238,13239],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":6498,"description":6503},[236,6698,6699],{"id":6702,"title":6703,"body":13244,"category":236,"cover":237,"description":6708,"extension":238,"meta":13391,"navigation":90,"path":6887,"pinned":241,"publishedAt":242,"seo":13392,"slug":6889,"stem":6890,"summary":6891,"tags":13393,"updatedAt":242,"visible":90,"__hash__":6895},{"type":7,"value":13245,"toc":13381},[13246,13248,13250,13252,13254,13258,13260,13262,13280,13282,13284,13332,13334,13339,13341,13343,13351,13353,13363,13365,13373,13375,13377,13379],[10,13247,6708],{},[14,13249,16],{"id":16},[10,13251,6713],{},[14,13253,22],{"id":22},[10,13255,13256],{},[26,13257],{"alt":6720,"src":6721},[10,13259,6724],{},[14,13261,35],{"id":35},[37,13263,13264,13268,13274],{},[40,13265,13266,6734],{},[46,13267,6733],{},[40,13269,13270,6740,13272,168],{},[46,13271,6739],{},[46,13273,6743],{},[40,13275,6746,13276,6750,13278,6754],{},[46,13277,6749],{},[46,13279,6753],{},[14,13281,58],{"id":58},[10,13283,61],{},[63,13285,13286],{"className":65,"code":6761,"language":67,"meta":68,"style":68},[46,13287,13288,13292,13296,13300,13304,13308,13312,13316,13320,13324,13328],{"__ignoreMap":68},[72,13289,13290],{"class":74,"line":75},[72,13291,6565],{},[72,13293,13294],{"class":74,"line":81},[72,13295,91],{"emptyLinePlaceholder":90},[72,13297,13298],{"class":74,"line":87},[72,13299,6776],{},[72,13301,13302],{"class":74,"line":94},[72,13303,6781],{},[72,13305,13306],{"class":74,"line":100},[72,13307,6786],{},[72,13309,13310],{"class":74,"line":106},[72,13311,6791],{},[72,13313,13314],{"class":74,"line":111},[72,13315,91],{"emptyLinePlaceholder":90},[72,13317,13318],{"class":74,"line":117},[72,13319,6800],{},[72,13321,13322],{"class":74,"line":123},[72,13323,6805],{},[72,13325,13326],{"class":74,"line":128},[72,13327,6810],{},[72,13329,13330],{"class":74,"line":5791},[72,13331,6815],{},[10,13333,134],{},[63,13335,13337],{"className":13336,"code":6821,"language":140,"meta":68},[138],[46,13338,6821],{"__ignoreMap":68},[10,13340,145],{},[14,13342,148],{"id":148},[150,13344,13345,13349],{},[40,13346,6832,13347,6835],{},[46,13348,6749],{},[40,13350,6838],{},[14,13352,187],{"id":187},[37,13354,13355,13359],{},[40,13356,2348,13357,6847],{},[46,13358,6733],{},[40,13360,6850,13361,168],{},[46,13362,6853],{},[14,13364,202],{"id":202},[150,13366,13367,13369],{},[40,13368,6860],{},[40,13370,6863,13371,6866],{},[46,13372,346],{},[10,13374,213],{},[14,13376,216],{"id":216},[10,13378,6873],{},[221,13380,223],{},{"title":68,"searchDepth":81,"depth":81,"links":13382},[13383,13384,13385,13386,13387,13388,13389,13390],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":6703,"description":6708},[236,6893,6894],{"id":6897,"title":6898,"body":13395,"category":236,"cover":237,"description":6903,"extension":238,"meta":13538,"navigation":90,"path":7071,"pinned":241,"publishedAt":242,"seo":13539,"slug":7073,"stem":7074,"summary":7075,"tags":13540,"updatedAt":242,"visible":90,"__hash__":7079},{"type":7,"value":13396,"toc":13528},[13397,13399,13401,13403,13405,13409,13415,13417,13427,13429,13431,13483,13485,13490,13492,13494,13504,13506,13512,13514,13520,13522,13524,13526],[10,13398,6903],{},[14,13400,16],{"id":16},[10,13402,6908],{},[14,13404,22],{"id":22},[10,13406,13407],{},[26,13408],{"alt":6915,"src":6916},[10,13410,13411,6922,13413,6926],{},[46,13412,6921],{},[46,13414,6925],{},[14,13416,35],{"id":35},[37,13418,13419,13421,13425],{},[40,13420,6933],{},[40,13422,13423,6939],{},[46,13424,6938],{},[40,13426,6942],{},[14,13428,58],{"id":58},[10,13430,61],{},[63,13432,13433],{"className":65,"code":6949,"language":67,"meta":68,"style":68},[46,13434,13435,13439,13443,13447,13451,13455,13459,13463,13467,13471,13475,13479],{"__ignoreMap":68},[72,13436,13437],{"class":74,"line":75},[72,13438,6956],{},[72,13440,13441],{"class":74,"line":81},[72,13442,91],{"emptyLinePlaceholder":90},[72,13444,13445],{"class":74,"line":87},[72,13446,6965],{},[72,13448,13449],{"class":74,"line":94},[72,13450,91],{"emptyLinePlaceholder":90},[72,13452,13453],{"class":74,"line":100},[72,13454,6974],{},[72,13456,13457],{"class":74,"line":106},[72,13458,6979],{},[72,13460,13461],{"class":74,"line":111},[72,13462,6791],{},[72,13464,13465],{"class":74,"line":117},[72,13466,91],{"emptyLinePlaceholder":90},[72,13468,13469],{"class":74,"line":123},[72,13470,6992],{},[72,13472,13473],{"class":74,"line":128},[72,13474,6997],{},[72,13476,13477],{"class":74,"line":5791},[72,13478,6810],{},[72,13480,13481],{"class":74,"line":5796},[72,13482,7006],{},[10,13484,134],{},[63,13486,13488],{"className":13487,"code":7012,"language":140,"meta":68},[138],[46,13489,7012],{"__ignoreMap":68},[10,13491,145],{},[14,13493,148],{"id":148},[150,13495,13496,13500],{},[40,13497,13498,7025],{},[46,13499,6921],{},[40,13501,13502,7030],{},[46,13503,6925],{},[14,13505,187],{"id":187},[37,13507,13508,13510],{},[40,13509,7037],{},[40,13511,7040],{},[14,13513,202],{"id":202},[150,13515,13516,13518],{},[40,13517,7047],{},[40,13519,7050],{},[10,13521,213],{},[14,13523,216],{"id":216},[10,13525,7057],{},[221,13527,223],{},{"title":68,"searchDepth":81,"depth":81,"links":13529},[13530,13531,13532,13533,13534,13535,13536,13537],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":6898,"description":6903},[236,7077,7078],{"id":7081,"title":7082,"body":13542,"category":236,"cover":237,"description":7087,"extension":238,"meta":13693,"navigation":90,"path":7272,"pinned":241,"publishedAt":242,"seo":13694,"slug":7274,"stem":7275,"summary":7276,"tags":13695,"updatedAt":242,"visible":90,"__hash__":7280},{"type":7,"value":13543,"toc":13683},[13544,13546,13548,13550,13552,13556,13560,13562,13576,13578,13580,13632,13634,13639,13641,13643,13655,13657,13667,13669,13675,13677,13679,13681],[10,13545,7087],{},[14,13547,16],{"id":16},[10,13549,7092],{},[14,13551,22],{"id":22},[10,13553,13554],{},[26,13555],{"alt":7099,"src":7100},[10,13557,13558,7106],{},[46,13559,7105],{},[14,13561,35],{"id":35},[37,13563,13564,13570,13574],{},[40,13565,2348,13566,7116,13568,7120],{},[46,13567,7115],{},[46,13569,7119],{},[40,13571,7123,13572,7127],{},[46,13573,7126],{},[40,13575,7130],{},[14,13577,58],{"id":58},[10,13579,61],{},[63,13581,13582],{"className":65,"code":7137,"language":67,"meta":68,"style":68},[46,13583,13584,13588,13592,13596,13600,13604,13608,13612,13616,13620,13624,13628],{"__ignoreMap":68},[72,13585,13586],{"class":74,"line":75},[72,13587,7144],{},[72,13589,13590],{"class":74,"line":81},[72,13591,91],{"emptyLinePlaceholder":90},[72,13593,13594],{"class":74,"line":87},[72,13595,7153],{},[72,13597,13598],{"class":74,"line":94},[72,13599,7158],{},[72,13601,13602],{"class":74,"line":100},[72,13603,7163],{},[72,13605,13606],{"class":74,"line":106},[72,13607,7168],{},[72,13609,13610],{"class":74,"line":111},[72,13611,7173],{},[72,13613,13614],{"class":74,"line":117},[72,13615,91],{"emptyLinePlaceholder":90},[72,13617,13618],{"class":74,"line":123},[72,13619,7182],{},[72,13621,13622],{"class":74,"line":128},[72,13623,7187],{},[72,13625,13626],{"class":74,"line":5791},[72,13627,7192],{},[72,13629,13630],{"class":74,"line":5796},[72,13631,7197],{},[10,13633,134],{},[63,13635,13637],{"className":13636,"code":7203,"language":140,"meta":68},[138],[46,13638,7203],{"__ignoreMap":68},[10,13640,145],{},[14,13642,148],{"id":148},[150,13644,13645,13651],{},[40,13646,13647,7217,13649,7220],{},[46,13648,7216],{},[46,13650,7126],{},[40,13652,13653,7225],{},[46,13654,7105],{},[14,13656,187],{"id":187},[37,13658,13659,13661],{},[40,13660,7232],{},[40,13662,7235,13663,7238,13665,7241],{},[46,13664,7115],{},[46,13666,7119],{},[14,13668,202],{"id":202},[150,13670,13671,13673],{},[40,13672,7248],{},[40,13674,7251],{},[10,13676,213],{},[14,13678,216],{"id":216},[10,13680,7258],{},[221,13682,223],{},{"title":68,"searchDepth":81,"depth":81,"links":13684},[13685,13686,13687,13688,13689,13690,13691,13692],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":7082,"description":7087},[236,7278,7279],{"id":7282,"title":7283,"body":13697,"category":236,"cover":237,"description":7288,"extension":238,"meta":13911,"navigation":90,"path":7562,"pinned":241,"publishedAt":242,"seo":13912,"slug":7564,"stem":7565,"summary":7566,"tags":13913,"updatedAt":242,"visible":90,"__hash__":7570},{"type":7,"value":13698,"toc":13898},[13699,13701,13703,13705,13707,13711,13717,13719,13731,13733,13735,13795,13797,13802,13804,13806,13824,13826,13834,13838,13846,13848,13852,13856,13862,13864,13874,13876,13890,13892,13894,13896],[10,13700,7288],{},[14,13702,16],{"id":16},[10,13704,7293],{},[14,13706,22],{"id":22},[10,13708,13709],{},[26,13710],{"alt":7300,"src":7301},[10,13712,7304,13713,7308,13715,7312],{},[46,13714,7307],{},[46,13716,7311],{},[14,13718,35],{"id":35},[37,13720,13721,13725,13729],{},[40,13722,7319,13723,7322],{},[46,13724,7307],{},[40,13726,13727,7328],{},[46,13728,7327],{},[40,13730,7331],{},[14,13732,58],{"id":58},[10,13734,61],{},[63,13736,13737],{"className":65,"code":7338,"language":67,"meta":68,"style":68},[46,13738,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775,13779,13783,13787,13791],{"__ignoreMap":68},[72,13740,13741],{"class":74,"line":75},[72,13742,7345],{},[72,13744,13745],{"class":74,"line":81},[72,13746,7350],{},[72,13748,13749],{"class":74,"line":87},[72,13750,7355],{},[72,13752,13753],{"class":74,"line":94},[72,13754,7360],{},[72,13756,13757],{"class":74,"line":100},[72,13758,7365],{},[72,13760,13761],{"class":74,"line":106},[72,13762,91],{"emptyLinePlaceholder":90},[72,13764,13765],{"class":74,"line":111},[72,13766,7374],{},[72,13768,13769],{"class":74,"line":117},[72,13770,7379],{},[72,13772,13773],{"class":74,"line":123},[72,13774,7384],{},[72,13776,13777],{"class":74,"line":128},[72,13778,7389],{},[72,13780,13781],{"class":74,"line":5791},[72,13782,1155],{},[72,13784,13785],{"class":74,"line":5796},[72,13786,7398],{},[72,13788,13789],{"class":74,"line":7401},[72,13790,7404],{},[72,13792,13793],{"class":74,"line":7407},[72,13794,7410],{},[10,13796,134],{},[63,13798,13800],{"className":13799,"code":7416,"language":140,"meta":68},[138],[46,13801,7416],{"__ignoreMap":68},[10,13803,145],{},[14,13805,148],{"id":148},[150,13807,13808,13816],{},[40,13809,13810,7429,13812,7432,13814,7436],{},[46,13811,3044],{},[46,13813,7327],{},[46,13815,7435],{},[40,13817,7439,13818,7442,13820,7445,13822,168],{},[46,13819,7307],{},[46,13821,1169],{},[46,13823,7311],{},[170,13825,172],{"id":172},[10,13827,13828,2266,13830,1166,13832,7458],{},[46,13829,7307],{},[46,13831,1169],{},[46,13833,7311],{},[10,13835,13836],{},[26,13837],{"alt":7463,"src":7464},[10,13839,13840,7469,13842,7472,13844,7475],{},[46,13841,7307],{},[46,13843,1169],{},[46,13845,7311],{},[170,13847,172],{"id":4226},[10,13849,13850,7483],{},[46,13851,7482],{},[10,13853,13854],{},[26,13855],{"alt":7488,"src":7489},[10,13857,7492,13858,7495,13860,7498],{},[46,13859,7482],{},[46,13861,1169],{},[14,13863,187],{"id":187},[37,13865,13866,13870],{},[40,13867,7505,13868,7509],{},[46,13869,7508],{},[40,13871,7512,13872,7515],{},[46,13873,7482],{},[14,13875,202],{"id":202},[150,13877,13878,13886],{},[40,13879,7522,13880,7526,13882,1166,13884,168],{},[46,13881,7525],{},[46,13883,7529],{},[46,13885,7532],{},[40,13887,7535,13888,7538],{},[46,13889,6743],{},[10,13891,213],{},[14,13893,216],{"id":216},[10,13895,7545],{},[221,13897,223],{},{"title":68,"searchDepth":81,"depth":81,"links":13899},[13900,13901,13902,13903,13904,13908,13909,13910],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":13905},[13906,13907],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":7283,"description":7288},[236,7568,7569],{"id":7572,"title":7573,"body":13915,"category":236,"cover":237,"description":7578,"extension":238,"meta":14066,"navigation":90,"path":7755,"pinned":241,"publishedAt":242,"seo":14067,"slug":7757,"stem":7758,"summary":7759,"tags":14068,"updatedAt":242,"visible":90,"__hash__":7762},{"type":7,"value":13916,"toc":14056},[13917,13919,13921,13923,13925,13929,13933,13935,13947,13949,13951,13999,14001,14006,14008,14010,14020,14022,14032,14034,14048,14050,14052,14054],[10,13918,7578],{},[14,13920,16],{"id":16},[10,13922,7583],{},[14,13924,22],{"id":22},[10,13926,13927],{},[26,13928],{"alt":7590,"src":7591},[10,13930,7594,13931,7597],{},[46,13932,6753],{},[14,13934,35],{"id":35},[37,13936,13937,13941,13945],{},[40,13938,13939,7606],{},[46,13940,6753],{},[40,13942,13943,7612],{},[46,13944,7611],{},[40,13946,7615],{},[14,13948,58],{"id":58},[10,13950,61],{},[63,13952,13953],{"className":65,"code":7622,"language":67,"meta":68,"style":68},[46,13954,13955,13959,13963,13967,13971,13975,13979,13983,13987,13991,13995],{"__ignoreMap":68},[72,13956,13957],{"class":74,"line":75},[72,13958,6565],{},[72,13960,13961],{"class":74,"line":81},[72,13962,91],{"emptyLinePlaceholder":90},[72,13964,13965],{"class":74,"line":87},[72,13966,6776],{},[72,13968,13969],{"class":74,"line":94},[72,13970,91],{"emptyLinePlaceholder":90},[72,13972,13973],{"class":74,"line":100},[72,13974,7645],{},[72,13976,13977],{"class":74,"line":106},[72,13978,7650],{},[72,13980,13981],{"class":74,"line":111},[72,13982,91],{"emptyLinePlaceholder":90},[72,13984,13985],{"class":74,"line":117},[72,13986,7659],{},[72,13988,13989],{"class":74,"line":123},[72,13990,7664],{},[72,13992,13993],{"class":74,"line":128},[72,13994,91],{"emptyLinePlaceholder":90},[72,13996,13997],{"class":74,"line":5791},[72,13998,7673],{},[10,14000,134],{},[63,14002,14004],{"className":14003,"code":7679,"language":140,"meta":68},[138],[46,14005,7679],{"__ignoreMap":68},[10,14007,145],{},[14,14009,148],{"id":148},[150,14011,14012,14018],{},[40,14013,7594,14014,7692,14016,168],{},[46,14015,6753],{},[46,14017,7695],{},[40,14019,7698],{},[14,14021,187],{"id":187},[37,14023,14024,14028],{},[40,14025,4794,14026,7707],{},[46,14027,6753],{},[40,14029,7710,14030,7713],{},[46,14031,6753],{},[14,14033,202],{"id":202},[150,14035,14036,14042],{},[40,14037,7720,14038,7724,14040,168],{},[46,14039,7723],{},[46,14041,6753],{},[40,14043,4794,14044,7731,14046,168],{},[46,14045,6753],{},[46,14047,7734],{},[10,14049,213],{},[14,14051,216],{"id":216},[10,14053,7741],{},[221,14055,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14057},[14058,14059,14060,14061,14062,14063,14064,14065],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":7573,"description":7578},[236,6753,7761],{"id":7764,"title":7765,"body":14070,"category":236,"cover":237,"description":7770,"extension":238,"meta":14241,"navigation":90,"path":7983,"pinned":241,"publishedAt":242,"seo":14242,"slug":7985,"stem":7986,"summary":7987,"tags":14243,"updatedAt":242,"visible":90,"__hash__":7991},{"type":7,"value":14071,"toc":14229},[14072,14074,14076,14078,14080,14084,14086,14088,14100,14102,14104,14160,14162,14167,14169,14171,14187,14189,14191,14195,14201,14203,14211,14213,14221,14223,14225,14227],[10,14073,7770],{},[14,14075,16],{"id":16},[10,14077,7775],{},[14,14079,22],{"id":22},[10,14081,14082],{},[26,14083],{"alt":7782,"src":7783},[10,14085,7786],{},[14,14087,35],{"id":35},[37,14089,14090,14094,14098],{},[40,14091,14092,7796],{},[46,14093,7795],{},[40,14095,14096,7802],{},[46,14097,7801],{},[40,14099,7805],{},[14,14101,58],{"id":58},[10,14103,61],{},[63,14105,14106],{"className":65,"code":7812,"language":67,"meta":68,"style":68},[46,14107,14108,14112,14116,14120,14124,14128,14132,14136,14140,14144,14148,14152,14156],{"__ignoreMap":68},[72,14109,14110],{"class":74,"line":75},[72,14111,7819],{},[72,14113,14114],{"class":74,"line":81},[72,14115,7824],{},[72,14117,14118],{"class":74,"line":87},[72,14119,7829],{},[72,14121,14122],{"class":74,"line":94},[72,14123,7834],{},[72,14125,14126],{"class":74,"line":100},[72,14127,91],{"emptyLinePlaceholder":90},[72,14129,14130],{"class":74,"line":106},[72,14131,7843],{},[72,14133,14134],{"class":74,"line":111},[72,14135,7848],{},[72,14137,14138],{"class":74,"line":117},[72,14139,7853],{},[72,14141,14142],{"class":74,"line":123},[72,14143,7858],{},[72,14145,14146],{"class":74,"line":128},[72,14147,91],{"emptyLinePlaceholder":90},[72,14149,14150],{"class":74,"line":5791},[72,14151,7867],{},[72,14153,14154],{"class":74,"line":5796},[72,14155,7872],{},[72,14157,14158],{"class":74,"line":7401},[72,14159,7877],{},[10,14161,134],{},[63,14163,14165],{"className":14164,"code":7883,"language":140,"meta":68},[138],[46,14166,7883],{"__ignoreMap":68},[10,14168,145],{},[14,14170,148],{"id":148},[150,14172,14173,14179],{},[40,14174,7894,14175,7898,14177,7901],{},[46,14176,7897],{},[46,14178,7801],{},[40,14180,14181,7907,14183,7911,14185,7914],{},[46,14182,7906],{},[46,14184,7910],{},[46,14186,7795],{},[170,14188,172],{"id":172},[10,14190,7919],{},[10,14192,14193],{},[26,14194],{"alt":7924,"src":7925},[10,14196,7928,14197,1166,14199,7934],{},[46,14198,4591],{},[46,14200,7933],{},[14,14202,187],{"id":187},[37,14204,14205,14209],{},[40,14206,7941,14207,7944],{},[46,14208,7795],{},[40,14210,7947],{},[14,14212,202],{"id":202},[150,14214,14215,14219],{},[40,14216,5304,14217,7957],{},[46,14218,7956],{},[40,14220,7960],{},[10,14222,213],{},[14,14224,216],{"id":216},[10,14226,7967],{},[221,14228,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14230},[14231,14232,14233,14234,14235,14238,14239,14240],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":14236},[14237],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":7765,"description":7770},[236,7989,7990],{"id":7993,"title":7994,"body":14245,"category":236,"cover":237,"description":7999,"extension":238,"meta":14392,"navigation":90,"path":8178,"pinned":241,"publishedAt":242,"seo":14393,"slug":8180,"stem":8181,"summary":8182,"tags":14394,"updatedAt":242,"visible":90,"__hash__":8186},{"type":7,"value":14246,"toc":14382},[14247,14249,14251,14253,14255,14259,14261,14263,14271,14273,14275,14331,14333,14338,14340,14342,14354,14356,14362,14364,14374,14376,14378,14380],[10,14248,7999],{},[14,14250,16],{"id":16},[10,14252,8004],{},[14,14254,22],{"id":22},[10,14256,14257],{},[26,14258],{"alt":8011,"src":8012},[10,14260,8015],{},[14,14262,35],{"id":35},[37,14264,14265,14267,14269],{},[40,14266,8022],{},[40,14268,8025],{},[40,14270,8028],{},[14,14272,58],{"id":58},[10,14274,61],{},[63,14276,14277],{"className":65,"code":8035,"language":67,"meta":68,"style":68},[46,14278,14279,14283,14287,14291,14295,14299,14303,14307,14311,14315,14319,14323,14327],{"__ignoreMap":68},[72,14280,14281],{"class":74,"line":75},[72,14282,8042],{},[72,14284,14285],{"class":74,"line":81},[72,14286,8047],{},[72,14288,14289],{"class":74,"line":87},[72,14290,8052],{},[72,14292,14293],{"class":74,"line":94},[72,14294,91],{"emptyLinePlaceholder":90},[72,14296,14297],{"class":74,"line":100},[72,14298,8061],{},[72,14300,14301],{"class":74,"line":106},[72,14302,8066],{},[72,14304,14305],{"class":74,"line":111},[72,14306,8071],{},[72,14308,14309],{"class":74,"line":117},[72,14310,91],{"emptyLinePlaceholder":90},[72,14312,14313],{"class":74,"line":123},[72,14314,8080],{},[72,14316,14317],{"class":74,"line":128},[72,14318,8085],{},[72,14320,14321],{"class":74,"line":5791},[72,14322,91],{"emptyLinePlaceholder":90},[72,14324,14325],{"class":74,"line":5796},[72,14326,8094],{},[72,14328,14329],{"class":74,"line":7401},[72,14330,8099],{},[10,14332,134],{},[63,14334,14336],{"className":14335,"code":8105,"language":140,"meta":68},[138],[46,14337,8105],{"__ignoreMap":68},[10,14339,145],{},[14,14341,148],{"id":148},[150,14343,14344,14350],{},[40,14345,14346,8119,14348,8123],{},[46,14347,8118],{},[46,14349,8122],{},[40,14351,8126,14352,8130],{},[46,14353,8129],{},[14,14355,187],{"id":187},[37,14357,14358,14360],{},[40,14359,8137],{},[40,14361,8140],{},[14,14363,202],{"id":202},[150,14365,14366,14372],{},[40,14367,8147,14368,8151,14370,168],{},[46,14369,8150],{},[46,14371,8154],{},[40,14373,8157],{},[10,14375,213],{},[14,14377,216],{"id":216},[10,14379,8164],{},[221,14381,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14383},[14384,14385,14386,14387,14388,14389,14390,14391],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":7994,"description":7999},[236,8184,8185],{"id":8188,"title":8189,"body":14396,"category":236,"cover":237,"description":8194,"extension":238,"meta":14559,"navigation":90,"path":8398,"pinned":241,"publishedAt":242,"seo":14560,"slug":8400,"stem":8401,"summary":8402,"tags":14561,"updatedAt":242,"visible":90,"__hash__":8406},{"type":7,"value":14397,"toc":14547},[14398,14400,14402,14404,14406,14410,14414,14416,14432,14434,14436,14480,14482,14487,14489,14491,14505,14507,14511,14515,14519,14521,14527,14529,14539,14541,14543,14545],[10,14399,8194],{},[14,14401,16],{"id":16},[10,14403,8199],{},[14,14405,22],{"id":22},[10,14407,14408],{},[26,14409],{"alt":8206,"src":8207},[10,14411,8210,14412,8214],{},[46,14413,8213],{},[14,14415,35],{"id":35},[37,14417,14418,14424,14430],{},[40,14419,14420,8224,14422,8228],{},[46,14421,8223],{},[46,14423,8227],{},[40,14425,8231,14426,8235,14428,8238],{},[46,14427,8234],{},[46,14429,4345],{},[40,14431,8241],{},[14,14433,58],{"id":58},[10,14435,61],{},[63,14437,14438],{"className":65,"code":8248,"language":67,"meta":68,"style":68},[46,14439,14440,14444,14448,14452,14456,14460,14464,14468,14472,14476],{"__ignoreMap":68},[72,14441,14442],{"class":74,"line":75},[72,14443,8255],{},[72,14445,14446],{"class":74,"line":81},[72,14447,8260],{},[72,14449,14450],{"class":74,"line":87},[72,14451,8265],{},[72,14453,14454],{"class":74,"line":94},[72,14455,8270],{},[72,14457,14458],{"class":74,"line":100},[72,14459,8275],{},[72,14461,14462],{"class":74,"line":106},[72,14463,91],{"emptyLinePlaceholder":90},[72,14465,14466],{"class":74,"line":111},[72,14467,8284],{},[72,14469,14470],{"class":74,"line":117},[72,14471,8289],{},[72,14473,14474],{"class":74,"line":123},[72,14475,8289],{},[72,14477,14478],{"class":74,"line":128},[72,14479,8289],{},[10,14481,134],{},[63,14483,14485],{"className":14484,"code":8303,"language":140,"meta":68},[138],[46,14486,8303],{"__ignoreMap":68},[10,14488,145],{},[14,14490,148],{"id":148},[150,14492,14493,14497],{},[40,14494,7894,14495,8317],{},[46,14496,8316],{},[40,14498,8320,14499,8323,14501,8326,14503,8330],{},[46,14500,8227],{},[46,14502,8213],{},[46,14504,8329],{},[170,14506,172],{"id":172},[10,14508,8335,14509,8338],{},[46,14510,8227],{},[10,14512,14513],{},[26,14514],{"alt":8343,"src":8344},[10,14516,8347,14517,8350],{},[46,14518,8213],{},[14,14520,187],{"id":187},[37,14522,14523,14525],{},[40,14524,8357],{},[40,14526,8360],{},[14,14528,202],{"id":202},[150,14530,14531,14533],{},[40,14532,8367],{},[40,14534,4018,14535,8372,14537,8375],{},[46,14536,4345],{},[46,14538,8227],{},[10,14540,213],{},[14,14542,216],{"id":216},[10,14544,8382],{},[221,14546,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14548},[14549,14550,14551,14552,14553,14556,14557,14558],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":14554},[14555],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":8189,"description":8194},[236,8404,8405],{"id":8408,"title":8409,"body":14563,"category":236,"cover":237,"description":8414,"extension":238,"meta":14746,"navigation":90,"path":8639,"pinned":241,"publishedAt":242,"seo":14747,"slug":8641,"stem":8642,"summary":8643,"tags":14748,"updatedAt":242,"visible":90,"__hash__":8646},{"type":7,"value":14564,"toc":14734},[14565,14567,14569,14571,14573,14577,14579,14581,14595,14597,14599,14667,14669,14674,14676,14678,14692,14694,14696,14700,14706,14708,14716,14718,14726,14728,14730,14732],[10,14566,8414],{},[14,14568,16],{"id":16},[10,14570,8419],{},[14,14572,22],{"id":22},[10,14574,14575],{},[26,14576],{"alt":8426,"src":8427},[10,14578,8430],{},[14,14580,35],{"id":35},[37,14582,14583,14589,14591],{},[40,14584,14585,8440,14587,168],{},[46,14586,8439],{},[46,14588,8443],{},[40,14590,8446],{},[40,14592,14593,8452],{},[46,14594,8451],{},[14,14596,58],{"id":58},[10,14598,61],{},[63,14600,14601],{"className":65,"code":8459,"language":67,"meta":68,"style":68},[46,14602,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647,14651,14655,14659,14663],{"__ignoreMap":68},[72,14604,14605],{"class":74,"line":75},[72,14606,8466],{},[72,14608,14609],{"class":74,"line":81},[72,14610,91],{"emptyLinePlaceholder":90},[72,14612,14613],{"class":74,"line":87},[72,14614,8475],{},[72,14616,14617],{"class":74,"line":94},[72,14618,8480],{},[72,14620,14621],{"class":74,"line":100},[72,14622,8485],{},[72,14624,14625],{"class":74,"line":106},[72,14626,8490],{},[72,14628,14629],{"class":74,"line":111},[72,14630,8495],{},[72,14632,14633],{"class":74,"line":117},[72,14634,8500],{},[72,14636,14637],{"class":74,"line":123},[72,14638,8505],{},[72,14640,14641],{"class":74,"line":128},[72,14642,8510],{},[72,14644,14645],{"class":74,"line":5791},[72,14646,91],{"emptyLinePlaceholder":90},[72,14648,14649],{"class":74,"line":5796},[72,14650,8519],{},[72,14652,14653],{"class":74,"line":7401},[72,14654,6144],{},[72,14656,14657],{"class":74,"line":7407},[72,14658,6149],{},[72,14660,14661],{"class":74,"line":8530},[72,14662,91],{"emptyLinePlaceholder":90},[72,14664,14665],{"class":74,"line":8535},[72,14666,8538],{},[10,14668,134],{},[63,14670,14672],{"className":14671,"code":8544,"language":140,"meta":68},[138],[46,14673,8544],{"__ignoreMap":68},[10,14675,145],{},[14,14677,148],{"id":148},[150,14679,14680,14690],{},[40,14681,8555,14682,8559,14684,8563,14686,8567,14688,168],{},[46,14683,8558],{},[46,14685,8562],{},[46,14687,8566],{},[46,14689,8558],{},[40,14691,8572],{},[170,14693,172],{"id":172},[10,14695,8577],{},[10,14697,14698],{},[26,14699],{"alt":8582,"src":8583},[10,14701,14702,8588,14704,168],{},[46,14703,8439],{},[46,14705,8443],{},[14,14707,187],{"id":187},[37,14709,14710,14714],{},[40,14711,8597,14712,168],{},[46,14713,195],{},[40,14715,8602],{},[14,14717,202],{"id":202},[150,14719,14720,14722],{},[40,14721,8609],{},[40,14723,8612,14724,8616],{},[46,14725,8615],{},[10,14727,213],{},[14,14729,216],{"id":216},[10,14731,8623],{},[221,14733,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14735},[14736,14737,14738,14739,14740,14743,14744,14745],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":14741},[14742],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":8409,"description":8414},[236,8645,5338],{"id":8648,"title":8649,"body":14750,"category":236,"cover":237,"description":8654,"extension":238,"meta":14909,"navigation":90,"path":8842,"pinned":241,"publishedAt":242,"seo":14910,"slug":8844,"stem":8845,"summary":8846,"tags":14911,"updatedAt":242,"visible":90,"__hash__":8850},{"type":7,"value":14751,"toc":14897},[14752,14754,14756,14758,14760,14764,14766,14768,14776,14778,14780,14844,14846,14851,14853,14855,14863,14865,14867,14871,14873,14875,14881,14883,14889,14891,14893,14895],[10,14753,8654],{},[14,14755,16],{"id":16},[10,14757,8659],{},[14,14759,22],{"id":22},[10,14761,14762],{},[26,14763],{"alt":8666,"src":8667},[10,14765,8670],{},[14,14767,35],{"id":35},[37,14769,14770,14772,14774],{},[40,14771,8677],{},[40,14773,8680],{},[40,14775,8683],{},[14,14777,58],{"id":58},[10,14779,61],{},[63,14781,14782],{"className":65,"code":8690,"language":67,"meta":68,"style":68},[46,14783,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824,14828,14832,14836,14840],{"__ignoreMap":68},[72,14785,14786],{"class":74,"line":75},[72,14787,8697],{},[72,14789,14790],{"class":74,"line":81},[72,14791,8702],{},[72,14793,14794],{"class":74,"line":87},[72,14795,91],{"emptyLinePlaceholder":90},[72,14797,14798],{"class":74,"line":94},[72,14799,8711],{},[72,14801,14802],{"class":74,"line":100},[72,14803,91],{"emptyLinePlaceholder":90},[72,14805,14806],{"class":74,"line":106},[72,14807,8720],{},[72,14809,14810],{"class":74,"line":111},[72,14811,8725],{},[72,14813,14814],{"class":74,"line":117},[72,14815,8730],{},[72,14817,14818],{"class":74,"line":123},[72,14819,91],{"emptyLinePlaceholder":90},[72,14821,14822],{"class":74,"line":128},[72,14823,8739],{},[72,14825,14826],{"class":74,"line":5791},[72,14827,8744],{},[72,14829,14830],{"class":74,"line":5796},[72,14831,8749],{},[72,14833,14834],{"class":74,"line":7401},[72,14835,91],{"emptyLinePlaceholder":90},[72,14837,14838],{"class":74,"line":7407},[72,14839,6158],{},[72,14841,14842],{"class":74,"line":8530},[72,14843,8762],{},[10,14845,134],{},[63,14847,14849],{"className":14848,"code":8768,"language":140,"meta":68},[138],[46,14850,8768],{"__ignoreMap":68},[10,14852,145],{},[14,14854,148],{"id":148},[150,14856,14857,14861],{},[40,14858,14859,8782],{},[46,14860,8781],{},[40,14862,8785],{},[170,14864,172],{"id":172},[10,14866,8790],{},[10,14868,14869],{},[26,14870],{"alt":8795,"src":8796},[10,14872,8799],{},[14,14874,187],{"id":187},[37,14876,14877,14879],{},[40,14878,8806],{},[40,14880,8809],{},[14,14882,202],{"id":202},[150,14884,14885,14887],{},[40,14886,8816],{},[40,14888,8819],{},[10,14890,213],{},[14,14892,216],{"id":216},[10,14894,8826],{},[221,14896,223],{},{"title":68,"searchDepth":81,"depth":81,"links":14898},[14899,14900,14901,14902,14903,14906,14907,14908],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":14904},[14905],{"id":172,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":8649,"description":8654},[236,8848,8849],{"id":8852,"title":8853,"body":14913,"category":236,"cover":237,"description":8858,"extension":238,"meta":15151,"navigation":90,"path":9159,"pinned":241,"publishedAt":242,"seo":15152,"slug":9161,"stem":9162,"summary":9163,"tags":15153,"updatedAt":242,"visible":90,"__hash__":9167},{"type":7,"value":14914,"toc":15138},[14915,14917,14919,14921,14923,14927,14929,14931,14941,14943,14945,15061,15063,15068,15070,15072,15082,15084,15086,15090,15092,15094,15096,15100,15104,15106,15114,15116,15130,15132,15134,15136],[10,14916,8858],{},[14,14918,16],{"id":16},[10,14920,8863],{},[14,14922,22],{"id":22},[10,14924,14925],{},[26,14926],{"alt":8870,"src":8871},[10,14928,8874],{},[14,14930,35],{"id":35},[37,14932,14933,14935,14937],{},[40,14934,8881],{},[40,14936,8884],{},[40,14938,8887,14939,8891],{},[46,14940,8890],{},[14,14942,58],{"id":58},[10,14944,61],{},[63,14946,14947],{"className":65,"code":8898,"language":67,"meta":68,"style":68},[46,14948,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041,15045,15049,15053,15057],{"__ignoreMap":68},[72,14950,14951],{"class":74,"line":75},[72,14952,6956],{},[72,14954,14955],{"class":74,"line":81},[72,14956,6565],{},[72,14958,14959],{"class":74,"line":87},[72,14960,91],{"emptyLinePlaceholder":90},[72,14962,14963],{"class":74,"line":94},[72,14964,8917],{},[72,14966,14967],{"class":74,"line":100},[72,14968,8922],{},[72,14970,14971],{"class":74,"line":106},[72,14972,8927],{},[72,14974,14975],{"class":74,"line":111},[72,14976,8932],{},[72,14978,14979],{"class":74,"line":117},[72,14980,91],{"emptyLinePlaceholder":90},[72,14982,14983],{"class":74,"line":123},[72,14984,8941],{},[72,14986,14987],{"class":74,"line":128},[72,14988,8946],{},[72,14990,14991],{"class":74,"line":5791},[72,14992,8951],{},[72,14994,14995],{"class":74,"line":5796},[72,14996,8956],{},[72,14998,14999],{"class":74,"line":7401},[72,15000,8961],{},[72,15002,15003],{"class":74,"line":7407},[72,15004,91],{"emptyLinePlaceholder":90},[72,15006,15007],{"class":74,"line":8530},[72,15008,8970],{},[72,15010,15011],{"class":74,"line":8535},[72,15012,8975],{},[72,15014,15015],{"class":74,"line":8978},[72,15016,8981],{},[72,15018,15019],{"class":74,"line":8984},[72,15020,91],{"emptyLinePlaceholder":90},[72,15022,15023],{"class":74,"line":8989},[72,15024,8992],{},[72,15026,15027],{"class":74,"line":8995},[72,15028,91],{"emptyLinePlaceholder":90},[72,15030,15031],{"class":74,"line":9000},[72,15032,7374],{},[72,15034,15035],{"class":74,"line":9005},[72,15036,9008],{},[72,15038,15039],{"class":74,"line":9011},[72,15040,9014],{},[72,15042,15043],{"class":74,"line":9017},[72,15044,9020],{},[72,15046,15047],{"class":74,"line":9023},[72,15048,7384],{},[72,15050,15051],{"class":74,"line":9028},[72,15052,9031],{},[72,15054,15055],{"class":74,"line":9034},[72,15056,1155],{},[72,15058,15059],{"class":74,"line":9039},[72,15060,9042],{},[10,15062,134],{},[63,15064,15066],{"className":15065,"code":9048,"language":140,"meta":68},[138],[46,15067,9048],{"__ignoreMap":68},[10,15069,145],{},[14,15071,148],{"id":148},[150,15073,15074,15078],{},[40,15075,9059,15076,9062],{},[46,15077,8890],{},[40,15079,15080,9067],{},[46,15081,8122],{},[170,15083,172],{"id":172},[10,15085,9072],{},[10,15087,15088],{},[26,15089],{"alt":9077,"src":9078},[10,15091,9081],{},[170,15093,172],{"id":4226},[10,15095,9086],{},[10,15097,15098],{},[26,15099],{"alt":9091,"src":9092},[10,15101,9095,15102,9099],{},[46,15103,9098],{},[14,15105,187],{"id":187},[37,15107,15108,15110],{},[40,15109,9106],{},[40,15111,9109,15112,9112],{},[46,15113,9098],{},[14,15115,202],{"id":202},[150,15117,15118,15122,15124],{},[40,15119,9119,15120,9122],{},[46,15121,9098],{},[40,15123,9125],{},[40,15125,9128,15126,9132,15128,9135],{},[46,15127,9131],{},[46,15129,6100],{},[10,15131,213],{},[14,15133,216],{"id":216},[10,15135,9142],{},[221,15137,223],{},{"title":68,"searchDepth":81,"depth":81,"links":15139},[15140,15141,15142,15143,15144,15148,15149,15150],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":148,"depth":81,"text":148,"children":15145},[15146,15147],{"id":172,"depth":87,"text":172},{"id":4226,"depth":87,"text":172},{"id":187,"depth":81,"text":187},{"id":202,"depth":81,"text":202},{"id":216,"depth":81,"text":216},{},{"title":8853,"description":8858},[236,9165,9166],{"id":1065,"title":1066,"body":15155,"category":236,"cover":1074,"description":68,"extension":238,"meta":15391,"navigation":90,"path":1391,"pinned":241,"publishedAt":1392,"seo":15392,"slug":1394,"stem":1395,"summary":1396,"tags":15393,"updatedAt":1392,"visible":90,"__hash__":1400},{"type":7,"value":15156,"toc":15376},[15157,15161,15163,15165,15167,15169,15189,15191,15196,15198,15200,15228,15234,15236,15240,15242,15262,15264,15274,15276,15278,15280,15282,15284,15286,15288,15290,15292,15312,15314,15316,15320,15322,15324,15326,15328,15332,15334,15352,15354,15356,15358,15360,15362,15364,15366,15368,15370,15372,15374],[10,15158,15159],{},[26,15160],{"alt":1073,"src":1074},[10,15162,1077],{},[10,15164,1080],{},[14,15166,1084],{"id":1083},[10,15168,1087],{},[63,15170,15171],{"className":65,"code":1090,"language":67,"meta":68,"style":68},[46,15172,15173,15177,15181,15185],{"__ignoreMap":68},[72,15174,15175],{"class":74,"line":75},[72,15176,1097],{},[72,15178,15179],{"class":74,"line":81},[72,15180,1102],{},[72,15182,15183],{"class":74,"line":87},[72,15184,91],{"emptyLinePlaceholder":90},[72,15186,15187],{"class":74,"line":94},[72,15188,1111],{},[10,15190,1114],{},[63,15192,15194],{"className":15193,"code":1118,"language":140,"meta":68},[138],[46,15195,1118],{"__ignoreMap":68},[10,15197,1123],{},[10,15199,1126],{},[63,15201,15202],{"className":65,"code":1129,"language":67,"meta":68,"style":68},[46,15203,15204,15208,15212,15216,15220,15224],{"__ignoreMap":68},[72,15205,15206],{"class":74,"line":75},[72,15207,1136],{},[72,15209,15210],{"class":74,"line":81},[72,15211,91],{"emptyLinePlaceholder":90},[72,15213,15214],{"class":74,"line":87},[72,15215,1145],{},[72,15217,15218],{"class":74,"line":94},[72,15219,1150],{},[72,15221,15222],{"class":74,"line":100},[72,15223,1155],{},[72,15225,15226],{"class":74,"line":106},[72,15227,1160],{},[10,15229,15230,1166,15232,1170],{},[46,15231,1165],{},[46,15233,1169],{},[14,15235,1174],{"id":1173},[10,15237,1177,15238,1181],{},[46,15239,1180],{},[10,15241,1184],{},[63,15243,15244],{"className":65,"code":1187,"language":67,"meta":68,"style":68},[46,15245,15246,15250,15254,15258],{"__ignoreMap":68},[72,15247,15248],{"class":74,"line":75},[72,15249,1194],{},[72,15251,15252],{"class":74,"line":81},[72,15253,1199],{},[72,15255,15256],{"class":74,"line":87},[72,15257,1204],{},[72,15259,15260],{"class":74,"line":94},[72,15261,1209],{},[10,15263,1212],{},[63,15265,15266],{"className":600,"code":1215,"language":602,"meta":68,"style":68},[46,15267,15268],{"__ignoreMap":68},[72,15269,15270,15272],{"class":74,"line":75},[72,15271,700],{"class":609},[72,15273,1224],{"class":645},[10,15275,1227],{},[14,15277,1231],{"id":1230},[170,15279,1234],{"id":1234},[10,15281,1237],{},[170,15283,1240],{"id":1240},[10,15285,1243],{},[170,15287,1246],{"id":1246},[10,15289,1249],{},[10,15291,1252],{},[63,15293,15294],{"className":65,"code":1255,"language":67,"meta":68,"style":68},[46,15295,15296,15300,15304,15308],{"__ignoreMap":68},[72,15297,15298],{"class":74,"line":75},[72,15299,1262],{},[72,15301,15302],{"class":74,"line":81},[72,15303,91],{"emptyLinePlaceholder":90},[72,15305,15306],{"class":74,"line":87},[72,15307,1271],{},[72,15309,15310],{"class":74,"line":94},[72,15311,1276],{},[10,15313,1279],{},[170,15315,1282],{"id":1282},[10,15317,1285,15318,1288],{},[46,15319,271],{},[10,15321,1291],{},[170,15323,1294],{"id":1294},[10,15325,1297],{},[14,15327,1301],{"id":1300},[10,15329,15330],{},[26,15331],{"alt":1306,"src":1307},[10,15333,1310],{},[37,15335,15336,15338,15340,15342,15344,15346,15348,15350],{},[40,15337,1315],{},[40,15339,1318],{},[40,15341,1321],{},[40,15343,1324],{},[40,15345,1327],{},[40,15347,1330],{},[40,15349,1333],{},[40,15351,1336],{},[10,15353,1339],{},[14,15355,1343],{"id":1342},[10,15357,1346],{},[10,15359,1349],{},[14,15361,1353],{"id":1352},[10,15363,1356],{},[10,15365,1359],{},[10,15367,1362],{},[14,15369,1365],{"id":1365},[10,15371,1368],{},[10,15373,1371],{},[221,15375,1374],{},{"title":68,"searchDepth":81,"depth":81,"links":15377},[15378,15379,15380,15387,15388,15389,15390],{"id":1083,"depth":81,"text":1084},{"id":1173,"depth":81,"text":1174},{"id":1230,"depth":81,"text":1231,"children":15381},[15382,15383,15384,15385,15386],{"id":1234,"depth":87,"text":1234},{"id":1240,"depth":87,"text":1240},{"id":1246,"depth":87,"text":1246},{"id":1282,"depth":87,"text":1282},{"id":1294,"depth":87,"text":1294},{"id":1300,"depth":81,"text":1301},{"id":1342,"depth":81,"text":1343},{"id":1352,"depth":81,"text":1353},{"id":1365,"depth":81,"text":1365},{},{"title":1066,"description":68},[236,1398,1399],{"id":253,"title":254,"body":15395,"category":236,"cover":237,"description":68,"extension":238,"meta":15974,"navigation":90,"path":1054,"pinned":241,"publishedAt":1055,"seo":15975,"slug":1057,"stem":1058,"summary":1059,"tags":15976,"updatedAt":1055,"visible":90,"__hash__":1063},{"type":7,"value":15396,"toc":15950},[15397,15399,15401,15403,15407,15409,15411,15435,15447,15449,15451,15456,15460,15464,15476,15480,15484,15488,15490,15524,15526,15530,15534,15536,15558,15588,15600,15610,15618,15620,15626,15636,15638,15643,15647,15649,15663,15669,15689,15691,15693,15695,15705,15709,15711,15720,15724,15726,15728,15748,15752,15754,15756,15758,15760,15780,15782,15784,15786,15812,15814,15830,15832,15848,15852,15854,15856,15876,15878,15880,15882,15886,15896,15898,15900,15902,15912,15920,15922,15924,15938,15948],[14,15398,259],{"id":259},[10,15400,262],{},[10,15402,265],{},[10,15404,268,15405,272],{},[46,15406,271],{},[14,15408,275],{"id":275},[10,15410,278],{},[280,15412,15413,15415],{},[10,15414,284],{},[280,15416,15417,15423,15425,15429,15431],{},[10,15418,289,15419,293,15421,297],{},[46,15420,292],{},[46,15422,296],{},[10,15424,300],{},[10,15426,303,15427,308],{},[305,15428,307],{},[10,15430,311],{},[10,15432,15433],{},[26,15434],{"alt":316,"src":317},[280,15436,15437,15439],{},[10,15438,322],{},[280,15440,15441,15443],{},[10,15442,327],{},[10,15444,15445],{},[26,15446],{"alt":332,"src":333},[14,15448,337],{"id":336},[170,15450,341],{"id":340},[10,15452,344,15453,352],{},[346,15454,351],{"href":348,"rel":15455},[350],[280,15457,15458],{},[10,15459,357],{},[10,15461,15462],{},[26,15463],{"alt":362,"src":363},[37,15465,15466,15470,15474],{},[40,15467,368,15468,168],{},[305,15469,371],{},[40,15471,374,15472,168],{},[305,15473,377],{},[40,15475,380],{},[10,15477,15478],{},[26,15479],{"alt":385,"src":386},[280,15481,15482],{},[10,15483,391],{},[10,15485,15486],{},[26,15487],{"alt":396,"src":397},[170,15489,401],{"id":400},[280,15491,15492,15496,15500,15520],{},[280,15493,15494],{},[10,15495,408],{},[10,15497,411,15498,415],{},[305,15499,414],{},[63,15501,15502],{"className":65,"code":418,"language":67,"meta":68,"style":68},[46,15503,15504,15508,15512,15516],{"__ignoreMap":68},[72,15505,15506],{"class":74,"line":75},[72,15507,425],{},[72,15509,15510],{"class":74,"line":81},[72,15511,430],{},[72,15513,15514],{"class":74,"line":87},[72,15515,435],{},[72,15517,15518],{"class":74,"line":94},[72,15519,440],{},[10,15521,443,15522,447],{},[305,15523,446],{},[10,15525,450],{},[10,15527,453,15528,456],{},[46,15529,67],{},[10,15531,15532],{},[26,15533],{"alt":461,"src":462},[10,15535,465],{},[280,15537,15538,15540,15544],{},[10,15539,470],{},[10,15541,15542],{},[305,15543,475],{},[280,15545,15546,15550,15554],{},[10,15547,480,15548,483],{},[46,15549,67],{},[10,15551,486,15552,489],{},[46,15553,67],{},[10,15555,492,15556,496],{},[305,15557,495],{},[280,15559,15560,15562,15566],{},[10,15561,501],{},[10,15563,15564],{},[305,15565,506],{},[280,15567,15568,15574,15582,15584],{},[10,15569,15570,514,15572,518],{},[46,15571,513],{},[46,15573,517],{},[10,15575,521,15576,524,15578,528,15580,532],{},[46,15577,513],{},[305,15579,527],{},[305,15581,531],{},[10,15583,535],{},[10,15585,15586,541],{},[305,15587,540],{},[280,15589,15590,15592],{},[10,15591,546],{},[280,15593,15594,15598],{},[10,15595,551,15596,555],{},[305,15597,554],{},[10,15599,558],{},[280,15601,15602,15606],{},[10,15603,563,15604],{},[305,15605,566],{},[10,15607,15608],{},[26,15609],{"alt":571,"src":572},[280,15611,15612,15614],{},[10,15613,577],{},[10,15615,15616],{},[26,15617],{"alt":571,"src":582},[170,15619,586],{"id":585},[10,15621,589,15622,593,15624,597],{},[46,15623,592],{},[46,15625,596],{},[63,15627,15628],{"className":600,"code":601,"language":602,"meta":68,"style":68},[46,15629,15630],{"__ignoreMap":68},[72,15631,15632,15634],{"class":74,"line":75},[72,15633,67],{"class":609},[72,15635,613],{"class":612},[10,15637,616],{},[63,15639,15641],{"className":15640,"code":620,"language":140,"meta":68},[138],[46,15642,620],{"__ignoreMap":68},[10,15644,15645],{},[26,15646],{"alt":571,"src":627},[10,15648,630],{},[63,15650,15651],{"className":600,"code":633,"language":602,"meta":68,"style":68},[46,15652,15653],{"__ignoreMap":68},[72,15654,15655,15657,15659,15661],{"class":74,"line":75},[72,15656,67],{"class":609},[72,15658,642],{"class":612},[72,15660,646],{"class":645},[72,15662,613],{"class":612},[10,15664,651,15665,654,15667,658],{},[46,15666,67],{},[46,15668,657],{},[63,15670,15671],{"className":600,"code":661,"language":602,"meta":68,"style":68},[46,15672,15673,15679],{"__ignoreMap":68},[72,15674,15675,15677],{"class":74,"line":75},[72,15676,517],{"class":609},[72,15678,613],{"class":612},[72,15680,15681,15683,15685,15687],{"class":74,"line":81},[72,15682,517],{"class":609},[72,15684,642],{"class":612},[72,15686,646],{"class":645},[72,15688,613],{"class":612},[14,15690,683],{"id":682},[170,15692,687],{"id":686},[10,15694,690],{},[63,15696,15697],{"className":600,"code":693,"language":602,"meta":68,"style":68},[46,15698,15699],{"__ignoreMap":68},[72,15700,15701,15703],{"class":74,"line":75},[72,15702,700],{"class":609},[72,15704,613],{"class":612},[10,15706,705,15707,709],{},[46,15708,708],{},[170,15710,713],{"id":712},[10,15712,344,15713,721,15716,168,15718,728],{},[346,15714,720],{"href":718,"rel":15715},[350],[305,15717,724],{},[46,15719,727],{},[10,15721,731,15722,735],{},[46,15723,734],{},[170,15725,739],{"id":738},[10,15727,742],{},[63,15729,15730],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,15731,15732,15738],{"__ignoreMap":68},[72,15733,15734,15736],{"class":74,"line":75},[72,15735,700],{"class":609},[72,15737,613],{"class":612},[72,15739,15740,15742,15744,15746],{"class":74,"line":81},[72,15741,700],{"class":609},[72,15743,642],{"class":612},[72,15745,646],{"class":645},[72,15747,613],{"class":612},[10,15749,766,15750,769],{},[46,15751,700],{},[14,15753,773],{"id":772},[10,15755,776],{},[170,15757,780],{"id":779},[10,15759,783],{},[63,15761,15762],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,15763,15764,15770],{"__ignoreMap":68},[72,15765,15766,15768],{"class":74,"line":75},[72,15767,700],{"class":609},[72,15769,613],{"class":612},[72,15771,15772,15774,15776,15778],{"class":74,"line":81},[72,15773,700],{"class":609},[72,15775,642],{"class":612},[72,15777,646],{"class":645},[72,15779,613],{"class":612},[10,15781,806],{},[170,15783,810],{"id":809},[10,15785,813],{},[63,15787,15788],{"className":600,"code":816,"language":602,"meta":68,"style":68},[46,15789,15790,15798],{"__ignoreMap":68},[72,15791,15792,15794,15796],{"class":74,"line":75},[72,15793,823],{"class":609},[72,15795,826],{"class":645},[72,15797,829],{"class":645},[72,15799,15800,15802,15804,15806,15808,15810],{"class":74,"line":81},[72,15801,823],{"class":609},[72,15803,826],{"class":645},[72,15805,838],{"class":645},[72,15807,841],{"class":645},[72,15809,844],{"class":645},[72,15811,847],{"class":645},[10,15813,850],{},[63,15815,15816],{"className":600,"code":853,"language":602,"meta":68,"style":68},[46,15817,15818],{"__ignoreMap":68},[72,15819,15820,15822,15824,15826,15828],{"class":74,"line":75},[72,15821,823],{"class":609},[72,15823,862],{"class":645},[72,15825,838],{"class":645},[72,15827,841],{"class":645},[72,15829,869],{"class":645},[10,15831,872],{},[63,15833,15834],{"className":600,"code":875,"language":602,"meta":68,"style":68},[46,15835,15836],{"__ignoreMap":68},[72,15837,15838,15840,15842,15844,15846],{"class":74,"line":75},[72,15839,823],{"class":609},[72,15841,884],{"class":645},[72,15843,887],{"class":612},[72,15845,890],{"class":645},[72,15847,893],{"class":645},[10,15849,15850,898],{},[46,15851,823],{},[170,15853,902],{"id":901},[10,15855,905],{},[63,15857,15858],{"className":600,"code":745,"language":602,"meta":68,"style":68},[46,15859,15860,15866],{"__ignoreMap":68},[72,15861,15862,15864],{"class":74,"line":75},[72,15863,700],{"class":609},[72,15865,613],{"class":612},[72,15867,15868,15870,15872,15874],{"class":74,"line":81},[72,15869,700],{"class":609},[72,15871,642],{"class":612},[72,15873,646],{"class":645},[72,15875,613],{"class":612},[10,15877,928],{},[14,15879,931],{"id":931},[170,15881,935],{"id":934},[10,15883,938,15884,942],{},[46,15885,941],{},[150,15887,15888,15892,15894],{},[40,15889,947,15890,950],{},[46,15891,657],{},[40,15893,953],{},[40,15895,956],{},[10,15897,959],{},[170,15899,963],{"id":962},[10,15901,966],{},[63,15903,15904],{"className":600,"code":693,"language":602,"meta":68,"style":68},[46,15905,15906],{"__ignoreMap":68},[72,15907,15908,15910],{"class":74,"line":75},[72,15909,700],{"class":609},[72,15911,613],{"class":612},[10,15913,979,15914,982,15916,985,15918,168],{},[46,15915,700],{},[46,15917,67],{},[46,15919,700],{},[170,15921,991],{"id":990},[10,15923,994],{},[63,15925,15926],{"className":600,"code":997,"language":602,"meta":68,"style":68},[46,15927,15928],{"__ignoreMap":68},[72,15929,15930,15932,15934,15936],{"class":74,"line":75},[72,15931,700],{"class":609},[72,15933,642],{"class":612},[72,15935,646],{"class":645},[72,15937,613],{"class":612},[10,15939,1012,15940,1015,15942,1018,15944,1021,15946,1025],{},[46,15941,700],{},[46,15943,67],{},[46,15945,517],{},[46,15947,1024],{},[221,15949,1028],{},{"title":68,"searchDepth":81,"depth":81,"links":15951},[15952,15953,15954,15959,15964,15969],{"id":259,"depth":81,"text":259},{"id":275,"depth":81,"text":275},{"id":336,"depth":81,"text":337,"children":15955},[15956,15957,15958],{"id":340,"depth":87,"text":341},{"id":400,"depth":87,"text":401},{"id":585,"depth":87,"text":586},{"id":682,"depth":81,"text":683,"children":15960},[15961,15962,15963],{"id":686,"depth":87,"text":687},{"id":712,"depth":87,"text":713},{"id":738,"depth":87,"text":739},{"id":772,"depth":81,"text":773,"children":15965},[15966,15967,15968],{"id":779,"depth":87,"text":780},{"id":809,"depth":87,"text":810},{"id":901,"depth":87,"text":902},{"id":931,"depth":81,"text":931,"children":15970},[15971,15972,15973],{"id":934,"depth":87,"text":935},{"id":962,"depth":87,"text":963},{"id":990,"depth":87,"text":991},{},{"title":254,"description":68},[236,1061,1062],1786973365392]