[{"data":1,"prerenderedAt":15951},["ShallowReactive",2],{"post-python-set-basics":3,"sidebar-posts":214,"post-related-source":9142},{"id":4,"title":5,"body":6,"category":199,"cover":200,"description":12,"extension":201,"meta":202,"navigation":92,"path":203,"pinned":204,"publishedAt":205,"seo":206,"slug":207,"stem":208,"summary":209,"tags":210,"updatedAt":205,"visible":92,"__hash__":213},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":8,"toc":189},"minimark",[9,13,17,20,23,30,33,36,58,61,64,112,115,123,126,129,145,148,162,165,176,179,182,185],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[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\u002F14-set-operations.svg",[10,31,32],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"集合中的元素不重复。",[40,44,45],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,47,48,49,53,54,57],{},"创建空集合必须写 ",[50,51,52],"code",{},"set()","；",[50,55,56],{},"{}"," 创建的是空字典。",[14,59,60],{"id":60},"跟着示例运行",[10,62,63],{},"把下面代码保存到本课脚本并运行：",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-python shiki shiki-themes github-dark","left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n","python","",[50,72,73,81,87,94,100,106],{"__ignoreMap":70},[74,75,78],"span",{"class":76,"line":77},"line",1,[74,79,80],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[74,82,84],{"class":76,"line":83},2,[74,85,86],{},"right = {\"Python\", \"Docker\"}\n",[74,88,90],{"class":76,"line":89},3,[74,91,93],{"emptyLinePlaceholder":92},true,"\n",[74,95,97],{"class":76,"line":96},4,[74,98,99],{},"print(left & right)\n",[74,101,103],{"class":76,"line":102},5,[74,104,105],{},"print(left | right)\n",[74,107,109],{"class":76,"line":108},6,[74,110,111],{},"print(\"Git\" in left)\n",[10,113,114],{},"预期结果：",[65,116,121],{"className":117,"code":119,"language":120,"meta":70},[118],"language-text","{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n","text",[50,122,119],{"__ignoreMap":70},[10,124,125],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,127,128],{"id":128},"按执行顺序拆开看",[130,131,132,135],"ol",{},[40,133,134],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,136,137,140,141,144],{},[50,138,139],{},"&"," 计算交集，",[50,142,143],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,146,147],{"id":147},"初学者容易混淆的地方",[37,149,150,159],{},[40,151,152,153,155,156,158],{},"使用 ",[50,154,56],{}," 创建空集合，实际得到空字典；空集合应写 ",[50,157,52],{},"。",[40,160,161],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,163,164],{"id":164},"练习",[130,166,167,173],{},[40,168,169,170,172],{},"把包含重复标签的列表交给 ",[50,171,52],{}," 去重。",[40,174,175],{},"计算两组课程标签的交集和差集。",[10,177,178],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,180,181],{"id":181},"本篇边界",[10,183,184],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,187,188],"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":70,"searchDepth":83,"depth":83,"links":190},[191,192,193,194,195,196,197,198],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",false,"2026-08-17",{"title":5,"description":12},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[199,211,212],"集合","数据结构","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",[215,1028,1365,1499,1651,1830,2018,2183,2366,2549,2742,2973,3157,3333,3490,3661,3788,4003,4232,4414,4578,4767,4955,5110,5270,5467,5664,5878,6045,6289,6470,6675,6870,7054,7255,7545,7737,7966,8161,8381,8621,8825],{"id":216,"title":217,"body":218,"category":199,"cover":200,"description":70,"extension":201,"meta":1017,"navigation":92,"path":1018,"pinned":204,"publishedAt":1019,"seo":1020,"slug":1021,"stem":1022,"summary":1023,"tags":1024,"updatedAt":1019,"visible":92,"__hash__":1027},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":219,"toc":993},[220,223,226,229,236,239,242,281,297,301,306,317,322,328,345,351,356,362,366,412,415,421,427,430,461,506,523,537,547,551,562,578,581,587,592,595,613,623,644,648,652,655,667,674,678,693,700,704,707,728,734,738,741,745,748,768,771,775,778,812,815,834,837,858,863,867,870,890,893,896,900,907,921,924,928,931,941,952,956,959,974,990],[14,221,222],{"id":222},"引言",[10,224,225],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,227,228],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,230,231,232,235],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[50,233,234],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,237,238],{"id":238},"扫盲",[10,240,241],{},"那么这里有几个概念：",[243,244,245,248],"blockquote",{},[10,246,247],{},"为什么需要安装python解释器？",[243,249,250,261,264,272,275],{},[10,251,252,253,256,257,260],{},"我们写的代码，电脑其实看不懂，电脑只认识",[50,254,255],{},"0","和",[50,258,259],{},"1","组成的机器指令。",[10,262,263],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,265,266,267,271],{},"这样，我们就能用",[268,269,270],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,273,274],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,276,277],{},[26,278],{"alt":279,"src":280},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[243,282,283,286],{},[10,284,285],{},"pip又是什么？",[243,287,288,291],{},[10,289,290],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,292,293],{},[26,294],{"alt":295,"src":296},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,298,300],{"id":299},"windows-安装","Windows 安装",[302,303,305],"h3",{"id":304},"_1-下载官方安装程序","1. 下载官方安装程序",[10,307,308,309,316],{},"打开 ",[310,311,315],"a",{"href":312,"rel":313},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[314],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[243,318,319],{},[10,320,321],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,323,324],{},[26,325],{"alt":326,"src":327},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,329,330,336,342],{},[40,331,332,333,158],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[268,334,335],{},"Windows installer (64-bit)",[40,337,338,339,158],{},"搭载 ARM 处理器的 Windows 设备选择 ",[268,340,341],{},"Windows installer (ARM64)",[40,343,344],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,346,347],{},[26,348],{"alt":349,"src":350},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[243,352,353],{},[10,354,355],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,357,358],{},[26,359],{"alt":360,"src":361},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[302,363,365],{"id":364},"_2-安装并加入-path","2. 安装并加入 PATH",[243,367,368,373,380,405],{},[243,369,370],{},[10,371,372],{},"PATH 环境变量",[10,374,375,376,379],{},"Windows 有一个特殊的变量叫 ",[268,377,378],{},"PATH","，它里面存了一串文件夹路径，比如：",[65,381,383],{"className":67,"code":382,"language":69,"meta":70,"style":70},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[50,384,385,390,395,400],{"__ignoreMap":70},[74,386,387],{"class":76,"line":77},[74,388,389],{},"D:\\Python313\\\n",[74,391,392],{"class":76,"line":83},[74,393,394],{},"D:\\Python313\\Scripts\\\n",[74,396,397],{"class":76,"line":89},[74,398,399],{},"C:\\Windows\\System32\\\n",[74,401,402],{"class":76,"line":96},[74,403,404],{},"...\n",[10,406,407,408,411],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[268,409,410],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,413,414],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,416,417,418,420],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[50,419,69],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,422,423],{},[26,424],{"alt":425,"src":426},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,428,429],{},"对安装界面最底部的两个勾选项分别解释 :",[243,431,432,435,440],{},[10,433,434],{},"Add python.exe to PATH",[10,436,437],{},[268,438,439],{},"把 Python 添加到系统环境变量",[243,441,442,448,454],{},[10,443,444,445,447],{},"勾选后，你可以在命令行任意位置直接输入 ",[50,446,69],{}," 就能运行",[10,449,450,451,453],{},"不勾选的话，命令行输入 ",[50,452,69],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,455,456,457,460],{},"必须",[268,458,459],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[243,462,463,466,471],{},[10,464,465],{},"Use admin privileges when installing py.exe",[10,467,468],{},[268,469,470],{},"使用管理员权限安装 py.exe（Python 启动器）",[243,472,473,483,497,500],{},[10,474,475,478,479,482],{},[50,476,477],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[50,480,481],{},"py"," 来启动 Python。",[10,484,485,486,488,489,492,493,496],{},"勾选后，",[50,487,477],{}," 会安装到",[268,490,491],{},"系统级目录","，电脑上",[268,494,495],{},"所有用户账户","都能用",[10,498,499],{},"不勾选，只有当前用户能用",[10,501,502,505],{},[268,503,504],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[243,507,508,511],{},[10,509,510],{},"操作建议",[243,512,513,520],{},[10,514,515,516,519],{},"两个都勾上之后，再点 ",[268,517,518],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,521,522],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[243,524,525,531],{},[10,526,527,528],{},"Python 安装的",[268,529,530],{},"可选功能页",[10,532,533],{},[26,534],{"alt":535,"src":536},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[243,538,539,542],{},[10,540,541],{},"高级选项页",[10,543,544],{},[26,545],{"alt":535,"src":546},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[302,548,550],{"id":549},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,552,553,554,557,558,561],{},"按 ",[50,555,556],{},"Win + R","，输入 ",[50,559,560],{},"cmd"," 并回车，然后执行：",[65,563,567],{"className":564,"code":565,"language":566,"meta":70,"style":70},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[50,568,569],{"__ignoreMap":70},[74,570,571,574],{"class":76,"line":77},[74,572,69],{"class":573},"svObZ",[74,575,577],{"class":576},"sDLfK"," --version\n",[10,579,580],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[65,582,585],{"className":583,"code":584,"language":120,"meta":70},[118],"Python 3.x.x\n",[50,586,584],{"__ignoreMap":70},[10,588,589],{},[26,590],{"alt":535,"src":591},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,593,594],{},"继续检查 pip：",[65,596,598],{"className":564,"code":597,"language":566,"meta":70,"style":70},"python -m pip --version\n",[50,599,600],{"__ignoreMap":70},[74,601,602,604,607,611],{"class":76,"line":77},[74,603,69],{"class":573},[74,605,606],{"class":576}," -m",[74,608,610],{"class":609},"sU2Wk"," pip",[74,612,577],{"class":576},[10,614,615,616,618,619,622],{},"如果 ",[50,617,69],{}," 无法识别，但 ",[50,620,621],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[65,624,626],{"className":564,"code":625,"language":566,"meta":70,"style":70},"py --version\npy -m pip --version\n",[50,627,628,634],{"__ignoreMap":70},[74,629,630,632],{"class":76,"line":77},[74,631,481],{"class":573},[74,633,577],{"class":576},[74,635,636,638,640,642],{"class":76,"line":83},[74,637,481],{"class":573},[74,639,606],{"class":576},[74,641,610],{"class":609},[74,643,577],{"class":576},[14,645,647],{"id":646},"macos-安装","macOS 安装",[302,649,651],{"id":650},"_1-先检查现有环境","1. 先检查现有环境",[10,653,654],{},"打开“终端”应用，执行：",[65,656,658],{"className":564,"code":657,"language":566,"meta":70,"style":70},"python3 --version\n",[50,659,660],{"__ignoreMap":70},[74,661,662,665],{"class":76,"line":77},[74,663,664],{"class":573},"python3",[74,666,577],{"class":576},[10,668,669,670,673],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[50,671,672],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[302,675,677],{"id":676},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,679,308,680,685,686,158,689,692],{},[310,681,684],{"href":682,"rel":683},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[314],"Python macOS 下载页","，下载当前稳定版的 ",[268,687,688],{},"macOS 64-bit universal2 installer",[50,690,691],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,694,695,696,699],{},"下载完成后打开 ",[50,697,698],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[302,701,703],{"id":702},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,705,706],{},"安装完成后重新打开终端，执行：",[65,708,710],{"className":564,"code":709,"language":566,"meta":70,"style":70},"python3 --version\npython3 -m pip --version\n",[50,711,712,718],{"__ignoreMap":70},[74,713,714,716],{"class":76,"line":77},[74,715,664],{"class":573},[74,717,577],{"class":576},[74,719,720,722,724,726],{"class":76,"line":83},[74,721,664],{"class":573},[74,723,606],{"class":576},[74,725,610],{"class":609},[74,727,577],{"class":576},[10,729,730,731,733],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[50,732,664],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,735,737],{"id":736},"linux-安装","Linux 安装",[10,739,740],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[302,742,744],{"id":743},"_1-检查是否已经安装","1. 检查是否已经安装",[10,746,747],{},"打开终端，执行：",[65,749,750],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,751,752,758],{"__ignoreMap":70},[74,753,754,756],{"class":76,"line":77},[74,755,664],{"class":573},[74,757,577],{"class":576},[74,759,760,762,764,766],{"class":76,"line":83},[74,761,664],{"class":573},[74,763,606],{"class":576},[74,765,610],{"class":609},[74,767,577],{"class":576},[10,769,770],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[302,772,774],{"id":773},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,776,777],{},"Ubuntu 或 Debian：",[65,779,781],{"className":564,"code":780,"language":566,"meta":70,"style":70},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[50,782,783,794],{"__ignoreMap":70},[74,784,785,788,791],{"class":76,"line":77},[74,786,787],{"class":573},"sudo",[74,789,790],{"class":609}," apt",[74,792,793],{"class":609}," update\n",[74,795,796,798,800,803,806,809],{"class":76,"line":83},[74,797,787],{"class":573},[74,799,790],{"class":609},[74,801,802],{"class":609}," install",[74,804,805],{"class":609}," python3",[74,807,808],{"class":609}," python3-pip",[74,810,811],{"class":609}," python3-venv\n",[10,813,814],{},"Fedora：",[65,816,818],{"className":564,"code":817,"language":566,"meta":70,"style":70},"sudo dnf install python3 python3-pip\n",[50,819,820],{"__ignoreMap":70},[74,821,822,824,827,829,831],{"class":76,"line":77},[74,823,787],{"class":573},[74,825,826],{"class":609}," dnf",[74,828,802],{"class":609},[74,830,805],{"class":609},[74,832,833],{"class":609}," python3-pip\n",[10,835,836],{},"Arch Linux：",[65,838,840],{"className":564,"code":839,"language":566,"meta":70,"style":70},"sudo pacman -S python python-pip\n",[50,841,842],{"__ignoreMap":70},[74,843,844,846,849,852,855],{"class":76,"line":77},[74,845,787],{"class":573},[74,847,848],{"class":609}," pacman",[74,850,851],{"class":576}," -S",[74,853,854],{"class":609}," python",[74,856,857],{"class":609}," python-pip\n",[10,859,860,862],{},[50,861,787],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[302,864,866],{"id":865},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,868,869],{},"安装结束后执行：",[65,871,872],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,873,874,880],{"__ignoreMap":70},[74,875,876,878],{"class":76,"line":77},[74,877,664],{"class":573},[74,879,577],{"class":576},[74,881,882,884,886,888],{"class":76,"line":83},[74,883,664],{"class":573},[74,885,606],{"class":576},[74,887,610],{"class":609},[74,889,577],{"class":576},[10,891,892],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,894,895],{"id":895},"常见问题",[302,897,899],{"id":898},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,901,902,903,906],{},"先关闭当前命令提示符并重新打开，再执行 ",[50,904,905],{},"python --version","。如果仍然失败，按下面的顺序检查：",[130,908,909,915,918],{},[40,910,911,912,914],{},"执行 ",[50,913,621],{},"，确认 Python Launcher 是否可用。",[40,916,917],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,919,920],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,922,923],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[302,925,927],{"id":926},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,929,930],{},"先尝试：",[65,932,933],{"className":564,"code":657,"language":566,"meta":70,"style":70},[50,934,935],{"__ignoreMap":70},[74,936,937,939],{"class":76,"line":77},[74,938,664],{"class":573},[74,940,577],{"class":576},[10,942,943,944,946,947,949,950,158],{},"在这两个系统中，只有 ",[50,945,664],{}," 命令而没有 ",[50,948,69],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[50,951,664],{},[302,953,955],{"id":954},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,957,958],{},"先使用模块方式检查：",[65,960,962],{"className":564,"code":961,"language":566,"meta":70,"style":70},"python3 -m pip --version\n",[50,963,964],{"__ignoreMap":70},[74,965,966,968,970,972],{"class":76,"line":77},[74,967,664],{"class":573},[74,969,606],{"class":576},[74,971,610],{"class":609},[74,973,577],{"class":576},[10,975,976,977,979,980,982,983,985,986,989],{},"Windows 用户将命令中的 ",[50,978,664],{}," 换成 ",[50,981,69],{}," 或 ",[50,984,481],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[50,987,988],{},"python3-pip","；不要直接使用其他系统的安装命令。",[186,991,992],{},"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":70,"searchDepth":83,"depth":83,"links":994},[995,996,997,1002,1007,1012],{"id":222,"depth":83,"text":222},{"id":238,"depth":83,"text":238},{"id":299,"depth":83,"text":300,"children":998},[999,1000,1001],{"id":304,"depth":89,"text":305},{"id":364,"depth":89,"text":365},{"id":549,"depth":89,"text":550},{"id":646,"depth":83,"text":647,"children":1003},[1004,1005,1006],{"id":650,"depth":89,"text":651},{"id":676,"depth":89,"text":677},{"id":702,"depth":89,"text":703},{"id":736,"depth":83,"text":737,"children":1008},[1009,1010,1011],{"id":743,"depth":89,"text":744},{"id":773,"depth":89,"text":774},{"id":865,"depth":89,"text":866},{"id":895,"depth":83,"text":895,"children":1013},[1014,1015,1016],{"id":898,"depth":89,"text":899},{"id":926,"depth":89,"text":927},{"id":954,"depth":89,"text":955},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":217,"description":70},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[199,1025,1026],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1029,"title":1030,"body":1031,"category":199,"cover":1038,"description":70,"extension":201,"meta":1354,"navigation":92,"path":1355,"pinned":204,"publishedAt":1356,"seo":1357,"slug":1358,"stem":1359,"summary":1360,"tags":1361,"updatedAt":1356,"visible":92,"__hash__":1364},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1032,"toc":1339},[1033,1039,1042,1045,1049,1052,1076,1079,1085,1088,1091,1125,1135,1139,1146,1149,1174,1177,1189,1192,1196,1199,1202,1205,1208,1211,1214,1217,1241,1244,1247,1253,1256,1259,1262,1266,1272,1275,1301,1304,1308,1311,1314,1318,1321,1324,1327,1330,1333,1336],[10,1034,1035],{},[26,1036],{"alt":1037,"src":1038},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1040,1041],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1043,1044],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1046,1048],{"id":1047},"python-代码是什么样的","Python 代码是什么样的",[10,1050,1051],{},"下面是一段简单的 Python 代码：",[65,1053,1055],{"className":67,"code":1054,"language":69,"meta":70,"style":70},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[50,1056,1057,1062,1067,1071],{"__ignoreMap":70},[74,1058,1059],{"class":76,"line":77},[74,1060,1061],{},"name = \"Python\"\n",[74,1063,1064],{"class":76,"line":83},[74,1065,1066],{},"year = 2026\n",[74,1068,1069],{"class":76,"line":89},[74,1070,93],{"emptyLinePlaceholder":92},[74,1072,1073],{"class":76,"line":96},[74,1074,1075],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1077,1078],{},"运行结果：",[65,1080,1083],{"className":1081,"code":1082,"language":120,"meta":70},[118],"正在学习 Python，当前年份是 2026\n",[50,1084,1082],{"__ignoreMap":70},[10,1086,1087],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1089,1090],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[65,1092,1094],{"className":67,"code":1093,"language":69,"meta":70,"style":70},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[50,1095,1096,1101,1105,1110,1115,1120],{"__ignoreMap":70},[74,1097,1098],{"class":76,"line":77},[74,1099,1100],{},"score = 85\n",[74,1102,1103],{"class":76,"line":83},[74,1104,93],{"emptyLinePlaceholder":92},[74,1106,1107],{"class":76,"line":89},[74,1108,1109],{},"if score >= 60:\n",[74,1111,1112],{"class":76,"line":96},[74,1113,1114],{},"    print(\"成绩合格\")\n",[74,1116,1117],{"class":76,"line":102},[74,1118,1119],{},"else:\n",[74,1121,1122],{"class":76,"line":108},[74,1123,1124],{},"    print(\"需要继续学习\")\n",[10,1126,1127,1130,1131,1134],{},[50,1128,1129],{},"if"," 和 ",[50,1132,1133],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1136,1138],{"id":1137},"python-如何运行代码","Python 如何运行代码",[10,1140,1141,1142,1145],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[50,1143,1144],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1147,1148],{},"交互式环境适合快速验证一个表达式：",[65,1150,1152],{"className":67,"code":1151,"language":69,"meta":70,"style":70},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[50,1153,1154,1159,1164,1169],{"__ignoreMap":70},[74,1155,1156],{"class":76,"line":77},[74,1157,1158],{},">>> 10 + 20\n",[74,1160,1161],{"class":76,"line":83},[74,1162,1163],{},"30\n",[74,1165,1166],{"class":76,"line":89},[74,1167,1168],{},">>> \"Python\".lower()\n",[74,1170,1171],{"class":76,"line":96},[74,1172,1173],{},"'python'\n",[10,1175,1176],{},"需要保存和重复运行的程序，则可以写入文件：",[65,1178,1180],{"className":564,"code":1179,"language":566,"meta":70,"style":70},"python3 hello.py\n",[50,1181,1182],{"__ignoreMap":70},[74,1183,1184,1186],{"class":76,"line":77},[74,1185,664],{"class":573},[74,1187,1188],{"class":609}," hello.py\n",[10,1190,1191],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1193,1195],{"id":1194},"python-的特点","Python 的特点",[302,1197,1198],{"id":1198},"语法相对简洁",[10,1200,1201],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[302,1203,1204],{"id":1204},"支持多种编程方式",[10,1206,1207],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[302,1209,1210],{"id":1210},"标准库比较完整",[10,1212,1213],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1215,1216],{},"例如，获取当前时间：",[65,1218,1220],{"className":67,"code":1219,"language":69,"meta":70,"style":70},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[50,1221,1222,1227,1231,1236],{"__ignoreMap":70},[74,1223,1224],{"class":76,"line":77},[74,1225,1226],{},"from datetime import datetime\n",[74,1228,1229],{"class":76,"line":83},[74,1230,93],{"emptyLinePlaceholder":92},[74,1232,1233],{"class":76,"line":89},[74,1234,1235],{},"now = datetime.now()\n",[74,1237,1238],{"class":76,"line":96},[74,1239,1240],{},"print(now)\n",[10,1242,1243],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[302,1245,1246],{"id":1246},"第三方工具丰富",[10,1248,1249,1250,1252],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[50,1251,234],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1254,1255],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[302,1257,1258],{"id":1258},"支持多个操作系统",[10,1260,1261],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1263,1265],{"id":1264},"python-可以做什么","Python 可以做什么",[10,1267,1268],{},[26,1269],{"alt":1270,"src":1271},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1273,1274],{},"Python 的应用范围比较广，常见方向包括：",[37,1276,1277,1280,1283,1286,1289,1292,1295,1298],{},[40,1278,1279],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1281,1282],{},"开发网站后端和 API 服务；",[40,1284,1285],{},"进行数据清洗、统计分析和图表展示；",[40,1287,1288],{},"编写网络爬虫和信息采集工具；",[40,1290,1291],{},"开发自动化测试程序；",[40,1293,1294],{},"进行机器学习和人工智能开发；",[40,1296,1297],{},"编写运维、监控和辅助开发工具；",[40,1299,1300],{},"开发部分桌面应用和插件。",[10,1302,1303],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1305,1307],{"id":1306},"python-的发展","Python 的发展",[10,1309,1310],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1312,1313],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1315,1317],{"id":1316},"python-也有局限","Python 也有局限",[10,1319,1320],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1322,1323],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1325,1326],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1328,1329],{"id":1329},"写在最后",[10,1331,1332],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1334,1335],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[186,1337,1338],{},"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":70,"searchDepth":83,"depth":83,"links":1340},[1341,1342,1343,1350,1351,1352,1353],{"id":1047,"depth":83,"text":1048},{"id":1137,"depth":83,"text":1138},{"id":1194,"depth":83,"text":1195,"children":1344},[1345,1346,1347,1348,1349],{"id":1198,"depth":89,"text":1198},{"id":1204,"depth":89,"text":1204},{"id":1210,"depth":89,"text":1210},{"id":1246,"depth":89,"text":1246},{"id":1258,"depth":89,"text":1258},{"id":1264,"depth":83,"text":1265},{"id":1306,"depth":83,"text":1307},{"id":1316,"depth":83,"text":1317},{"id":1329,"depth":83,"text":1329},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1030,"description":70},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[199,1362,1363],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1366,"title":1367,"body":1368,"category":199,"cover":200,"description":1372,"extension":201,"meta":1490,"navigation":92,"path":1491,"pinned":204,"publishedAt":205,"seo":1492,"slug":1493,"stem":1494,"summary":1495,"tags":1496,"updatedAt":205,"visible":92,"__hash__":1498},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1369,"toc":1480},[1370,1373,1375,1378,1380,1386,1391,1393,1407,1409,1411,1420,1422,1428,1430,1432,1448,1450,1461,1463,1471,1473,1475,1478],[10,1371,1372],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1374,16],{"id":16},[10,1376,1377],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1379,22],{"id":22},[10,1381,1382],{},[26,1383],{"alt":1384,"src":1385},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1387,1388,1390],{},[50,1389,1144],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1392,35],{"id":35},[37,1394,1395,1401,1404],{},[40,1396,1397,1398,1400],{},"源代码是人编写的文本，通常保存在 ",[50,1399,1144],{}," 文件中。",[40,1402,1403],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1405,1406],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1408,60],{"id":60},[10,1410,63],{},[65,1412,1414],{"className":67,"code":1413,"language":69,"meta":70,"style":70},"print(\"你好，Python\")\n",[50,1415,1416],{"__ignoreMap":70},[74,1417,1418],{"class":76,"line":77},[74,1419,1413],{},[10,1421,114],{},[65,1423,1426],{"className":1424,"code":1425,"language":120,"meta":70},[118],"你好，Python\n",[50,1427,1425],{"__ignoreMap":70},[10,1429,125],{},[14,1431,128],{"id":128},[130,1433,1434,1441],{},[40,1435,1436,1437,1440],{},"终端启动解释器后，解释器读取 ",[50,1438,1439],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1442,1443,1444,1447],{},"字符串对象先准备好，再交给 ",[50,1445,1446],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1449,147],{"id":147},[37,1451,1452,1455],{},[40,1453,1454],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1456,1457,1458,1460],{},"认为 ",[50,1459,1144],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1462,164],{"id":164},[130,1464,1465,1468],{},[40,1466,1467],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1469,1470],{},"把示例文字改成自己的学习目标并重新运行。",[10,1472,178],{},[14,1474,181],{"id":181},[10,1476,1477],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1479,188],{},{"title":70,"searchDepth":83,"depth":83,"links":1481},[1482,1483,1484,1485,1486,1487,1488,1489],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1367,"description":1372},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[199,1362,1497],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1500,"title":1501,"body":1502,"category":199,"cover":200,"description":1506,"extension":201,"meta":1642,"navigation":92,"path":1643,"pinned":204,"publishedAt":205,"seo":1644,"slug":1645,"stem":1646,"summary":1647,"tags":1648,"updatedAt":205,"visible":92,"__hash__":1650},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1503,"toc":1632},[1504,1507,1509,1512,1514,1520,1526,1528,1543,1545,1548,1568,1570,1576,1578,1580,1593,1595,1609,1611,1622,1624,1626,1629],[10,1505,1506],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1508,16],{"id":16},[10,1510,1511],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1513,22],{"id":22},[10,1515,1516],{},[26,1517],{"alt":1518,"src":1519},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1521,1522,1523,1525],{},"终端收到 ",[50,1524,664],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1527,35],{"id":35},[37,1529,1530,1533,1536],{},[40,1531,1532],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1534,1535],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1537,1538,1539,1542],{},"检查 pip 时使用 ",[50,1540,1541],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1544,60],{"id":60},[10,1546,1547],{},"在 macOS 终端执行：",[65,1549,1550],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,1551,1552,1558],{"__ignoreMap":70},[74,1553,1554,1556],{"class":76,"line":77},[74,1555,664],{"class":573},[74,1557,577],{"class":576},[74,1559,1560,1562,1564,1566],{"class":76,"line":83},[74,1561,664],{"class":573},[74,1563,606],{"class":576},[74,1565,610],{"class":609},[74,1567,577],{"class":576},[10,1569,114],{},[65,1571,1574],{"className":1572,"code":1573,"language":120,"meta":70},[118],"Python 3.14.x\npip 版本信息与安装路径\n",[50,1575,1573],{"__ignoreMap":70},[10,1577,125],{},[14,1579,128],{"id":128},[130,1581,1582,1588],{},[40,1583,1584,1587],{},[50,1585,1586],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1589,1590,1592],{},[50,1591,672],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1594,147],{"id":147},[37,1596,1597,1603],{},[40,1598,1599,1600,1602],{},"看到系统已有 ",[50,1601,664],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1604,1605,1606,1608],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[50,1607,664],{},"，不修改系统自带工具。",[14,1610,164],{"id":164},[130,1612,1613,1619],{},[40,1614,911,1615,1618],{},[50,1616,1617],{},"which python3","，记录当前解释器路径。",[40,1620,1621],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1623,178],{},[14,1625,181],{"id":181},[10,1627,1628],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1630,1631],{},"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":70,"searchDepth":83,"depth":83,"links":1633},[1634,1635,1636,1637,1638,1639,1640,1641],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1501,"description":1506},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[199,1649,1025],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1652,"title":1653,"body":1654,"category":199,"cover":200,"description":1819,"extension":201,"meta":1820,"navigation":92,"path":1821,"pinned":204,"publishedAt":205,"seo":1822,"slug":1823,"stem":1824,"summary":1825,"tags":1826,"updatedAt":205,"visible":92,"__hash__":1829},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1655,"toc":1809},[1656,1662,1664,1667,1669,1675,1678,1680,1704,1706,1708,1735,1737,1743,1745,1747,1765,1767,1781,1783,1797,1799,1801,1807],[10,1657,1658,1659,1661],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[50,1660,1144],{}," 脚本。",[14,1663,16],{"id":16},[10,1665,1666],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1668,22],{"id":22},[10,1670,1671],{},[26,1672],{"alt":1673,"src":1674},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1676,1677],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1679,35],{"id":35},[37,1681,1682,1691,1698],{},[40,1683,1684,1685,1687,1688,158],{},"在终端输入 ",[50,1686,664],{}," 进入 REPL，提示符通常是 ",[50,1689,1690],{},">>>",[40,1692,1693,1694,1697],{},"输入 ",[50,1695,1696],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1699,1700,1701,1703],{},"需要保存、复查或多次运行的代码应写入 ",[50,1702,1144],{}," 文件。",[14,1705,60],{"id":60},[10,1707,63],{},[65,1709,1713],{"className":1710,"code":1711,"language":1712,"meta":70,"style":70},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[50,1714,1715,1720,1725,1730],{"__ignoreMap":70},[74,1716,1717],{"class":76,"line":77},[74,1718,1719],{},">>> 2 + 3\n",[74,1721,1722],{"class":76,"line":83},[74,1723,1724],{},"5\n",[74,1726,1727],{"class":76,"line":89},[74,1728,1729],{},">>> \"python\".upper()\n",[74,1731,1732],{"class":76,"line":96},[74,1733,1734],{},"'PYTHON'\n",[10,1736,114],{},[65,1738,1741],{"className":1739,"code":1740,"language":120,"meta":70},[118],"REPL 会直接显示表达式结果\n",[50,1742,1740],{"__ignoreMap":70},[10,1744,125],{},[14,1746,128],{"id":128},[130,1748,1749,1759],{},[40,1750,1751,1752,1755,1756,158],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[50,1753,1754],{},"2 + 3"," 能直接看到 ",[50,1757,1758],{},"5",[40,1760,1761,1762,1764],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[50,1763,1446],{}," 才会写到标准输出。",[14,1766,147],{"id":147},[37,1768,1769,1778],{},[40,1770,1771,1772,1774,1775,1777],{},"把提示符 ",[50,1773,1690],{}," 复制进 ",[50,1776,1144],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1779,1780],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1782,164],{"id":164},[130,1784,1785,1791],{},[40,1786,1787,1788,158],{},"在 REPL 计算 ",[50,1789,1790],{},"12 * 8",[40,1792,1793,1794,1796],{},"把同一表达式写入脚本；观察脚本中不调用 ",[50,1795,1446],{}," 时是否显示结果。",[10,1798,178],{},[14,1800,181],{"id":181},[10,1802,1803,1804,1806],{},"本篇目标是根据任务选择 REPL 或 ",[50,1805,1144],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1808,188],{},{"title":70,"searchDepth":83,"depth":83,"links":1810},[1811,1812,1813,1814,1815,1816,1817,1818],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1653,"description":1819},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[199,1827,1828],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1831,"title":1832,"body":1833,"category":199,"cover":200,"description":1837,"extension":201,"meta":2008,"navigation":92,"path":2009,"pinned":204,"publishedAt":205,"seo":2010,"slug":2011,"stem":2012,"summary":2013,"tags":2014,"updatedAt":205,"visible":92,"__hash__":2017},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1834,"toc":1998},[1835,1838,1840,1843,1845,1851,1857,1859,1877,1879,1881,1926,1928,1934,1936,1938,1960,1962,1974,1976,1988,1990,1992,1995],[10,1836,1837],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1839,16],{"id":16},[10,1841,1842],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1844,22],{"id":22},[10,1846,1847],{},[26,1848],{"alt":1849,"src":1850},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1852,1853,1856],{},[50,1854,1855],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1858,35],{"id":35},[37,1860,1861,1864,1874],{},[40,1862,1863],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1865,1866,1869,1870,1873],{},[50,1867,1868],{},"pwd"," 显示当前目录，",[50,1871,1872],{},"ls"," 显示目录里的文件。",[40,1875,1876],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1878,60],{"id":60},[10,1880,1547],{},[65,1882,1884],{"className":564,"code":1883,"language":566,"meta":70,"style":70},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[50,1885,1886,1894,1901,1906,1920],{"__ignoreMap":70},[74,1887,1888,1891],{"class":76,"line":77},[74,1889,1890],{"class":573},"mkdir",[74,1892,1893],{"class":609}," python-study\n",[74,1895,1896,1899],{"class":76,"line":83},[74,1897,1898],{"class":576},"cd",[74,1900,1893],{"class":609},[74,1902,1903],{"class":76,"line":89},[74,1904,1905],{"class":576},"pwd\n",[74,1907,1908,1911,1914,1918],{"class":76,"line":96},[74,1909,1910],{"class":576},"printf",[74,1912,1913],{"class":609}," 'print(\"项目已经运行\")\\n'",[74,1915,1917],{"class":1916},"snl16"," >",[74,1919,1188],{"class":609},[74,1921,1922,1924],{"class":76,"line":102},[74,1923,664],{"class":573},[74,1925,1188],{"class":609},[10,1927,114],{},[65,1929,1932],{"className":1930,"code":1931,"language":120,"meta":70},[118],"项目已经运行\n",[50,1933,1931],{"__ignoreMap":70},[10,1935,125],{},[14,1937,128],{"id":128},[130,1939,1940,1951],{},[40,1941,1942,1944,1945,1947,1948,1950],{},[50,1943,1890],{}," 创建目录，",[50,1946,1898],{}," 改变终端当前目录，",[50,1949,1868],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1952,1953,1955,1956,1959],{},[50,1954,1855],{}," 会在当前目录寻找 ",[50,1957,1958],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1961,147],{"id":147},[37,1963,1964,1971],{},[40,1965,1966,1967,1130,1969,158],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[50,1968,1868],{},[50,1970,1872],{},[40,1972,1973],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1975,164],{"id":164},[130,1977,1978,1985],{},[40,1979,1980,1981,1984],{},"新建 ",[50,1982,1983],{},"lesson01.py"," 并输出课程编号。",[40,1986,1987],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1989,178],{},[14,1991,181],{"id":181},[10,1993,1994],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1996,1997],{},"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":70,"searchDepth":83,"depth":83,"links":1999},[2000,2001,2002,2003,2004,2005,2006,2007],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1832,"description":1837},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[199,2015,2016],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2019,"title":2020,"body":2021,"category":199,"cover":200,"description":2025,"extension":201,"meta":2173,"navigation":92,"path":2174,"pinned":204,"publishedAt":205,"seo":2175,"slug":2176,"stem":2177,"summary":2178,"tags":2179,"updatedAt":205,"visible":92,"__hash__":2182},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2022,"toc":2163},[2023,2026,2028,2031,2033,2039,2050,2052,2072,2074,2076,2096,2098,2104,2106,2108,2127,2129,2137,2139,2154,2156,2158,2161],[10,2024,2025],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2027,16],{"id":16},[10,2029,2030],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2032,22],{"id":22},[10,2034,2035],{},[26,2036],{"alt":2037,"src":2038},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2040,2041,2042,158,2044,2047,2048,158],{},"Python 先计算表达式，再把得到的对象交给 ",[50,2043,1446],{},[50,2045,2046],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[50,2049,1754],{},[14,2051,35],{"id":35},[37,2053,2054,2060,2069],{},[40,2055,2056,2059],{},[50,2057,2058],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2061,2062,2065,2066,158],{},[50,2063,2064],{},"7 + 5"," 是表达式，运行时先求值得到 ",[50,2067,2068],{},"12",[40,2070,2071],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2073,60],{"id":60},[10,2075,63],{},[65,2077,2079],{"className":67,"code":2078,"language":69,"meta":70,"style":70},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[50,2080,2081,2086,2091],{"__ignoreMap":70},[74,2082,2083],{"class":76,"line":77},[74,2084,2085],{},"print(42)\n",[74,2087,2088],{"class":76,"line":83},[74,2089,2090],{},"print(7 + 5)\n",[74,2092,2093],{"class":76,"line":89},[74,2094,2095],{},"print(\"Python 基础课\")\n",[10,2097,114],{},[65,2099,2102],{"className":2100,"code":2101,"language":120,"meta":70},[118],"42\n12\nPython 基础课\n",[50,2103,2101],{"__ignoreMap":70},[10,2105,125],{},[14,2107,128],{"id":128},[130,2109,2110,2118],{},[40,2111,2112,2115,2116,158],{},[50,2113,2114],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[50,2117,2068],{},[40,2119,2120,2122,2123,2126],{},[50,2121,1446],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[50,2124,2125],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2128,147],{"id":147},[37,2130,2131,2134],{},[40,2132,2133],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2135,2136],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2138,164],{"id":164},[130,2140,2141,2144],{},[40,2142,2143],{},"分别输出一个整数、一个小数和一段文本。",[40,2145,2146,2147,2149,2150,2153],{},"比较 ",[50,2148,2046],{}," 与 ",[50,2151,2152],{},"print(\"2 + 3\")"," 的结果。",[10,2155,178],{},[14,2157,181],{"id":181},[10,2159,2160],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2162,188],{},{"title":70,"searchDepth":83,"depth":83,"links":2164},[2165,2166,2167,2168,2169,2170,2171,2172],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2020,"description":2025},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[199,2180,2181],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2184,"title":2185,"body":2186,"category":199,"cover":200,"description":2190,"extension":201,"meta":2356,"navigation":92,"path":2357,"pinned":204,"publishedAt":205,"seo":2358,"slug":2359,"stem":2360,"summary":2361,"tags":2362,"updatedAt":205,"visible":92,"__hash__":2365},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2187,"toc":2346},[2188,2191,2193,2196,2198,2204,2207,2209,2235,2237,2239,2267,2269,2275,2277,2279,2303,2305,2320,2322,2337,2339,2341,2344],[10,2189,2190],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2192,16],{"id":16},[10,2194,2195],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2197,22],{"id":22},[10,2199,2200],{},[26,2201],{"alt":2202,"src":2203},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2205,2206],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2208,35],{"id":35},[37,2210,2211,2214,2224],{},[40,2212,2213],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2215,2216,2217,2149,2220,2223],{},"变量名区分大小写，",[50,2218,2219],{},"score",[50,2221,2222],{},"Score"," 是两个名字。",[40,2225,2226,2227,2230,2231,2234],{},"使用能表达含义的名称；不要用 ",[50,2228,2229],{},"list","、",[50,2232,2233],{},"str"," 等内置名称作为普通变量名。",[14,2236,60],{"id":60},[10,2238,63],{},[65,2240,2242],{"className":67,"code":2241,"language":69,"meta":70,"style":70},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[50,2243,2244,2249,2254,2258,2263],{"__ignoreMap":70},[74,2245,2246],{"class":76,"line":77},[74,2247,2248],{},"score = 90\n",[74,2250,2251],{"class":76,"line":83},[74,2252,2253],{},"print(score)\n",[74,2255,2256],{"class":76,"line":89},[74,2257,93],{"emptyLinePlaceholder":92},[74,2259,2260],{"class":76,"line":96},[74,2261,2262],{},"score = 95\n",[74,2264,2265],{"class":76,"line":102},[74,2266,2253],{},[10,2268,114],{},[65,2270,2273],{"className":2271,"code":2272,"language":120,"meta":70},[118],"90\n95\n",[50,2274,2272],{"__ignoreMap":70},[10,2276,125],{},[14,2278,128],{"id":128},[130,2280,2281,2290],{},[40,2282,911,2283,2286,2287,2289],{},[50,2284,2285],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[50,2288,2219],{}," 再绑定到它。",[40,2291,911,2292,2295,2296,2299,2300,158],{},[50,2293,2294],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[50,2297,2298],{},"90"," 没有被改造成 ",[50,2301,2302],{},"95",[14,2304,147],{"id":147},[37,2306,2307,2310],{},[40,2308,2309],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2311,152,2312,2230,2314,2230,2316,2319],{},[50,2313,2229],{},[50,2315,2233],{},[50,2317,2318],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2321,164],{"id":164},[130,2323,2324,2334],{},[40,2325,2326,2327,1130,2330,2333],{},"创建 ",[50,2328,2329],{},"course_name",[50,2331,2332],{},"lesson_count"," 两个变量并输出。",[40,2335,2336],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2338,178],{},[14,2340,181],{"id":181},[10,2342,2343],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2345,188],{},{"title":70,"searchDepth":83,"depth":83,"links":2347},[2348,2349,2350,2351,2352,2353,2354,2355],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2185,"description":2190},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[199,2363,2364],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2367,"title":2368,"body":2369,"category":199,"cover":200,"description":2373,"extension":201,"meta":2539,"navigation":92,"path":2540,"pinned":204,"publishedAt":205,"seo":2541,"slug":2542,"stem":2543,"summary":2544,"tags":2545,"updatedAt":205,"visible":92,"__hash__":2548},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2370,"toc":2529},[2371,2374,2376,2379,2381,2387,2390,2392,2421,2423,2425,2471,2473,2479,2481,2483,2497,2499,2510,2512,2520,2522,2524,2527],[10,2372,2373],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2375,16],{"id":16},[10,2377,2378],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2380,22],{"id":22},[10,2382,2383],{},[26,2384],{"alt":2385,"src":2386},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2388,2389],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2391,35],{"id":35},[37,2393,2394,2404,2418],{},[40,2395,2396,2399,2400,2403],{},[50,2397,2398],{},"int"," 表示整数，",[50,2401,2402],{},"float"," 表示浮点数。",[40,2405,2406,2409,2410,2413,2414,2417],{},[50,2407,2408],{},"\u002F"," 总是进行真除法；",[50,2411,2412],{},"\u002F\u002F"," 是向下取整除法，",[50,2415,2416],{},"%"," 得到余数。",[40,2419,2420],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2422,60],{"id":60},[10,2424,63],{},[65,2426,2428],{"className":67,"code":2427,"language":69,"meta":70,"style":70},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[50,2429,2430,2435,2440,2445,2449,2454,2459,2465],{"__ignoreMap":70},[74,2431,2432],{"class":76,"line":77},[74,2433,2434],{},"price = 25\n",[74,2436,2437],{"class":76,"line":83},[74,2438,2439],{},"count = 4\n",[74,2441,2442],{"class":76,"line":89},[74,2443,2444],{},"discount = 0.9\n",[74,2446,2447],{"class":76,"line":96},[74,2448,93],{"emptyLinePlaceholder":92},[74,2450,2451],{"class":76,"line":102},[74,2452,2453],{},"total = price * count * discount\n",[74,2455,2456],{"class":76,"line":108},[74,2457,2458],{},"average = total \u002F count\n",[74,2460,2462],{"class":76,"line":2461},7,[74,2463,2464],{},"print(total)\n",[74,2466,2468],{"class":76,"line":2467},8,[74,2469,2470],{},"print(average)\n",[10,2472,114],{},[65,2474,2477],{"className":2475,"code":2476,"language":120,"meta":70},[118],"90.0\n22.5\n",[50,2478,2476],{"__ignoreMap":70},[10,2480,125],{},[14,2482,128],{"id":128},[130,2484,2485,2491],{},[40,2486,2487,2490],{},[50,2488,2489],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2492,2493,2496],{},[50,2494,2495],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2498,147],{"id":147},[37,2500,2501,2507],{},[40,2502,2503,2504,158],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[50,2505,2506],{},"decimal.Decimal",[40,2508,2509],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2511,164],{"id":164},[130,2513,2514,2517],{},[40,2515,2516],{},"计算 137 除以 10 的商和余数。",[40,2518,2519],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2521,178],{},[14,2523,181],{"id":181},[10,2525,2526],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2528,188],{},{"title":70,"searchDepth":83,"depth":83,"links":2530},[2531,2532,2533,2534,2535,2536,2537,2538],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2368,"description":2373},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[199,2546,2547],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2550,"title":2551,"body":2552,"category":199,"cover":200,"description":2556,"extension":201,"meta":2732,"navigation":92,"path":2733,"pinned":204,"publishedAt":205,"seo":2734,"slug":2735,"stem":2736,"summary":2737,"tags":2738,"updatedAt":205,"visible":92,"__hash__":2741},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2553,"toc":2720},[2554,2557,2559,2562,2564,2570,2580,2582,2593,2595,2597,2627,2629,2635,2637,2639,2669,2672,2675,2681,2684,2686,2694,2696,2711,2713,2715,2718],[10,2555,2556],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2558,16],{"id":16},[10,2560,2561],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2563,22],{"id":22},[10,2565,2566],{},[26,2567],{"alt":2568,"src":2569},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2571,2572,2573,2576,2577,158],{},"切片 ",[50,2574,2575],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[50,2578,2579],{},"stop - start",[14,2581,35],{"id":35},[37,2583,2584,2587,2590],{},[40,2585,2586],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2588,2589],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2591,2592],{},"切片会创建新的字符串，不会修改原字符串。",[14,2594,60],{"id":60},[10,2596,63],{},[65,2598,2600],{"className":67,"code":2599,"language":69,"meta":70,"style":70},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[50,2601,2602,2607,2612,2617,2622],{"__ignoreMap":70},[74,2603,2604],{"class":76,"line":77},[74,2605,2606],{},"language = \"Python\"\n",[74,2608,2609],{"class":76,"line":83},[74,2610,2611],{},"print(language[0])\n",[74,2613,2614],{"class":76,"line":89},[74,2615,2616],{},"print(language[-1])\n",[74,2618,2619],{"class":76,"line":96},[74,2620,2621],{},"print(language[0:3])\n",[74,2623,2624],{"class":76,"line":102},[74,2625,2626],{},"print(language + \" 3.14\")\n",[10,2628,114],{},[65,2630,2633],{"className":2631,"code":2632,"language":120,"meta":70},[118],"P\nn\nPyt\nPython 3.14\n",[50,2634,2632],{"__ignoreMap":70},[10,2636,125],{},[14,2638,128],{"id":128},[130,2640,2641,2655],{},[40,2642,2643,2644,2646,2647,2650,2651,2654],{},"字符串 ",[50,2645,199],{}," 的正索引从 ",[50,2648,2649],{},"P"," 的 0 开始，负索引从末尾 ",[50,2652,2653],{},"n"," 的 -1 开始。",[40,2656,2657,2660,2661,2664,2665,2668],{},[50,2658,2659],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[50,2662,2663],{},"Pyt","；索引 3 的 ",[50,2666,2667],{},"h"," 不在结果中。",[302,2670,2671],{"id":2671},"再看一个具体细节",[10,2673,2674],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2676,2677],{},[26,2678],{"alt":2679,"src":2680},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2682,2683],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2685,147],{"id":147},[37,2687,2688,2691],{},[40,2689,2690],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2692,2693],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2695,164],{"id":164},[130,2697,2698,2708],{},[40,2699,2700,2701,2704,2705,158],{},"从 ",[50,2702,2703],{},"\"programming\""," 中切出 ",[50,2706,2707],{},"\"gram\"",[40,2709,2710],{},"使用负索引取得字符串倒数第二个字符。",[10,2712,178],{},[14,2714,181],{"id":181},[10,2716,2717],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2719,188],{},{"title":70,"searchDepth":83,"depth":83,"links":2721},[2722,2723,2724,2725,2726,2729,2730,2731],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":2727},[2728],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2551,"description":2556},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[199,2739,2740],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2743,"title":2744,"body":2745,"category":199,"cover":200,"description":2749,"extension":201,"meta":2963,"navigation":92,"path":2964,"pinned":204,"publishedAt":205,"seo":2965,"slug":2966,"stem":2967,"summary":2968,"tags":2969,"updatedAt":205,"visible":92,"__hash__":2972},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2746,"toc":2951},[2747,2750,2752,2755,2757,2763,2773,2775,2808,2810,2812,2856,2858,2864,2866,2868,2889,2891,2894,2900,2908,2910,2924,2926,2942,2944,2946,2949],[10,2748,2749],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2751,16],{"id":16},[10,2753,2754],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2756,22],{"id":22},[10,2758,2759],{},[26,2760],{"alt":2761,"src":2762},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2764,2765,2766,982,2769,2772],{},"比较表达式先产生 ",[50,2767,2768],{},"True",[50,2770,2771],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2774,35],{"id":35},[37,2776,2777,2791,2805],{},[40,2778,2779,2782,2783,2786,2787,2790],{},[50,2780,2781],{},"=="," 判断是否相等，",[50,2784,2785],{},"!="," 判断是否不等；单个 ",[50,2788,2789],{},"="," 是赋值。",[40,2792,2793,2796,2797,2800,2801,2804],{},[50,2794,2795],{},"and"," 要求两侧都为真，",[50,2798,2799],{},"or"," 只需一侧为真，",[50,2802,2803],{},"not"," 取反。",[40,2806,2807],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2809,60],{"id":60},[10,2811,63],{},[65,2813,2815],{"className":67,"code":2814,"language":69,"meta":70,"style":70},"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",[50,2816,2817,2822,2827,2831,2836,2841,2846,2851],{"__ignoreMap":70},[74,2818,2819],{"class":76,"line":77},[74,2820,2821],{},"age = 20\n",[74,2823,2824],{"class":76,"line":83},[74,2825,2826],{},"has_ticket = True\n",[74,2828,2829],{"class":76,"line":89},[74,2830,93],{"emptyLinePlaceholder":92},[74,2832,2833],{"class":76,"line":96},[74,2834,2835],{},"is_adult = age >= 18\n",[74,2837,2838],{"class":76,"line":102},[74,2839,2840],{},"can_enter = is_adult and has_ticket\n",[74,2842,2843],{"class":76,"line":108},[74,2844,2845],{},"print(is_adult)\n",[74,2847,2848],{"class":76,"line":2461},[74,2849,2850],{},"print(can_enter)\n",[74,2852,2853],{"class":76,"line":2467},[74,2854,2855],{},"print(not has_ticket)\n",[10,2857,114],{},[65,2859,2862],{"className":2860,"code":2861,"language":120,"meta":70},[118],"True\nTrue\nFalse\n",[50,2863,2861],{"__ignoreMap":70},[10,2865,125],{},[14,2867,128],{"id":128},[130,2869,2870,2880],{},[40,2871,2872,2875,2876,2879],{},[50,2873,2874],{},"age >= 18"," 先产生布尔值并绑定给 ",[50,2877,2878],{},"is_adult","，这一步没有任何分支跳转。",[40,2881,2882,2885,2886,2888],{},[50,2883,2884],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[50,2887,2803],{}," 只对紧随其后的值取反。",[302,2890,2671],{"id":2671},[10,2892,2893],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2895,2896],{},[26,2897],{"alt":2898,"src":2899},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2901,2902,2904,2905,2907],{},[50,2903,2795],{}," 只有“真、真”得到真；",[50,2906,2799],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2909,147],{"id":147},[37,2911,2912,2921],{},[40,2913,2914,2915,2917,2918,2920],{},"用单个等号判断相等。",[50,2916,2789],{}," 是赋值，",[50,2919,2781],{}," 才是相等比较。",[40,2922,2923],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2925,164],{"id":164},[130,2927,2928,2935],{},[40,2929,2930,2931,2934],{},"判断数字 ",[50,2932,2933],{},"15"," 是否同时大于 10 且小于 20。",[40,2936,2937,2938,2941],{},"分别修改年龄和票据状态，记录 ",[50,2939,2940],{},"can_enter"," 的四种组合结果。",[10,2943,178],{},[14,2945,181],{"id":181},[10,2947,2948],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2950,188],{},{"title":70,"searchDepth":83,"depth":83,"links":2952},[2953,2954,2955,2956,2957,2960,2961,2962],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":2958},[2959],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2744,"description":2749},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[199,2970,2971],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2974,"title":2975,"body":2976,"category":199,"cover":200,"description":2980,"extension":201,"meta":3148,"navigation":92,"path":3149,"pinned":204,"publishedAt":205,"seo":3150,"slug":3151,"stem":3152,"summary":3153,"tags":3154,"updatedAt":205,"visible":92,"__hash__":3156},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2977,"toc":3138},[2978,2981,2983,2986,2988,2994,3012,3014,3027,3029,3031,3065,3067,3073,3075,3077,3099,3101,3113,3115,3129,3131,3133,3136],[10,2979,2980],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2982,16],{"id":16},[10,2984,2985],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2987,22],{"id":22},[10,2989,2990],{},[26,2991],{"alt":2992,"src":2993},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2995,2996,2999,3000,3003,3004,3007,3008,3011],{},[50,2997,2998],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[50,3001,3002],{},"18","，程序首先得到的也是 ",[50,3005,3006],{},"\"18\"","，需要 ",[50,3009,3010],{},"int()"," 后才能按整数参与计算。",[14,3013,35],{"id":35},[37,3015,3016,3019,3024],{},[40,3017,3018],{},"提示文字应告诉用户需要输入什么。",[40,3020,3021,3023],{},[50,3022,3010],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3025,3026],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3028,60],{"id":60},[10,3030,63],{},[65,3032,3034],{"className":67,"code":3033,"language":69,"meta":70,"style":70},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[50,3035,3036,3041,3046,3051,3055,3060],{"__ignoreMap":70},[74,3037,3038],{"class":76,"line":77},[74,3039,3040],{},"name = input(\"请输入姓名：\")\n",[74,3042,3043],{"class":76,"line":83},[74,3044,3045],{},"age_text = input(\"请输入年龄：\")\n",[74,3047,3048],{"class":76,"line":89},[74,3049,3050],{},"age = int(age_text)\n",[74,3052,3053],{"class":76,"line":96},[74,3054,93],{"emptyLinePlaceholder":92},[74,3056,3057],{"class":76,"line":102},[74,3058,3059],{},"print(\"你好，\" + name)\n",[74,3061,3062],{"class":76,"line":108},[74,3063,3064],{},"print(age + 1)\n",[10,3066,114],{},[65,3068,3071],{"className":3069,"code":3070,"language":120,"meta":70},[118],"根据输入显示姓名，并输出下一年的年龄\n",[50,3072,3070],{"__ignoreMap":70},[10,3074,125],{},[14,3076,128],{"id":128},[130,3078,3079,3089],{},[40,3080,3081,3082,3084,3085,3088],{},"两次 ",[50,3083,2998],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[50,3086,3087],{},"age_text"," 用来提醒这仍是文本。",[40,3090,3091,3094,3095,3098],{},[50,3092,3093],{},"int(age_text)"," 创建整数对象，后面的 ",[50,3096,3097],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3100,147],{"id":147},[37,3102,3103,3110],{},[40,3104,3105,3106,3109],{},"直接计算 ",[50,3107,3108],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3111,3112],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3114,164],{"id":164},[130,3116,3117,3120],{},[40,3118,3119],{},"接收两个整数并输出它们的和。",[40,3121,1693,3122,3125,3126,3128],{},[50,3123,3124],{},"18.5"," 给 ",[50,3127,3010],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3130,178],{},[14,3132,181],{"id":181},[10,3134,3135],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3137,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3139},[3140,3141,3142,3143,3144,3145,3146,3147],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2975,"description":2980},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[199,2318,3155],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3158,"title":3159,"body":3160,"category":199,"cover":200,"description":3164,"extension":201,"meta":3324,"navigation":92,"path":3325,"pinned":204,"publishedAt":205,"seo":3326,"slug":3327,"stem":3328,"summary":3329,"tags":3330,"updatedAt":205,"visible":92,"__hash__":3332},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3161,"toc":3314},[3162,3165,3167,3170,3172,3178,3185,3187,3201,3203,3205,3244,3246,3252,3254,3256,3275,3277,3292,3294,3305,3307,3309,3312],[10,3163,3164],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3166,16],{"id":16},[10,3168,3169],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3171,22],{"id":22},[10,3173,3174],{},[26,3175],{"alt":3176,"src":3177},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3179,3180,3181,3184],{},"列表为元素维护从 0 开始的位置索引。修改 ",[50,3182,3183],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3186,35],{"id":35},[37,3188,3189,3192,3195],{},[40,3190,3191],{},"列表使用方括号，元素之间用逗号分隔。",[40,3193,3194],{},"列表可变，可以替换、追加和删除元素。",[40,3196,3197,3198,158],{},"访问不存在的索引会产生 ",[50,3199,3200],{},"IndexError",[14,3202,60],{"id":60},[10,3204,63],{},[65,3206,3208],{"className":67,"code":3207,"language":69,"meta":70,"style":70},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[50,3209,3210,3215,3220,3224,3229,3234,3239],{"__ignoreMap":70},[74,3211,3212],{"class":76,"line":77},[74,3213,3214],{},"scores = [82, 90, 76]\n",[74,3216,3217],{"class":76,"line":83},[74,3218,3219],{},"print(scores[0])\n",[74,3221,3222],{"class":76,"line":89},[74,3223,93],{"emptyLinePlaceholder":92},[74,3225,3226],{"class":76,"line":96},[74,3227,3228],{},"scores[1] = 95\n",[74,3230,3231],{"class":76,"line":102},[74,3232,3233],{},"scores.append(88)\n",[74,3235,3236],{"class":76,"line":108},[74,3237,3238],{},"print(scores)\n",[74,3240,3241],{"class":76,"line":2461},[74,3242,3243],{},"print(len(scores))\n",[10,3245,114],{},[65,3247,3250],{"className":3248,"code":3249,"language":120,"meta":70},[118],"82\n[82, 95, 76, 88]\n4\n",[50,3251,3249],{"__ignoreMap":70},[10,3253,125],{},[14,3255,128],{"id":128},[130,3257,3258,3261],{},[40,3259,3260],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3262,3263,3266,3267,3270,3271,3274],{},[50,3264,3265],{},"scores[1] = 95"," 替换第二个位置，",[50,3268,3269],{},"append(88)"," 在末尾增加新位置，",[50,3272,3273],{},"len()"," 因而从 3 变为 4。",[14,3276,147],{"id":147},[37,3278,3279,3289],{},[40,3280,3281,3282,3285,3286,158],{},"访问 ",[50,3283,3284],{},"scores[len(scores)]","。最后一个合法正索引是 ",[50,3287,3288],{},"len(scores) - 1",[40,3290,3291],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3293,164],{"id":164},[130,3295,3296,3299],{},[40,3297,3298],{},"建立三项学习任务列表，再追加第四项。",[40,3300,3301,3302,3304],{},"修改第二项，并用 ",[50,3303,3273],{}," 检查元素数量。",[10,3306,178],{},[14,3308,181],{"id":181},[10,3310,3311],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3313,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3315},[3316,3317,3318,3319,3320,3321,3322,3323],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3159,"description":3164},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[199,3331,212],"列表","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3334,"title":3335,"body":3336,"category":199,"cover":200,"description":3340,"extension":201,"meta":3481,"navigation":92,"path":3482,"pinned":204,"publishedAt":205,"seo":3483,"slug":3484,"stem":3485,"summary":3486,"tags":3487,"updatedAt":205,"visible":92,"__hash__":3489},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3337,"toc":3471},[3338,3341,3343,3346,3348,3354,3357,3359,3370,3372,3374,3408,3410,3416,3418,3420,3434,3436,3448,3450,3462,3464,3466,3469],[10,3339,3340],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3342,16],{"id":16},[10,3344,3345],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3347,22],{"id":22},[10,3349,3350],{},[26,3351],{"alt":3352,"src":3353},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3355,3356],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3358,35],{"id":35},[37,3360,3361,3364,3367],{},[40,3362,3363],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3365,3366],{},"只有一个元素的元组必须保留尾随逗号。",[40,3368,3369],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3371,60],{"id":60},[10,3373,63],{},[65,3375,3377],{"className":67,"code":3376,"language":69,"meta":70,"style":70},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[50,3378,3379,3384,3389,3394,3398,3403],{"__ignoreMap":70},[74,3380,3381],{"class":76,"line":77},[74,3382,3383],{},"point = (120, 80)\n",[74,3385,3386],{"class":76,"line":83},[74,3387,3388],{},"print(point[0])\n",[74,3390,3391],{"class":76,"line":89},[74,3392,3393],{},"print(point[1])\n",[74,3395,3396],{"class":76,"line":96},[74,3397,93],{"emptyLinePlaceholder":92},[74,3399,3400],{"class":76,"line":102},[74,3401,3402],{},"single = (5,)\n",[74,3404,3405],{"class":76,"line":108},[74,3406,3407],{},"print(single)\n",[10,3409,114],{},[65,3411,3414],{"className":3412,"code":3413,"language":120,"meta":70},[118],"120\n80\n(5,)\n",[50,3415,3413],{"__ignoreMap":70},[10,3417,125],{},[14,3419,128],{"id":128},[130,3421,3422,3428],{},[40,3423,3424,3427],{},[50,3425,3426],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3429,3430,3433],{},[50,3431,3432],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3435,147],{"id":147},[37,3437,3438,3445],{},[40,3439,3440,3441,3444],{},"把 ",[50,3442,3443],{},"(5)"," 当作元组，实际它仍是整数。",[40,3446,3447],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3449,164],{"id":164},[130,3451,3452,3455],{},[40,3453,3454],{},"用元组表示宽度和高度。",[40,3456,2146,3457,2149,3459,3461],{},[50,3458,3443],{},[50,3460,3432],{}," 的类型。",[10,3463,178],{},[14,3465,181],{"id":181},[10,3467,3468],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3470,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3472},[3473,3474,3475,3476,3477,3478,3479,3480],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3335,"description":3340},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[199,3488,212],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3491,"title":3492,"body":3493,"category":199,"cover":200,"description":3497,"extension":201,"meta":3652,"navigation":92,"path":3653,"pinned":204,"publishedAt":205,"seo":3654,"slug":3655,"stem":3656,"summary":3657,"tags":3658,"updatedAt":205,"visible":92,"__hash__":3660},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3494,"toc":3642},[3495,3498,3500,3503,3505,3511,3521,3523,3537,3539,3541,3575,3577,3583,3585,3587,3602,3604,3623,3625,3633,3635,3637,3640],[10,3496,3497],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3499,16],{"id":16},[10,3501,3502],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3504,22],{"id":22},[10,3506,3507],{},[26,3508],{"alt":3509,"src":3510},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3512,3513,3514,3517,3518,3520],{},"字典通过键定位值，不使用连续位置表达含义。",[50,3515,3516],{},"student[\"score\"]"," 读取的是键 ",[50,3519,2219],{}," 对应的值，而不是“第几个元素”。",[14,3522,35],{"id":35},[37,3524,3525,3528,3534],{},[40,3526,3527],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3529,152,3530,3533],{},[50,3531,3532],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3535,3536],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3538,60],{"id":60},[10,3540,63],{},[65,3542,3544],{"className":67,"code":3543,"language":69,"meta":70,"style":70},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[50,3545,3546,3551,3556,3560,3565,3570],{"__ignoreMap":70},[74,3547,3548],{"class":76,"line":77},[74,3549,3550],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[74,3552,3553],{"class":76,"line":83},[74,3554,3555],{},"print(student[\"name\"])\n",[74,3557,3558],{"class":76,"line":89},[74,3559,93],{"emptyLinePlaceholder":92},[74,3561,3562],{"class":76,"line":96},[74,3563,3564],{},"student[\"score\"] = 95\n",[74,3566,3567],{"class":76,"line":102},[74,3568,3569],{},"student[\"city\"] = \"郑州\"\n",[74,3571,3572],{"class":76,"line":108},[74,3573,3574],{},"print(student)\n",[10,3576,114],{},[65,3578,3581],{"className":3579,"code":3580,"language":120,"meta":70},[118],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[50,3582,3580],{"__ignoreMap":70},[10,3584,125],{},[14,3586,128],{"id":128},[130,3588,3589,3592],{},[40,3590,3591],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3593,3594,3595,3597,3598,3601],{},"给已有键 ",[50,3596,2219],{}," 赋值会更新映射，给新键 ",[50,3599,3600],{},"city"," 赋值会增加映射。",[14,3603,147],{"id":147},[37,3605,3606,3613],{},[40,3607,3608,3609,3612],{},"按位置理解字典并尝试 ",[50,3610,3611],{},"student[0]","，而实际键是字符串。",[40,3614,3615,3616,3619,3620,158],{},"直接读取不确定存在的键并忽略 ",[50,3617,3618],{},"KeyError","；后续可根据场景使用成员检查或 ",[50,3621,3622],{},"get()",[14,3624,164],{"id":164},[130,3626,3627,3630],{},[40,3628,3629],{},"建立一本书的标题、作者和页数字典。",[40,3631,3632],{},"添加分类键，再修改页数。",[10,3634,178],{},[14,3636,181],{"id":181},[10,3638,3639],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3641,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3643},[3644,3645,3646,3647,3648,3649,3650,3651],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3492,"description":3497},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[199,3659,212],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":4,"title":5,"body":3662,"category":199,"cover":200,"description":12,"extension":201,"meta":3785,"navigation":92,"path":203,"pinned":204,"publishedAt":205,"seo":3786,"slug":207,"stem":208,"summary":209,"tags":3787,"updatedAt":205,"visible":92,"__hash__":213},{"type":7,"value":3663,"toc":3775},[3664,3666,3668,3670,3672,3676,3678,3680,3692,3694,3696,3724,3726,3731,3733,3735,3745,3747,3757,3759,3767,3769,3771,3773],[10,3665,12],{},[14,3667,16],{"id":16},[10,3669,19],{},[14,3671,22],{"id":22},[10,3673,3674],{},[26,3675],{"alt":28,"src":29},[10,3677,32],{},[14,3679,35],{"id":35},[37,3681,3682,3684,3686],{},[40,3683,42],{},[40,3685,45],{},[40,3687,48,3688,53,3690,57],{},[50,3689,52],{},[50,3691,56],{},[14,3693,60],{"id":60},[10,3695,63],{},[65,3697,3698],{"className":67,"code":68,"language":69,"meta":70,"style":70},[50,3699,3700,3704,3708,3712,3716,3720],{"__ignoreMap":70},[74,3701,3702],{"class":76,"line":77},[74,3703,80],{},[74,3705,3706],{"class":76,"line":83},[74,3707,86],{},[74,3709,3710],{"class":76,"line":89},[74,3711,93],{"emptyLinePlaceholder":92},[74,3713,3714],{"class":76,"line":96},[74,3715,99],{},[74,3717,3718],{"class":76,"line":102},[74,3719,105],{},[74,3721,3722],{"class":76,"line":108},[74,3723,111],{},[10,3725,114],{},[65,3727,3729],{"className":3728,"code":119,"language":120,"meta":70},[118],[50,3730,119],{"__ignoreMap":70},[10,3732,125],{},[14,3734,128],{"id":128},[130,3736,3737,3739],{},[40,3738,134],{},[40,3740,3741,140,3743,144],{},[50,3742,139],{},[50,3744,143],{},[14,3746,147],{"id":147},[37,3748,3749,3755],{},[40,3750,152,3751,155,3753,158],{},[50,3752,56],{},[50,3754,52],{},[40,3756,161],{},[14,3758,164],{"id":164},[130,3760,3761,3765],{},[40,3762,169,3763,172],{},[50,3764,52],{},[40,3766,175],{},[10,3768,178],{},[14,3770,181],{"id":181},[10,3772,184],{},[186,3774,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3776},[3777,3778,3779,3780,3781,3782,3783,3784],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5,"description":12},[199,211,212],{"id":3789,"title":3790,"body":3791,"category":199,"cover":200,"description":3795,"extension":201,"meta":3993,"navigation":92,"path":3994,"pinned":204,"publishedAt":205,"seo":3995,"slug":3996,"stem":3997,"summary":3998,"tags":3999,"updatedAt":205,"visible":92,"__hash__":4002},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3792,"toc":3981},[3793,3796,3798,3801,3803,3809,3819,3821,3838,3840,3842,3892,3894,3900,3902,3904,3926,3928,3931,3937,3940,3942,3955,3957,3972,3974,3976,3979],[10,3794,3795],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3797,16],{"id":16},[10,3799,3800],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3802,22],{"id":22},[10,3804,3805],{},[26,3806],{"alt":3807,"src":3808},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3810,3811,3814,3815,3818],{},[50,3812,3813],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[50,3816,3817],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3820,35],{"id":35},[37,3822,3823,3832,3835],{},[40,3824,3825,3827,3828,3831],{},[50,3826,2781],{}," 比较内容是否相等，",[50,3829,3830],{},"is"," 比较是否为同一个对象。",[40,3833,3834],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3836,3837],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3839,60],{"id":60},[10,3841,63],{},[65,3843,3845],{"className":67,"code":3844,"language":69,"meta":70,"style":70},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[50,3846,3847,3852,3857,3862,3866,3871,3876,3881,3886],{"__ignoreMap":70},[74,3848,3849],{"class":76,"line":77},[74,3850,3851],{},"tasks = [\"变量\", \"字符串\"]\n",[74,3853,3854],{"class":76,"line":83},[74,3855,3856],{},"shared = tasks\n",[74,3858,3859],{"class":76,"line":89},[74,3860,3861],{},"backup = tasks.copy()\n",[74,3863,3864],{"class":76,"line":96},[74,3865,93],{"emptyLinePlaceholder":92},[74,3867,3868],{"class":76,"line":102},[74,3869,3870],{},"tasks.append(\"列表\")\n",[74,3872,3873],{"class":76,"line":108},[74,3874,3875],{},"print(shared)\n",[74,3877,3878],{"class":76,"line":2461},[74,3879,3880],{},"print(backup)\n",[74,3882,3883],{"class":76,"line":2467},[74,3884,3885],{},"print(tasks is shared)\n",[74,3887,3889],{"class":76,"line":3888},9,[74,3890,3891],{},"print(tasks is backup)\n",[10,3893,114],{},[65,3895,3898],{"className":3896,"code":3897,"language":120,"meta":70},[118],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[50,3899,3897],{"__ignoreMap":70},[10,3901,125],{},[14,3903,128],{"id":128},[130,3905,3906,3912],{},[40,3907,3908,3911],{},[50,3909,3910],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3913,3914,3917,3918,3921,3922,3925],{},[50,3915,3916],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[50,3919,3920],{},"shared"," 能观察到变化，",[50,3923,3924],{},"backup"," 不会。",[302,3927,2671],{"id":2671},[10,3929,3930],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3932,3933],{},[26,3934],{"alt":3935,"src":3936},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3938,3939],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3941,147],{"id":147},[37,3943,3944,3952],{},[40,3945,3946,3947,3949,3950,158],{},"用 ",[50,3948,2781],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[50,3951,3830],{},[40,3953,3954],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3956,164],{"id":164},[130,3958,3959,3962],{},[40,3960,3961],{},"让两个变量引用同一个字典并修改其中一个。",[40,3963,152,3964,3967,3968,1130,3970,158],{},[50,3965,3966],{},"copy()"," 创建外层副本，再比较 ",[50,3969,3830],{},[50,3971,2781],{},[10,3973,178],{},[14,3975,181],{"id":181},[10,3977,3978],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3980,188],{},{"title":70,"searchDepth":83,"depth":83,"links":3982},[3983,3984,3985,3986,3987,3990,3991,3992],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":3988},[3989],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3790,"description":3795},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[199,4000,4001],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4004,"title":4005,"body":4006,"category":199,"cover":200,"description":4010,"extension":201,"meta":4223,"navigation":92,"path":4224,"pinned":204,"publishedAt":205,"seo":4225,"slug":4226,"stem":4227,"summary":4228,"tags":4229,"updatedAt":205,"visible":92,"__hash__":4231},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4007,"toc":4210},[4008,4011,4013,4016,4018,4024,4034,4036,4047,4049,4051,4104,4106,4112,4114,4116,4134,4136,4139,4145,4153,4156,4159,4165,4171,4173,4191,4193,4201,4203,4205,4208],[10,4009,4010],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4012,16],{"id":16},[10,4014,4015],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4017,22],{"id":22},[10,4019,4020],{},[26,4021],{"alt":4022,"src":4023},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4025,4026,2230,4028,2230,4031,4033],{},[50,4027,1129],{},[50,4029,4030],{},"elif",[50,4032,1133],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4035,35],{"id":35},[37,4037,4038,4041,4044],{},[40,4039,4040],{},"冒号表示接下来开始一个代码块。",[40,4042,4043],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4045,4046],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4048,60],{"id":60},[10,4050,63],{},[65,4052,4054],{"className":67,"code":4053,"language":69,"meta":70,"style":70},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[50,4055,4056,4061,4065,4070,4075,4080,4085,4089,4094,4098],{"__ignoreMap":70},[74,4057,4058],{"class":76,"line":77},[74,4059,4060],{},"score = int(input(\"请输入分数：\"))\n",[74,4062,4063],{"class":76,"line":83},[74,4064,93],{"emptyLinePlaceholder":92},[74,4066,4067],{"class":76,"line":89},[74,4068,4069],{},"if score >= 90:\n",[74,4071,4072],{"class":76,"line":96},[74,4073,4074],{},"    level = \"优秀\"\n",[74,4076,4077],{"class":76,"line":102},[74,4078,4079],{},"elif score >= 60:\n",[74,4081,4082],{"class":76,"line":108},[74,4083,4084],{},"    level = \"合格\"\n",[74,4086,4087],{"class":76,"line":2461},[74,4088,1119],{},[74,4090,4091],{"class":76,"line":2467},[74,4092,4093],{},"    level = \"需要继续学习\"\n",[74,4095,4096],{"class":76,"line":3888},[74,4097,93],{"emptyLinePlaceholder":92},[74,4099,4101],{"class":76,"line":4100},10,[74,4102,4103],{},"print(level)\n",[10,4105,114],{},[65,4107,4110],{"className":4108,"code":4109,"language":120,"meta":70},[118],"输入 85 时输出：合格\n",[50,4111,4109],{"__ignoreMap":70},[10,4113,125],{},[14,4115,128],{"id":128},[130,4117,4118,4125],{},[40,4119,4120,4121,4124],{},"输入先转换为整数，程序从 ",[50,4122,4123],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4126,4127,4130,4131,4133],{},[50,4128,4129],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[50,4132,1133],{}," 被跳过；最终三个分支只会选择一个。",[302,4135,2671],{"id":2671},[10,4137,4138],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4140,4141],{},[26,4142],{"alt":4143,"src":4144},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4146,4147,4149,4150,4152],{},[50,4148,4123],{}," 必须放在 ",[50,4151,4129],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[302,4154,2671],{"id":4155},"再看一个具体细节-1",[10,4157,4158],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4160,4161],{},[26,4162],{"alt":4163,"src":4164},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4166,4167,4168,4170],{},"同一缩进层级属于同一个代码块；回到 ",[50,4169,1129],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4172,147],{"id":147},[37,4174,4175,4181],{},[40,4176,4177,4178,4180],{},"先写 ",[50,4179,4129],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4182,4183,4184,4186,4187,4190],{},"混用多个独立 ",[50,4185,1129],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[50,4188,4189],{},"if\u002Felif\u002Felse"," 链。",[14,4192,164],{"id":164},[130,4194,4195,4198],{},[40,4196,4197],{},"根据温度输出“冷、适中、热”三个等级。",[40,4199,4200],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4202,178],{},[14,4204,181],{"id":181},[10,4206,4207],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4209,188],{},{"title":70,"searchDepth":83,"depth":83,"links":4211},[4212,4213,4214,4215,4216,4220,4221,4222],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":4217},[4218,4219],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4005,"description":4010},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[199,1129,4230],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4233,"title":4234,"body":4235,"category":199,"cover":200,"description":4239,"extension":201,"meta":4405,"navigation":92,"path":4406,"pinned":204,"publishedAt":205,"seo":4407,"slug":4408,"stem":4409,"summary":4410,"tags":4411,"updatedAt":205,"visible":92,"__hash__":4413},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4236,"toc":4393},[4237,4240,4242,4245,4247,4253,4259,4261,4276,4278,4280,4318,4320,4326,4328,4330,4345,4347,4350,4356,4362,4364,4372,4374,4384,4386,4388,4391],[10,4238,4239],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4241,16],{"id":16},[10,4243,4244],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4246,22],{"id":22},[10,4248,4249],{},[26,4250],{"alt":4251,"src":4252},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4254,4255,4258],{},[50,4256,4257],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4260,35],{"id":35},[37,4262,4263,4266,4269],{},[40,4264,4265],{},"进入循环前先准备参与条件判断的状态。",[40,4267,4268],{},"循环体中必须有机会让条件变为假。",[40,4270,4271,4272,4275],{},"能够预先确定遍历对象时，后续介绍的 ",[50,4273,4274],{},"for"," 通常更直接。",[14,4277,60],{"id":60},[10,4279,63],{},[65,4281,4283],{"className":67,"code":4282,"language":69,"meta":70,"style":70},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[50,4284,4285,4290,4294,4299,4304,4309,4313],{"__ignoreMap":70},[74,4286,4287],{"class":76,"line":77},[74,4288,4289],{},"count = 1\n",[74,4291,4292],{"class":76,"line":83},[74,4293,93],{"emptyLinePlaceholder":92},[74,4295,4296],{"class":76,"line":89},[74,4297,4298],{},"while count \u003C= 3:\n",[74,4300,4301],{"class":76,"line":96},[74,4302,4303],{},"    print(\"第\", count, \"次练习\")\n",[74,4305,4306],{"class":76,"line":102},[74,4307,4308],{},"    count = count + 1\n",[74,4310,4311],{"class":76,"line":108},[74,4312,93],{"emptyLinePlaceholder":92},[74,4314,4315],{"class":76,"line":2461},[74,4316,4317],{},"print(\"练习结束\")\n",[10,4319,114],{},[65,4321,4324],{"className":4322,"code":4323,"language":120,"meta":70},[118],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[50,4325,4323],{"__ignoreMap":70},[10,4327,125],{},[14,4329,128],{"id":128},[130,4331,4332,4339],{},[40,4333,4334,4335,4338],{},"进入循环前 ",[50,4336,4337],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4340,4341,4342,4344],{},"循环体末尾把 ",[50,4343,4337],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[302,4346,2671],{"id":2671},[10,4348,4349],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4351,4352],{},[26,4353],{"alt":4354,"src":4355},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4357,4358,4359,4361],{},"第4次检查时 ",[50,4360,4337],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4363,147],{"id":147},[37,4365,4366,4369],{},[40,4367,4368],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4370,4371],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4373,164],{"id":164},[130,4375,4376,4381],{},[40,4377,152,4378,4380],{},[50,4379,4257],{}," 输出 1 到 5。",[40,4382,4383],{},"计算 1 到 10 的累加和。",[10,4385,178],{},[14,4387,181],{"id":181},[10,4389,4390],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4392,188],{},{"title":70,"searchDepth":83,"depth":83,"links":4394},[4395,4396,4397,4398,4399,4402,4403,4404],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":4400},[4401],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4234,"description":4239},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[199,4257,4412],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4415,"title":4416,"body":4417,"category":199,"cover":200,"description":4421,"extension":201,"meta":4569,"navigation":92,"path":4570,"pinned":204,"publishedAt":205,"seo":4571,"slug":4572,"stem":4573,"summary":4574,"tags":4575,"updatedAt":205,"visible":92,"__hash__":4577},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4418,"toc":4559},[4419,4422,4424,4427,4429,4435,4440,4442,4456,4458,4460,4498,4500,4506,4508,4510,4527,4529,4537,4539,4550,4552,4554,4557],[10,4420,4421],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4423,16],{"id":16},[10,4425,4426],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4428,22],{"id":22},[10,4430,4431],{},[26,4432],{"alt":4433,"src":4434},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4436,4437,4439],{},[50,4438,4274],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4441,35],{"id":35},[37,4443,4444,4450,4453],{},[40,4445,4446,4449],{},[50,4447,4448],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4451,4452],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4454,4455],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4457,60],{"id":60},[10,4459,63],{},[65,4461,4463],{"className":67,"code":4462,"language":69,"meta":70,"style":70},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[50,4464,4465,4470,4474,4479,4484,4488,4493],{"__ignoreMap":70},[74,4466,4467],{"class":76,"line":77},[74,4468,4469],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[74,4471,4472],{"class":76,"line":83},[74,4473,93],{"emptyLinePlaceholder":92},[74,4475,4476],{"class":76,"line":89},[74,4477,4478],{},"for course in courses:\n",[74,4480,4481],{"class":76,"line":96},[74,4482,4483],{},"    print(course)\n",[74,4485,4486],{"class":76,"line":102},[74,4487,93],{"emptyLinePlaceholder":92},[74,4489,4490],{"class":76,"line":108},[74,4491,4492],{},"for number in range(1, 4):\n",[74,4494,4495],{"class":76,"line":2461},[74,4496,4497],{},"    print(number)\n",[10,4499,114],{},[65,4501,4504],{"className":4502,"code":4503,"language":120,"meta":70},[118],"变量\n字符串\n列表\n1\n2\n3\n",[50,4505,4503],{"__ignoreMap":70},[10,4507,125],{},[14,4509,128],{"id":128},[130,4511,4512,4522],{},[40,4513,4514,4515,4517,4518,4521],{},"第一个 ",[50,4516,4274],{}," 依次从列表取得字符串，循环变量 ",[50,4519,4520],{},"course"," 每轮重新绑定。",[40,4523,4524,4526],{},[50,4525,4448],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4528,147],{"id":147},[37,4530,4531,4534],{},[40,4532,4533],{},"只需要元素却手工维护索引，增加越界风险。",[40,4535,4536],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4538,164],{"id":164},[130,4540,4541,4544],{},[40,4542,4543],{},"逐项输出一个字符串中的字符。",[40,4545,152,4546,4549],{},[50,4547,4548],{},"range()"," 输出 2、4、6、8。",[10,4551,178],{},[14,4553,181],{"id":181},[10,4555,4556],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4558,188],{},{"title":70,"searchDepth":83,"depth":83,"links":4560},[4561,4562,4563,4564,4565,4566,4567,4568],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4416,"description":4421},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[199,4274,4576],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4579,"title":4580,"body":4581,"category":199,"cover":200,"description":4585,"extension":201,"meta":4759,"navigation":92,"path":4760,"pinned":204,"publishedAt":205,"seo":4761,"slug":4762,"stem":4763,"summary":4764,"tags":4765,"updatedAt":205,"visible":92,"__hash__":4766},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4582,"toc":4749},[4583,4586,4588,4591,4593,4599,4609,4611,4630,4632,4634,4686,4688,4694,4696,4698,4712,4714,4730,4732,4740,4742,4744,4747],[10,4584,4585],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4587,16],{"id":16},[10,4589,4590],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4592,22],{"id":22},[10,4594,4595],{},[26,4596],{"alt":4597,"src":4598},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4600,4601,4604,4605,4608],{},[50,4602,4603],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[50,4606,4607],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4610,35],{"id":35},[37,4612,4613,4616,4624],{},[40,4614,4615],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4617,4618,4620,4621,4623],{},[50,4619,4603],{}," 前要确认不会跳过 ",[50,4622,4257],{}," 循环中的状态更新。",[40,4625,4626,4627,4629],{},"多层嵌套中 ",[50,4628,4607],{}," 只结束它所在的最内层循环。",[14,4631,60],{"id":60},[10,4633,63],{},[65,4635,4637],{"className":67,"code":4636,"language":69,"meta":70,"style":70},"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",[50,4638,4639,4644,4648,4653,4658,4663,4668,4673,4677,4681],{"__ignoreMap":70},[74,4640,4641],{"class":76,"line":77},[74,4642,4643],{},"numbers = [3, -1, 0, 8, 12]\n",[74,4645,4646],{"class":76,"line":83},[74,4647,93],{"emptyLinePlaceholder":92},[74,4649,4650],{"class":76,"line":89},[74,4651,4652],{},"for number in numbers:\n",[74,4654,4655],{"class":76,"line":96},[74,4656,4657],{},"    if number \u003C 0:\n",[74,4659,4660],{"class":76,"line":102},[74,4661,4662],{},"        continue\n",[74,4664,4665],{"class":76,"line":108},[74,4666,4667],{},"    if number == 0:\n",[74,4669,4670],{"class":76,"line":2461},[74,4671,4672],{},"        break\n",[74,4674,4675],{"class":76,"line":2467},[74,4676,4497],{},[74,4678,4679],{"class":76,"line":3888},[74,4680,93],{"emptyLinePlaceholder":92},[74,4682,4683],{"class":76,"line":4100},[74,4684,4685],{},"print(\"循环结束\")\n",[10,4687,114],{},[65,4689,4692],{"className":4690,"code":4691,"language":120,"meta":70},[118],"3\n循环结束\n",[50,4693,4691],{"__ignoreMap":70},[10,4695,125],{},[14,4697,128],{"id":128},[130,4699,4700,4706],{},[40,4701,4702,4703,4705],{},"遇到 -1 时 ",[50,4704,4603],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4707,4708,4709,4711],{},"遇到 0 时 ",[50,4710,4607],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4713,147],{"id":147},[37,4715,4716,4721],{},[40,4717,3440,4718,4720],{},[50,4719,4603],{}," 当作结束循环，实际它只跳到下一轮。",[40,4722,4723,4724,4726,4727,4729],{},"在 ",[50,4725,4257],{}," 中把状态更新放在可能被 ",[50,4728,4603],{}," 跳过的位置，造成无限循环。",[14,4731,164],{"id":164},[130,4733,4734,4737],{},[40,4735,4736],{},"跳过列表中的空字符串并输出其他内容。",[40,4738,4739],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4741,178],{},[14,4743,181],{"id":181},[10,4745,4746],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4748,188],{},{"title":70,"searchDepth":83,"depth":83,"links":4750},[4751,4752,4753,4754,4755,4756,4757,4758],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4580,"description":4585},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[199,4607,4603],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4768,"title":4769,"body":4770,"category":199,"cover":200,"description":4774,"extension":201,"meta":4945,"navigation":92,"path":4946,"pinned":204,"publishedAt":205,"seo":4947,"slug":4948,"stem":4949,"summary":4950,"tags":4951,"updatedAt":205,"visible":92,"__hash__":4954},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4771,"toc":4933},[4772,4775,4777,4780,4782,4788,4791,4793,4817,4819,4821,4855,4857,4863,4865,4867,4884,4886,4889,4895,4898,4900,4914,4916,4924,4926,4928,4931],[10,4773,4774],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4776,16],{"id":16},[10,4778,4779],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4781,22],{"id":22},[10,4783,4784],{},[26,4785],{"alt":4786,"src":4787},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4789,4790],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4792,35],{"id":35},[37,4794,4795,4798,4801],{},[40,4796,4797],{},"每增加一层嵌套，阅读成本都会上升。",[40,4799,4800],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4802,4803,4804,2230,4807,4810,4811,2230,4814,158],{},"变量名使用 ",[50,4805,4806],{},"row",[50,4808,4809],{},"cell"," 等层级含义，避免全部写成 ",[50,4812,4813],{},"i",[50,4815,4816],{},"j",[14,4818,60],{"id":60},[10,4820,63],{},[65,4822,4824],{"className":67,"code":4823,"language":69,"meta":70,"style":70},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[50,4825,4826,4831,4835,4840,4845,4850],{"__ignoreMap":70},[74,4827,4828],{"class":76,"line":77},[74,4829,4830],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[74,4832,4833],{"class":76,"line":83},[74,4834,93],{"emptyLinePlaceholder":92},[74,4836,4837],{"class":76,"line":89},[74,4838,4839],{},"for row in table:\n",[74,4841,4842],{"class":76,"line":96},[74,4843,4844],{},"    for cell in row:\n",[74,4846,4847],{"class":76,"line":102},[74,4848,4849],{},"        print(cell)\n",[74,4851,4852],{"class":76,"line":108},[74,4853,4854],{},"    print(\"一行结束\")\n",[10,4856,114],{},[65,4858,4861],{"className":4859,"code":4860,"language":120,"meta":70},[118],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[50,4862,4860],{"__ignoreMap":70},[10,4864,125],{},[14,4866,128],{"id":128},[130,4868,4869,4881],{},[40,4870,4871,4872,4874,4875,1130,4878,158],{},"外层变量 ",[50,4873,4806],{}," 先引用第一行列表，内层才依次处理 ",[50,4876,4877],{},"A1",[50,4879,4880],{},"A2",[40,4882,4883],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[302,4885,2671],{"id":2671},[10,4887,4888],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4890,4891],{},[26,4892],{"alt":4893,"src":4894},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4896,4897],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4899,147],{"id":147},[37,4901,4902,4911],{},[40,4903,4904,4905,982,4908,4910],{},"把两层循环变量都叫 ",[50,4906,4907],{},"item",[50,4909,4813],{},"，难以确认当前层级。",[40,4912,4913],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4915,164],{"id":164},[130,4917,4918,4921],{},[40,4919,4920],{},"打印一个 2×3 数字表。",[40,4922,4923],{},"在内层增加条件，只输出大于 3 的元素。",[10,4925,178],{},[14,4927,181],{"id":181},[10,4929,4930],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4932,188],{},{"title":70,"searchDepth":83,"depth":83,"links":4934},[4935,4936,4937,4938,4939,4942,4943,4944],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":4940},[4941],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4769,"description":4774},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[199,4952,4953],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4956,"title":4957,"body":4958,"category":199,"cover":200,"description":4962,"extension":201,"meta":5100,"navigation":92,"path":5101,"pinned":204,"publishedAt":205,"seo":5102,"slug":5103,"stem":5104,"summary":5105,"tags":5106,"updatedAt":205,"visible":92,"__hash__":5109},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4959,"toc":5090},[4960,4963,4965,4968,4970,4976,4979,4981,4992,4994,4996,5034,5036,5042,5044,5046,5058,5060,5071,5073,5081,5083,5085,5088],[10,4961,4962],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4964,16],{"id":16},[10,4966,4967],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4969,22],{"id":22},[10,4971,4972],{},[26,4973],{"alt":4974,"src":4975},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4977,4978],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4980,35],{"id":35},[37,4982,4983,4986,4989],{},[40,4984,4985],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,4987,4988],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,4990,4991],{},"推导式创建新列表，不修改输入列表。",[14,4993,60],{"id":60},[10,4995,63],{},[65,4997,4999],{"className":67,"code":4998,"language":69,"meta":70,"style":70},"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",[50,5000,5001,5006,5010,5015,5020,5024,5029],{"__ignoreMap":70},[74,5002,5003],{"class":76,"line":77},[74,5004,5005],{},"numbers = [1, 2, 3, 4, 5]\n",[74,5007,5008],{"class":76,"line":83},[74,5009,93],{"emptyLinePlaceholder":92},[74,5011,5012],{"class":76,"line":89},[74,5013,5014],{},"squares = [number * number for number in numbers]\n",[74,5016,5017],{"class":76,"line":96},[74,5018,5019],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[74,5021,5022],{"class":76,"line":102},[74,5023,93],{"emptyLinePlaceholder":92},[74,5025,5026],{"class":76,"line":108},[74,5027,5028],{},"print(squares)\n",[74,5030,5031],{"class":76,"line":2461},[74,5032,5033],{},"print(even_squares)\n",[10,5035,114],{},[65,5037,5040],{"className":5038,"code":5039,"language":120,"meta":70},[118],"[1, 4, 9, 16, 25]\n[4, 16]\n",[50,5041,5039],{"__ignoreMap":70},[10,5043,125],{},[14,5045,128],{"id":128},[130,5047,5048,5051],{},[40,5049,5050],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5052,5053,5054,5057],{},"第二条先用 ",[50,5055,5056],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5059,147],{"id":147},[37,5061,5062,5068],{},[40,5063,5064,5065,5067],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[50,5066,4274],{}," 开始找输入。",[40,5069,5070],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5072,164],{"id":164},[130,5074,5075,5078],{},[40,5076,5077],{},"把字符串列表转换为长度列表。",[40,5079,5080],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5082,178],{},[14,5084,181],{"id":181},[10,5086,5087],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5089,188],{},{"title":70,"searchDepth":83,"depth":83,"links":5091},[5092,5093,5094,5095,5096,5097,5098,5099],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4957,"description":4962},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[199,5107,5108],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5111,"title":5112,"body":5113,"category":199,"cover":200,"description":5117,"extension":201,"meta":5260,"navigation":92,"path":5261,"pinned":204,"publishedAt":205,"seo":5262,"slug":5263,"stem":5264,"summary":5265,"tags":5266,"updatedAt":205,"visible":92,"__hash__":5269},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5114,"toc":5250},[5115,5118,5120,5123,5125,5131,5134,5136,5147,5149,5151,5190,5192,5198,5200,5202,5217,5219,5227,5229,5241,5243,5245,5248],[10,5116,5117],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5119,16],{"id":16},[10,5121,5122],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5124,22],{"id":22},[10,5126,5127],{},[26,5128],{"alt":5129,"src":5130},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5132,5133],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5135,35],{"id":35},[37,5137,5138,5141,5144],{},[40,5139,5140],{},"函数名描述动作，使用小写字母和下划线。",[40,5142,5143],{},"函数定义要先执行，之后才能调用。",[40,5145,5146],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5148,60],{"id":60},[10,5150,63],{},[65,5152,5154],{"className":67,"code":5153,"language":69,"meta":70,"style":70},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[50,5155,5156,5161,5166,5171,5175,5180,5185],{"__ignoreMap":70},[74,5157,5158],{"class":76,"line":77},[74,5159,5160],{},"def show_progress():\n",[74,5162,5163],{"class":76,"line":83},[74,5164,5165],{},"    print(\"正在学习函数\")\n",[74,5167,5168],{"class":76,"line":89},[74,5169,5170],{},"    print(\"本节完成 50%\")\n",[74,5172,5173],{"class":76,"line":96},[74,5174,93],{"emptyLinePlaceholder":92},[74,5176,5177],{"class":76,"line":102},[74,5178,5179],{},"print(\"调用前\")\n",[74,5181,5182],{"class":76,"line":108},[74,5183,5184],{},"show_progress()\n",[74,5186,5187],{"class":76,"line":2461},[74,5188,5189],{},"print(\"调用后\")\n",[10,5191,114],{},[65,5193,5196],{"className":5194,"code":5195,"language":120,"meta":70},[118],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[50,5197,5195],{"__ignoreMap":70},[10,5199,125],{},[14,5201,128],{"id":128},[130,5203,5204,5210],{},[40,5205,911,5206,5209],{},[50,5207,5208],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5211,5212,5213,5216],{},"运行到 ",[50,5214,5215],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5218,147],{"id":147},[37,5220,5221,5224],{},[40,5222,5223],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5225,5226],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5228,164],{"id":164},[130,5230,5231,5238],{},[40,5232,5233,5234,5237],{},"定义 ",[50,5235,5236],{},"show_plan()"," 输出两行学习计划。",[40,5239,5240],{},"连续调用同一个函数两次，观察执行顺序。",[10,5242,178],{},[14,5244,181],{"id":181},[10,5246,5247],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5249,188],{},{"title":70,"searchDepth":83,"depth":83,"links":5251},[5252,5253,5254,5255,5256,5257,5258,5259],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5112,"description":5117},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[199,5267,5268],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5271,"title":5272,"body":5273,"category":199,"cover":200,"description":5277,"extension":201,"meta":5457,"navigation":92,"path":5458,"pinned":204,"publishedAt":205,"seo":5459,"slug":5460,"stem":5461,"summary":5462,"tags":5463,"updatedAt":205,"visible":92,"__hash__":5466},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5274,"toc":5445},[5275,5278,5280,5283,5285,5291,5298,5300,5317,5319,5321,5355,5357,5363,5365,5367,5388,5390,5393,5399,5409,5411,5426,5428,5436,5438,5440,5443],[10,5276,5277],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5279,16],{"id":16},[10,5281,5282],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5284,22],{"id":22},[10,5286,5287],{},[26,5288],{"alt":5289,"src":5290},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5292,5293,5294,5297],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[50,5295,5296],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5299,35],{"id":35},[37,5301,5302,5305,5308],{},[40,5303,5304],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5306,5307],{},"局部变量默认只在函数内部可见。",[40,5309,5310,5311,5313,5314,158],{},"没有显式 ",[50,5312,5296],{}," 的函数会返回 ",[50,5315,5316],{},"None",[14,5318,60],{"id":60},[10,5320,63],{},[65,5322,5324],{"className":67,"code":5323,"language":69,"meta":70,"style":70},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[50,5325,5326,5331,5336,5341,5345,5350],{"__ignoreMap":70},[74,5327,5328],{"class":76,"line":77},[74,5329,5330],{},"def calculate_total(price, count):\n",[74,5332,5333],{"class":76,"line":83},[74,5334,5335],{},"    total = price * count\n",[74,5337,5338],{"class":76,"line":89},[74,5339,5340],{},"    return total\n",[74,5342,5343],{"class":76,"line":96},[74,5344,93],{"emptyLinePlaceholder":92},[74,5346,5347],{"class":76,"line":102},[74,5348,5349],{},"result = calculate_total(25, 4)\n",[74,5351,5352],{"class":76,"line":108},[74,5353,5354],{},"print(result)\n",[10,5356,114],{},[65,5358,5361],{"className":5359,"code":5360,"language":120,"meta":70},[118],"100\n",[50,5362,5360],{"__ignoreMap":70},[10,5364,125],{},[14,5366,128],{"id":128},[130,5368,5369,5378],{},[40,5370,5371,5372,2230,5375,5377],{},"调用时 25 和 4 分别绑定到 ",[50,5373,5374],{},"price",[50,5376,4337],{},"，它们只在本次函数调用的局部范围中使用。",[40,5379,5380,5383,5384,5387],{},[50,5381,5382],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[50,5385,5386],{},"result"," 并输出。",[302,5389,2671],{"id":2671},[10,5391,5392],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5394,5395],{},[26,5396],{"alt":5397,"src":5398},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5400,5401,2230,5403,1130,5405,5408],{},[50,5402,5374],{},[50,5404,4337],{},[50,5406,5407],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5410,147],{"id":147},[37,5412,5413,5420],{},[40,5414,5415,5416,5419],{},"在函数内部只 ",[50,5417,5418],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5421,5422,5423,5425],{},"试图在函数外直接访问局部变量 ",[50,5424,5407],{},"，它的名字只在调用期间的局部作用域存在。",[14,5427,164],{"id":164},[130,5429,5430,5433],{},[40,5431,5432],{},"编写计算长方形面积的函数。",[40,5434,5435],{},"让函数返回结果后在调用方加上单位再输出。",[10,5437,178],{},[14,5439,181],{"id":181},[10,5441,5442],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5444,188],{},{"title":70,"searchDepth":83,"depth":83,"links":5446},[5447,5448,5449,5450,5451,5454,5455,5456],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":5452},[5453],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5272,"description":5277},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[199,5464,5465],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5468,"title":5469,"body":5470,"category":199,"cover":200,"description":5474,"extension":201,"meta":5654,"navigation":92,"path":5655,"pinned":204,"publishedAt":205,"seo":5656,"slug":5657,"stem":5658,"summary":5659,"tags":5660,"updatedAt":205,"visible":92,"__hash__":5663},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5471,"toc":5642},[5472,5475,5477,5480,5482,5488,5491,5493,5510,5512,5514,5566,5568,5574,5576,5578,5596,5598,5601,5607,5610,5612,5623,5625,5633,5635,5637,5640],[10,5473,5474],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5476,16],{"id":16},[10,5478,5479],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5481,22],{"id":22},[10,5483,5484],{},[26,5485],{"alt":5486,"src":5487},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5489,5490],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5492,35],{"id":35},[37,5494,5495,5498,5504],{},[40,5496,5497],{},"必需参数应放在有默认值的参数之前。",[40,5499,5500,5503],{},[50,5501,5502],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5505,5506,5509],{},[50,5507,5508],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5511,60],{"id":60},[10,5513,63],{},[65,5515,5517],{"className":67,"code":5516,"language":69,"meta":70,"style":70},"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",[50,5518,5519,5524,5529,5533,5538,5543,5547,5552,5557,5561],{"__ignoreMap":70},[74,5520,5521],{"class":76,"line":77},[74,5522,5523],{},"def build_title(name, level=\"基础\"):\n",[74,5525,5526],{"class":76,"line":83},[74,5527,5528],{},"    return name + \"｜\" + level\n",[74,5530,5531],{"class":76,"line":89},[74,5532,93],{"emptyLinePlaceholder":92},[74,5534,5535],{"class":76,"line":96},[74,5536,5537],{},"print(build_title(\"Python\"))\n",[74,5539,5540],{"class":76,"line":102},[74,5541,5542],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[74,5544,5545],{"class":76,"line":108},[74,5546,93],{"emptyLinePlaceholder":92},[74,5548,5549],{"class":76,"line":2461},[74,5550,5551],{},"def total(*numbers):\n",[74,5553,5554],{"class":76,"line":2467},[74,5555,5556],{},"    return sum(numbers)\n",[74,5558,5559],{"class":76,"line":3888},[74,5560,93],{"emptyLinePlaceholder":92},[74,5562,5563],{"class":76,"line":4100},[74,5564,5565],{},"print(total(10, 20, 30))\n",[10,5567,114],{},[65,5569,5572],{"className":5570,"code":5571,"language":120,"meta":70},[118],"Python｜基础\n异常处理｜进阶\n60\n",[50,5573,5571],{"__ignoreMap":70},[10,5575,125],{},[14,5577,128],{"id":128},[130,5579,5580,5587],{},[40,5581,5582,5583,5586],{},"第一次调用只提供必需参数，",[50,5584,5585],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5588,5589,5592,5593,158],{},[50,5590,5591],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[50,5594,5595],{},"sum()",[302,5597,2671],{"id":2671},[10,5599,5600],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5602,5603],{},[26,5604],{"alt":5605,"src":5606},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5608,5609],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5611,147],{"id":147},[37,5613,5614,5620],{},[40,5615,5616,5617,5619],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[50,5618,5316],{}," 再在函数内创建。",[40,5621,5622],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5624,164],{"id":164},[130,5626,5627,5630],{},[40,5628,5629],{},"给问候函数增加默认称呼。",[40,5631,5632],{},"编写接收任意数量分数并返回总分的函数。",[10,5634,178],{},[14,5636,181],{"id":181},[10,5638,5639],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5641,188],{},{"title":70,"searchDepth":83,"depth":83,"links":5643},[5644,5645,5646,5647,5648,5651,5652,5653],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":5649},[5650],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5469,"description":5474},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[199,5661,5662],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5665,"title":5666,"body":5667,"category":199,"cover":200,"description":5671,"extension":201,"meta":5868,"navigation":92,"path":5869,"pinned":204,"publishedAt":205,"seo":5870,"slug":5871,"stem":5872,"summary":5873,"tags":5874,"updatedAt":205,"visible":92,"__hash__":5877},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5668,"toc":5856},[5669,5672,5674,5677,5679,5685,5688,5690,5707,5709,5711,5774,5776,5782,5784,5786,5813,5815,5818,5824,5827,5829,5837,5839,5847,5849,5851,5854],[10,5670,5671],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5673,16],{"id":16},[10,5675,5676],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5678,22],{"id":22},[10,5680,5681],{},[26,5682],{"alt":5683,"src":5684},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5686,5687],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5689,35],{"id":35},[37,5691,5692,5695,5698],{},[40,5693,5694],{},"函数内部赋值默认创建局部变量。",[40,5696,5697],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5699,5700,2149,5703,5706],{},[50,5701,5702],{},"global",[50,5704,5705],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5708,60],{"id":60},[10,5710,63],{},[65,5712,5714],{"className":67,"code":5713,"language":69,"meta":70,"style":70},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[50,5715,5716,5721,5725,5730,5735,5739,5744,5749,5754,5758,5763,5768],{"__ignoreMap":70},[74,5717,5718],{"class":76,"line":77},[74,5719,5720],{},"course = \"Python\"\n",[74,5722,5723],{"class":76,"line":83},[74,5724,93],{"emptyLinePlaceholder":92},[74,5726,5727],{"class":76,"line":89},[74,5728,5729],{},"def outer():\n",[74,5731,5732],{"class":76,"line":96},[74,5733,5734],{},"    level = \"基础\"\n",[74,5736,5737],{"class":76,"line":102},[74,5738,93],{"emptyLinePlaceholder":92},[74,5740,5741],{"class":76,"line":108},[74,5742,5743],{},"    def show():\n",[74,5745,5746],{"class":76,"line":2461},[74,5747,5748],{},"        lesson = \"作用域\"\n",[74,5750,5751],{"class":76,"line":2467},[74,5752,5753],{},"        print(course, level, lesson)\n",[74,5755,5756],{"class":76,"line":3888},[74,5757,93],{"emptyLinePlaceholder":92},[74,5759,5760],{"class":76,"line":4100},[74,5761,5762],{},"    show()\n",[74,5764,5766],{"class":76,"line":5765},11,[74,5767,93],{"emptyLinePlaceholder":92},[74,5769,5771],{"class":76,"line":5770},12,[74,5772,5773],{},"outer()\n",[10,5775,114],{},[65,5777,5780],{"className":5778,"code":5779,"language":120,"meta":70},[118],"Python 基础 作用域\n",[50,5781,5779],{"__ignoreMap":70},[10,5783,125],{},[14,5785,128],{"id":128},[130,5787,5788,5805],{},[40,5789,5790,5793,5794,5797,5798,5800,5801,5804],{},[50,5791,5792],{},"show()"," 中查找 ",[50,5795,5796],{},"lesson"," 时先在局部找到，查找 ",[50,5799,5585],{}," 时到外层 ",[50,5802,5803],{},"outer()"," 找到。",[40,5806,5807,5809,5810,5812],{},[50,5808,4520],{}," 在局部和外层都不存在，继续到模块全局找到；",[50,5811,2181],{}," 最后在内置作用域找到。",[302,5814,2671],{"id":2671},[10,5816,5817],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5819,5820],{},[26,5821],{"alt":5822,"src":5823},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5825,5826],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5828,147],{"id":147},[37,5830,5831,5834],{},[40,5832,5833],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5835,5836],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5838,164],{"id":164},[130,5840,5841,5844],{},[40,5842,5843],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5845,5846],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5848,178],{},[14,5850,181],{"id":181},[10,5852,5853],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5855,188],{},{"title":70,"searchDepth":83,"depth":83,"links":5857},[5858,5859,5860,5861,5862,5865,5866,5867],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":5863},[5864],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5666,"description":5671},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[199,5875,5876],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5879,"title":5880,"body":5881,"category":199,"cover":200,"description":5885,"extension":201,"meta":6035,"navigation":92,"path":6036,"pinned":204,"publishedAt":205,"seo":6037,"slug":6038,"stem":6039,"summary":6040,"tags":6041,"updatedAt":205,"visible":92,"__hash__":6044},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5882,"toc":6025},[5883,5886,5888,5891,5893,5899,5902,5904,5923,5925,5927,5961,5963,5969,5971,5973,5988,5990,6002,6004,6016,6018,6020,6023],[10,5884,5885],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5887,16],{"id":16},[10,5889,5890],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5892,22],{"id":22},[10,5894,5895],{},[26,5896],{"alt":5897,"src":5898},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5900,5901],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5903,35],{"id":35},[37,5905,5906,5909,5912],{},[40,5907,5908],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5910,5911],{},"注解表达接口意图，不代替输入校验和测试。",[40,5913,5914,5915,2230,5917,2230,5919,5922],{},"基础注解优先使用 ",[50,5916,2233],{},[50,5918,2398],{},[50,5920,5921],{},"list[str]"," 等直接写法。",[14,5924,60],{"id":60},[10,5926,63],{},[65,5928,5930],{"className":67,"code":5929,"language":69,"meta":70,"style":70},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[50,5931,5932,5937,5942,5947,5951,5956],{"__ignoreMap":70},[74,5933,5934],{"class":76,"line":77},[74,5935,5936],{},"def format_score(name: str, score: int) -> str:\n",[74,5938,5939],{"class":76,"line":83},[74,5940,5941],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[74,5943,5944],{"class":76,"line":89},[74,5945,5946],{},"    return name + \"：\" + str(score)\n",[74,5948,5949],{"class":76,"line":96},[74,5950,93],{"emptyLinePlaceholder":92},[74,5952,5953],{"class":76,"line":102},[74,5954,5955],{},"print(format_score(\"小郑\", 95))\n",[74,5957,5958],{"class":76,"line":108},[74,5959,5960],{},"print(format_score.__doc__)\n",[10,5962,114],{},[65,5964,5967],{"className":5965,"code":5966,"language":120,"meta":70},[118],"小郑：95\n返回带姓名的分数文本。\n",[50,5968,5966],{"__ignoreMap":70},[10,5970,125],{},[14,5972,128],{"id":128},[130,5974,5975,5985],{},[40,5976,5977,5978,5981,5982,5984],{},"函数签名说明 ",[50,5979,5980],{},"name"," 预期为字符串、",[50,5983,2219],{}," 预期为整数，返回值预期为字符串。",[40,5986,5987],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5989,147],{"id":147},[37,5991,5992,5999],{},[40,5993,5994,5995,5998],{},"认为加了 ",[50,5996,5997],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6000,6001],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6003,164],{"id":164},[130,6005,6006,6009],{},[40,6007,6008],{},"为面积函数补充参数和返回值注解。",[40,6010,6011,6012,6015],{},"通过 ",[50,6013,6014],{},"函数名.__doc__"," 查看文档字符串。",[10,6017,178],{},[14,6019,181],{"id":181},[10,6021,6022],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6024,188],{},{"title":70,"searchDepth":83,"depth":83,"links":6026},[6027,6028,6029,6030,6031,6032,6033,6034],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5880,"description":5885},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[199,6042,6043],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6046,"title":6047,"body":6048,"category":199,"cover":200,"description":6052,"extension":201,"meta":6279,"navigation":92,"path":6280,"pinned":204,"publishedAt":205,"seo":6281,"slug":6282,"stem":6283,"summary":6284,"tags":6285,"updatedAt":205,"visible":92,"__hash__":6288},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6049,"toc":6267},[6050,6053,6055,6061,6063,6069,6080,6082,6100,6102,6109,6138,6145,6164,6173,6175,6181,6183,6185,6208,6210,6213,6219,6225,6227,6243,6245,6258,6260,6262,6265],[10,6051,6052],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6054,16],{"id":16},[10,6056,6057,6058,6060],{},"本篇只处理“模块、import 与 ",[268,6059,5980],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6062,22],{"id":22},[10,6064,6065],{},[26,6066],{"alt":6067,"src":6068},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6070,6071,6072,6075,6076,6079],{},"同一个文件直接运行时 ",[50,6073,6074],{},"__name__"," 等于 ",[50,6077,6078],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6081,35],{"id":35},[37,6083,6084,6090,6093],{},[40,6085,6086,6087,6089],{},"一个 ",[50,6088,1144],{}," 文件就是一个模块。",[40,6091,6092],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6094,6095,6096,6099],{},"避免使用 ",[50,6097,6098],{},"from module import *","，它会让名字来源不清楚。",[14,6101,60],{"id":60},[10,6103,6104,6105,6108],{},"先在同一个目录中创建两个文件。把函数放进 ",[50,6106,6107],{},"calculator.py","：",[65,6110,6112],{"className":67,"code":6111,"language":69,"meta":70,"style":70},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[50,6113,6114,6119,6124,6128,6133],{"__ignoreMap":70},[74,6115,6116],{"class":76,"line":77},[74,6117,6118],{},"def add(left, right):\n",[74,6120,6121],{"class":76,"line":83},[74,6122,6123],{},"    return left + right\n",[74,6125,6126],{"class":76,"line":89},[74,6127,93],{"emptyLinePlaceholder":92},[74,6129,6130],{"class":76,"line":96},[74,6131,6132],{},"if __name__ == \"__main__\":\n",[74,6134,6135],{"class":76,"line":102},[74,6136,6137],{},"    print(add(2, 3))\n",[10,6139,6140,6141,6144],{},"再创建 ",[50,6142,6143],{},"app.py","，从模块中导入函数：",[65,6146,6148],{"className":67,"code":6147,"language":69,"meta":70,"style":70},"from calculator import add\n\nprint(add(10, 20))\n",[50,6149,6150,6155,6159],{"__ignoreMap":70},[74,6151,6152],{"class":76,"line":77},[74,6153,6154],{},"from calculator import add\n",[74,6156,6157],{"class":76,"line":83},[74,6158,93],{"emptyLinePlaceholder":92},[74,6160,6161],{"class":76,"line":89},[74,6162,6163],{},"print(add(10, 20))\n",[10,6165,6166,6167,1130,6170,158],{},"分别执行 ",[50,6168,6169],{},"python3 calculator.py",[50,6171,6172],{},"python3 app.py",[10,6174,114],{},[65,6176,6179],{"className":6177,"code":6178,"language":120,"meta":70},[118],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[50,6180,6178],{"__ignoreMap":70},[10,6182,125],{},[14,6184,128],{"id":128},[130,6186,6187,6197],{},[40,6188,6189,6190,6192,6193,6196],{},"直接运行 ",[50,6191,6107],{}," 时，模块名是 ",[50,6194,6195],{},"__main__","，入口代码输出 5。",[40,6198,6199,6201,6202,6204,6205,6207],{},[50,6200,6143],{}," 导入模块时，",[50,6203,6107],{}," 的函数定义会执行，但入口判断为假；随后 ",[50,6206,6143],{}," 调用函数输出 30。",[302,6209,2671],{"id":2671},[10,6211,6212],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6214,6215],{},[26,6216],{"alt":6217,"src":6218},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6220,6221,6222,6224],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[50,6223,6195],{}," 保护下的演示代码。",[14,6226,147],{"id":147},[37,6228,6229,6236],{},[40,6230,6231,6232,1130,6234,158],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[50,6233,6107],{},[50,6235,6143],{},[40,6237,6238,6239,6242],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[50,6240,6241],{},"json.py","，导致导入目标被遮蔽。",[14,6244,164],{"id":164},[130,6246,6247,6253],{},[40,6248,2326,6249,6252],{},[50,6250,6251],{},"text_tools.py"," 并导出一个格式化函数。",[40,6254,6255,6256,158],{},"分别直接运行模块和从另一个脚本导入，输出 ",[50,6257,6074],{},[10,6259,178],{},[14,6261,181],{"id":181},[10,6263,6264],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6266,188],{},{"title":70,"searchDepth":83,"depth":83,"links":6268},[6269,6270,6271,6272,6273,6276,6277,6278],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":6274},[6275],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6047,"description":6052},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[199,6286,6287],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6290,"title":6291,"body":6292,"category":199,"cover":200,"description":6296,"extension":201,"meta":6461,"navigation":92,"path":6462,"pinned":204,"publishedAt":205,"seo":6463,"slug":6464,"stem":6465,"summary":6466,"tags":6467,"updatedAt":205,"visible":92,"__hash__":6469},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6293,"toc":6451},[6294,6297,6299,6302,6304,6310,6313,6315,6329,6331,6333,6379,6381,6387,6389,6391,6417,6419,6429,6431,6442,6444,6446,6449],[10,6295,6296],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6298,16],{"id":16},[10,6300,6301],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6303,22],{"id":22},[10,6305,6306],{},[26,6307],{"alt":6308,"src":6309},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6311,6312],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6314,35],{"id":35},[37,6316,6317,6323,6326],{},[40,6318,6319,6322],{},[50,6320,6321],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6324,6325],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6327,6328],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6330,60],{"id":60},[10,6332,1547],{},[65,6334,6336],{"className":564,"code":6335,"language":566,"meta":70,"style":70},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[50,6337,6338,6350,6358,6364,6374],{"__ignoreMap":70},[74,6339,6340,6342,6344,6347],{"class":76,"line":77},[74,6341,664],{"class":573},[74,6343,606],{"class":576},[74,6345,6346],{"class":609}," venv",[74,6348,6349],{"class":609}," .venv\n",[74,6351,6352,6355],{"class":76,"line":83},[74,6353,6354],{"class":576},"source",[74,6356,6357],{"class":609}," .venv\u002Fbin\u002Factivate\n",[74,6359,6360,6362],{"class":76,"line":89},[74,6361,69],{"class":573},[74,6363,577],{"class":576},[74,6365,6366,6368,6370,6372],{"class":76,"line":96},[74,6367,69],{"class":573},[74,6369,606],{"class":576},[74,6371,610],{"class":609},[74,6373,577],{"class":576},[74,6375,6376],{"class":76,"line":102},[74,6377,6378],{"class":573},"deactivate\n",[10,6380,114],{},[65,6382,6385],{"className":6383,"code":6384,"language":120,"meta":70},[118],"Python 和 pip 的路径应指向当前项目的 .venv\n",[50,6386,6384],{"__ignoreMap":70},[10,6388,125],{},[14,6390,128],{"id":128},[130,6392,6393,6402],{},[40,6394,6395,6398,6399,6401],{},[50,6396,6397],{},"venv"," 根据当前 ",[50,6400,664],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6403,6404,6405,2149,6407,6410,6411,53,6413,6416],{},"激活后 ",[50,6406,69],{},[50,6408,6409],{},"python -m pip"," 优先指向 ",[50,6412,6321],{},[50,6414,6415],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6418,147],{"id":147},[37,6420,6421,6424],{},[40,6422,6423],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6425,3440,6426,6428],{},[50,6427,6321],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6430,164],{"id":164},[130,6432,6433,6439],{},[40,6434,6435,6436,158],{},"创建虚拟环境并记录激活前后的 ",[50,6437,6438],{},"which python",[40,6440,6441],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6443,178],{},[14,6445,181],{"id":181},[10,6447,6448],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6450,1631],{},{"title":70,"searchDepth":83,"depth":83,"links":6452},[6453,6454,6455,6456,6457,6458,6459,6460],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6291,"description":6296},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[199,6468,234],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6471,"title":6472,"body":6473,"category":199,"cover":200,"description":6477,"extension":201,"meta":6665,"navigation":92,"path":6666,"pinned":204,"publishedAt":205,"seo":6667,"slug":6668,"stem":6669,"summary":6670,"tags":6671,"updatedAt":205,"visible":92,"__hash__":6674},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6474,"toc":6655},[6475,6478,6480,6483,6485,6491,6500,6502,6526,6528,6530,6583,6585,6591,6593,6595,6611,6613,6632,6634,6646,6648,6650,6653],[10,6476,6477],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6479,16],{"id":16},[10,6481,6482],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6484,22],{"id":22},[10,6486,6487],{},[26,6488],{"alt":6489,"src":6490},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6492,6493,6496,6497,6499],{},[50,6494,6495],{},"Path"," 使用 ",[50,6498,2408],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6501,35],{"id":35},[37,6503,6504,6507,6519],{},[40,6505,6506],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6508,6509,2230,6512,2230,6515,6518],{},[50,6510,6511],{},"exists()",[50,6513,6514],{},"is_file()",[50,6516,6517],{},"is_dir()"," 检查真实文件系统状态。",[40,6520,6521,6522,6525],{},"创建目录前明确目标；",[50,6523,6524],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6527,60],{"id":60},[10,6529,63],{},[65,6531,6533],{"className":67,"code":6532,"language":69,"meta":70,"style":70},"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",[50,6534,6535,6540,6544,6549,6554,6559,6563,6568,6573,6578],{"__ignoreMap":70},[74,6536,6537],{"class":76,"line":77},[74,6538,6539],{},"from pathlib import Path\n",[74,6541,6542],{"class":76,"line":83},[74,6543,93],{"emptyLinePlaceholder":92},[74,6545,6546],{"class":76,"line":89},[74,6547,6548],{},"project = Path.cwd()\n",[74,6550,6551],{"class":76,"line":96},[74,6552,6553],{},"data_dir = project \u002F \"data\"\n",[74,6555,6556],{"class":76,"line":102},[74,6557,6558],{},"file_path = data_dir \u002F \"records.json\"\n",[74,6560,6561],{"class":76,"line":108},[74,6562,93],{"emptyLinePlaceholder":92},[74,6564,6565],{"class":76,"line":2461},[74,6566,6567],{},"print(project)\n",[74,6569,6570],{"class":76,"line":2467},[74,6571,6572],{},"print(file_path.name)\n",[74,6574,6575],{"class":76,"line":3888},[74,6576,6577],{},"print(file_path.suffix)\n",[74,6579,6580],{"class":76,"line":4100},[74,6581,6582],{},"print(file_path.exists())\n",[10,6584,114],{},[65,6586,6589],{"className":6587,"code":6588,"language":120,"meta":70},[118],"显示当前项目路径、records.json、.json 和存在状态\n",[50,6590,6588],{"__ignoreMap":70},[10,6592,125],{},[14,6594,128],{"id":128},[130,6596,6597,6603],{},[40,6598,6599,6602],{},[50,6600,6601],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6604,152,6605,6607,6608,6610],{},[50,6606,2408],{}," 组合路径片段只创建新的 ",[50,6609,6495],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6612,147],{"id":147},[37,6614,6615,6623],{},[40,6616,3440,6617,6619,6620,6622],{},[50,6618,6495],{}," 对象存在当成真实文件存在，仍需调用 ",[50,6621,6511],{}," 等方法确认。",[40,6624,6625,6626,982,6628,6631],{},"手工拼接 ",[50,6627,2408],{},[50,6629,6630],{},"\\"," 分隔符，降低跨平台可读性。",[14,6633,164],{"id":164},[130,6635,6636,6643],{},[40,6637,6638,6639,6642],{},"组合 ",[50,6640,6641],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6644,6645],{},"输出路径的父目录、文件名和扩展名。",[10,6647,178],{},[14,6649,181],{"id":181},[10,6651,6652],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6654,188],{},{"title":70,"searchDepth":83,"depth":83,"links":6656},[6657,6658,6659,6660,6661,6662,6663,6664],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6472,"description":6477},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[199,6672,6673],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6676,"title":6677,"body":6678,"category":199,"cover":200,"description":6682,"extension":201,"meta":6860,"navigation":92,"path":6861,"pinned":204,"publishedAt":205,"seo":6862,"slug":6863,"stem":6864,"summary":6865,"tags":6866,"updatedAt":205,"visible":92,"__hash__":6869},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6679,"toc":6850},[6680,6683,6685,6688,6690,6696,6699,6701,6729,6731,6733,6790,6792,6798,6800,6802,6813,6815,6828,6830,6841,6843,6845,6848],[10,6681,6682],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6684,16],{"id":16},[10,6686,6687],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6689,22],{"id":22},[10,6691,6692],{},[26,6693],{"alt":6694,"src":6695},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6697,6698],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6700,35],{"id":35},[37,6702,6703,6709,6718],{},[40,6704,6705,6708],{},[50,6706,6707],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6710,6711,6714,6715,158],{},[50,6712,6713],{},"r"," 模式读取不存在文件会产生 ",[50,6716,6717],{},"FileNotFoundError",[40,6719,6720,6721,6724,6725,6728],{},"本篇显式调用 ",[50,6722,6723],{},"close()","；第 34 篇会用 ",[50,6726,6727],{},"with"," 更可靠地管理关闭动作。",[14,6730,60],{"id":60},[10,6732,63],{},[65,6734,6736],{"className":67,"code":6735,"language":69,"meta":70,"style":70},"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",[50,6737,6738,6742,6746,6751,6756,6761,6766,6770,6775,6780,6785],{"__ignoreMap":70},[74,6739,6740],{"class":76,"line":77},[74,6741,6539],{},[74,6743,6744],{"class":76,"line":83},[74,6745,93],{"emptyLinePlaceholder":92},[74,6747,6748],{"class":76,"line":89},[74,6749,6750],{},"file_path = Path(\"notes.txt\")\n",[74,6752,6753],{"class":76,"line":96},[74,6754,6755],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[74,6757,6758],{"class":76,"line":102},[74,6759,6760],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[74,6762,6763],{"class":76,"line":108},[74,6764,6765],{},"writer.close()\n",[74,6767,6768],{"class":76,"line":2461},[74,6769,93],{"emptyLinePlaceholder":92},[74,6771,6772],{"class":76,"line":2467},[74,6773,6774],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[74,6776,6777],{"class":76,"line":3888},[74,6778,6779],{},"content = reader.read()\n",[74,6781,6782],{"class":76,"line":4100},[74,6783,6784],{},"reader.close()\n",[74,6786,6787],{"class":76,"line":5765},[74,6788,6789],{},"print(content)\n",[10,6791,114],{},[65,6793,6796],{"className":6794,"code":6795,"language":120,"meta":70},[118],"变量\n循环\n函数\n",[50,6797,6795],{"__ignoreMap":70},[10,6799,125],{},[14,6801,128],{"id":128},[130,6803,6804,6810],{},[40,6805,6806,6807,6809],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[50,6808,6723],{}," 确保缓冲内容交给文件系统。",[40,6811,6812],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6814,147],{"id":147},[37,6816,6817,6822],{},[40,6818,152,6819,6821],{},[50,6820,6707],{}," 模式打开重要文件却未确认覆盖风险。",[40,6823,6824,6825,158],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[50,6826,6827],{},"encoding=\"utf-8\"",[14,6829,164],{"id":164},[130,6831,6832,6835],{},[40,6833,6834],{},"写入三行学习记录并读取。",[40,6836,6837,6838,6840],{},"改用 ",[50,6839,310],{}," 模式追加一行，确认原内容仍保留。",[10,6842,178],{},[14,6844,181],{"id":181},[10,6846,6847],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6849,188],{},{"title":70,"searchDepth":83,"depth":83,"links":6851},[6852,6853,6854,6855,6856,6857,6858,6859],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6677,"description":6682},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[199,6867,6868],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6871,"title":6872,"body":6873,"category":199,"cover":200,"description":6877,"extension":201,"meta":7044,"navigation":92,"path":7045,"pinned":204,"publishedAt":205,"seo":7046,"slug":7047,"stem":7048,"summary":7049,"tags":7050,"updatedAt":205,"visible":92,"__hash__":7053},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6874,"toc":7034},[6875,6878,6880,6883,6885,6891,6901,6903,6917,6919,6921,6981,6983,6989,6991,6993,7005,7007,7015,7017,7025,7027,7029,7032],[10,6876,6877],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6879,16],{"id":16},[10,6881,6882],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6884,22],{"id":22},[10,6886,6887],{},[26,6888],{"alt":6889,"src":6890},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6892,6893,6896,6897,6900],{},[50,6894,6895],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[50,6898,6899],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6902,35],{"id":35},[37,6904,6905,6908,6914],{},[40,6906,6907],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6909,6910,6913],{},[50,6911,6912],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6915,6916],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6918,60],{"id":60},[10,6920,63],{},[65,6922,6924],{"className":67,"code":6923,"language":69,"meta":70,"style":70},"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",[50,6925,6926,6931,6935,6940,6944,6949,6954,6958,6962,6967,6972,6976],{"__ignoreMap":70},[74,6927,6928],{"class":76,"line":77},[74,6929,6930],{},"import json\n",[74,6932,6933],{"class":76,"line":83},[74,6934,93],{"emptyLinePlaceholder":92},[74,6936,6937],{"class":76,"line":89},[74,6938,6939],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[74,6941,6942],{"class":76,"line":96},[74,6943,93],{"emptyLinePlaceholder":92},[74,6945,6946],{"class":76,"line":102},[74,6947,6948],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[74,6950,6951],{"class":76,"line":108},[74,6952,6953],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[74,6955,6956],{"class":76,"line":2461},[74,6957,6765],{},[74,6959,6960],{"class":76,"line":2467},[74,6961,93],{"emptyLinePlaceholder":92},[74,6963,6964],{"class":76,"line":3888},[74,6965,6966],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[74,6968,6969],{"class":76,"line":4100},[74,6970,6971],{},"loaded = json.load(reader)\n",[74,6973,6974],{"class":76,"line":5765},[74,6975,6784],{},[74,6977,6978],{"class":76,"line":5770},[74,6979,6980],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6982,114],{},[65,6984,6987],{"className":6985,"code":6986,"language":120,"meta":70},[118],"Python 60\n",[50,6988,6986],{"__ignoreMap":70},[10,6990,125],{},[14,6992,128],{"id":128},[130,6994,6995,7000],{},[40,6996,6997,6999],{},[50,6998,6895],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7001,7002,7004],{},[50,7003,6899],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7006,147],{"id":147},[37,7008,7009,7012],{},[40,7010,7011],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7013,7014],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7016,164],{"id":164},[130,7018,7019,7022],{},[40,7020,7021],{},"保存包含两条学习记录的列表。",[40,7023,7024],{},"读取后修改进度，再重新写回文件。",[10,7026,178],{},[14,7028,181],{"id":181},[10,7030,7031],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7033,188],{},{"title":70,"searchDepth":83,"depth":83,"links":7035},[7036,7037,7038,7039,7040,7041,7042,7043],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6872,"description":6877},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[199,7051,7052],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7055,"title":7056,"body":7057,"category":199,"cover":200,"description":7061,"extension":201,"meta":7245,"navigation":92,"path":7246,"pinned":204,"publishedAt":205,"seo":7247,"slug":7248,"stem":7249,"summary":7250,"tags":7251,"updatedAt":205,"visible":92,"__hash__":7254},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7058,"toc":7235},[7059,7062,7064,7067,7069,7075,7081,7083,7105,7107,7109,7172,7174,7180,7182,7184,7200,7202,7216,7218,7226,7228,7230,7233],[10,7060,7061],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7063,16],{"id":16},[10,7065,7066],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7068,22],{"id":22},[10,7070,7071],{},[26,7072],{"alt":7073,"src":7074},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7076,7077,7080],{},[50,7078,7079],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7082,35],{"id":35},[37,7084,7085,7095,7102],{},[40,7086,152,7087,7090,7091,7094],{},[50,7088,7089],{},"newline=\"\""," 让 ",[50,7092,7093],{},"csv"," 模块正确处理换行。",[40,7096,7097,7098,7101],{},"字段顺序由 ",[50,7099,7100],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7103,7104],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7106,60],{"id":60},[10,7108,63],{},[65,7110,7112],{"className":67,"code":7111,"language":69,"meta":70,"style":70},"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",[50,7113,7114,7119,7123,7128,7133,7138,7143,7148,7152,7157,7162,7167],{"__ignoreMap":70},[74,7115,7116],{"class":76,"line":77},[74,7117,7118],{},"import csv\n",[74,7120,7121],{"class":76,"line":83},[74,7122,93],{"emptyLinePlaceholder":92},[74,7124,7125],{"class":76,"line":89},[74,7126,7127],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[74,7129,7130],{"class":76,"line":96},[74,7131,7132],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[74,7134,7135],{"class":76,"line":102},[74,7136,7137],{},"writer.writeheader()\n",[74,7139,7140],{"class":76,"line":108},[74,7141,7142],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[74,7144,7145],{"class":76,"line":2461},[74,7146,7147],{},"writer_file.close()\n",[74,7149,7150],{"class":76,"line":2467},[74,7151,93],{"emptyLinePlaceholder":92},[74,7153,7154],{"class":76,"line":3888},[74,7155,7156],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[74,7158,7159],{"class":76,"line":4100},[74,7160,7161],{},"for row in csv.DictReader(reader_file):\n",[74,7163,7164],{"class":76,"line":5765},[74,7165,7166],{},"    print(row[\"name\"], row[\"score\"])\n",[74,7168,7169],{"class":76,"line":5770},[74,7170,7171],{},"reader_file.close()\n",[10,7173,114],{},[65,7175,7178],{"className":7176,"code":7177,"language":120,"meta":70},[118],"小郑 95\n",[50,7179,7177],{"__ignoreMap":70},[10,7181,125],{},[14,7183,128],{"id":128},[130,7185,7186,7195],{},[40,7187,7188,7191,7192,7194],{},[50,7189,7190],{},"DictWriter"," 按 ",[50,7193,7100],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7196,7197,7199],{},[50,7198,7079],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7201,147],{"id":147},[37,7203,7204,7207],{},[40,7205,7206],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7208,7209,7210,7212,7213,7215],{},"在 macOS 以外环境忽略 ",[50,7211,7089],{}," 可能出现额外空行；统一交给 ",[50,7214,7093],{}," 模块管理换行。",[14,7217,164],{"id":164},[130,7219,7220,7223],{},[40,7221,7222],{},"写入三名学习者的课程和分数。",[40,7224,7225],{},"读取 CSV 后把分数字符串转换为整数。",[10,7227,178],{},[14,7229,181],{"id":181},[10,7231,7232],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7234,188],{},{"title":70,"searchDepth":83,"depth":83,"links":7236},[7237,7238,7239,7240,7241,7242,7243,7244],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7056,"description":7061},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[199,7252,7253],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7256,"title":7257,"body":7258,"category":199,"cover":200,"description":7262,"extension":201,"meta":7535,"navigation":92,"path":7536,"pinned":204,"publishedAt":205,"seo":7537,"slug":7538,"stem":7539,"summary":7540,"tags":7541,"updatedAt":205,"visible":92,"__hash__":7544},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7259,"toc":7522},[7260,7263,7265,7268,7270,7276,7287,7289,7306,7308,7310,7385,7387,7393,7395,7397,7422,7424,7433,7439,7450,7452,7458,7464,7473,7475,7490,7492,7513,7515,7517,7520],[10,7261,7262],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7264,16],{"id":16},[10,7266,7267],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7269,22],{"id":22},[10,7271,7272],{},[26,7273],{"alt":7274,"src":7275},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7277,7278,7279,7282,7283,7286],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[50,7280,7281],{},"except","；无论是否异常，",[50,7284,7285],{},"finally"," 都会在离开结构前执行。",[14,7288,35],{"id":35},[37,7290,7291,7297,7303],{},[40,7292,7293,7294,7296],{},"只捕获能够处理的具体异常，不使用空的 ",[50,7295,7281],{}," 吞掉全部错误。",[40,7298,7299,7302],{},[50,7300,7301],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7304,7305],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7307,60],{"id":60},[10,7309,63],{},[65,7311,7313],{"className":67,"code":7312,"language":69,"meta":70,"style":70},"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",[50,7314,7315,7320,7325,7330,7335,7340,7344,7349,7354,7359,7364,7368,7373,7379],{"__ignoreMap":70},[74,7316,7317],{"class":76,"line":77},[74,7318,7319],{},"def parse_age(text):\n",[74,7321,7322],{"class":76,"line":83},[74,7323,7324],{},"    age = int(text)\n",[74,7326,7327],{"class":76,"line":89},[74,7328,7329],{},"    if age \u003C 0:\n",[74,7331,7332],{"class":76,"line":96},[74,7333,7334],{},"        raise ValueError(\"年龄不能为负数\")\n",[74,7336,7337],{"class":76,"line":102},[74,7338,7339],{},"    return age\n",[74,7341,7342],{"class":76,"line":108},[74,7343,93],{"emptyLinePlaceholder":92},[74,7345,7346],{"class":76,"line":2461},[74,7347,7348],{},"try:\n",[74,7350,7351],{"class":76,"line":2467},[74,7352,7353],{},"    age = parse_age(\"18\")\n",[74,7355,7356],{"class":76,"line":3888},[74,7357,7358],{},"except ValueError as error:\n",[74,7360,7361],{"class":76,"line":4100},[74,7362,7363],{},"    print(\"输入错误：\", error)\n",[74,7365,7366],{"class":76,"line":5765},[74,7367,1119],{},[74,7369,7370],{"class":76,"line":5770},[74,7371,7372],{},"    print(\"年龄：\", age)\n",[74,7374,7376],{"class":76,"line":7375},13,[74,7377,7378],{},"finally:\n",[74,7380,7382],{"class":76,"line":7381},14,[74,7383,7384],{},"    print(\"处理结束\")\n",[10,7386,114],{},[65,7388,7391],{"className":7389,"code":7390,"language":120,"meta":70},[118],"年龄： 18\n处理结束\n",[50,7392,7390],{"__ignoreMap":70},[10,7394,125],{},[14,7396,128],{"id":128},[130,7398,7399,7411],{},[40,7400,7401,7403,7404,7406,7407,7410],{},[50,7402,3010],{}," 或主动 ",[50,7405,7301],{}," 都可能产生 ",[50,7408,7409],{},"ValueError","，控制流立即离开当前正常路径。",[40,7412,7413,7414,7416,7417,7419,7420,158],{},"有异常时进入匹配的 ",[50,7415,7281],{},"；没有异常时执行 ",[50,7418,1133],{},"；两种情况最后都会执行 ",[50,7421,7285],{},[302,7423,2671],{"id":2671},[10,7425,7426,2230,7428,1130,7430,7432],{},[50,7427,7281],{},[50,7429,1133],{},[50,7431,7285],{}," 的职责不同，不能只看它们出现的顺序。",[10,7434,7435],{},[26,7436],{"alt":7437,"src":7438},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7440,7441,7443,7444,7446,7447,7449],{},[50,7442,7281],{}," 处理匹配异常，",[50,7445,1133],{}," 只在无异常时运行，",[50,7448,7285],{}," 负责两条路径都需要的清理动作。",[302,7451,2671],{"id":4155},[10,7453,7454,7457],{},[50,7455,7456],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7459,7460],{},[26,7461],{"alt":7462,"src":7463},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7465,7466,7467,7469,7470,7472],{},"只把可能产生预期异常的操作放进 ",[50,7468,7456],{},"，后续正常业务放进 ",[50,7471,1133],{},"，错误边界会更清楚。",[14,7474,147],{"id":147},[37,7476,7477,7484],{},[40,7478,7479,7480,7483],{},"使用裸 ",[50,7481,7482],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7485,7486,7487,7489],{},"把整个程序包在一个巨大 ",[50,7488,7456],{}," 中，无法判断究竟哪一步允许失败。",[14,7491,164],{"id":164},[130,7493,7494,7507],{},[40,7495,7496,7497,7500,7501,1130,7504,158],{},"让 ",[50,7498,7499],{},"parse_age"," 分别处理 ",[50,7502,7503],{},"\"abc\"",[50,7505,7506],{},"\"-1\"",[40,7508,7509,7510,7512],{},"为文件读取捕获 ",[50,7511,6717],{}," 并给出清晰提示。",[10,7514,178],{},[14,7516,181],{"id":181},[10,7518,7519],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7521,188],{},{"title":70,"searchDepth":83,"depth":83,"links":7523},[7524,7525,7526,7527,7528,7532,7533,7534],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":7529},[7530,7531],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7257,"description":7262},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[199,7542,7543],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7546,"title":7547,"body":7548,"category":199,"cover":200,"description":7552,"extension":201,"meta":7728,"navigation":92,"path":7729,"pinned":204,"publishedAt":205,"seo":7730,"slug":7731,"stem":7732,"summary":7733,"tags":7734,"updatedAt":205,"visible":92,"__hash__":7736},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7549,"toc":7718},[7550,7553,7555,7558,7560,7566,7572,7574,7590,7592,7594,7648,7650,7656,7658,7660,7673,7675,7688,7690,7709,7711,7713,7716],[10,7551,7552],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7554,16],{"id":16},[10,7556,7557],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7559,22],{"id":22},[10,7561,7562],{},[26,7563],{"alt":7564,"src":7565},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7567,7568,7569,7571],{},"进入 ",[50,7570,6727],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7573,35],{"id":35},[37,7575,7576,7581,7587],{},[40,7577,7578,7580],{},[50,7579,6727],{}," 把资源获取和释放配成一个清晰边界。",[40,7582,7583,7586],{},[50,7584,7585],{},"as file"," 得到的是上下文返回的资源对象。",[40,7588,7589],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7591,60],{"id":60},[10,7593,63],{},[65,7595,7597],{"className":67,"code":7596,"language":69,"meta":70,"style":70},"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",[50,7598,7599,7603,7607,7611,7615,7620,7625,7629,7634,7639,7643],{"__ignoreMap":70},[74,7600,7601],{"class":76,"line":77},[74,7602,6539],{},[74,7604,7605],{"class":76,"line":83},[74,7606,93],{"emptyLinePlaceholder":92},[74,7608,7609],{"class":76,"line":89},[74,7610,6750],{},[74,7612,7613],{"class":76,"line":96},[74,7614,93],{"emptyLinePlaceholder":92},[74,7616,7617],{"class":76,"line":102},[74,7618,7619],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,7621,7622],{"class":76,"line":108},[74,7623,7624],{},"    file.write(\"上下文管理器\\n\")\n",[74,7626,7627],{"class":76,"line":2461},[74,7628,93],{"emptyLinePlaceholder":92},[74,7630,7631],{"class":76,"line":2467},[74,7632,7633],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[74,7635,7636],{"class":76,"line":3888},[74,7637,7638],{},"    print(file.read())\n",[74,7640,7641],{"class":76,"line":4100},[74,7642,93],{"emptyLinePlaceholder":92},[74,7644,7645],{"class":76,"line":5765},[74,7646,7647],{},"print(file.closed)\n",[10,7649,114],{},[65,7651,7654],{"className":7652,"code":7653,"language":120,"meta":70},[118],"上下文管理器\n\nTrue\n",[50,7655,7653],{"__ignoreMap":70},[10,7657,125],{},[14,7659,128],{"id":128},[130,7661,7662,7670],{},[40,7663,7568,7664,7666,7667,158],{},[50,7665,6727],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[50,7668,7669],{},"file",[40,7671,7672],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7674,147],{"id":147},[37,7676,7677,7682],{},[40,7678,4723,7679,7681],{},[50,7680,6727],{}," 代码块外继续读写已经关闭的文件对象。",[40,7683,7684,7685,7687],{},"误以为 ",[50,7686,6727],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7689,164],{"id":164},[130,7691,7692,7701],{},[40,7693,7694,7695,7698,7699,158],{},"把第 30 篇的手动 ",[50,7696,7697],{},"open\u002Fclose"," 改写为 ",[50,7700,6727],{},[40,7702,4723,7703,7705,7706,158],{},[50,7704,6727],{}," 块后检查 ",[50,7707,7708],{},"file.closed",[10,7710,178],{},[14,7712,181],{"id":181},[10,7714,7715],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7717,188],{},{"title":70,"searchDepth":83,"depth":83,"links":7719},[7720,7721,7722,7723,7724,7725,7726,7727],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7547,"description":7552},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[199,6727,7735],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7738,"title":7739,"body":7740,"category":199,"cover":200,"description":7744,"extension":201,"meta":7956,"navigation":92,"path":7957,"pinned":204,"publishedAt":205,"seo":7958,"slug":7959,"stem":7960,"summary":7961,"tags":7962,"updatedAt":205,"visible":92,"__hash__":7965},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7741,"toc":7944},[7742,7745,7747,7750,7752,7758,7761,7763,7780,7782,7784,7852,7854,7860,7862,7864,7889,7891,7894,7900,7909,7911,7922,7924,7935,7937,7939,7942],[10,7743,7744],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7746,16],{"id":16},[10,7748,7749],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7751,22],{"id":22},[10,7753,7754],{},[26,7755],{"alt":7756,"src":7757},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7759,7760],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7762,35],{"id":35},[37,7764,7765,7771,7777],{},[40,7766,7767,7770],{},[50,7768,7769],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7772,7773,7776],{},[50,7774,7775],{},"__init__"," 在实例创建过程中初始化属性。",[40,7778,7779],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7781,60],{"id":60},[10,7783,63],{},[65,7785,7787],{"className":67,"code":7786,"language":69,"meta":70,"style":70},"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",[50,7788,7789,7794,7799,7804,7809,7813,7818,7823,7828,7833,7837,7842,7847],{"__ignoreMap":70},[74,7790,7791],{"class":76,"line":77},[74,7792,7793],{},"class LearningRecord:\n",[74,7795,7796],{"class":76,"line":83},[74,7797,7798],{},"    def __init__(self, course, progress=0):\n",[74,7800,7801],{"class":76,"line":89},[74,7802,7803],{},"        self.course = course\n",[74,7805,7806],{"class":76,"line":96},[74,7807,7808],{},"        self.progress = progress\n",[74,7810,7811],{"class":76,"line":102},[74,7812,93],{"emptyLinePlaceholder":92},[74,7814,7815],{"class":76,"line":108},[74,7816,7817],{},"    def advance(self, amount):\n",[74,7819,7820],{"class":76,"line":2461},[74,7821,7822],{},"        self.progress = self.progress + amount\n",[74,7824,7825],{"class":76,"line":2467},[74,7826,7827],{},"        if self.progress > 100:\n",[74,7829,7830],{"class":76,"line":3888},[74,7831,7832],{},"            self.progress = 100\n",[74,7834,7835],{"class":76,"line":4100},[74,7836,93],{"emptyLinePlaceholder":92},[74,7838,7839],{"class":76,"line":5765},[74,7840,7841],{},"record = LearningRecord(\"Python\", 40)\n",[74,7843,7844],{"class":76,"line":5770},[74,7845,7846],{},"record.advance(15)\n",[74,7848,7849],{"class":76,"line":7375},[74,7850,7851],{},"print(record.course, record.progress)\n",[10,7853,114],{},[65,7855,7858],{"className":7856,"code":7857,"language":120,"meta":70},[118],"Python 55\n",[50,7859,7857],{"__ignoreMap":70},[10,7861,125],{},[14,7863,128],{"id":128},[130,7865,7866,7876],{},[40,7867,7868,7869,7872,7873,7875],{},"调用 ",[50,7870,7871],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[50,7874,7775],{}," 把课程和进度保存在该实例属性中。",[40,7877,7878,7881,7882,7885,7886,7888],{},[50,7879,7880],{},"record.advance(15)"," 自动把 ",[50,7883,7884],{},"record"," 作为 ",[50,7887,7769],{},"，方法更新同一实例的进度并限制上限。",[302,7890,2671],{"id":2671},[10,7892,7893],{},"类是共同定义，实例则各自保存状态。",[10,7895,7896],{},[26,7897],{"alt":7898,"src":7899},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7901,7902,7903,1130,7905,7908],{},"两个实例共享同一套方法定义，但 ",[50,7904,4520],{},[50,7906,7907],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7910,147],{"id":147},[37,7912,7913,7919],{},[40,7914,7915,7916,7918],{},"调用实例方法时手工再传一次 ",[50,7917,7769],{},"。通过实例调用时 Python 会自动绑定。",[40,7920,7921],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7923,164],{"id":164},[130,7925,7926,7932],{},[40,7927,5233,7928,7931],{},[50,7929,7930],{},"Book"," 类，保存标题和阅读页数。",[40,7933,7934],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7936,178],{},[14,7938,181],{"id":181},[10,7940,7941],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7943,188],{},{"title":70,"searchDepth":83,"depth":83,"links":7945},[7946,7947,7948,7949,7950,7953,7954,7955],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":7951},[7952],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7739,"description":7744},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[199,7963,7964],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7967,"title":7968,"body":7969,"category":199,"cover":200,"description":7973,"extension":201,"meta":8151,"navigation":92,"path":8152,"pinned":204,"publishedAt":205,"seo":8153,"slug":8154,"stem":8155,"summary":8156,"tags":8157,"updatedAt":205,"visible":92,"__hash__":8160},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7970,"toc":8141},[7971,7974,7976,7979,7981,7987,7990,7992,8003,8005,8007,8074,8076,8082,8084,8086,8105,8107,8115,8117,8132,8134,8136,8139],[10,7972,7973],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7975,16],{"id":16},[10,7977,7978],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7980,22],{"id":22},[10,7982,7983],{},[26,7984],{"alt":7985,"src":7986},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7988,7989],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7991,35],{"id":35},[37,7993,7994,7997,8000],{},[40,7995,7996],{},"封装让对象通过方法维护自己的有效状态。",[40,7998,7999],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8001,8002],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8004,60],{"id":60},[10,8006,63],{},[65,8008,8010],{"className":67,"code":8009,"language":69,"meta":70,"style":70},"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",[50,8011,8012,8017,8022,8027,8031,8036,8041,8046,8050,8055,8060,8064,8069],{"__ignoreMap":70},[74,8013,8014],{"class":76,"line":77},[74,8015,8016],{},"class Storage:\n",[74,8018,8019],{"class":76,"line":83},[74,8020,8021],{},"    def save(self, text):\n",[74,8023,8024],{"class":76,"line":89},[74,8025,8026],{},"        print(\"保存：\", text)\n",[74,8028,8029],{"class":76,"line":96},[74,8030,93],{"emptyLinePlaceholder":92},[74,8032,8033],{"class":76,"line":102},[74,8034,8035],{},"class LearningService:\n",[74,8037,8038],{"class":76,"line":108},[74,8039,8040],{},"    def __init__(self, storage):\n",[74,8042,8043],{"class":76,"line":2461},[74,8044,8045],{},"        self.storage = storage\n",[74,8047,8048],{"class":76,"line":2467},[74,8049,93],{"emptyLinePlaceholder":92},[74,8051,8052],{"class":76,"line":3888},[74,8053,8054],{},"    def finish_lesson(self, title):\n",[74,8056,8057],{"class":76,"line":4100},[74,8058,8059],{},"        self.storage.save(title)\n",[74,8061,8062],{"class":76,"line":5765},[74,8063,93],{"emptyLinePlaceholder":92},[74,8065,8066],{"class":76,"line":5770},[74,8067,8068],{},"service = LearningService(Storage())\n",[74,8070,8071],{"class":76,"line":7375},[74,8072,8073],{},"service.finish_lesson(\"异常处理\")\n",[10,8075,114],{},[65,8077,8080],{"className":8078,"code":8079,"language":120,"meta":70},[118],"保存： 异常处理\n",[50,8081,8079],{"__ignoreMap":70},[10,8083,125],{},[14,8085,128],{"id":128},[130,8087,8088,8098],{},[40,8089,8090,8093,8094,8097],{},[50,8091,8092],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[50,8095,8096],{},"save()"," 的协作对象。",[40,8099,8100,8101,8104],{},"调用业务方法时，服务把保存动作委托给 ",[50,8102,8103],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8106,147],{"id":147},[37,8108,8109,8112],{},[40,8110,8111],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8113,8114],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8116,164],{"id":164},[130,8118,8119,8129],{},[40,8120,8121,8122,8125,8126,158],{},"用组合让 ",[50,8123,8124],{},"OrderService"," 使用一个 ",[50,8127,8128],{},"Notifier",[40,8130,8131],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8133,178],{},[14,8135,181],{"id":181},[10,8137,8138],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8140,188],{},{"title":70,"searchDepth":83,"depth":83,"links":8142},[8143,8144,8145,8146,8147,8148,8149,8150],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7968,"description":7973},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[199,8158,8159],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8162,"title":8163,"body":8164,"category":199,"cover":200,"description":8168,"extension":201,"meta":8371,"navigation":92,"path":8372,"pinned":204,"publishedAt":205,"seo":8373,"slug":8374,"stem":8375,"summary":8376,"tags":8377,"updatedAt":205,"visible":92,"__hash__":8380},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8165,"toc":8359},[8166,8169,8171,8174,8176,8182,8189,8191,8216,8218,8220,8272,8274,8280,8282,8284,8305,8307,8313,8319,8325,8327,8335,8337,8350,8352,8354,8357],[10,8167,8168],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8170,16],{"id":16},[10,8172,8173],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8175,22],{"id":22},[10,8177,8178],{},[26,8179],{"alt":8180,"src":8181},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8183,8184,8185,8188],{},"生成器运行到 ",[50,8186,8187],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8190,35],{"id":35},[37,8192,8193,8203,8213],{},[40,8194,8195,8198,8199,8202],{},[50,8196,8197],{},"iter()"," 从可迭代对象取得迭代器，",[50,8200,8201],{},"next()"," 请求下一个值。",[40,8204,8205,8206,8209,8210,8212],{},"没有更多值时迭代器抛出 ",[50,8207,8208],{},"StopIteration","，",[50,8211,4274],{}," 会自动处理。",[40,8214,8215],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8217,60],{"id":60},[10,8219,63],{},[65,8221,8223],{"className":67,"code":8222,"language":69,"meta":70,"style":70},"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",[50,8224,8225,8230,8235,8240,8245,8250,8254,8259,8264,8268],{"__ignoreMap":70},[74,8226,8227],{"class":76,"line":77},[74,8228,8229],{},"def countdown(start):\n",[74,8231,8232],{"class":76,"line":83},[74,8233,8234],{},"    current = start\n",[74,8236,8237],{"class":76,"line":89},[74,8238,8239],{},"    while current > 0:\n",[74,8241,8242],{"class":76,"line":96},[74,8243,8244],{},"        yield current\n",[74,8246,8247],{"class":76,"line":102},[74,8248,8249],{},"        current = current - 1\n",[74,8251,8252],{"class":76,"line":108},[74,8253,93],{"emptyLinePlaceholder":92},[74,8255,8256],{"class":76,"line":2461},[74,8257,8258],{},"iterator = countdown(3)\n",[74,8260,8261],{"class":76,"line":2467},[74,8262,8263],{},"print(next(iterator))\n",[74,8265,8266],{"class":76,"line":3888},[74,8267,8263],{},[74,8269,8270],{"class":76,"line":4100},[74,8271,8263],{},[10,8273,114],{},[65,8275,8278],{"className":8276,"code":8277,"language":120,"meta":70},[118],"3\n2\n1\n",[50,8279,8277],{"__ignoreMap":70},[10,8281,125],{},[14,8283,128],{"id":128},[130,8285,8286,8292],{},[40,8287,7868,8288,8291],{},[50,8289,8290],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8293,8294,8295,8297,8298,8300,8301,8304],{},"每次 ",[50,8296,8201],{}," 运行到下一个 ",[50,8299,8187],{}," 并暂停，局部变量 ",[50,8302,8303],{},"current"," 和执行位置被保留。",[302,8306,2671],{"id":2671},[10,8308,8309,8310,8312],{},"生成器的暂停位置可以展开成多次 ",[50,8311,8201],{}," 的时间线。",[10,8314,8315],{},[26,8316],{"alt":8317,"src":8318},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8320,8321,8322,8324],{},"每次请求只推进到下一个 ",[50,8323,8187],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8326,147],{"id":147},[37,8328,8329,8332],{},[40,8330,8331],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8333,8334],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8336,164],{"id":164},[130,8338,8339,8342],{},[40,8340,8341],{},"编写产生 1 到指定上限偶数的生成器。",[40,8343,3946,8344,8346,8347,8349],{},[50,8345,4274],{}," 遍历生成器，比较手动 ",[50,8348,8201],{}," 的差异。",[10,8351,178],{},[14,8353,181],{"id":181},[10,8355,8356],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8358,188],{},{"title":70,"searchDepth":83,"depth":83,"links":8360},[8361,8362,8363,8364,8365,8368,8369,8370],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":8366},[8367],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8163,"description":8168},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[199,8378,8379],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8382,"title":8383,"body":8384,"category":199,"cover":200,"description":8388,"extension":201,"meta":8612,"navigation":92,"path":8613,"pinned":204,"publishedAt":205,"seo":8614,"slug":8615,"stem":8616,"summary":8617,"tags":8618,"updatedAt":205,"visible":92,"__hash__":8620},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8385,"toc":8600},[8386,8389,8391,8394,8396,8402,8405,8407,8427,8429,8431,8513,8515,8521,8523,8525,8547,8549,8552,8558,8565,8567,8577,8579,8591,8593,8595,8598],[10,8387,8388],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8390,16],{"id":16},[10,8392,8393],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8395,22],{"id":22},[10,8397,8398],{},[26,8399],{"alt":8400,"src":8401},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8403,8404],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8406,35],{"id":35},[37,8408,8409,8418,8421],{},[40,8410,8411,8414,8415,158],{},[50,8412,8413],{},"@trace"," 等价于 ",[50,8416,8417],{},"add = trace(add)",[40,8419,8420],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8422,8423,8426],{},[50,8424,8425],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8428,60],{"id":60},[10,8430,63],{},[65,8432,8434],{"className":67,"code":8433,"language":69,"meta":70,"style":70},"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",[50,8435,8436,8441,8445,8450,8455,8460,8465,8470,8475,8480,8485,8489,8494,8498,8502,8507],{"__ignoreMap":70},[74,8437,8438],{"class":76,"line":77},[74,8439,8440],{},"from functools import wraps\n",[74,8442,8443],{"class":76,"line":83},[74,8444,93],{"emptyLinePlaceholder":92},[74,8446,8447],{"class":76,"line":89},[74,8448,8449],{},"def trace(function):\n",[74,8451,8452],{"class":76,"line":96},[74,8453,8454],{},"    @wraps(function)\n",[74,8456,8457],{"class":76,"line":102},[74,8458,8459],{},"    def wrapper(*args, **kwargs):\n",[74,8461,8462],{"class":76,"line":108},[74,8463,8464],{},"        print(\"开始：\", function.__name__)\n",[74,8466,8467],{"class":76,"line":2461},[74,8468,8469],{},"        result = function(*args, **kwargs)\n",[74,8471,8472],{"class":76,"line":2467},[74,8473,8474],{},"        print(\"结束：\", function.__name__)\n",[74,8476,8477],{"class":76,"line":3888},[74,8478,8479],{},"        return result\n",[74,8481,8482],{"class":76,"line":4100},[74,8483,8484],{},"    return wrapper\n",[74,8486,8487],{"class":76,"line":5765},[74,8488,93],{"emptyLinePlaceholder":92},[74,8490,8491],{"class":76,"line":5770},[74,8492,8493],{},"@trace\n",[74,8495,8496],{"class":76,"line":7375},[74,8497,6118],{},[74,8499,8500],{"class":76,"line":7381},[74,8501,6123],{},[74,8503,8505],{"class":76,"line":8504},15,[74,8506,93],{"emptyLinePlaceholder":92},[74,8508,8510],{"class":76,"line":8509},16,[74,8511,8512],{},"print(add(2, 3))\n",[10,8514,114],{},[65,8516,8519],{"className":8517,"code":8518,"language":120,"meta":70},[118],"开始： add\n结束： add\n5\n",[50,8520,8518],{"__ignoreMap":70},[10,8522,125],{},[14,8524,128],{"id":128},[130,8526,8527,8544],{},[40,8528,8529,8530,8533,8534,8537,8538,8541,8542,158],{},"解释器执行定义时，把原 ",[50,8531,8532],{},"add"," 函数交给 ",[50,8535,8536],{},"trace","，返回的 ",[50,8539,8540],{},"wrapper"," 重新绑定到名字 ",[50,8543,8532],{},[40,8545,8546],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[302,8548,2671],{"id":2671},[10,8550,8551],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8553,8554],{},[26,8555],{"alt":8556,"src":8557},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8559,8560,8562,8563,158],{},[50,8561,8413],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[50,8564,8417],{},[14,8566,147],{"id":147},[37,8568,8569,8574],{},[40,8570,8571,8572,158],{},"包装函数忘记返回原函数结果，调用方得到 ",[50,8573,5316],{},[40,8575,8576],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8578,164],{"id":164},[130,8580,8581,8584],{},[40,8582,8583],{},"编写只记录调用次数的简单装饰器。",[40,8585,8586,8587,8590],{},"删除包装函数的 ",[50,8588,8589],{},"return result","，观察调用方得到什么。",[10,8592,178],{},[14,8594,181],{"id":181},[10,8596,8597],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8599,188],{},{"title":70,"searchDepth":83,"depth":83,"links":8601},[8602,8603,8604,8605,8606,8609,8610,8611],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":8607},[8608],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8383,"description":8388},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[199,8619,5267],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8622,"title":8623,"body":8624,"category":199,"cover":200,"description":8628,"extension":201,"meta":8815,"navigation":92,"path":8816,"pinned":204,"publishedAt":205,"seo":8817,"slug":8818,"stem":8819,"summary":8820,"tags":8821,"updatedAt":205,"visible":92,"__hash__":8824},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8625,"toc":8803},[8626,8629,8631,8634,8636,8642,8645,8647,8658,8660,8662,8737,8739,8745,8747,8749,8760,8762,8765,8771,8774,8776,8784,8786,8794,8796,8798,8801],[10,8627,8628],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8630,16],{"id":16},[10,8632,8633],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8635,22],{"id":22},[10,8637,8638],{},[26,8639],{"alt":8640,"src":8641},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8643,8644],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8646,35],{"id":35},[37,8648,8649,8652,8655],{},[40,8650,8651],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8653,8654],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8656,8657],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8659,60],{"id":60},[10,8661,63],{},[65,8663,8665],{"className":67,"code":8664,"language":69,"meta":70,"style":70},"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",[50,8666,8667,8672,8677,8681,8686,8690,8695,8700,8705,8709,8714,8719,8724,8728,8732],{"__ignoreMap":70},[74,8668,8669],{"class":76,"line":77},[74,8670,8671],{},"import logging\n",[74,8673,8674],{"class":76,"line":83},[74,8675,8676],{},"import unittest\n",[74,8678,8679],{"class":76,"line":89},[74,8680,93],{"emptyLinePlaceholder":92},[74,8682,8683],{"class":76,"line":96},[74,8684,8685],{},"logging.basicConfig(level=logging.INFO)\n",[74,8687,8688],{"class":76,"line":102},[74,8689,93],{"emptyLinePlaceholder":92},[74,8691,8692],{"class":76,"line":108},[74,8693,8694],{},"def clamp_progress(value):\n",[74,8696,8697],{"class":76,"line":2461},[74,8698,8699],{},"    logging.info(\"检查进度：%s\", value)\n",[74,8701,8702],{"class":76,"line":2467},[74,8703,8704],{},"    return max(0, min(100, value))\n",[74,8706,8707],{"class":76,"line":3888},[74,8708,93],{"emptyLinePlaceholder":92},[74,8710,8711],{"class":76,"line":4100},[74,8712,8713],{},"class ProgressTest(unittest.TestCase):\n",[74,8715,8716],{"class":76,"line":5765},[74,8717,8718],{},"    def test_upper_limit(self):\n",[74,8720,8721],{"class":76,"line":5770},[74,8722,8723],{},"        self.assertEqual(clamp_progress(120), 100)\n",[74,8725,8726],{"class":76,"line":7375},[74,8727,93],{"emptyLinePlaceholder":92},[74,8729,8730],{"class":76,"line":7381},[74,8731,6132],{},[74,8733,8734],{"class":76,"line":8504},[74,8735,8736],{},"    unittest.main()\n",[10,8738,114],{},[65,8740,8743],{"className":8741,"code":8742,"language":120,"meta":70},[118],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[50,8744,8742],{"__ignoreMap":70},[10,8746,125],{},[14,8748,128],{"id":128},[130,8750,8751,8757],{},[40,8752,8753,8756],{},[50,8754,8755],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8758,8759],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[302,8761,2671],{"id":2671},[10,8763,8764],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8766,8767],{},[26,8768],{"alt":8769,"src":8770},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8772,8773],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8775,147],{"id":147},[37,8777,8778,8781],{},[40,8779,8780],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8782,8783],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8785,164],{"id":164},[130,8787,8788,8791],{},[40,8789,8790],{},"为负数进度增加测试。",[40,8792,8793],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8795,178],{},[14,8797,181],{"id":181},[10,8799,8800],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8802,188],{},{"title":70,"searchDepth":83,"depth":83,"links":8804},[8805,8806,8807,8808,8809,8812,8813,8814],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":8810},[8811],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8623,"description":8628},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[199,8822,8823],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8826,"title":8827,"body":8828,"category":199,"cover":200,"description":8832,"extension":201,"meta":9132,"navigation":92,"path":9133,"pinned":204,"publishedAt":205,"seo":9134,"slug":9135,"stem":9136,"summary":9137,"tags":9138,"updatedAt":205,"visible":92,"__hash__":9141},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8829,"toc":9119},[8830,8833,8835,8838,8840,8846,8849,8851,8866,8868,8870,9017,9019,9025,9027,9029,9042,9044,9047,9053,9056,9058,9061,9067,9074,9076,9087,9089,9110,9112,9114,9117],[10,8831,8832],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8834,16],{"id":16},[10,8836,8837],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8839,22],{"id":22},[10,8841,8842],{},[26,8843],{"alt":8844,"src":8845},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8847,8848],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8850,35],{"id":35},[37,8852,8853,8856,8859],{},[40,8854,8855],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8857,8858],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8860,8861,8862,8865],{},"实际扩展前先为 ",[50,8863,8864],{},"add()"," 和存储边界补充测试。",[14,8867,60],{"id":60},[10,8869,63],{},[65,8871,8873],{"className":67,"code":8872,"language":69,"meta":70,"style":70},"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",[50,8874,8875,8879,8883,8887,8892,8897,8902,8907,8911,8916,8921,8926,8931,8936,8940,8945,8950,8956,8961,8967,8972,8977,8983,8989,8995,9000,9006,9011],{"__ignoreMap":70},[74,8876,8877],{"class":76,"line":77},[74,8878,6930],{},[74,8880,8881],{"class":76,"line":83},[74,8882,6539],{},[74,8884,8885],{"class":76,"line":89},[74,8886,93],{"emptyLinePlaceholder":92},[74,8888,8889],{"class":76,"line":96},[74,8890,8891],{},"class LearningRecords:\n",[74,8893,8894],{"class":76,"line":102},[74,8895,8896],{},"    def __init__(self, file_path):\n",[74,8898,8899],{"class":76,"line":108},[74,8900,8901],{},"        self.file_path = Path(file_path)\n",[74,8903,8904],{"class":76,"line":2461},[74,8905,8906],{},"        self.items = []\n",[74,8908,8909],{"class":76,"line":2467},[74,8910,93],{"emptyLinePlaceholder":92},[74,8912,8913],{"class":76,"line":3888},[74,8914,8915],{},"    def add(self, title):\n",[74,8917,8918],{"class":76,"line":4100},[74,8919,8920],{},"        title = title.strip()\n",[74,8922,8923],{"class":76,"line":5765},[74,8924,8925],{},"        if not title:\n",[74,8927,8928],{"class":76,"line":5770},[74,8929,8930],{},"            raise ValueError(\"课程名称不能为空\")\n",[74,8932,8933],{"class":76,"line":7375},[74,8934,8935],{},"        self.items.append({\"title\": title, \"done\": False})\n",[74,8937,8938],{"class":76,"line":7381},[74,8939,93],{"emptyLinePlaceholder":92},[74,8941,8942],{"class":76,"line":8504},[74,8943,8944],{},"    def save(self):\n",[74,8946,8947],{"class":76,"line":8509},[74,8948,8949],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[74,8951,8953],{"class":76,"line":8952},17,[74,8954,8955],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[74,8957,8959],{"class":76,"line":8958},18,[74,8960,93],{"emptyLinePlaceholder":92},[74,8962,8964],{"class":76,"line":8963},19,[74,8965,8966],{},"records = LearningRecords(\"learning-records.json\")\n",[74,8968,8970],{"class":76,"line":8969},20,[74,8971,93],{"emptyLinePlaceholder":92},[74,8973,8975],{"class":76,"line":8974},21,[74,8976,7348],{},[74,8978,8980],{"class":76,"line":8979},22,[74,8981,8982],{},"    title = input(\"输入已学习课程：\")\n",[74,8984,8986],{"class":76,"line":8985},23,[74,8987,8988],{},"    records.add(title)\n",[74,8990,8992],{"class":76,"line":8991},24,[74,8993,8994],{},"    records.save()\n",[74,8996,8998],{"class":76,"line":8997},25,[74,8999,7358],{},[74,9001,9003],{"class":76,"line":9002},26,[74,9004,9005],{},"    print(\"无法保存：\", error)\n",[74,9007,9009],{"class":76,"line":9008},27,[74,9010,1119],{},[74,9012,9014],{"class":76,"line":9013},28,[74,9015,9016],{},"    print(\"已保存 1 条学习记录\")\n",[10,9018,114],{},[65,9020,9023],{"className":9021,"code":9022,"language":120,"meta":70},[118],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[50,9024,9022],{"__ignoreMap":70},[10,9026,125],{},[14,9028,128],{"id":128},[130,9030,9031,9037],{},[40,9032,9033,9034,9036],{},"输入层取得课程名后，",[50,9035,8864],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9038,9039,9041],{},[50,9040,8096],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[302,9043,2671],{"id":2671},[10,9045,9046],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9048,9049],{},[26,9050],{"alt":9051,"src":9052},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9054,9055],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[302,9057,2671],{"id":4155},[10,9059,9060],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9062,9063],{},[26,9064],{"alt":9065,"src":9066},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9068,9069,9070,9073],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[50,9071,9072],{},"load()"," 把文件状态恢复到内存。",[14,9075,147],{"id":147},[37,9077,9078,9081],{},[40,9079,9080],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9082,9083,9084,9086],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[50,9085,9072],{}," 是下一项必要扩展。",[14,9088,164],{"id":164},[130,9090,9091,9097,9100],{},[40,9092,9093,9094,9096],{},"增加 ",[50,9095,9072],{},"，文件不存在时从空列表开始。",[40,9098,9099],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9101,9102,9103,9106,9107,9109],{},"把输入循环放进 ",[50,9104,9105],{},"main()","，通过 ",[50,9108,6074],{}," 控制程序入口。",[10,9111,178],{},[14,9113,181],{"id":181},[10,9115,9116],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,9118,188],{},{"title":70,"searchDepth":83,"depth":83,"links":9120},[9121,9122,9123,9124,9125,9129,9130,9131],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":9126},[9127,9128],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8827,"description":8832},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[199,9139,9140],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9143,9246,9365,9496,9639,9764,9901,10038,10179,10348,10485,10618,10741,10870,10997,11160,11336,11477,11606,11755,11898,12019,12142,12291,12444,12609,12736,12917,13060,13217,13368,13515,13670,13888,14043,14218,14369,14536,14723,14886,15128,15368],{"id":1366,"title":1367,"body":9144,"category":199,"cover":200,"description":1372,"extension":201,"meta":9243,"navigation":92,"path":1491,"pinned":204,"publishedAt":205,"seo":9244,"slug":1493,"stem":1494,"summary":1495,"tags":9245,"updatedAt":205,"visible":92,"__hash__":1498},{"type":7,"value":9145,"toc":9233},[9146,9148,9150,9152,9154,9158,9162,9164,9174,9176,9178,9186,9188,9193,9195,9197,9207,9209,9217,9219,9225,9227,9229,9231],[10,9147,1372],{},[14,9149,16],{"id":16},[10,9151,1377],{},[14,9153,22],{"id":22},[10,9155,9156],{},[26,9157],{"alt":1384,"src":1385},[10,9159,9160,1390],{},[50,9161,1144],{},[14,9163,35],{"id":35},[37,9165,9166,9170,9172],{},[40,9167,1397,9168,1400],{},[50,9169,1144],{},[40,9171,1403],{},[40,9173,1406],{},[14,9175,60],{"id":60},[10,9177,63],{},[65,9179,9180],{"className":67,"code":1413,"language":69,"meta":70,"style":70},[50,9181,9182],{"__ignoreMap":70},[74,9183,9184],{"class":76,"line":77},[74,9185,1413],{},[10,9187,114],{},[65,9189,9191],{"className":9190,"code":1425,"language":120,"meta":70},[118],[50,9192,1425],{"__ignoreMap":70},[10,9194,125],{},[14,9196,128],{"id":128},[130,9198,9199,9203],{},[40,9200,1436,9201,1440],{},[50,9202,1439],{},[40,9204,1443,9205,1447],{},[50,9206,1446],{},[14,9208,147],{"id":147},[37,9210,9211,9213],{},[40,9212,1454],{},[40,9214,1457,9215,1460],{},[50,9216,1144],{},[14,9218,164],{"id":164},[130,9220,9221,9223],{},[40,9222,1467],{},[40,9224,1470],{},[10,9226,178],{},[14,9228,181],{"id":181},[10,9230,1477],{},[186,9232,188],{},{"title":70,"searchDepth":83,"depth":83,"links":9234},[9235,9236,9237,9238,9239,9240,9241,9242],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":1367,"description":1372},[199,1362,1497],{"id":1500,"title":1501,"body":9247,"category":199,"cover":200,"description":1506,"extension":201,"meta":9362,"navigation":92,"path":1643,"pinned":204,"publishedAt":205,"seo":9363,"slug":1645,"stem":1646,"summary":1647,"tags":9364,"updatedAt":205,"visible":92,"__hash__":1650},{"type":7,"value":9248,"toc":9352},[9249,9251,9253,9255,9257,9261,9265,9267,9277,9279,9281,9301,9303,9308,9310,9312,9322,9324,9334,9336,9344,9346,9348,9350],[10,9250,1506],{},[14,9252,16],{"id":16},[10,9254,1511],{},[14,9256,22],{"id":22},[10,9258,9259],{},[26,9260],{"alt":1518,"src":1519},[10,9262,1522,9263,1525],{},[50,9264,664],{},[14,9266,35],{"id":35},[37,9268,9269,9271,9273],{},[40,9270,1532],{},[40,9272,1535],{},[40,9274,1538,9275,1542],{},[50,9276,1541],{},[14,9278,60],{"id":60},[10,9280,1547],{},[65,9282,9283],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,9284,9285,9291],{"__ignoreMap":70},[74,9286,9287,9289],{"class":76,"line":77},[74,9288,664],{"class":573},[74,9290,577],{"class":576},[74,9292,9293,9295,9297,9299],{"class":76,"line":83},[74,9294,664],{"class":573},[74,9296,606],{"class":576},[74,9298,610],{"class":609},[74,9300,577],{"class":576},[10,9302,114],{},[65,9304,9306],{"className":9305,"code":1573,"language":120,"meta":70},[118],[50,9307,1573],{"__ignoreMap":70},[10,9309,125],{},[14,9311,128],{"id":128},[130,9313,9314,9318],{},[40,9315,9316,1587],{},[50,9317,1586],{},[40,9319,9320,1592],{},[50,9321,672],{},[14,9323,147],{"id":147},[37,9325,9326,9330],{},[40,9327,1599,9328,1602],{},[50,9329,664],{},[40,9331,1605,9332,1608],{},[50,9333,664],{},[14,9335,164],{"id":164},[130,9337,9338,9342],{},[40,9339,911,9340,1618],{},[50,9341,1617],{},[40,9343,1621],{},[10,9345,178],{},[14,9347,181],{"id":181},[10,9349,1628],{},[186,9351,1631],{},{"title":70,"searchDepth":83,"depth":83,"links":9353},[9354,9355,9356,9357,9358,9359,9360,9361],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":1501,"description":1506},[199,1649,1025],{"id":1652,"title":1653,"body":9366,"category":199,"cover":200,"description":1819,"extension":201,"meta":9493,"navigation":92,"path":1821,"pinned":204,"publishedAt":205,"seo":9494,"slug":1823,"stem":1824,"summary":1825,"tags":9495,"updatedAt":205,"visible":92,"__hash__":1829},{"type":7,"value":9367,"toc":9483},[9368,9372,9374,9376,9378,9382,9384,9386,9402,9404,9406,9426,9428,9433,9435,9437,9449,9451,9461,9463,9473,9475,9477,9481],[10,9369,1658,9370,1661],{},[50,9371,1144],{},[14,9373,16],{"id":16},[10,9375,1666],{},[14,9377,22],{"id":22},[10,9379,9380],{},[26,9381],{"alt":1673,"src":1674},[10,9383,1677],{},[14,9385,35],{"id":35},[37,9387,9388,9394,9398],{},[40,9389,1684,9390,1687,9392,158],{},[50,9391,664],{},[50,9393,1690],{},[40,9395,1693,9396,1697],{},[50,9397,1696],{},[40,9399,1700,9400,1703],{},[50,9401,1144],{},[14,9403,60],{"id":60},[10,9405,63],{},[65,9407,9408],{"className":1710,"code":1711,"language":1712,"meta":70,"style":70},[50,9409,9410,9414,9418,9422],{"__ignoreMap":70},[74,9411,9412],{"class":76,"line":77},[74,9413,1719],{},[74,9415,9416],{"class":76,"line":83},[74,9417,1724],{},[74,9419,9420],{"class":76,"line":89},[74,9421,1729],{},[74,9423,9424],{"class":76,"line":96},[74,9425,1734],{},[10,9427,114],{},[65,9429,9431],{"className":9430,"code":1740,"language":120,"meta":70},[118],[50,9432,1740],{"__ignoreMap":70},[10,9434,125],{},[14,9436,128],{"id":128},[130,9438,9439,9445],{},[40,9440,1751,9441,1755,9443,158],{},[50,9442,1754],{},[50,9444,1758],{},[40,9446,1761,9447,1764],{},[50,9448,1446],{},[14,9450,147],{"id":147},[37,9452,9453,9459],{},[40,9454,1771,9455,1774,9457,1777],{},[50,9456,1690],{},[50,9458,1144],{},[40,9460,1780],{},[14,9462,164],{"id":164},[130,9464,9465,9469],{},[40,9466,1787,9467,158],{},[50,9468,1790],{},[40,9470,1793,9471,1796],{},[50,9472,1446],{},[10,9474,178],{},[14,9476,181],{"id":181},[10,9478,1803,9479,1806],{},[50,9480,1144],{},[186,9482,188],{},{"title":70,"searchDepth":83,"depth":83,"links":9484},[9485,9486,9487,9488,9489,9490,9491,9492],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":1653,"description":1819},[199,1827,1828],{"id":1831,"title":1832,"body":9497,"category":199,"cover":200,"description":1837,"extension":201,"meta":9636,"navigation":92,"path":2009,"pinned":204,"publishedAt":205,"seo":9637,"slug":2011,"stem":2012,"summary":2013,"tags":9638,"updatedAt":205,"visible":92,"__hash__":2017},{"type":7,"value":9498,"toc":9626},[9499,9501,9503,9505,9507,9511,9515,9517,9529,9531,9533,9569,9571,9576,9578,9580,9596,9598,9608,9610,9618,9620,9622,9624],[10,9500,1837],{},[14,9502,16],{"id":16},[10,9504,1842],{},[14,9506,22],{"id":22},[10,9508,9509],{},[26,9510],{"alt":1849,"src":1850},[10,9512,9513,1856],{},[50,9514,1855],{},[14,9516,35],{"id":35},[37,9518,9519,9521,9527],{},[40,9520,1863],{},[40,9522,9523,1869,9525,1873],{},[50,9524,1868],{},[50,9526,1872],{},[40,9528,1876],{},[14,9530,60],{"id":60},[10,9532,1547],{},[65,9534,9535],{"className":564,"code":1883,"language":566,"meta":70,"style":70},[50,9536,9537,9543,9549,9553,9563],{"__ignoreMap":70},[74,9538,9539,9541],{"class":76,"line":77},[74,9540,1890],{"class":573},[74,9542,1893],{"class":609},[74,9544,9545,9547],{"class":76,"line":83},[74,9546,1898],{"class":576},[74,9548,1893],{"class":609},[74,9550,9551],{"class":76,"line":89},[74,9552,1905],{"class":576},[74,9554,9555,9557,9559,9561],{"class":76,"line":96},[74,9556,1910],{"class":576},[74,9558,1913],{"class":609},[74,9560,1917],{"class":1916},[74,9562,1188],{"class":609},[74,9564,9565,9567],{"class":76,"line":102},[74,9566,664],{"class":573},[74,9568,1188],{"class":609},[10,9570,114],{},[65,9572,9574],{"className":9573,"code":1931,"language":120,"meta":70},[118],[50,9575,1931],{"__ignoreMap":70},[10,9577,125],{},[14,9579,128],{"id":128},[130,9581,9582,9590],{},[40,9583,9584,1944,9586,1947,9588,1950],{},[50,9585,1890],{},[50,9587,1898],{},[50,9589,1868],{},[40,9591,9592,1955,9594,1959],{},[50,9593,1855],{},[50,9595,1958],{},[14,9597,147],{"id":147},[37,9599,9600,9606],{},[40,9601,1966,9602,1130,9604,158],{},[50,9603,1868],{},[50,9605,1872],{},[40,9607,1973],{},[14,9609,164],{"id":164},[130,9611,9612,9616],{},[40,9613,1980,9614,1984],{},[50,9615,1983],{},[40,9617,1987],{},[10,9619,178],{},[14,9621,181],{"id":181},[10,9623,1994],{},[186,9625,1997],{},{"title":70,"searchDepth":83,"depth":83,"links":9627},[9628,9629,9630,9631,9632,9633,9634,9635],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":1832,"description":1837},[199,2015,2016],{"id":2019,"title":2020,"body":9640,"category":199,"cover":200,"description":2025,"extension":201,"meta":9761,"navigation":92,"path":2174,"pinned":204,"publishedAt":205,"seo":9762,"slug":2176,"stem":2177,"summary":2178,"tags":9763,"updatedAt":205,"visible":92,"__hash__":2182},{"type":7,"value":9641,"toc":9751},[9642,9644,9646,9648,9650,9654,9662,9664,9678,9680,9682,9698,9700,9705,9707,9709,9723,9725,9731,9733,9743,9745,9747,9749],[10,9643,2025],{},[14,9645,16],{"id":16},[10,9647,2030],{},[14,9649,22],{"id":22},[10,9651,9652],{},[26,9653],{"alt":2037,"src":2038},[10,9655,2041,9656,158,9658,2047,9660,158],{},[50,9657,1446],{},[50,9659,2046],{},[50,9661,1754],{},[14,9663,35],{"id":35},[37,9665,9666,9670,9676],{},[40,9667,9668,2059],{},[50,9669,2058],{},[40,9671,9672,2065,9674,158],{},[50,9673,2064],{},[50,9675,2068],{},[40,9677,2071],{},[14,9679,60],{"id":60},[10,9681,63],{},[65,9683,9684],{"className":67,"code":2078,"language":69,"meta":70,"style":70},[50,9685,9686,9690,9694],{"__ignoreMap":70},[74,9687,9688],{"class":76,"line":77},[74,9689,2085],{},[74,9691,9692],{"class":76,"line":83},[74,9693,2090],{},[74,9695,9696],{"class":76,"line":89},[74,9697,2095],{},[10,9699,114],{},[65,9701,9703],{"className":9702,"code":2101,"language":120,"meta":70},[118],[50,9704,2101],{"__ignoreMap":70},[10,9706,125],{},[14,9708,128],{"id":128},[130,9710,9711,9717],{},[40,9712,9713,2115,9715,158],{},[50,9714,2114],{},[50,9716,2068],{},[40,9718,9719,2122,9721,2126],{},[50,9720,1446],{},[50,9722,2125],{},[14,9724,147],{"id":147},[37,9726,9727,9729],{},[40,9728,2133],{},[40,9730,2136],{},[14,9732,164],{"id":164},[130,9734,9735,9737],{},[40,9736,2143],{},[40,9738,2146,9739,2149,9741,2153],{},[50,9740,2046],{},[50,9742,2152],{},[10,9744,178],{},[14,9746,181],{"id":181},[10,9748,2160],{},[186,9750,188],{},{"title":70,"searchDepth":83,"depth":83,"links":9752},[9753,9754,9755,9756,9757,9758,9759,9760],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2020,"description":2025},[199,2180,2181],{"id":2184,"title":2185,"body":9765,"category":199,"cover":200,"description":2190,"extension":201,"meta":9898,"navigation":92,"path":2357,"pinned":204,"publishedAt":205,"seo":9899,"slug":2359,"stem":2360,"summary":2361,"tags":9900,"updatedAt":205,"visible":92,"__hash__":2365},{"type":7,"value":9766,"toc":9888},[9767,9769,9771,9773,9775,9779,9781,9783,9799,9801,9803,9827,9829,9834,9836,9838,9854,9856,9868,9870,9880,9882,9884,9886],[10,9768,2190],{},[14,9770,16],{"id":16},[10,9772,2195],{},[14,9774,22],{"id":22},[10,9776,9777],{},[26,9778],{"alt":2202,"src":2203},[10,9780,2206],{},[14,9782,35],{"id":35},[37,9784,9785,9787,9793],{},[40,9786,2213],{},[40,9788,2216,9789,2149,9791,2223],{},[50,9790,2219],{},[50,9792,2222],{},[40,9794,2226,9795,2230,9797,2234],{},[50,9796,2229],{},[50,9798,2233],{},[14,9800,60],{"id":60},[10,9802,63],{},[65,9804,9805],{"className":67,"code":2241,"language":69,"meta":70,"style":70},[50,9806,9807,9811,9815,9819,9823],{"__ignoreMap":70},[74,9808,9809],{"class":76,"line":77},[74,9810,2248],{},[74,9812,9813],{"class":76,"line":83},[74,9814,2253],{},[74,9816,9817],{"class":76,"line":89},[74,9818,93],{"emptyLinePlaceholder":92},[74,9820,9821],{"class":76,"line":96},[74,9822,2262],{},[74,9824,9825],{"class":76,"line":102},[74,9826,2253],{},[10,9828,114],{},[65,9830,9832],{"className":9831,"code":2272,"language":120,"meta":70},[118],[50,9833,2272],{"__ignoreMap":70},[10,9835,125],{},[14,9837,128],{"id":128},[130,9839,9840,9846],{},[40,9841,911,9842,2286,9844,2289],{},[50,9843,2285],{},[50,9845,2219],{},[40,9847,911,9848,2295,9850,2299,9852,158],{},[50,9849,2294],{},[50,9851,2298],{},[50,9853,2302],{},[14,9855,147],{"id":147},[37,9857,9858,9860],{},[40,9859,2309],{},[40,9861,152,9862,2230,9864,2230,9866,2319],{},[50,9863,2229],{},[50,9865,2233],{},[50,9867,2318],{},[14,9869,164],{"id":164},[130,9871,9872,9878],{},[40,9873,2326,9874,1130,9876,2333],{},[50,9875,2329],{},[50,9877,2332],{},[40,9879,2336],{},[10,9881,178],{},[14,9883,181],{"id":181},[10,9885,2343],{},[186,9887,188],{},{"title":70,"searchDepth":83,"depth":83,"links":9889},[9890,9891,9892,9893,9894,9895,9896,9897],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2185,"description":2190},[199,2363,2364],{"id":2367,"title":2368,"body":9902,"category":199,"cover":200,"description":2373,"extension":201,"meta":10035,"navigation":92,"path":2540,"pinned":204,"publishedAt":205,"seo":10036,"slug":2542,"stem":2543,"summary":2544,"tags":10037,"updatedAt":205,"visible":92,"__hash__":2548},{"type":7,"value":9903,"toc":10025},[9904,9906,9908,9910,9912,9916,9918,9920,9938,9940,9942,9978,9980,9985,9987,9989,9999,10001,10009,10011,10017,10019,10021,10023],[10,9905,2373],{},[14,9907,16],{"id":16},[10,9909,2378],{},[14,9911,22],{"id":22},[10,9913,9914],{},[26,9915],{"alt":2385,"src":2386},[10,9917,2389],{},[14,9919,35],{"id":35},[37,9921,9922,9928,9936],{},[40,9923,9924,2399,9926,2403],{},[50,9925,2398],{},[50,9927,2402],{},[40,9929,9930,2409,9932,2413,9934,2417],{},[50,9931,2408],{},[50,9933,2412],{},[50,9935,2416],{},[40,9937,2420],{},[14,9939,60],{"id":60},[10,9941,63],{},[65,9943,9944],{"className":67,"code":2427,"language":69,"meta":70,"style":70},[50,9945,9946,9950,9954,9958,9962,9966,9970,9974],{"__ignoreMap":70},[74,9947,9948],{"class":76,"line":77},[74,9949,2434],{},[74,9951,9952],{"class":76,"line":83},[74,9953,2439],{},[74,9955,9956],{"class":76,"line":89},[74,9957,2444],{},[74,9959,9960],{"class":76,"line":96},[74,9961,93],{"emptyLinePlaceholder":92},[74,9963,9964],{"class":76,"line":102},[74,9965,2453],{},[74,9967,9968],{"class":76,"line":108},[74,9969,2458],{},[74,9971,9972],{"class":76,"line":2461},[74,9973,2464],{},[74,9975,9976],{"class":76,"line":2467},[74,9977,2470],{},[10,9979,114],{},[65,9981,9983],{"className":9982,"code":2476,"language":120,"meta":70},[118],[50,9984,2476],{"__ignoreMap":70},[10,9986,125],{},[14,9988,128],{"id":128},[130,9990,9991,9995],{},[40,9992,9993,2490],{},[50,9994,2489],{},[40,9996,9997,2496],{},[50,9998,2495],{},[14,10000,147],{"id":147},[37,10002,10003,10007],{},[40,10004,2503,10005,158],{},[50,10006,2506],{},[40,10008,2509],{},[14,10010,164],{"id":164},[130,10012,10013,10015],{},[40,10014,2516],{},[40,10016,2519],{},[10,10018,178],{},[14,10020,181],{"id":181},[10,10022,2526],{},[186,10024,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10026},[10027,10028,10029,10030,10031,10032,10033,10034],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2368,"description":2373},[199,2546,2547],{"id":2550,"title":2551,"body":10039,"category":199,"cover":200,"description":2556,"extension":201,"meta":10176,"navigation":92,"path":2733,"pinned":204,"publishedAt":205,"seo":10177,"slug":2735,"stem":2736,"summary":2737,"tags":10178,"updatedAt":205,"visible":92,"__hash__":2741},{"type":7,"value":10040,"toc":10164},[10041,10043,10045,10047,10049,10053,10059,10061,10069,10071,10073,10097,10099,10104,10106,10108,10126,10128,10130,10134,10136,10138,10144,10146,10156,10158,10160,10162],[10,10042,2556],{},[14,10044,16],{"id":16},[10,10046,2561],{},[14,10048,22],{"id":22},[10,10050,10051],{},[26,10052],{"alt":2568,"src":2569},[10,10054,2572,10055,2576,10057,158],{},[50,10056,2575],{},[50,10058,2579],{},[14,10060,35],{"id":35},[37,10062,10063,10065,10067],{},[40,10064,2586],{},[40,10066,2589],{},[40,10068,2592],{},[14,10070,60],{"id":60},[10,10072,63],{},[65,10074,10075],{"className":67,"code":2599,"language":69,"meta":70,"style":70},[50,10076,10077,10081,10085,10089,10093],{"__ignoreMap":70},[74,10078,10079],{"class":76,"line":77},[74,10080,2606],{},[74,10082,10083],{"class":76,"line":83},[74,10084,2611],{},[74,10086,10087],{"class":76,"line":89},[74,10088,2616],{},[74,10090,10091],{"class":76,"line":96},[74,10092,2621],{},[74,10094,10095],{"class":76,"line":102},[74,10096,2626],{},[10,10098,114],{},[65,10100,10102],{"className":10101,"code":2632,"language":120,"meta":70},[118],[50,10103,2632],{"__ignoreMap":70},[10,10105,125],{},[14,10107,128],{"id":128},[130,10109,10110,10118],{},[40,10111,2643,10112,2646,10114,2650,10116,2654],{},[50,10113,199],{},[50,10115,2649],{},[50,10117,2653],{},[40,10119,10120,2660,10122,2664,10124,2668],{},[50,10121,2659],{},[50,10123,2663],{},[50,10125,2667],{},[302,10127,2671],{"id":2671},[10,10129,2674],{},[10,10131,10132],{},[26,10133],{"alt":2679,"src":2680},[10,10135,2683],{},[14,10137,147],{"id":147},[37,10139,10140,10142],{},[40,10141,2690],{},[40,10143,2693],{},[14,10145,164],{"id":164},[130,10147,10148,10154],{},[40,10149,2700,10150,2704,10152,158],{},[50,10151,2703],{},[50,10153,2707],{},[40,10155,2710],{},[10,10157,178],{},[14,10159,181],{"id":181},[10,10161,2717],{},[186,10163,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10165},[10166,10167,10168,10169,10170,10173,10174,10175],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":10171},[10172],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2551,"description":2556},[199,2739,2740],{"id":2743,"title":2744,"body":10180,"category":199,"cover":200,"description":2749,"extension":201,"meta":10345,"navigation":92,"path":2964,"pinned":204,"publishedAt":205,"seo":10346,"slug":2966,"stem":2967,"summary":2968,"tags":10347,"updatedAt":205,"visible":92,"__hash__":2972},{"type":7,"value":10181,"toc":10333},[10182,10184,10186,10188,10190,10194,10200,10202,10222,10224,10226,10262,10264,10269,10271,10273,10287,10289,10291,10295,10301,10303,10313,10315,10325,10327,10329,10331],[10,10183,2749],{},[14,10185,16],{"id":16},[10,10187,2754],{},[14,10189,22],{"id":22},[10,10191,10192],{},[26,10193],{"alt":2761,"src":2762},[10,10195,2765,10196,982,10198,2772],{},[50,10197,2768],{},[50,10199,2771],{},[14,10201,35],{"id":35},[37,10203,10204,10212,10220],{},[40,10205,10206,2782,10208,2786,10210,2790],{},[50,10207,2781],{},[50,10209,2785],{},[50,10211,2789],{},[40,10213,10214,2796,10216,2800,10218,2804],{},[50,10215,2795],{},[50,10217,2799],{},[50,10219,2803],{},[40,10221,2807],{},[14,10223,60],{"id":60},[10,10225,63],{},[65,10227,10228],{"className":67,"code":2814,"language":69,"meta":70,"style":70},[50,10229,10230,10234,10238,10242,10246,10250,10254,10258],{"__ignoreMap":70},[74,10231,10232],{"class":76,"line":77},[74,10233,2821],{},[74,10235,10236],{"class":76,"line":83},[74,10237,2826],{},[74,10239,10240],{"class":76,"line":89},[74,10241,93],{"emptyLinePlaceholder":92},[74,10243,10244],{"class":76,"line":96},[74,10245,2835],{},[74,10247,10248],{"class":76,"line":102},[74,10249,2840],{},[74,10251,10252],{"class":76,"line":108},[74,10253,2845],{},[74,10255,10256],{"class":76,"line":2461},[74,10257,2850],{},[74,10259,10260],{"class":76,"line":2467},[74,10261,2855],{},[10,10263,114],{},[65,10265,10267],{"className":10266,"code":2861,"language":120,"meta":70},[118],[50,10268,2861],{"__ignoreMap":70},[10,10270,125],{},[14,10272,128],{"id":128},[130,10274,10275,10281],{},[40,10276,10277,2875,10279,2879],{},[50,10278,2874],{},[50,10280,2878],{},[40,10282,10283,2885,10285,2888],{},[50,10284,2884],{},[50,10286,2803],{},[302,10288,2671],{"id":2671},[10,10290,2893],{},[10,10292,10293],{},[26,10294],{"alt":2898,"src":2899},[10,10296,10297,2904,10299,2907],{},[50,10298,2795],{},[50,10300,2799],{},[14,10302,147],{"id":147},[37,10304,10305,10311],{},[40,10306,2914,10307,2917,10309,2920],{},[50,10308,2789],{},[50,10310,2781],{},[40,10312,2923],{},[14,10314,164],{"id":164},[130,10316,10317,10321],{},[40,10318,2930,10319,2934],{},[50,10320,2933],{},[40,10322,2937,10323,2941],{},[50,10324,2940],{},[10,10326,178],{},[14,10328,181],{"id":181},[10,10330,2948],{},[186,10332,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10334},[10335,10336,10337,10338,10339,10342,10343,10344],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":10340},[10341],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2744,"description":2749},[199,2970,2971],{"id":2974,"title":2975,"body":10349,"category":199,"cover":200,"description":2980,"extension":201,"meta":10482,"navigation":92,"path":3149,"pinned":204,"publishedAt":205,"seo":10483,"slug":3151,"stem":3152,"summary":3153,"tags":10484,"updatedAt":205,"visible":92,"__hash__":3156},{"type":7,"value":10350,"toc":10472},[10351,10353,10355,10357,10359,10363,10373,10375,10385,10387,10389,10417,10419,10424,10426,10428,10442,10444,10452,10454,10464,10466,10468,10470],[10,10352,2980],{},[14,10354,16],{"id":16},[10,10356,2985],{},[14,10358,22],{"id":22},[10,10360,10361],{},[26,10362],{"alt":2992,"src":2993},[10,10364,10365,2999,10367,3003,10369,3007,10371,3011],{},[50,10366,2998],{},[50,10368,3002],{},[50,10370,3006],{},[50,10372,3010],{},[14,10374,35],{"id":35},[37,10376,10377,10379,10383],{},[40,10378,3018],{},[40,10380,10381,3023],{},[50,10382,3010],{},[40,10384,3026],{},[14,10386,60],{"id":60},[10,10388,63],{},[65,10390,10391],{"className":67,"code":3033,"language":69,"meta":70,"style":70},[50,10392,10393,10397,10401,10405,10409,10413],{"__ignoreMap":70},[74,10394,10395],{"class":76,"line":77},[74,10396,3040],{},[74,10398,10399],{"class":76,"line":83},[74,10400,3045],{},[74,10402,10403],{"class":76,"line":89},[74,10404,3050],{},[74,10406,10407],{"class":76,"line":96},[74,10408,93],{"emptyLinePlaceholder":92},[74,10410,10411],{"class":76,"line":102},[74,10412,3059],{},[74,10414,10415],{"class":76,"line":108},[74,10416,3064],{},[10,10418,114],{},[65,10420,10422],{"className":10421,"code":3070,"language":120,"meta":70},[118],[50,10423,3070],{"__ignoreMap":70},[10,10425,125],{},[14,10427,128],{"id":128},[130,10429,10430,10436],{},[40,10431,3081,10432,3084,10434,3088],{},[50,10433,2998],{},[50,10435,3087],{},[40,10437,10438,3094,10440,3098],{},[50,10439,3093],{},[50,10441,3097],{},[14,10443,147],{"id":147},[37,10445,10446,10450],{},[40,10447,3105,10448,3109],{},[50,10449,3108],{},[40,10451,3112],{},[14,10453,164],{"id":164},[130,10455,10456,10458],{},[40,10457,3119],{},[40,10459,1693,10460,3125,10462,3128],{},[50,10461,3124],{},[50,10463,3010],{},[10,10465,178],{},[14,10467,181],{"id":181},[10,10469,3135],{},[186,10471,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10473},[10474,10475,10476,10477,10478,10479,10480,10481],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":2975,"description":2980},[199,2318,3155],{"id":3158,"title":3159,"body":10486,"category":199,"cover":200,"description":3164,"extension":201,"meta":10615,"navigation":92,"path":3325,"pinned":204,"publishedAt":205,"seo":10616,"slug":3327,"stem":3328,"summary":3329,"tags":10617,"updatedAt":205,"visible":92,"__hash__":3332},{"type":7,"value":10487,"toc":10605},[10488,10490,10492,10494,10496,10500,10504,10506,10516,10518,10520,10552,10554,10559,10561,10563,10575,10577,10587,10589,10597,10599,10601,10603],[10,10489,3164],{},[14,10491,16],{"id":16},[10,10493,3169],{},[14,10495,22],{"id":22},[10,10497,10498],{},[26,10499],{"alt":3176,"src":3177},[10,10501,3180,10502,3184],{},[50,10503,3183],{},[14,10505,35],{"id":35},[37,10507,10508,10510,10512],{},[40,10509,3191],{},[40,10511,3194],{},[40,10513,3197,10514,158],{},[50,10515,3200],{},[14,10517,60],{"id":60},[10,10519,63],{},[65,10521,10522],{"className":67,"code":3207,"language":69,"meta":70,"style":70},[50,10523,10524,10528,10532,10536,10540,10544,10548],{"__ignoreMap":70},[74,10525,10526],{"class":76,"line":77},[74,10527,3214],{},[74,10529,10530],{"class":76,"line":83},[74,10531,3219],{},[74,10533,10534],{"class":76,"line":89},[74,10535,93],{"emptyLinePlaceholder":92},[74,10537,10538],{"class":76,"line":96},[74,10539,3228],{},[74,10541,10542],{"class":76,"line":102},[74,10543,3233],{},[74,10545,10546],{"class":76,"line":108},[74,10547,3238],{},[74,10549,10550],{"class":76,"line":2461},[74,10551,3243],{},[10,10553,114],{},[65,10555,10557],{"className":10556,"code":3249,"language":120,"meta":70},[118],[50,10558,3249],{"__ignoreMap":70},[10,10560,125],{},[14,10562,128],{"id":128},[130,10564,10565,10567],{},[40,10566,3260],{},[40,10568,10569,3266,10571,3270,10573,3274],{},[50,10570,3265],{},[50,10572,3269],{},[50,10574,3273],{},[14,10576,147],{"id":147},[37,10578,10579,10585],{},[40,10580,3281,10581,3285,10583,158],{},[50,10582,3284],{},[50,10584,3288],{},[40,10586,3291],{},[14,10588,164],{"id":164},[130,10590,10591,10593],{},[40,10592,3298],{},[40,10594,3301,10595,3304],{},[50,10596,3273],{},[10,10598,178],{},[14,10600,181],{"id":181},[10,10602,3311],{},[186,10604,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10606},[10607,10608,10609,10610,10611,10612,10613,10614],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":3159,"description":3164},[199,3331,212],{"id":3334,"title":3335,"body":10619,"category":199,"cover":200,"description":3340,"extension":201,"meta":10738,"navigation":92,"path":3482,"pinned":204,"publishedAt":205,"seo":10739,"slug":3484,"stem":3485,"summary":3486,"tags":10740,"updatedAt":205,"visible":92,"__hash__":3489},{"type":7,"value":10620,"toc":10728},[10621,10623,10625,10627,10629,10633,10635,10637,10645,10647,10649,10677,10679,10684,10686,10688,10698,10700,10708,10710,10720,10722,10724,10726],[10,10622,3340],{},[14,10624,16],{"id":16},[10,10626,3345],{},[14,10628,22],{"id":22},[10,10630,10631],{},[26,10632],{"alt":3352,"src":3353},[10,10634,3356],{},[14,10636,35],{"id":35},[37,10638,10639,10641,10643],{},[40,10640,3363],{},[40,10642,3366],{},[40,10644,3369],{},[14,10646,60],{"id":60},[10,10648,63],{},[65,10650,10651],{"className":67,"code":3376,"language":69,"meta":70,"style":70},[50,10652,10653,10657,10661,10665,10669,10673],{"__ignoreMap":70},[74,10654,10655],{"class":76,"line":77},[74,10656,3383],{},[74,10658,10659],{"class":76,"line":83},[74,10660,3388],{},[74,10662,10663],{"class":76,"line":89},[74,10664,3393],{},[74,10666,10667],{"class":76,"line":96},[74,10668,93],{"emptyLinePlaceholder":92},[74,10670,10671],{"class":76,"line":102},[74,10672,3402],{},[74,10674,10675],{"class":76,"line":108},[74,10676,3407],{},[10,10678,114],{},[65,10680,10682],{"className":10681,"code":3413,"language":120,"meta":70},[118],[50,10683,3413],{"__ignoreMap":70},[10,10685,125],{},[14,10687,128],{"id":128},[130,10689,10690,10694],{},[40,10691,10692,3427],{},[50,10693,3426],{},[40,10695,10696,3433],{},[50,10697,3432],{},[14,10699,147],{"id":147},[37,10701,10702,10706],{},[40,10703,3440,10704,3444],{},[50,10705,3443],{},[40,10707,3447],{},[14,10709,164],{"id":164},[130,10711,10712,10714],{},[40,10713,3454],{},[40,10715,2146,10716,2149,10718,3461],{},[50,10717,3443],{},[50,10719,3432],{},[10,10721,178],{},[14,10723,181],{"id":181},[10,10725,3468],{},[186,10727,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10729},[10730,10731,10732,10733,10734,10735,10736,10737],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":3335,"description":3340},[199,3488,212],{"id":3491,"title":3492,"body":10742,"category":199,"cover":200,"description":3497,"extension":201,"meta":10867,"navigation":92,"path":3653,"pinned":204,"publishedAt":205,"seo":10868,"slug":3655,"stem":3656,"summary":3657,"tags":10869,"updatedAt":205,"visible":92,"__hash__":3660},{"type":7,"value":10743,"toc":10857},[10744,10746,10748,10750,10752,10756,10762,10764,10774,10776,10778,10806,10808,10813,10815,10817,10827,10829,10841,10843,10849,10851,10853,10855],[10,10745,3497],{},[14,10747,16],{"id":16},[10,10749,3502],{},[14,10751,22],{"id":22},[10,10753,10754],{},[26,10755],{"alt":3509,"src":3510},[10,10757,3513,10758,3517,10760,3520],{},[50,10759,3516],{},[50,10761,2219],{},[14,10763,35],{"id":35},[37,10765,10766,10768,10772],{},[40,10767,3527],{},[40,10769,152,10770,3533],{},[50,10771,3532],{},[40,10773,3536],{},[14,10775,60],{"id":60},[10,10777,63],{},[65,10779,10780],{"className":67,"code":3543,"language":69,"meta":70,"style":70},[50,10781,10782,10786,10790,10794,10798,10802],{"__ignoreMap":70},[74,10783,10784],{"class":76,"line":77},[74,10785,3550],{},[74,10787,10788],{"class":76,"line":83},[74,10789,3555],{},[74,10791,10792],{"class":76,"line":89},[74,10793,93],{"emptyLinePlaceholder":92},[74,10795,10796],{"class":76,"line":96},[74,10797,3564],{},[74,10799,10800],{"class":76,"line":102},[74,10801,3569],{},[74,10803,10804],{"class":76,"line":108},[74,10805,3574],{},[10,10807,114],{},[65,10809,10811],{"className":10810,"code":3580,"language":120,"meta":70},[118],[50,10812,3580],{"__ignoreMap":70},[10,10814,125],{},[14,10816,128],{"id":128},[130,10818,10819,10821],{},[40,10820,3591],{},[40,10822,3594,10823,3597,10825,3601],{},[50,10824,2219],{},[50,10826,3600],{},[14,10828,147],{"id":147},[37,10830,10831,10835],{},[40,10832,3608,10833,3612],{},[50,10834,3611],{},[40,10836,3615,10837,3619,10839,158],{},[50,10838,3618],{},[50,10840,3622],{},[14,10842,164],{"id":164},[130,10844,10845,10847],{},[40,10846,3629],{},[40,10848,3632],{},[10,10850,178],{},[14,10852,181],{"id":181},[10,10854,3639],{},[186,10856,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10858},[10859,10860,10861,10862,10863,10864,10865,10866],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":3492,"description":3497},[199,3659,212],{"id":4,"title":5,"body":10871,"category":199,"cover":200,"description":12,"extension":201,"meta":10994,"navigation":92,"path":203,"pinned":204,"publishedAt":205,"seo":10995,"slug":207,"stem":208,"summary":209,"tags":10996,"updatedAt":205,"visible":92,"__hash__":213},{"type":7,"value":10872,"toc":10984},[10873,10875,10877,10879,10881,10885,10887,10889,10901,10903,10905,10933,10935,10940,10942,10944,10954,10956,10966,10968,10976,10978,10980,10982],[10,10874,12],{},[14,10876,16],{"id":16},[10,10878,19],{},[14,10880,22],{"id":22},[10,10882,10883],{},[26,10884],{"alt":28,"src":29},[10,10886,32],{},[14,10888,35],{"id":35},[37,10890,10891,10893,10895],{},[40,10892,42],{},[40,10894,45],{},[40,10896,48,10897,53,10899,57],{},[50,10898,52],{},[50,10900,56],{},[14,10902,60],{"id":60},[10,10904,63],{},[65,10906,10907],{"className":67,"code":68,"language":69,"meta":70,"style":70},[50,10908,10909,10913,10917,10921,10925,10929],{"__ignoreMap":70},[74,10910,10911],{"class":76,"line":77},[74,10912,80],{},[74,10914,10915],{"class":76,"line":83},[74,10916,86],{},[74,10918,10919],{"class":76,"line":89},[74,10920,93],{"emptyLinePlaceholder":92},[74,10922,10923],{"class":76,"line":96},[74,10924,99],{},[74,10926,10927],{"class":76,"line":102},[74,10928,105],{},[74,10930,10931],{"class":76,"line":108},[74,10932,111],{},[10,10934,114],{},[65,10936,10938],{"className":10937,"code":119,"language":120,"meta":70},[118],[50,10939,119],{"__ignoreMap":70},[10,10941,125],{},[14,10943,128],{"id":128},[130,10945,10946,10948],{},[40,10947,134],{},[40,10949,10950,140,10952,144],{},[50,10951,139],{},[50,10953,143],{},[14,10955,147],{"id":147},[37,10957,10958,10964],{},[40,10959,152,10960,155,10962,158],{},[50,10961,56],{},[50,10963,52],{},[40,10965,161],{},[14,10967,164],{"id":164},[130,10969,10970,10974],{},[40,10971,169,10972,172],{},[50,10973,52],{},[40,10975,175],{},[10,10977,178],{},[14,10979,181],{"id":181},[10,10981,184],{},[186,10983,188],{},{"title":70,"searchDepth":83,"depth":83,"links":10985},[10986,10987,10988,10989,10990,10991,10992,10993],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5,"description":12},[199,211,212],{"id":3789,"title":3790,"body":10998,"category":199,"cover":200,"description":3795,"extension":201,"meta":11157,"navigation":92,"path":3994,"pinned":204,"publishedAt":205,"seo":11158,"slug":3996,"stem":3997,"summary":3998,"tags":11159,"updatedAt":205,"visible":92,"__hash__":4002},{"type":7,"value":10999,"toc":11145},[11000,11002,11004,11006,11008,11012,11018,11020,11032,11034,11036,11076,11078,11083,11085,11087,11101,11103,11105,11109,11111,11113,11123,11125,11137,11139,11141,11143],[10,11001,3795],{},[14,11003,16],{"id":16},[10,11005,3800],{},[14,11007,22],{"id":22},[10,11009,11010],{},[26,11011],{"alt":3807,"src":3808},[10,11013,11014,3814,11016,3818],{},[50,11015,3813],{},[50,11017,3817],{},[14,11019,35],{"id":35},[37,11021,11022,11028,11030],{},[40,11023,11024,3827,11026,3831],{},[50,11025,2781],{},[50,11027,3830],{},[40,11029,3834],{},[40,11031,3837],{},[14,11033,60],{"id":60},[10,11035,63],{},[65,11037,11038],{"className":67,"code":3844,"language":69,"meta":70,"style":70},[50,11039,11040,11044,11048,11052,11056,11060,11064,11068,11072],{"__ignoreMap":70},[74,11041,11042],{"class":76,"line":77},[74,11043,3851],{},[74,11045,11046],{"class":76,"line":83},[74,11047,3856],{},[74,11049,11050],{"class":76,"line":89},[74,11051,3861],{},[74,11053,11054],{"class":76,"line":96},[74,11055,93],{"emptyLinePlaceholder":92},[74,11057,11058],{"class":76,"line":102},[74,11059,3870],{},[74,11061,11062],{"class":76,"line":108},[74,11063,3875],{},[74,11065,11066],{"class":76,"line":2461},[74,11067,3880],{},[74,11069,11070],{"class":76,"line":2467},[74,11071,3885],{},[74,11073,11074],{"class":76,"line":3888},[74,11075,3891],{},[10,11077,114],{},[65,11079,11081],{"className":11080,"code":3897,"language":120,"meta":70},[118],[50,11082,3897],{"__ignoreMap":70},[10,11084,125],{},[14,11086,128],{"id":128},[130,11088,11089,11093],{},[40,11090,11091,3911],{},[50,11092,3910],{},[40,11094,11095,3917,11097,3921,11099,3925],{},[50,11096,3916],{},[50,11098,3920],{},[50,11100,3924],{},[302,11102,2671],{"id":2671},[10,11104,3930],{},[10,11106,11107],{},[26,11108],{"alt":3935,"src":3936},[10,11110,3939],{},[14,11112,147],{"id":147},[37,11114,11115,11121],{},[40,11116,3946,11117,3949,11119,158],{},[50,11118,2781],{},[50,11120,3830],{},[40,11122,3954],{},[14,11124,164],{"id":164},[130,11126,11127,11129],{},[40,11128,3961],{},[40,11130,152,11131,3967,11133,1130,11135,158],{},[50,11132,3966],{},[50,11134,3830],{},[50,11136,2781],{},[10,11138,178],{},[14,11140,181],{"id":181},[10,11142,3978],{},[186,11144,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11146},[11147,11148,11149,11150,11151,11154,11155,11156],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":11152},[11153],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":3790,"description":3795},[199,4000,4001],{"id":4004,"title":4005,"body":11161,"category":199,"cover":200,"description":4010,"extension":201,"meta":11333,"navigation":92,"path":4224,"pinned":204,"publishedAt":205,"seo":11334,"slug":4226,"stem":4227,"summary":4228,"tags":11335,"updatedAt":205,"visible":92,"__hash__":4231},{"type":7,"value":11162,"toc":11320},[11163,11165,11167,11169,11171,11175,11183,11185,11193,11195,11197,11241,11243,11248,11250,11252,11264,11266,11268,11272,11278,11280,11282,11286,11290,11292,11304,11306,11312,11314,11316,11318],[10,11164,4010],{},[14,11166,16],{"id":16},[10,11168,4015],{},[14,11170,22],{"id":22},[10,11172,11173],{},[26,11174],{"alt":4022,"src":4023},[10,11176,11177,2230,11179,2230,11181,4033],{},[50,11178,1129],{},[50,11180,4030],{},[50,11182,1133],{},[14,11184,35],{"id":35},[37,11186,11187,11189,11191],{},[40,11188,4040],{},[40,11190,4043],{},[40,11192,4046],{},[14,11194,60],{"id":60},[10,11196,63],{},[65,11198,11199],{"className":67,"code":4053,"language":69,"meta":70,"style":70},[50,11200,11201,11205,11209,11213,11217,11221,11225,11229,11233,11237],{"__ignoreMap":70},[74,11202,11203],{"class":76,"line":77},[74,11204,4060],{},[74,11206,11207],{"class":76,"line":83},[74,11208,93],{"emptyLinePlaceholder":92},[74,11210,11211],{"class":76,"line":89},[74,11212,4069],{},[74,11214,11215],{"class":76,"line":96},[74,11216,4074],{},[74,11218,11219],{"class":76,"line":102},[74,11220,4079],{},[74,11222,11223],{"class":76,"line":108},[74,11224,4084],{},[74,11226,11227],{"class":76,"line":2461},[74,11228,1119],{},[74,11230,11231],{"class":76,"line":2467},[74,11232,4093],{},[74,11234,11235],{"class":76,"line":3888},[74,11236,93],{"emptyLinePlaceholder":92},[74,11238,11239],{"class":76,"line":4100},[74,11240,4103],{},[10,11242,114],{},[65,11244,11246],{"className":11245,"code":4109,"language":120,"meta":70},[118],[50,11247,4109],{"__ignoreMap":70},[10,11249,125],{},[14,11251,128],{"id":128},[130,11253,11254,11258],{},[40,11255,4120,11256,4124],{},[50,11257,4123],{},[40,11259,11260,4130,11262,4133],{},[50,11261,4129],{},[50,11263,1133],{},[302,11265,2671],{"id":2671},[10,11267,4138],{},[10,11269,11270],{},[26,11271],{"alt":4143,"src":4144},[10,11273,11274,4149,11276,4152],{},[50,11275,4123],{},[50,11277,4129],{},[302,11279,2671],{"id":4155},[10,11281,4158],{},[10,11283,11284],{},[26,11285],{"alt":4163,"src":4164},[10,11287,4167,11288,4170],{},[50,11289,1129],{},[14,11291,147],{"id":147},[37,11293,11294,11298],{},[40,11295,4177,11296,4180],{},[50,11297,4129],{},[40,11299,4183,11300,4186,11302,4190],{},[50,11301,1129],{},[50,11303,4189],{},[14,11305,164],{"id":164},[130,11307,11308,11310],{},[40,11309,4197],{},[40,11311,4200],{},[10,11313,178],{},[14,11315,181],{"id":181},[10,11317,4207],{},[186,11319,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11321},[11322,11323,11324,11325,11326,11330,11331,11332],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":11327},[11328,11329],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4005,"description":4010},[199,1129,4230],{"id":4233,"title":4234,"body":11337,"category":199,"cover":200,"description":4239,"extension":201,"meta":11474,"navigation":92,"path":4406,"pinned":204,"publishedAt":205,"seo":11475,"slug":4408,"stem":4409,"summary":4410,"tags":11476,"updatedAt":205,"visible":92,"__hash__":4413},{"type":7,"value":11338,"toc":11462},[11339,11341,11343,11345,11347,11351,11355,11357,11367,11369,11371,11403,11405,11410,11412,11414,11424,11426,11428,11432,11436,11438,11444,11446,11454,11456,11458,11460],[10,11340,4239],{},[14,11342,16],{"id":16},[10,11344,4244],{},[14,11346,22],{"id":22},[10,11348,11349],{},[26,11350],{"alt":4251,"src":4252},[10,11352,11353,4258],{},[50,11354,4257],{},[14,11356,35],{"id":35},[37,11358,11359,11361,11363],{},[40,11360,4265],{},[40,11362,4268],{},[40,11364,4271,11365,4275],{},[50,11366,4274],{},[14,11368,60],{"id":60},[10,11370,63],{},[65,11372,11373],{"className":67,"code":4282,"language":69,"meta":70,"style":70},[50,11374,11375,11379,11383,11387,11391,11395,11399],{"__ignoreMap":70},[74,11376,11377],{"class":76,"line":77},[74,11378,4289],{},[74,11380,11381],{"class":76,"line":83},[74,11382,93],{"emptyLinePlaceholder":92},[74,11384,11385],{"class":76,"line":89},[74,11386,4298],{},[74,11388,11389],{"class":76,"line":96},[74,11390,4303],{},[74,11392,11393],{"class":76,"line":102},[74,11394,4308],{},[74,11396,11397],{"class":76,"line":108},[74,11398,93],{"emptyLinePlaceholder":92},[74,11400,11401],{"class":76,"line":2461},[74,11402,4317],{},[10,11404,114],{},[65,11406,11408],{"className":11407,"code":4323,"language":120,"meta":70},[118],[50,11409,4323],{"__ignoreMap":70},[10,11411,125],{},[14,11413,128],{"id":128},[130,11415,11416,11420],{},[40,11417,4334,11418,4338],{},[50,11419,4337],{},[40,11421,4341,11422,4344],{},[50,11423,4337],{},[302,11425,2671],{"id":2671},[10,11427,4349],{},[10,11429,11430],{},[26,11431],{"alt":4354,"src":4355},[10,11433,4358,11434,4361],{},[50,11435,4337],{},[14,11437,147],{"id":147},[37,11439,11440,11442],{},[40,11441,4368],{},[40,11443,4371],{},[14,11445,164],{"id":164},[130,11447,11448,11452],{},[40,11449,152,11450,4380],{},[50,11451,4257],{},[40,11453,4383],{},[10,11455,178],{},[14,11457,181],{"id":181},[10,11459,4390],{},[186,11461,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11463},[11464,11465,11466,11467,11468,11471,11472,11473],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":11469},[11470],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4234,"description":4239},[199,4257,4412],{"id":4415,"title":4416,"body":11478,"category":199,"cover":200,"description":4421,"extension":201,"meta":11603,"navigation":92,"path":4570,"pinned":204,"publishedAt":205,"seo":11604,"slug":4572,"stem":4573,"summary":4574,"tags":11605,"updatedAt":205,"visible":92,"__hash__":4577},{"type":7,"value":11479,"toc":11593},[11480,11482,11484,11486,11488,11492,11496,11498,11508,11510,11512,11544,11546,11551,11553,11555,11567,11569,11575,11577,11585,11587,11589,11591],[10,11481,4421],{},[14,11483,16],{"id":16},[10,11485,4426],{},[14,11487,22],{"id":22},[10,11489,11490],{},[26,11491],{"alt":4433,"src":4434},[10,11493,11494,4439],{},[50,11495,4274],{},[14,11497,35],{"id":35},[37,11499,11500,11504,11506],{},[40,11501,11502,4449],{},[50,11503,4448],{},[40,11505,4452],{},[40,11507,4455],{},[14,11509,60],{"id":60},[10,11511,63],{},[65,11513,11514],{"className":67,"code":4462,"language":69,"meta":70,"style":70},[50,11515,11516,11520,11524,11528,11532,11536,11540],{"__ignoreMap":70},[74,11517,11518],{"class":76,"line":77},[74,11519,4469],{},[74,11521,11522],{"class":76,"line":83},[74,11523,93],{"emptyLinePlaceholder":92},[74,11525,11526],{"class":76,"line":89},[74,11527,4478],{},[74,11529,11530],{"class":76,"line":96},[74,11531,4483],{},[74,11533,11534],{"class":76,"line":102},[74,11535,93],{"emptyLinePlaceholder":92},[74,11537,11538],{"class":76,"line":108},[74,11539,4492],{},[74,11541,11542],{"class":76,"line":2461},[74,11543,4497],{},[10,11545,114],{},[65,11547,11549],{"className":11548,"code":4503,"language":120,"meta":70},[118],[50,11550,4503],{"__ignoreMap":70},[10,11552,125],{},[14,11554,128],{"id":128},[130,11556,11557,11563],{},[40,11558,4514,11559,4517,11561,4521],{},[50,11560,4274],{},[50,11562,4520],{},[40,11564,11565,4526],{},[50,11566,4448],{},[14,11568,147],{"id":147},[37,11570,11571,11573],{},[40,11572,4533],{},[40,11574,4536],{},[14,11576,164],{"id":164},[130,11578,11579,11581],{},[40,11580,4543],{},[40,11582,152,11583,4549],{},[50,11584,4548],{},[10,11586,178],{},[14,11588,181],{"id":181},[10,11590,4556],{},[186,11592,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11594},[11595,11596,11597,11598,11599,11600,11601,11602],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4416,"description":4421},[199,4274,4576],{"id":4579,"title":4580,"body":11607,"category":199,"cover":200,"description":4585,"extension":201,"meta":11752,"navigation":92,"path":4760,"pinned":204,"publishedAt":205,"seo":11753,"slug":4762,"stem":4763,"summary":4764,"tags":11754,"updatedAt":205,"visible":92,"__hash__":4766},{"type":7,"value":11608,"toc":11742},[11609,11611,11613,11615,11617,11621,11627,11629,11643,11645,11647,11691,11693,11698,11700,11702,11712,11714,11726,11728,11734,11736,11738,11740],[10,11610,4585],{},[14,11612,16],{"id":16},[10,11614,4590],{},[14,11616,22],{"id":22},[10,11618,11619],{},[26,11620],{"alt":4597,"src":4598},[10,11622,11623,4604,11625,4608],{},[50,11624,4603],{},[50,11626,4607],{},[14,11628,35],{"id":35},[37,11630,11631,11633,11639],{},[40,11632,4615],{},[40,11634,11635,4620,11637,4623],{},[50,11636,4603],{},[50,11638,4257],{},[40,11640,4626,11641,4629],{},[50,11642,4607],{},[14,11644,60],{"id":60},[10,11646,63],{},[65,11648,11649],{"className":67,"code":4636,"language":69,"meta":70,"style":70},[50,11650,11651,11655,11659,11663,11667,11671,11675,11679,11683,11687],{"__ignoreMap":70},[74,11652,11653],{"class":76,"line":77},[74,11654,4643],{},[74,11656,11657],{"class":76,"line":83},[74,11658,93],{"emptyLinePlaceholder":92},[74,11660,11661],{"class":76,"line":89},[74,11662,4652],{},[74,11664,11665],{"class":76,"line":96},[74,11666,4657],{},[74,11668,11669],{"class":76,"line":102},[74,11670,4662],{},[74,11672,11673],{"class":76,"line":108},[74,11674,4667],{},[74,11676,11677],{"class":76,"line":2461},[74,11678,4672],{},[74,11680,11681],{"class":76,"line":2467},[74,11682,4497],{},[74,11684,11685],{"class":76,"line":3888},[74,11686,93],{"emptyLinePlaceholder":92},[74,11688,11689],{"class":76,"line":4100},[74,11690,4685],{},[10,11692,114],{},[65,11694,11696],{"className":11695,"code":4691,"language":120,"meta":70},[118],[50,11697,4691],{"__ignoreMap":70},[10,11699,125],{},[14,11701,128],{"id":128},[130,11703,11704,11708],{},[40,11705,4702,11706,4705],{},[50,11707,4603],{},[40,11709,4708,11710,4711],{},[50,11711,4607],{},[14,11713,147],{"id":147},[37,11715,11716,11720],{},[40,11717,3440,11718,4720],{},[50,11719,4603],{},[40,11721,4723,11722,4726,11724,4729],{},[50,11723,4257],{},[50,11725,4603],{},[14,11727,164],{"id":164},[130,11729,11730,11732],{},[40,11731,4736],{},[40,11733,4739],{},[10,11735,178],{},[14,11737,181],{"id":181},[10,11739,4746],{},[186,11741,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11743},[11744,11745,11746,11747,11748,11749,11750,11751],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4580,"description":4585},[199,4607,4603],{"id":4768,"title":4769,"body":11756,"category":199,"cover":200,"description":4774,"extension":201,"meta":11895,"navigation":92,"path":4946,"pinned":204,"publishedAt":205,"seo":11896,"slug":4948,"stem":4949,"summary":4950,"tags":11897,"updatedAt":205,"visible":92,"__hash__":4954},{"type":7,"value":11757,"toc":11883},[11758,11760,11762,11764,11766,11770,11772,11774,11790,11792,11794,11822,11824,11829,11831,11833,11845,11847,11849,11853,11855,11857,11867,11869,11875,11877,11879,11881],[10,11759,4774],{},[14,11761,16],{"id":16},[10,11763,4779],{},[14,11765,22],{"id":22},[10,11767,11768],{},[26,11769],{"alt":4786,"src":4787},[10,11771,4790],{},[14,11773,35],{"id":35},[37,11775,11776,11778,11780],{},[40,11777,4797],{},[40,11779,4800],{},[40,11781,4803,11782,2230,11784,4810,11786,2230,11788,158],{},[50,11783,4806],{},[50,11785,4809],{},[50,11787,4813],{},[50,11789,4816],{},[14,11791,60],{"id":60},[10,11793,63],{},[65,11795,11796],{"className":67,"code":4823,"language":69,"meta":70,"style":70},[50,11797,11798,11802,11806,11810,11814,11818],{"__ignoreMap":70},[74,11799,11800],{"class":76,"line":77},[74,11801,4830],{},[74,11803,11804],{"class":76,"line":83},[74,11805,93],{"emptyLinePlaceholder":92},[74,11807,11808],{"class":76,"line":89},[74,11809,4839],{},[74,11811,11812],{"class":76,"line":96},[74,11813,4844],{},[74,11815,11816],{"class":76,"line":102},[74,11817,4849],{},[74,11819,11820],{"class":76,"line":108},[74,11821,4854],{},[10,11823,114],{},[65,11825,11827],{"className":11826,"code":4860,"language":120,"meta":70},[118],[50,11828,4860],{"__ignoreMap":70},[10,11830,125],{},[14,11832,128],{"id":128},[130,11834,11835,11843],{},[40,11836,4871,11837,4874,11839,1130,11841,158],{},[50,11838,4806],{},[50,11840,4877],{},[50,11842,4880],{},[40,11844,4883],{},[302,11846,2671],{"id":2671},[10,11848,4888],{},[10,11850,11851],{},[26,11852],{"alt":4893,"src":4894},[10,11854,4897],{},[14,11856,147],{"id":147},[37,11858,11859,11865],{},[40,11860,4904,11861,982,11863,4910],{},[50,11862,4907],{},[50,11864,4813],{},[40,11866,4913],{},[14,11868,164],{"id":164},[130,11870,11871,11873],{},[40,11872,4920],{},[40,11874,4923],{},[10,11876,178],{},[14,11878,181],{"id":181},[10,11880,4930],{},[186,11882,188],{},{"title":70,"searchDepth":83,"depth":83,"links":11884},[11885,11886,11887,11888,11889,11892,11893,11894],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":11890},[11891],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4769,"description":4774},[199,4952,4953],{"id":4956,"title":4957,"body":11899,"category":199,"cover":200,"description":4962,"extension":201,"meta":12016,"navigation":92,"path":5101,"pinned":204,"publishedAt":205,"seo":12017,"slug":5103,"stem":5104,"summary":5105,"tags":12018,"updatedAt":205,"visible":92,"__hash__":5109},{"type":7,"value":11900,"toc":12006},[11901,11903,11905,11907,11909,11913,11915,11917,11925,11927,11929,11961,11963,11968,11970,11972,11980,11982,11990,11992,11998,12000,12002,12004],[10,11902,4962],{},[14,11904,16],{"id":16},[10,11906,4967],{},[14,11908,22],{"id":22},[10,11910,11911],{},[26,11912],{"alt":4974,"src":4975},[10,11914,4978],{},[14,11916,35],{"id":35},[37,11918,11919,11921,11923],{},[40,11920,4985],{},[40,11922,4988],{},[40,11924,4991],{},[14,11926,60],{"id":60},[10,11928,63],{},[65,11930,11931],{"className":67,"code":4998,"language":69,"meta":70,"style":70},[50,11932,11933,11937,11941,11945,11949,11953,11957],{"__ignoreMap":70},[74,11934,11935],{"class":76,"line":77},[74,11936,5005],{},[74,11938,11939],{"class":76,"line":83},[74,11940,93],{"emptyLinePlaceholder":92},[74,11942,11943],{"class":76,"line":89},[74,11944,5014],{},[74,11946,11947],{"class":76,"line":96},[74,11948,5019],{},[74,11950,11951],{"class":76,"line":102},[74,11952,93],{"emptyLinePlaceholder":92},[74,11954,11955],{"class":76,"line":108},[74,11956,5028],{},[74,11958,11959],{"class":76,"line":2461},[74,11960,5033],{},[10,11962,114],{},[65,11964,11966],{"className":11965,"code":5039,"language":120,"meta":70},[118],[50,11967,5039],{"__ignoreMap":70},[10,11969,125],{},[14,11971,128],{"id":128},[130,11973,11974,11976],{},[40,11975,5050],{},[40,11977,5053,11978,5057],{},[50,11979,5056],{},[14,11981,147],{"id":147},[37,11983,11984,11988],{},[40,11985,5064,11986,5067],{},[50,11987,4274],{},[40,11989,5070],{},[14,11991,164],{"id":164},[130,11993,11994,11996],{},[40,11995,5077],{},[40,11997,5080],{},[10,11999,178],{},[14,12001,181],{"id":181},[10,12003,5087],{},[186,12005,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12007},[12008,12009,12010,12011,12012,12013,12014,12015],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":4957,"description":4962},[199,5107,5108],{"id":5111,"title":5112,"body":12020,"category":199,"cover":200,"description":5117,"extension":201,"meta":12139,"navigation":92,"path":5261,"pinned":204,"publishedAt":205,"seo":12140,"slug":5263,"stem":5264,"summary":5265,"tags":12141,"updatedAt":205,"visible":92,"__hash__":5269},{"type":7,"value":12021,"toc":12129},[12022,12024,12026,12028,12030,12034,12036,12038,12046,12048,12050,12082,12084,12089,12091,12093,12103,12105,12111,12113,12121,12123,12125,12127],[10,12023,5117],{},[14,12025,16],{"id":16},[10,12027,5122],{},[14,12029,22],{"id":22},[10,12031,12032],{},[26,12033],{"alt":5129,"src":5130},[10,12035,5133],{},[14,12037,35],{"id":35},[37,12039,12040,12042,12044],{},[40,12041,5140],{},[40,12043,5143],{},[40,12045,5146],{},[14,12047,60],{"id":60},[10,12049,63],{},[65,12051,12052],{"className":67,"code":5153,"language":69,"meta":70,"style":70},[50,12053,12054,12058,12062,12066,12070,12074,12078],{"__ignoreMap":70},[74,12055,12056],{"class":76,"line":77},[74,12057,5160],{},[74,12059,12060],{"class":76,"line":83},[74,12061,5165],{},[74,12063,12064],{"class":76,"line":89},[74,12065,5170],{},[74,12067,12068],{"class":76,"line":96},[74,12069,93],{"emptyLinePlaceholder":92},[74,12071,12072],{"class":76,"line":102},[74,12073,5179],{},[74,12075,12076],{"class":76,"line":108},[74,12077,5184],{},[74,12079,12080],{"class":76,"line":2461},[74,12081,5189],{},[10,12083,114],{},[65,12085,12087],{"className":12086,"code":5195,"language":120,"meta":70},[118],[50,12088,5195],{"__ignoreMap":70},[10,12090,125],{},[14,12092,128],{"id":128},[130,12094,12095,12099],{},[40,12096,911,12097,5209],{},[50,12098,5208],{},[40,12100,5212,12101,5216],{},[50,12102,5215],{},[14,12104,147],{"id":147},[37,12106,12107,12109],{},[40,12108,5223],{},[40,12110,5226],{},[14,12112,164],{"id":164},[130,12114,12115,12119],{},[40,12116,5233,12117,5237],{},[50,12118,5236],{},[40,12120,5240],{},[10,12122,178],{},[14,12124,181],{"id":181},[10,12126,5247],{},[186,12128,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12130},[12131,12132,12133,12134,12135,12136,12137,12138],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5112,"description":5117},[199,5267,5268],{"id":5271,"title":5272,"body":12143,"category":199,"cover":200,"description":5277,"extension":201,"meta":12288,"navigation":92,"path":5458,"pinned":204,"publishedAt":205,"seo":12289,"slug":5460,"stem":5461,"summary":5462,"tags":12290,"updatedAt":205,"visible":92,"__hash__":5466},{"type":7,"value":12144,"toc":12276},[12145,12147,12149,12151,12153,12157,12161,12163,12175,12177,12179,12207,12209,12214,12216,12218,12232,12234,12236,12240,12248,12250,12260,12262,12268,12270,12272,12274],[10,12146,5277],{},[14,12148,16],{"id":16},[10,12150,5282],{},[14,12152,22],{"id":22},[10,12154,12155],{},[26,12156],{"alt":5289,"src":5290},[10,12158,5293,12159,5297],{},[50,12160,5296],{},[14,12162,35],{"id":35},[37,12164,12165,12167,12169],{},[40,12166,5304],{},[40,12168,5307],{},[40,12170,5310,12171,5313,12173,158],{},[50,12172,5296],{},[50,12174,5316],{},[14,12176,60],{"id":60},[10,12178,63],{},[65,12180,12181],{"className":67,"code":5323,"language":69,"meta":70,"style":70},[50,12182,12183,12187,12191,12195,12199,12203],{"__ignoreMap":70},[74,12184,12185],{"class":76,"line":77},[74,12186,5330],{},[74,12188,12189],{"class":76,"line":83},[74,12190,5335],{},[74,12192,12193],{"class":76,"line":89},[74,12194,5340],{},[74,12196,12197],{"class":76,"line":96},[74,12198,93],{"emptyLinePlaceholder":92},[74,12200,12201],{"class":76,"line":102},[74,12202,5349],{},[74,12204,12205],{"class":76,"line":108},[74,12206,5354],{},[10,12208,114],{},[65,12210,12212],{"className":12211,"code":5360,"language":120,"meta":70},[118],[50,12213,5360],{"__ignoreMap":70},[10,12215,125],{},[14,12217,128],{"id":128},[130,12219,12220,12226],{},[40,12221,5371,12222,2230,12224,5377],{},[50,12223,5374],{},[50,12225,4337],{},[40,12227,12228,5383,12230,5387],{},[50,12229,5382],{},[50,12231,5386],{},[302,12233,2671],{"id":2671},[10,12235,5392],{},[10,12237,12238],{},[26,12239],{"alt":5397,"src":5398},[10,12241,12242,2230,12244,1130,12246,5408],{},[50,12243,5374],{},[50,12245,4337],{},[50,12247,5407],{},[14,12249,147],{"id":147},[37,12251,12252,12256],{},[40,12253,5415,12254,5419],{},[50,12255,5418],{},[40,12257,5422,12258,5425],{},[50,12259,5407],{},[14,12261,164],{"id":164},[130,12263,12264,12266],{},[40,12265,5432],{},[40,12267,5435],{},[10,12269,178],{},[14,12271,181],{"id":181},[10,12273,5442],{},[186,12275,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12277},[12278,12279,12280,12281,12282,12285,12286,12287],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":12283},[12284],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5272,"description":5277},[199,5464,5465],{"id":5468,"title":5469,"body":12292,"category":199,"cover":200,"description":5474,"extension":201,"meta":12441,"navigation":92,"path":5655,"pinned":204,"publishedAt":205,"seo":12442,"slug":5657,"stem":5658,"summary":5659,"tags":12443,"updatedAt":205,"visible":92,"__hash__":5663},{"type":7,"value":12293,"toc":12429},[12294,12296,12298,12300,12302,12306,12308,12310,12322,12324,12326,12370,12372,12377,12379,12381,12393,12395,12397,12401,12403,12405,12413,12415,12421,12423,12425,12427],[10,12295,5474],{},[14,12297,16],{"id":16},[10,12299,5479],{},[14,12301,22],{"id":22},[10,12303,12304],{},[26,12305],{"alt":5486,"src":5487},[10,12307,5490],{},[14,12309,35],{"id":35},[37,12311,12312,12314,12318],{},[40,12313,5497],{},[40,12315,12316,5503],{},[50,12317,5502],{},[40,12319,12320,5509],{},[50,12321,5508],{},[14,12323,60],{"id":60},[10,12325,63],{},[65,12327,12328],{"className":67,"code":5516,"language":69,"meta":70,"style":70},[50,12329,12330,12334,12338,12342,12346,12350,12354,12358,12362,12366],{"__ignoreMap":70},[74,12331,12332],{"class":76,"line":77},[74,12333,5523],{},[74,12335,12336],{"class":76,"line":83},[74,12337,5528],{},[74,12339,12340],{"class":76,"line":89},[74,12341,93],{"emptyLinePlaceholder":92},[74,12343,12344],{"class":76,"line":96},[74,12345,5537],{},[74,12347,12348],{"class":76,"line":102},[74,12349,5542],{},[74,12351,12352],{"class":76,"line":108},[74,12353,93],{"emptyLinePlaceholder":92},[74,12355,12356],{"class":76,"line":2461},[74,12357,5551],{},[74,12359,12360],{"class":76,"line":2467},[74,12361,5556],{},[74,12363,12364],{"class":76,"line":3888},[74,12365,93],{"emptyLinePlaceholder":92},[74,12367,12368],{"class":76,"line":4100},[74,12369,5565],{},[10,12371,114],{},[65,12373,12375],{"className":12374,"code":5571,"language":120,"meta":70},[118],[50,12376,5571],{"__ignoreMap":70},[10,12378,125],{},[14,12380,128],{"id":128},[130,12382,12383,12387],{},[40,12384,5582,12385,5586],{},[50,12386,5585],{},[40,12388,12389,5592,12391,158],{},[50,12390,5591],{},[50,12392,5595],{},[302,12394,2671],{"id":2671},[10,12396,5600],{},[10,12398,12399],{},[26,12400],{"alt":5605,"src":5606},[10,12402,5609],{},[14,12404,147],{"id":147},[37,12406,12407,12411],{},[40,12408,5616,12409,5619],{},[50,12410,5316],{},[40,12412,5622],{},[14,12414,164],{"id":164},[130,12416,12417,12419],{},[40,12418,5629],{},[40,12420,5632],{},[10,12422,178],{},[14,12424,181],{"id":181},[10,12426,5639],{},[186,12428,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12430},[12431,12432,12433,12434,12435,12438,12439,12440],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":12436},[12437],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5469,"description":5474},[199,5661,5662],{"id":5665,"title":5666,"body":12445,"category":199,"cover":200,"description":5671,"extension":201,"meta":12606,"navigation":92,"path":5869,"pinned":204,"publishedAt":205,"seo":12607,"slug":5871,"stem":5872,"summary":5873,"tags":12608,"updatedAt":205,"visible":92,"__hash__":5877},{"type":7,"value":12446,"toc":12594},[12447,12449,12451,12453,12455,12459,12461,12463,12475,12477,12479,12531,12533,12538,12540,12542,12560,12562,12564,12568,12570,12572,12578,12580,12586,12588,12590,12592],[10,12448,5671],{},[14,12450,16],{"id":16},[10,12452,5676],{},[14,12454,22],{"id":22},[10,12456,12457],{},[26,12458],{"alt":5683,"src":5684},[10,12460,5687],{},[14,12462,35],{"id":35},[37,12464,12465,12467,12469],{},[40,12466,5694],{},[40,12468,5697],{},[40,12470,12471,2149,12473,5706],{},[50,12472,5702],{},[50,12474,5705],{},[14,12476,60],{"id":60},[10,12478,63],{},[65,12480,12481],{"className":67,"code":5713,"language":69,"meta":70,"style":70},[50,12482,12483,12487,12491,12495,12499,12503,12507,12511,12515,12519,12523,12527],{"__ignoreMap":70},[74,12484,12485],{"class":76,"line":77},[74,12486,5720],{},[74,12488,12489],{"class":76,"line":83},[74,12490,93],{"emptyLinePlaceholder":92},[74,12492,12493],{"class":76,"line":89},[74,12494,5729],{},[74,12496,12497],{"class":76,"line":96},[74,12498,5734],{},[74,12500,12501],{"class":76,"line":102},[74,12502,93],{"emptyLinePlaceholder":92},[74,12504,12505],{"class":76,"line":108},[74,12506,5743],{},[74,12508,12509],{"class":76,"line":2461},[74,12510,5748],{},[74,12512,12513],{"class":76,"line":2467},[74,12514,5753],{},[74,12516,12517],{"class":76,"line":3888},[74,12518,93],{"emptyLinePlaceholder":92},[74,12520,12521],{"class":76,"line":4100},[74,12522,5762],{},[74,12524,12525],{"class":76,"line":5765},[74,12526,93],{"emptyLinePlaceholder":92},[74,12528,12529],{"class":76,"line":5770},[74,12530,5773],{},[10,12532,114],{},[65,12534,12536],{"className":12535,"code":5779,"language":120,"meta":70},[118],[50,12537,5779],{"__ignoreMap":70},[10,12539,125],{},[14,12541,128],{"id":128},[130,12543,12544,12554],{},[40,12545,12546,5793,12548,5797,12550,5800,12552,5804],{},[50,12547,5792],{},[50,12549,5796],{},[50,12551,5585],{},[50,12553,5803],{},[40,12555,12556,5809,12558,5812],{},[50,12557,4520],{},[50,12559,2181],{},[302,12561,2671],{"id":2671},[10,12563,5817],{},[10,12565,12566],{},[26,12567],{"alt":5822,"src":5823},[10,12569,5826],{},[14,12571,147],{"id":147},[37,12573,12574,12576],{},[40,12575,5833],{},[40,12577,5836],{},[14,12579,164],{"id":164},[130,12581,12582,12584],{},[40,12583,5843],{},[40,12585,5846],{},[10,12587,178],{},[14,12589,181],{"id":181},[10,12591,5853],{},[186,12593,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12595},[12596,12597,12598,12599,12600,12603,12604,12605],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":12601},[12602],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5666,"description":5671},[199,5875,5876],{"id":5879,"title":5880,"body":12610,"category":199,"cover":200,"description":5885,"extension":201,"meta":12733,"navigation":92,"path":6036,"pinned":204,"publishedAt":205,"seo":12734,"slug":6038,"stem":6039,"summary":6040,"tags":12735,"updatedAt":205,"visible":92,"__hash__":6044},{"type":7,"value":12611,"toc":12723},[12612,12614,12616,12618,12620,12624,12626,12628,12642,12644,12646,12674,12676,12681,12683,12685,12695,12697,12705,12707,12715,12717,12719,12721],[10,12613,5885],{},[14,12615,16],{"id":16},[10,12617,5890],{},[14,12619,22],{"id":22},[10,12621,12622],{},[26,12623],{"alt":5897,"src":5898},[10,12625,5901],{},[14,12627,35],{"id":35},[37,12629,12630,12632,12634],{},[40,12631,5908],{},[40,12633,5911],{},[40,12635,5914,12636,2230,12638,2230,12640,5922],{},[50,12637,2233],{},[50,12639,2398],{},[50,12641,5921],{},[14,12643,60],{"id":60},[10,12645,63],{},[65,12647,12648],{"className":67,"code":5929,"language":69,"meta":70,"style":70},[50,12649,12650,12654,12658,12662,12666,12670],{"__ignoreMap":70},[74,12651,12652],{"class":76,"line":77},[74,12653,5936],{},[74,12655,12656],{"class":76,"line":83},[74,12657,5941],{},[74,12659,12660],{"class":76,"line":89},[74,12661,5946],{},[74,12663,12664],{"class":76,"line":96},[74,12665,93],{"emptyLinePlaceholder":92},[74,12667,12668],{"class":76,"line":102},[74,12669,5955],{},[74,12671,12672],{"class":76,"line":108},[74,12673,5960],{},[10,12675,114],{},[65,12677,12679],{"className":12678,"code":5966,"language":120,"meta":70},[118],[50,12680,5966],{"__ignoreMap":70},[10,12682,125],{},[14,12684,128],{"id":128},[130,12686,12687,12693],{},[40,12688,5977,12689,5981,12691,5984],{},[50,12690,5980],{},[50,12692,2219],{},[40,12694,5987],{},[14,12696,147],{"id":147},[37,12698,12699,12703],{},[40,12700,5994,12701,5998],{},[50,12702,5997],{},[40,12704,6001],{},[14,12706,164],{"id":164},[130,12708,12709,12711],{},[40,12710,6008],{},[40,12712,6011,12713,6015],{},[50,12714,6014],{},[10,12716,178],{},[14,12718,181],{"id":181},[10,12720,6022],{},[186,12722,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12724},[12725,12726,12727,12728,12729,12730,12731,12732],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":5880,"description":5885},[199,6042,6043],{"id":6046,"title":6047,"body":12737,"category":199,"cover":200,"description":6052,"extension":201,"meta":12914,"navigation":92,"path":6280,"pinned":204,"publishedAt":205,"seo":12915,"slug":6282,"stem":6283,"summary":6284,"tags":12916,"updatedAt":205,"visible":92,"__hash__":6288},{"type":7,"value":12738,"toc":12902},[12739,12741,12743,12747,12749,12753,12759,12761,12773,12775,12779,12803,12807,12823,12829,12831,12836,12838,12840,12856,12858,12860,12864,12868,12870,12882,12884,12894,12896,12898,12900],[10,12740,6052],{},[14,12742,16],{"id":16},[10,12744,6057,12745,6060],{},[268,12746,5980],{},[14,12748,22],{"id":22},[10,12750,12751],{},[26,12752],{"alt":6067,"src":6068},[10,12754,6071,12755,6075,12757,6079],{},[50,12756,6074],{},[50,12758,6078],{},[14,12760,35],{"id":35},[37,12762,12763,12767,12769],{},[40,12764,6086,12765,6089],{},[50,12766,1144],{},[40,12768,6092],{},[40,12770,6095,12771,6099],{},[50,12772,6098],{},[14,12774,60],{"id":60},[10,12776,6104,12777,6108],{},[50,12778,6107],{},[65,12780,12781],{"className":67,"code":6111,"language":69,"meta":70,"style":70},[50,12782,12783,12787,12791,12795,12799],{"__ignoreMap":70},[74,12784,12785],{"class":76,"line":77},[74,12786,6118],{},[74,12788,12789],{"class":76,"line":83},[74,12790,6123],{},[74,12792,12793],{"class":76,"line":89},[74,12794,93],{"emptyLinePlaceholder":92},[74,12796,12797],{"class":76,"line":96},[74,12798,6132],{},[74,12800,12801],{"class":76,"line":102},[74,12802,6137],{},[10,12804,6140,12805,6144],{},[50,12806,6143],{},[65,12808,12809],{"className":67,"code":6147,"language":69,"meta":70,"style":70},[50,12810,12811,12815,12819],{"__ignoreMap":70},[74,12812,12813],{"class":76,"line":77},[74,12814,6154],{},[74,12816,12817],{"class":76,"line":83},[74,12818,93],{"emptyLinePlaceholder":92},[74,12820,12821],{"class":76,"line":89},[74,12822,6163],{},[10,12824,6166,12825,1130,12827,158],{},[50,12826,6169],{},[50,12828,6172],{},[10,12830,114],{},[65,12832,12834],{"className":12833,"code":6178,"language":120,"meta":70},[118],[50,12835,6178],{"__ignoreMap":70},[10,12837,125],{},[14,12839,128],{"id":128},[130,12841,12842,12848],{},[40,12843,6189,12844,6192,12846,6196],{},[50,12845,6107],{},[50,12847,6195],{},[40,12849,12850,6201,12852,6204,12854,6207],{},[50,12851,6143],{},[50,12853,6107],{},[50,12855,6143],{},[302,12857,2671],{"id":2671},[10,12859,6212],{},[10,12861,12862],{},[26,12863],{"alt":6217,"src":6218},[10,12865,6221,12866,6224],{},[50,12867,6195],{},[14,12869,147],{"id":147},[37,12871,12872,12878],{},[40,12873,6231,12874,1130,12876,158],{},[50,12875,6107],{},[50,12877,6143],{},[40,12879,6238,12880,6242],{},[50,12881,6241],{},[14,12883,164],{"id":164},[130,12885,12886,12890],{},[40,12887,2326,12888,6252],{},[50,12889,6251],{},[40,12891,6255,12892,158],{},[50,12893,6074],{},[10,12895,178],{},[14,12897,181],{"id":181},[10,12899,6264],{},[186,12901,188],{},{"title":70,"searchDepth":83,"depth":83,"links":12903},[12904,12905,12906,12907,12908,12911,12912,12913],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":12909},[12910],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":6047,"description":6052},[199,6286,6287],{"id":6290,"title":6291,"body":12918,"category":199,"cover":200,"description":6296,"extension":201,"meta":13057,"navigation":92,"path":6462,"pinned":204,"publishedAt":205,"seo":13058,"slug":6464,"stem":6465,"summary":6466,"tags":13059,"updatedAt":205,"visible":92,"__hash__":6469},{"type":7,"value":12919,"toc":13047},[12920,12922,12924,12926,12928,12932,12934,12936,12946,12948,12950,12990,12992,12997,12999,13001,13019,13021,13029,13031,13039,13041,13043,13045],[10,12921,6296],{},[14,12923,16],{"id":16},[10,12925,6301],{},[14,12927,22],{"id":22},[10,12929,12930],{},[26,12931],{"alt":6308,"src":6309},[10,12933,6312],{},[14,12935,35],{"id":35},[37,12937,12938,12942,12944],{},[40,12939,12940,6322],{},[50,12941,6321],{},[40,12943,6325],{},[40,12945,6328],{},[14,12947,60],{"id":60},[10,12949,1547],{},[65,12951,12952],{"className":564,"code":6335,"language":566,"meta":70,"style":70},[50,12953,12954,12964,12970,12976,12986],{"__ignoreMap":70},[74,12955,12956,12958,12960,12962],{"class":76,"line":77},[74,12957,664],{"class":573},[74,12959,606],{"class":576},[74,12961,6346],{"class":609},[74,12963,6349],{"class":609},[74,12965,12966,12968],{"class":76,"line":83},[74,12967,6354],{"class":576},[74,12969,6357],{"class":609},[74,12971,12972,12974],{"class":76,"line":89},[74,12973,69],{"class":573},[74,12975,577],{"class":576},[74,12977,12978,12980,12982,12984],{"class":76,"line":96},[74,12979,69],{"class":573},[74,12981,606],{"class":576},[74,12983,610],{"class":609},[74,12985,577],{"class":576},[74,12987,12988],{"class":76,"line":102},[74,12989,6378],{"class":573},[10,12991,114],{},[65,12993,12995],{"className":12994,"code":6384,"language":120,"meta":70},[118],[50,12996,6384],{"__ignoreMap":70},[10,12998,125],{},[14,13000,128],{"id":128},[130,13002,13003,13009],{},[40,13004,13005,6398,13007,6401],{},[50,13006,6397],{},[50,13008,664],{},[40,13010,6404,13011,2149,13013,6410,13015,53,13017,6416],{},[50,13012,69],{},[50,13014,6409],{},[50,13016,6321],{},[50,13018,6415],{},[14,13020,147],{"id":147},[37,13022,13023,13025],{},[40,13024,6423],{},[40,13026,3440,13027,6428],{},[50,13028,6321],{},[14,13030,164],{"id":164},[130,13032,13033,13037],{},[40,13034,6435,13035,158],{},[50,13036,6438],{},[40,13038,6441],{},[10,13040,178],{},[14,13042,181],{"id":181},[10,13044,6448],{},[186,13046,1631],{},{"title":70,"searchDepth":83,"depth":83,"links":13048},[13049,13050,13051,13052,13053,13054,13055,13056],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":6291,"description":6296},[199,6468,234],{"id":6471,"title":6472,"body":13061,"category":199,"cover":200,"description":6477,"extension":201,"meta":13214,"navigation":92,"path":6666,"pinned":204,"publishedAt":205,"seo":13215,"slug":6668,"stem":6669,"summary":6670,"tags":13216,"updatedAt":205,"visible":92,"__hash__":6674},{"type":7,"value":13062,"toc":13204},[13063,13065,13067,13069,13071,13075,13081,13083,13099,13101,13103,13147,13149,13154,13156,13158,13170,13172,13186,13188,13196,13198,13200,13202],[10,13064,6477],{},[14,13066,16],{"id":16},[10,13068,6482],{},[14,13070,22],{"id":22},[10,13072,13073],{},[26,13074],{"alt":6489,"src":6490},[10,13076,13077,6496,13079,6499],{},[50,13078,6495],{},[50,13080,2408],{},[14,13082,35],{"id":35},[37,13084,13085,13087,13095],{},[40,13086,6506],{},[40,13088,13089,2230,13091,2230,13093,6518],{},[50,13090,6511],{},[50,13092,6514],{},[50,13094,6517],{},[40,13096,6521,13097,6525],{},[50,13098,6524],{},[14,13100,60],{"id":60},[10,13102,63],{},[65,13104,13105],{"className":67,"code":6532,"language":69,"meta":70,"style":70},[50,13106,13107,13111,13115,13119,13123,13127,13131,13135,13139,13143],{"__ignoreMap":70},[74,13108,13109],{"class":76,"line":77},[74,13110,6539],{},[74,13112,13113],{"class":76,"line":83},[74,13114,93],{"emptyLinePlaceholder":92},[74,13116,13117],{"class":76,"line":89},[74,13118,6548],{},[74,13120,13121],{"class":76,"line":96},[74,13122,6553],{},[74,13124,13125],{"class":76,"line":102},[74,13126,6558],{},[74,13128,13129],{"class":76,"line":108},[74,13130,93],{"emptyLinePlaceholder":92},[74,13132,13133],{"class":76,"line":2461},[74,13134,6567],{},[74,13136,13137],{"class":76,"line":2467},[74,13138,6572],{},[74,13140,13141],{"class":76,"line":3888},[74,13142,6577],{},[74,13144,13145],{"class":76,"line":4100},[74,13146,6582],{},[10,13148,114],{},[65,13150,13152],{"className":13151,"code":6588,"language":120,"meta":70},[118],[50,13153,6588],{"__ignoreMap":70},[10,13155,125],{},[14,13157,128],{"id":128},[130,13159,13160,13164],{},[40,13161,13162,6602],{},[50,13163,6601],{},[40,13165,152,13166,6607,13168,6610],{},[50,13167,2408],{},[50,13169,6495],{},[14,13171,147],{"id":147},[37,13173,13174,13180],{},[40,13175,3440,13176,6619,13178,6622],{},[50,13177,6495],{},[50,13179,6511],{},[40,13181,6625,13182,982,13184,6631],{},[50,13183,2408],{},[50,13185,6630],{},[14,13187,164],{"id":164},[130,13189,13190,13194],{},[40,13191,6638,13192,6642],{},[50,13193,6641],{},[40,13195,6645],{},[10,13197,178],{},[14,13199,181],{"id":181},[10,13201,6652],{},[186,13203,188],{},{"title":70,"searchDepth":83,"depth":83,"links":13205},[13206,13207,13208,13209,13210,13211,13212,13213],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":6472,"description":6477},[199,6672,6673],{"id":6676,"title":6677,"body":13218,"category":199,"cover":200,"description":6682,"extension":201,"meta":13365,"navigation":92,"path":6861,"pinned":204,"publishedAt":205,"seo":13366,"slug":6863,"stem":6864,"summary":6865,"tags":13367,"updatedAt":205,"visible":92,"__hash__":6869},{"type":7,"value":13219,"toc":13355},[13220,13222,13224,13226,13228,13232,13234,13236,13254,13256,13258,13306,13308,13313,13315,13317,13325,13327,13337,13339,13347,13349,13351,13353],[10,13221,6682],{},[14,13223,16],{"id":16},[10,13225,6687],{},[14,13227,22],{"id":22},[10,13229,13230],{},[26,13231],{"alt":6694,"src":6695},[10,13233,6698],{},[14,13235,35],{"id":35},[37,13237,13238,13242,13248],{},[40,13239,13240,6708],{},[50,13241,6707],{},[40,13243,13244,6714,13246,158],{},[50,13245,6713],{},[50,13247,6717],{},[40,13249,6720,13250,6724,13252,6728],{},[50,13251,6723],{},[50,13253,6727],{},[14,13255,60],{"id":60},[10,13257,63],{},[65,13259,13260],{"className":67,"code":6735,"language":69,"meta":70,"style":70},[50,13261,13262,13266,13270,13274,13278,13282,13286,13290,13294,13298,13302],{"__ignoreMap":70},[74,13263,13264],{"class":76,"line":77},[74,13265,6539],{},[74,13267,13268],{"class":76,"line":83},[74,13269,93],{"emptyLinePlaceholder":92},[74,13271,13272],{"class":76,"line":89},[74,13273,6750],{},[74,13275,13276],{"class":76,"line":96},[74,13277,6755],{},[74,13279,13280],{"class":76,"line":102},[74,13281,6760],{},[74,13283,13284],{"class":76,"line":108},[74,13285,6765],{},[74,13287,13288],{"class":76,"line":2461},[74,13289,93],{"emptyLinePlaceholder":92},[74,13291,13292],{"class":76,"line":2467},[74,13293,6774],{},[74,13295,13296],{"class":76,"line":3888},[74,13297,6779],{},[74,13299,13300],{"class":76,"line":4100},[74,13301,6784],{},[74,13303,13304],{"class":76,"line":5765},[74,13305,6789],{},[10,13307,114],{},[65,13309,13311],{"className":13310,"code":6795,"language":120,"meta":70},[118],[50,13312,6795],{"__ignoreMap":70},[10,13314,125],{},[14,13316,128],{"id":128},[130,13318,13319,13323],{},[40,13320,6806,13321,6809],{},[50,13322,6723],{},[40,13324,6812],{},[14,13326,147],{"id":147},[37,13328,13329,13333],{},[40,13330,152,13331,6821],{},[50,13332,6707],{},[40,13334,6824,13335,158],{},[50,13336,6827],{},[14,13338,164],{"id":164},[130,13340,13341,13343],{},[40,13342,6834],{},[40,13344,6837,13345,6840],{},[50,13346,310],{},[10,13348,178],{},[14,13350,181],{"id":181},[10,13352,6847],{},[186,13354,188],{},{"title":70,"searchDepth":83,"depth":83,"links":13356},[13357,13358,13359,13360,13361,13362,13363,13364],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":6677,"description":6682},[199,6867,6868],{"id":6871,"title":6872,"body":13369,"category":199,"cover":200,"description":6877,"extension":201,"meta":13512,"navigation":92,"path":7045,"pinned":204,"publishedAt":205,"seo":13513,"slug":7047,"stem":7048,"summary":7049,"tags":13514,"updatedAt":205,"visible":92,"__hash__":7053},{"type":7,"value":13370,"toc":13502},[13371,13373,13375,13377,13379,13383,13389,13391,13401,13403,13405,13457,13459,13464,13466,13468,13478,13480,13486,13488,13494,13496,13498,13500],[10,13372,6877],{},[14,13374,16],{"id":16},[10,13376,6882],{},[14,13378,22],{"id":22},[10,13380,13381],{},[26,13382],{"alt":6889,"src":6890},[10,13384,13385,6896,13387,6900],{},[50,13386,6895],{},[50,13388,6899],{},[14,13390,35],{"id":35},[37,13392,13393,13395,13399],{},[40,13394,6907],{},[40,13396,13397,6913],{},[50,13398,6912],{},[40,13400,6916],{},[14,13402,60],{"id":60},[10,13404,63],{},[65,13406,13407],{"className":67,"code":6923,"language":69,"meta":70,"style":70},[50,13408,13409,13413,13417,13421,13425,13429,13433,13437,13441,13445,13449,13453],{"__ignoreMap":70},[74,13410,13411],{"class":76,"line":77},[74,13412,6930],{},[74,13414,13415],{"class":76,"line":83},[74,13416,93],{"emptyLinePlaceholder":92},[74,13418,13419],{"class":76,"line":89},[74,13420,6939],{},[74,13422,13423],{"class":76,"line":96},[74,13424,93],{"emptyLinePlaceholder":92},[74,13426,13427],{"class":76,"line":102},[74,13428,6948],{},[74,13430,13431],{"class":76,"line":108},[74,13432,6953],{},[74,13434,13435],{"class":76,"line":2461},[74,13436,6765],{},[74,13438,13439],{"class":76,"line":2467},[74,13440,93],{"emptyLinePlaceholder":92},[74,13442,13443],{"class":76,"line":3888},[74,13444,6966],{},[74,13446,13447],{"class":76,"line":4100},[74,13448,6971],{},[74,13450,13451],{"class":76,"line":5765},[74,13452,6784],{},[74,13454,13455],{"class":76,"line":5770},[74,13456,6980],{},[10,13458,114],{},[65,13460,13462],{"className":13461,"code":6986,"language":120,"meta":70},[118],[50,13463,6986],{"__ignoreMap":70},[10,13465,125],{},[14,13467,128],{"id":128},[130,13469,13470,13474],{},[40,13471,13472,6999],{},[50,13473,6895],{},[40,13475,13476,7004],{},[50,13477,6899],{},[14,13479,147],{"id":147},[37,13481,13482,13484],{},[40,13483,7011],{},[40,13485,7014],{},[14,13487,164],{"id":164},[130,13489,13490,13492],{},[40,13491,7021],{},[40,13493,7024],{},[10,13495,178],{},[14,13497,181],{"id":181},[10,13499,7031],{},[186,13501,188],{},{"title":70,"searchDepth":83,"depth":83,"links":13503},[13504,13505,13506,13507,13508,13509,13510,13511],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":6872,"description":6877},[199,7051,7052],{"id":7055,"title":7056,"body":13516,"category":199,"cover":200,"description":7061,"extension":201,"meta":13667,"navigation":92,"path":7246,"pinned":204,"publishedAt":205,"seo":13668,"slug":7248,"stem":7249,"summary":7250,"tags":13669,"updatedAt":205,"visible":92,"__hash__":7254},{"type":7,"value":13517,"toc":13657},[13518,13520,13522,13524,13526,13530,13534,13536,13550,13552,13554,13606,13608,13613,13615,13617,13629,13631,13641,13643,13649,13651,13653,13655],[10,13519,7061],{},[14,13521,16],{"id":16},[10,13523,7066],{},[14,13525,22],{"id":22},[10,13527,13528],{},[26,13529],{"alt":7073,"src":7074},[10,13531,13532,7080],{},[50,13533,7079],{},[14,13535,35],{"id":35},[37,13537,13538,13544,13548],{},[40,13539,152,13540,7090,13542,7094],{},[50,13541,7089],{},[50,13543,7093],{},[40,13545,7097,13546,7101],{},[50,13547,7100],{},[40,13549,7104],{},[14,13551,60],{"id":60},[10,13553,63],{},[65,13555,13556],{"className":67,"code":7111,"language":69,"meta":70,"style":70},[50,13557,13558,13562,13566,13570,13574,13578,13582,13586,13590,13594,13598,13602],{"__ignoreMap":70},[74,13559,13560],{"class":76,"line":77},[74,13561,7118],{},[74,13563,13564],{"class":76,"line":83},[74,13565,93],{"emptyLinePlaceholder":92},[74,13567,13568],{"class":76,"line":89},[74,13569,7127],{},[74,13571,13572],{"class":76,"line":96},[74,13573,7132],{},[74,13575,13576],{"class":76,"line":102},[74,13577,7137],{},[74,13579,13580],{"class":76,"line":108},[74,13581,7142],{},[74,13583,13584],{"class":76,"line":2461},[74,13585,7147],{},[74,13587,13588],{"class":76,"line":2467},[74,13589,93],{"emptyLinePlaceholder":92},[74,13591,13592],{"class":76,"line":3888},[74,13593,7156],{},[74,13595,13596],{"class":76,"line":4100},[74,13597,7161],{},[74,13599,13600],{"class":76,"line":5765},[74,13601,7166],{},[74,13603,13604],{"class":76,"line":5770},[74,13605,7171],{},[10,13607,114],{},[65,13609,13611],{"className":13610,"code":7177,"language":120,"meta":70},[118],[50,13612,7177],{"__ignoreMap":70},[10,13614,125],{},[14,13616,128],{"id":128},[130,13618,13619,13625],{},[40,13620,13621,7191,13623,7194],{},[50,13622,7190],{},[50,13624,7100],{},[40,13626,13627,7199],{},[50,13628,7079],{},[14,13630,147],{"id":147},[37,13632,13633,13635],{},[40,13634,7206],{},[40,13636,7209,13637,7212,13639,7215],{},[50,13638,7089],{},[50,13640,7093],{},[14,13642,164],{"id":164},[130,13644,13645,13647],{},[40,13646,7222],{},[40,13648,7225],{},[10,13650,178],{},[14,13652,181],{"id":181},[10,13654,7232],{},[186,13656,188],{},{"title":70,"searchDepth":83,"depth":83,"links":13658},[13659,13660,13661,13662,13663,13664,13665,13666],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":7056,"description":7061},[199,7252,7253],{"id":7256,"title":7257,"body":13671,"category":199,"cover":200,"description":7262,"extension":201,"meta":13885,"navigation":92,"path":7536,"pinned":204,"publishedAt":205,"seo":13886,"slug":7538,"stem":7539,"summary":7540,"tags":13887,"updatedAt":205,"visible":92,"__hash__":7544},{"type":7,"value":13672,"toc":13872},[13673,13675,13677,13679,13681,13685,13691,13693,13705,13707,13709,13769,13771,13776,13778,13780,13798,13800,13808,13812,13820,13822,13826,13830,13836,13838,13848,13850,13864,13866,13868,13870],[10,13674,7262],{},[14,13676,16],{"id":16},[10,13678,7267],{},[14,13680,22],{"id":22},[10,13682,13683],{},[26,13684],{"alt":7274,"src":7275},[10,13686,7278,13687,7282,13689,7286],{},[50,13688,7281],{},[50,13690,7285],{},[14,13692,35],{"id":35},[37,13694,13695,13699,13703],{},[40,13696,7293,13697,7296],{},[50,13698,7281],{},[40,13700,13701,7302],{},[50,13702,7301],{},[40,13704,7305],{},[14,13706,60],{"id":60},[10,13708,63],{},[65,13710,13711],{"className":67,"code":7312,"language":69,"meta":70,"style":70},[50,13712,13713,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757,13761,13765],{"__ignoreMap":70},[74,13714,13715],{"class":76,"line":77},[74,13716,7319],{},[74,13718,13719],{"class":76,"line":83},[74,13720,7324],{},[74,13722,13723],{"class":76,"line":89},[74,13724,7329],{},[74,13726,13727],{"class":76,"line":96},[74,13728,7334],{},[74,13730,13731],{"class":76,"line":102},[74,13732,7339],{},[74,13734,13735],{"class":76,"line":108},[74,13736,93],{"emptyLinePlaceholder":92},[74,13738,13739],{"class":76,"line":2461},[74,13740,7348],{},[74,13742,13743],{"class":76,"line":2467},[74,13744,7353],{},[74,13746,13747],{"class":76,"line":3888},[74,13748,7358],{},[74,13750,13751],{"class":76,"line":4100},[74,13752,7363],{},[74,13754,13755],{"class":76,"line":5765},[74,13756,1119],{},[74,13758,13759],{"class":76,"line":5770},[74,13760,7372],{},[74,13762,13763],{"class":76,"line":7375},[74,13764,7378],{},[74,13766,13767],{"class":76,"line":7381},[74,13768,7384],{},[10,13770,114],{},[65,13772,13774],{"className":13773,"code":7390,"language":120,"meta":70},[118],[50,13775,7390],{"__ignoreMap":70},[10,13777,125],{},[14,13779,128],{"id":128},[130,13781,13782,13790],{},[40,13783,13784,7403,13786,7406,13788,7410],{},[50,13785,3010],{},[50,13787,7301],{},[50,13789,7409],{},[40,13791,7413,13792,7416,13794,7419,13796,158],{},[50,13793,7281],{},[50,13795,1133],{},[50,13797,7285],{},[302,13799,2671],{"id":2671},[10,13801,13802,2230,13804,1130,13806,7432],{},[50,13803,7281],{},[50,13805,1133],{},[50,13807,7285],{},[10,13809,13810],{},[26,13811],{"alt":7437,"src":7438},[10,13813,13814,7443,13816,7446,13818,7449],{},[50,13815,7281],{},[50,13817,1133],{},[50,13819,7285],{},[302,13821,2671],{"id":4155},[10,13823,13824,7457],{},[50,13825,7456],{},[10,13827,13828],{},[26,13829],{"alt":7462,"src":7463},[10,13831,7466,13832,7469,13834,7472],{},[50,13833,7456],{},[50,13835,1133],{},[14,13837,147],{"id":147},[37,13839,13840,13844],{},[40,13841,7479,13842,7483],{},[50,13843,7482],{},[40,13845,7486,13846,7489],{},[50,13847,7456],{},[14,13849,164],{"id":164},[130,13851,13852,13860],{},[40,13853,7496,13854,7500,13856,1130,13858,158],{},[50,13855,7499],{},[50,13857,7503],{},[50,13859,7506],{},[40,13861,7509,13862,7512],{},[50,13863,6717],{},[10,13865,178],{},[14,13867,181],{"id":181},[10,13869,7519],{},[186,13871,188],{},{"title":70,"searchDepth":83,"depth":83,"links":13873},[13874,13875,13876,13877,13878,13882,13883,13884],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":13879},[13880,13881],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":7257,"description":7262},[199,7542,7543],{"id":7546,"title":7547,"body":13889,"category":199,"cover":200,"description":7552,"extension":201,"meta":14040,"navigation":92,"path":7729,"pinned":204,"publishedAt":205,"seo":14041,"slug":7731,"stem":7732,"summary":7733,"tags":14042,"updatedAt":205,"visible":92,"__hash__":7736},{"type":7,"value":13890,"toc":14030},[13891,13893,13895,13897,13899,13903,13907,13909,13921,13923,13925,13973,13975,13980,13982,13984,13994,13996,14006,14008,14022,14024,14026,14028],[10,13892,7552],{},[14,13894,16],{"id":16},[10,13896,7557],{},[14,13898,22],{"id":22},[10,13900,13901],{},[26,13902],{"alt":7564,"src":7565},[10,13904,7568,13905,7571],{},[50,13906,6727],{},[14,13908,35],{"id":35},[37,13910,13911,13915,13919],{},[40,13912,13913,7580],{},[50,13914,6727],{},[40,13916,13917,7586],{},[50,13918,7585],{},[40,13920,7589],{},[14,13922,60],{"id":60},[10,13924,63],{},[65,13926,13927],{"className":67,"code":7596,"language":69,"meta":70,"style":70},[50,13928,13929,13933,13937,13941,13945,13949,13953,13957,13961,13965,13969],{"__ignoreMap":70},[74,13930,13931],{"class":76,"line":77},[74,13932,6539],{},[74,13934,13935],{"class":76,"line":83},[74,13936,93],{"emptyLinePlaceholder":92},[74,13938,13939],{"class":76,"line":89},[74,13940,6750],{},[74,13942,13943],{"class":76,"line":96},[74,13944,93],{"emptyLinePlaceholder":92},[74,13946,13947],{"class":76,"line":102},[74,13948,7619],{},[74,13950,13951],{"class":76,"line":108},[74,13952,7624],{},[74,13954,13955],{"class":76,"line":2461},[74,13956,93],{"emptyLinePlaceholder":92},[74,13958,13959],{"class":76,"line":2467},[74,13960,7633],{},[74,13962,13963],{"class":76,"line":3888},[74,13964,7638],{},[74,13966,13967],{"class":76,"line":4100},[74,13968,93],{"emptyLinePlaceholder":92},[74,13970,13971],{"class":76,"line":5765},[74,13972,7647],{},[10,13974,114],{},[65,13976,13978],{"className":13977,"code":7653,"language":120,"meta":70},[118],[50,13979,7653],{"__ignoreMap":70},[10,13981,125],{},[14,13983,128],{"id":128},[130,13985,13986,13992],{},[40,13987,7568,13988,7666,13990,158],{},[50,13989,6727],{},[50,13991,7669],{},[40,13993,7672],{},[14,13995,147],{"id":147},[37,13997,13998,14002],{},[40,13999,4723,14000,7681],{},[50,14001,6727],{},[40,14003,7684,14004,7687],{},[50,14005,6727],{},[14,14007,164],{"id":164},[130,14009,14010,14016],{},[40,14011,7694,14012,7698,14014,158],{},[50,14013,7697],{},[50,14015,6727],{},[40,14017,4723,14018,7705,14020,158],{},[50,14019,6727],{},[50,14021,7708],{},[10,14023,178],{},[14,14025,181],{"id":181},[10,14027,7715],{},[186,14029,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14031},[14032,14033,14034,14035,14036,14037,14038,14039],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":7547,"description":7552},[199,6727,7735],{"id":7738,"title":7739,"body":14044,"category":199,"cover":200,"description":7744,"extension":201,"meta":14215,"navigation":92,"path":7957,"pinned":204,"publishedAt":205,"seo":14216,"slug":7959,"stem":7960,"summary":7961,"tags":14217,"updatedAt":205,"visible":92,"__hash__":7965},{"type":7,"value":14045,"toc":14203},[14046,14048,14050,14052,14054,14058,14060,14062,14074,14076,14078,14134,14136,14141,14143,14145,14161,14163,14165,14169,14175,14177,14185,14187,14195,14197,14199,14201],[10,14047,7744],{},[14,14049,16],{"id":16},[10,14051,7749],{},[14,14053,22],{"id":22},[10,14055,14056],{},[26,14057],{"alt":7756,"src":7757},[10,14059,7760],{},[14,14061,35],{"id":35},[37,14063,14064,14068,14072],{},[40,14065,14066,7770],{},[50,14067,7769],{},[40,14069,14070,7776],{},[50,14071,7775],{},[40,14073,7779],{},[14,14075,60],{"id":60},[10,14077,63],{},[65,14079,14080],{"className":67,"code":7786,"language":69,"meta":70,"style":70},[50,14081,14082,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122,14126,14130],{"__ignoreMap":70},[74,14083,14084],{"class":76,"line":77},[74,14085,7793],{},[74,14087,14088],{"class":76,"line":83},[74,14089,7798],{},[74,14091,14092],{"class":76,"line":89},[74,14093,7803],{},[74,14095,14096],{"class":76,"line":96},[74,14097,7808],{},[74,14099,14100],{"class":76,"line":102},[74,14101,93],{"emptyLinePlaceholder":92},[74,14103,14104],{"class":76,"line":108},[74,14105,7817],{},[74,14107,14108],{"class":76,"line":2461},[74,14109,7822],{},[74,14111,14112],{"class":76,"line":2467},[74,14113,7827],{},[74,14115,14116],{"class":76,"line":3888},[74,14117,7832],{},[74,14119,14120],{"class":76,"line":4100},[74,14121,93],{"emptyLinePlaceholder":92},[74,14123,14124],{"class":76,"line":5765},[74,14125,7841],{},[74,14127,14128],{"class":76,"line":5770},[74,14129,7846],{},[74,14131,14132],{"class":76,"line":7375},[74,14133,7851],{},[10,14135,114],{},[65,14137,14139],{"className":14138,"code":7857,"language":120,"meta":70},[118],[50,14140,7857],{"__ignoreMap":70},[10,14142,125],{},[14,14144,128],{"id":128},[130,14146,14147,14153],{},[40,14148,7868,14149,7872,14151,7875],{},[50,14150,7871],{},[50,14152,7775],{},[40,14154,14155,7881,14157,7885,14159,7888],{},[50,14156,7880],{},[50,14158,7884],{},[50,14160,7769],{},[302,14162,2671],{"id":2671},[10,14164,7893],{},[10,14166,14167],{},[26,14168],{"alt":7898,"src":7899},[10,14170,7902,14171,1130,14173,7908],{},[50,14172,4520],{},[50,14174,7907],{},[14,14176,147],{"id":147},[37,14178,14179,14183],{},[40,14180,7915,14181,7918],{},[50,14182,7769],{},[40,14184,7921],{},[14,14186,164],{"id":164},[130,14188,14189,14193],{},[40,14190,5233,14191,7931],{},[50,14192,7930],{},[40,14194,7934],{},[10,14196,178],{},[14,14198,181],{"id":181},[10,14200,7941],{},[186,14202,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14204},[14205,14206,14207,14208,14209,14212,14213,14214],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":14210},[14211],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":7739,"description":7744},[199,7963,7964],{"id":7967,"title":7968,"body":14219,"category":199,"cover":200,"description":7973,"extension":201,"meta":14366,"navigation":92,"path":8152,"pinned":204,"publishedAt":205,"seo":14367,"slug":8154,"stem":8155,"summary":8156,"tags":14368,"updatedAt":205,"visible":92,"__hash__":8160},{"type":7,"value":14220,"toc":14356},[14221,14223,14225,14227,14229,14233,14235,14237,14245,14247,14249,14305,14307,14312,14314,14316,14328,14330,14336,14338,14348,14350,14352,14354],[10,14222,7973],{},[14,14224,16],{"id":16},[10,14226,7978],{},[14,14228,22],{"id":22},[10,14230,14231],{},[26,14232],{"alt":7985,"src":7986},[10,14234,7989],{},[14,14236,35],{"id":35},[37,14238,14239,14241,14243],{},[40,14240,7996],{},[40,14242,7999],{},[40,14244,8002],{},[14,14246,60],{"id":60},[10,14248,63],{},[65,14250,14251],{"className":67,"code":8009,"language":69,"meta":70,"style":70},[50,14252,14253,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293,14297,14301],{"__ignoreMap":70},[74,14254,14255],{"class":76,"line":77},[74,14256,8016],{},[74,14258,14259],{"class":76,"line":83},[74,14260,8021],{},[74,14262,14263],{"class":76,"line":89},[74,14264,8026],{},[74,14266,14267],{"class":76,"line":96},[74,14268,93],{"emptyLinePlaceholder":92},[74,14270,14271],{"class":76,"line":102},[74,14272,8035],{},[74,14274,14275],{"class":76,"line":108},[74,14276,8040],{},[74,14278,14279],{"class":76,"line":2461},[74,14280,8045],{},[74,14282,14283],{"class":76,"line":2467},[74,14284,93],{"emptyLinePlaceholder":92},[74,14286,14287],{"class":76,"line":3888},[74,14288,8054],{},[74,14290,14291],{"class":76,"line":4100},[74,14292,8059],{},[74,14294,14295],{"class":76,"line":5765},[74,14296,93],{"emptyLinePlaceholder":92},[74,14298,14299],{"class":76,"line":5770},[74,14300,8068],{},[74,14302,14303],{"class":76,"line":7375},[74,14304,8073],{},[10,14306,114],{},[65,14308,14310],{"className":14309,"code":8079,"language":120,"meta":70},[118],[50,14311,8079],{"__ignoreMap":70},[10,14313,125],{},[14,14315,128],{"id":128},[130,14317,14318,14324],{},[40,14319,14320,8093,14322,8097],{},[50,14321,8092],{},[50,14323,8096],{},[40,14325,8100,14326,8104],{},[50,14327,8103],{},[14,14329,147],{"id":147},[37,14331,14332,14334],{},[40,14333,8111],{},[40,14335,8114],{},[14,14337,164],{"id":164},[130,14339,14340,14346],{},[40,14341,8121,14342,8125,14344,158],{},[50,14343,8124],{},[50,14345,8128],{},[40,14347,8131],{},[10,14349,178],{},[14,14351,181],{"id":181},[10,14353,8138],{},[186,14355,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14357},[14358,14359,14360,14361,14362,14363,14364,14365],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":7968,"description":7973},[199,8158,8159],{"id":8162,"title":8163,"body":14370,"category":199,"cover":200,"description":8168,"extension":201,"meta":14533,"navigation":92,"path":8372,"pinned":204,"publishedAt":205,"seo":14534,"slug":8374,"stem":8375,"summary":8376,"tags":14535,"updatedAt":205,"visible":92,"__hash__":8380},{"type":7,"value":14371,"toc":14521},[14372,14374,14376,14378,14380,14384,14388,14390,14406,14408,14410,14454,14456,14461,14463,14465,14479,14481,14485,14489,14493,14495,14501,14503,14513,14515,14517,14519],[10,14373,8168],{},[14,14375,16],{"id":16},[10,14377,8173],{},[14,14379,22],{"id":22},[10,14381,14382],{},[26,14383],{"alt":8180,"src":8181},[10,14385,8184,14386,8188],{},[50,14387,8187],{},[14,14389,35],{"id":35},[37,14391,14392,14398,14404],{},[40,14393,14394,8198,14396,8202],{},[50,14395,8197],{},[50,14397,8201],{},[40,14399,8205,14400,8209,14402,8212],{},[50,14401,8208],{},[50,14403,4274],{},[40,14405,8215],{},[14,14407,60],{"id":60},[10,14409,63],{},[65,14411,14412],{"className":67,"code":8222,"language":69,"meta":70,"style":70},[50,14413,14414,14418,14422,14426,14430,14434,14438,14442,14446,14450],{"__ignoreMap":70},[74,14415,14416],{"class":76,"line":77},[74,14417,8229],{},[74,14419,14420],{"class":76,"line":83},[74,14421,8234],{},[74,14423,14424],{"class":76,"line":89},[74,14425,8239],{},[74,14427,14428],{"class":76,"line":96},[74,14429,8244],{},[74,14431,14432],{"class":76,"line":102},[74,14433,8249],{},[74,14435,14436],{"class":76,"line":108},[74,14437,93],{"emptyLinePlaceholder":92},[74,14439,14440],{"class":76,"line":2461},[74,14441,8258],{},[74,14443,14444],{"class":76,"line":2467},[74,14445,8263],{},[74,14447,14448],{"class":76,"line":3888},[74,14449,8263],{},[74,14451,14452],{"class":76,"line":4100},[74,14453,8263],{},[10,14455,114],{},[65,14457,14459],{"className":14458,"code":8277,"language":120,"meta":70},[118],[50,14460,8277],{"__ignoreMap":70},[10,14462,125],{},[14,14464,128],{"id":128},[130,14466,14467,14471],{},[40,14468,7868,14469,8291],{},[50,14470,8290],{},[40,14472,8294,14473,8297,14475,8300,14477,8304],{},[50,14474,8201],{},[50,14476,8187],{},[50,14478,8303],{},[302,14480,2671],{"id":2671},[10,14482,8309,14483,8312],{},[50,14484,8201],{},[10,14486,14487],{},[26,14488],{"alt":8317,"src":8318},[10,14490,8321,14491,8324],{},[50,14492,8187],{},[14,14494,147],{"id":147},[37,14496,14497,14499],{},[40,14498,8331],{},[40,14500,8334],{},[14,14502,164],{"id":164},[130,14504,14505,14507],{},[40,14506,8341],{},[40,14508,3946,14509,8346,14511,8349],{},[50,14510,4274],{},[50,14512,8201],{},[10,14514,178],{},[14,14516,181],{"id":181},[10,14518,8356],{},[186,14520,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14522},[14523,14524,14525,14526,14527,14530,14531,14532],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":14528},[14529],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":8163,"description":8168},[199,8378,8379],{"id":8382,"title":8383,"body":14537,"category":199,"cover":200,"description":8388,"extension":201,"meta":14720,"navigation":92,"path":8613,"pinned":204,"publishedAt":205,"seo":14721,"slug":8615,"stem":8616,"summary":8617,"tags":14722,"updatedAt":205,"visible":92,"__hash__":8620},{"type":7,"value":14538,"toc":14708},[14539,14541,14543,14545,14547,14551,14553,14555,14569,14571,14573,14641,14643,14648,14650,14652,14666,14668,14670,14674,14680,14682,14690,14692,14700,14702,14704,14706],[10,14540,8388],{},[14,14542,16],{"id":16},[10,14544,8393],{},[14,14546,22],{"id":22},[10,14548,14549],{},[26,14550],{"alt":8400,"src":8401},[10,14552,8404],{},[14,14554,35],{"id":35},[37,14556,14557,14563,14565],{},[40,14558,14559,8414,14561,158],{},[50,14560,8413],{},[50,14562,8417],{},[40,14564,8420],{},[40,14566,14567,8426],{},[50,14568,8425],{},[14,14570,60],{"id":60},[10,14572,63],{},[65,14574,14575],{"className":67,"code":8433,"language":69,"meta":70,"style":70},[50,14576,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637],{"__ignoreMap":70},[74,14578,14579],{"class":76,"line":77},[74,14580,8440],{},[74,14582,14583],{"class":76,"line":83},[74,14584,93],{"emptyLinePlaceholder":92},[74,14586,14587],{"class":76,"line":89},[74,14588,8449],{},[74,14590,14591],{"class":76,"line":96},[74,14592,8454],{},[74,14594,14595],{"class":76,"line":102},[74,14596,8459],{},[74,14598,14599],{"class":76,"line":108},[74,14600,8464],{},[74,14602,14603],{"class":76,"line":2461},[74,14604,8469],{},[74,14606,14607],{"class":76,"line":2467},[74,14608,8474],{},[74,14610,14611],{"class":76,"line":3888},[74,14612,8479],{},[74,14614,14615],{"class":76,"line":4100},[74,14616,8484],{},[74,14618,14619],{"class":76,"line":5765},[74,14620,93],{"emptyLinePlaceholder":92},[74,14622,14623],{"class":76,"line":5770},[74,14624,8493],{},[74,14626,14627],{"class":76,"line":7375},[74,14628,6118],{},[74,14630,14631],{"class":76,"line":7381},[74,14632,6123],{},[74,14634,14635],{"class":76,"line":8504},[74,14636,93],{"emptyLinePlaceholder":92},[74,14638,14639],{"class":76,"line":8509},[74,14640,8512],{},[10,14642,114],{},[65,14644,14646],{"className":14645,"code":8518,"language":120,"meta":70},[118],[50,14647,8518],{"__ignoreMap":70},[10,14649,125],{},[14,14651,128],{"id":128},[130,14653,14654,14664],{},[40,14655,8529,14656,8533,14658,8537,14660,8541,14662,158],{},[50,14657,8532],{},[50,14659,8536],{},[50,14661,8540],{},[50,14663,8532],{},[40,14665,8546],{},[302,14667,2671],{"id":2671},[10,14669,8551],{},[10,14671,14672],{},[26,14673],{"alt":8556,"src":8557},[10,14675,14676,8562,14678,158],{},[50,14677,8413],{},[50,14679,8417],{},[14,14681,147],{"id":147},[37,14683,14684,14688],{},[40,14685,8571,14686,158],{},[50,14687,5316],{},[40,14689,8576],{},[14,14691,164],{"id":164},[130,14693,14694,14696],{},[40,14695,8583],{},[40,14697,8586,14698,8590],{},[50,14699,8589],{},[10,14701,178],{},[14,14703,181],{"id":181},[10,14705,8597],{},[186,14707,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14709},[14710,14711,14712,14713,14714,14717,14718,14719],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":14715},[14716],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":8383,"description":8388},[199,8619,5267],{"id":8622,"title":8623,"body":14724,"category":199,"cover":200,"description":8628,"extension":201,"meta":14883,"navigation":92,"path":8816,"pinned":204,"publishedAt":205,"seo":14884,"slug":8818,"stem":8819,"summary":8820,"tags":14885,"updatedAt":205,"visible":92,"__hash__":8824},{"type":7,"value":14725,"toc":14871},[14726,14728,14730,14732,14734,14738,14740,14742,14750,14752,14754,14818,14820,14825,14827,14829,14837,14839,14841,14845,14847,14849,14855,14857,14863,14865,14867,14869],[10,14727,8628],{},[14,14729,16],{"id":16},[10,14731,8633],{},[14,14733,22],{"id":22},[10,14735,14736],{},[26,14737],{"alt":8640,"src":8641},[10,14739,8644],{},[14,14741,35],{"id":35},[37,14743,14744,14746,14748],{},[40,14745,8651],{},[40,14747,8654],{},[40,14749,8657],{},[14,14751,60],{"id":60},[10,14753,63],{},[65,14755,14756],{"className":67,"code":8664,"language":69,"meta":70,"style":70},[50,14757,14758,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814],{"__ignoreMap":70},[74,14759,14760],{"class":76,"line":77},[74,14761,8671],{},[74,14763,14764],{"class":76,"line":83},[74,14765,8676],{},[74,14767,14768],{"class":76,"line":89},[74,14769,93],{"emptyLinePlaceholder":92},[74,14771,14772],{"class":76,"line":96},[74,14773,8685],{},[74,14775,14776],{"class":76,"line":102},[74,14777,93],{"emptyLinePlaceholder":92},[74,14779,14780],{"class":76,"line":108},[74,14781,8694],{},[74,14783,14784],{"class":76,"line":2461},[74,14785,8699],{},[74,14787,14788],{"class":76,"line":2467},[74,14789,8704],{},[74,14791,14792],{"class":76,"line":3888},[74,14793,93],{"emptyLinePlaceholder":92},[74,14795,14796],{"class":76,"line":4100},[74,14797,8713],{},[74,14799,14800],{"class":76,"line":5765},[74,14801,8718],{},[74,14803,14804],{"class":76,"line":5770},[74,14805,8723],{},[74,14807,14808],{"class":76,"line":7375},[74,14809,93],{"emptyLinePlaceholder":92},[74,14811,14812],{"class":76,"line":7381},[74,14813,6132],{},[74,14815,14816],{"class":76,"line":8504},[74,14817,8736],{},[10,14819,114],{},[65,14821,14823],{"className":14822,"code":8742,"language":120,"meta":70},[118],[50,14824,8742],{"__ignoreMap":70},[10,14826,125],{},[14,14828,128],{"id":128},[130,14830,14831,14835],{},[40,14832,14833,8756],{},[50,14834,8755],{},[40,14836,8759],{},[302,14838,2671],{"id":2671},[10,14840,8764],{},[10,14842,14843],{},[26,14844],{"alt":8769,"src":8770},[10,14846,8773],{},[14,14848,147],{"id":147},[37,14850,14851,14853],{},[40,14852,8780],{},[40,14854,8783],{},[14,14856,164],{"id":164},[130,14858,14859,14861],{},[40,14860,8790],{},[40,14862,8793],{},[10,14864,178],{},[14,14866,181],{"id":181},[10,14868,8800],{},[186,14870,188],{},{"title":70,"searchDepth":83,"depth":83,"links":14872},[14873,14874,14875,14876,14877,14880,14881,14882],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":14878},[14879],{"id":2671,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":8623,"description":8628},[199,8822,8823],{"id":8826,"title":8827,"body":14887,"category":199,"cover":200,"description":8832,"extension":201,"meta":15125,"navigation":92,"path":9133,"pinned":204,"publishedAt":205,"seo":15126,"slug":9135,"stem":9136,"summary":9137,"tags":15127,"updatedAt":205,"visible":92,"__hash__":9141},{"type":7,"value":14888,"toc":15112},[14889,14891,14893,14895,14897,14901,14903,14905,14915,14917,14919,15035,15037,15042,15044,15046,15056,15058,15060,15064,15066,15068,15070,15074,15078,15080,15088,15090,15104,15106,15108,15110],[10,14890,8832],{},[14,14892,16],{"id":16},[10,14894,8837],{},[14,14896,22],{"id":22},[10,14898,14899],{},[26,14900],{"alt":8844,"src":8845},[10,14902,8848],{},[14,14904,35],{"id":35},[37,14906,14907,14909,14911],{},[40,14908,8855],{},[40,14910,8858],{},[40,14912,8861,14913,8865],{},[50,14914,8864],{},[14,14916,60],{"id":60},[10,14918,63],{},[65,14920,14921],{"className":67,"code":8872,"language":69,"meta":70,"style":70},[50,14922,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031],{"__ignoreMap":70},[74,14924,14925],{"class":76,"line":77},[74,14926,6930],{},[74,14928,14929],{"class":76,"line":83},[74,14930,6539],{},[74,14932,14933],{"class":76,"line":89},[74,14934,93],{"emptyLinePlaceholder":92},[74,14936,14937],{"class":76,"line":96},[74,14938,8891],{},[74,14940,14941],{"class":76,"line":102},[74,14942,8896],{},[74,14944,14945],{"class":76,"line":108},[74,14946,8901],{},[74,14948,14949],{"class":76,"line":2461},[74,14950,8906],{},[74,14952,14953],{"class":76,"line":2467},[74,14954,93],{"emptyLinePlaceholder":92},[74,14956,14957],{"class":76,"line":3888},[74,14958,8915],{},[74,14960,14961],{"class":76,"line":4100},[74,14962,8920],{},[74,14964,14965],{"class":76,"line":5765},[74,14966,8925],{},[74,14968,14969],{"class":76,"line":5770},[74,14970,8930],{},[74,14972,14973],{"class":76,"line":7375},[74,14974,8935],{},[74,14976,14977],{"class":76,"line":7381},[74,14978,93],{"emptyLinePlaceholder":92},[74,14980,14981],{"class":76,"line":8504},[74,14982,8944],{},[74,14984,14985],{"class":76,"line":8509},[74,14986,8949],{},[74,14988,14989],{"class":76,"line":8952},[74,14990,8955],{},[74,14992,14993],{"class":76,"line":8958},[74,14994,93],{"emptyLinePlaceholder":92},[74,14996,14997],{"class":76,"line":8963},[74,14998,8966],{},[74,15000,15001],{"class":76,"line":8969},[74,15002,93],{"emptyLinePlaceholder":92},[74,15004,15005],{"class":76,"line":8974},[74,15006,7348],{},[74,15008,15009],{"class":76,"line":8979},[74,15010,8982],{},[74,15012,15013],{"class":76,"line":8985},[74,15014,8988],{},[74,15016,15017],{"class":76,"line":8991},[74,15018,8994],{},[74,15020,15021],{"class":76,"line":8997},[74,15022,7358],{},[74,15024,15025],{"class":76,"line":9002},[74,15026,9005],{},[74,15028,15029],{"class":76,"line":9008},[74,15030,1119],{},[74,15032,15033],{"class":76,"line":9013},[74,15034,9016],{},[10,15036,114],{},[65,15038,15040],{"className":15039,"code":9022,"language":120,"meta":70},[118],[50,15041,9022],{"__ignoreMap":70},[10,15043,125],{},[14,15045,128],{"id":128},[130,15047,15048,15052],{},[40,15049,9033,15050,9036],{},[50,15051,8864],{},[40,15053,15054,9041],{},[50,15055,8096],{},[302,15057,2671],{"id":2671},[10,15059,9046],{},[10,15061,15062],{},[26,15063],{"alt":9051,"src":9052},[10,15065,9055],{},[302,15067,2671],{"id":4155},[10,15069,9060],{},[10,15071,15072],{},[26,15073],{"alt":9065,"src":9066},[10,15075,9069,15076,9073],{},[50,15077,9072],{},[14,15079,147],{"id":147},[37,15081,15082,15084],{},[40,15083,9080],{},[40,15085,9083,15086,9086],{},[50,15087,9072],{},[14,15089,164],{"id":164},[130,15091,15092,15096,15098],{},[40,15093,9093,15094,9096],{},[50,15095,9072],{},[40,15097,9099],{},[40,15099,9102,15100,9106,15102,9109],{},[50,15101,9105],{},[50,15103,6074],{},[10,15105,178],{},[14,15107,181],{"id":181},[10,15109,9116],{},[186,15111,188],{},{"title":70,"searchDepth":83,"depth":83,"links":15113},[15114,15115,15116,15117,15118,15122,15123,15124],{"id":16,"depth":83,"text":16},{"id":22,"depth":83,"text":22},{"id":35,"depth":83,"text":35},{"id":60,"depth":83,"text":60},{"id":128,"depth":83,"text":128,"children":15119},[15120,15121],{"id":2671,"depth":89,"text":2671},{"id":4155,"depth":89,"text":2671},{"id":147,"depth":83,"text":147},{"id":164,"depth":83,"text":164},{"id":181,"depth":83,"text":181},{},{"title":8827,"description":8832},[199,9139,9140],{"id":1029,"title":1030,"body":15129,"category":199,"cover":1038,"description":70,"extension":201,"meta":15365,"navigation":92,"path":1355,"pinned":204,"publishedAt":1356,"seo":15366,"slug":1358,"stem":1359,"summary":1360,"tags":15367,"updatedAt":1356,"visible":92,"__hash__":1364},{"type":7,"value":15130,"toc":15350},[15131,15135,15137,15139,15141,15143,15163,15165,15170,15172,15174,15202,15208,15210,15214,15216,15236,15238,15248,15250,15252,15254,15256,15258,15260,15262,15264,15266,15286,15288,15290,15294,15296,15298,15300,15302,15306,15308,15326,15328,15330,15332,15334,15336,15338,15340,15342,15344,15346,15348],[10,15132,15133],{},[26,15134],{"alt":1037,"src":1038},[10,15136,1041],{},[10,15138,1044],{},[14,15140,1048],{"id":1047},[10,15142,1051],{},[65,15144,15145],{"className":67,"code":1054,"language":69,"meta":70,"style":70},[50,15146,15147,15151,15155,15159],{"__ignoreMap":70},[74,15148,15149],{"class":76,"line":77},[74,15150,1061],{},[74,15152,15153],{"class":76,"line":83},[74,15154,1066],{},[74,15156,15157],{"class":76,"line":89},[74,15158,93],{"emptyLinePlaceholder":92},[74,15160,15161],{"class":76,"line":96},[74,15162,1075],{},[10,15164,1078],{},[65,15166,15168],{"className":15167,"code":1082,"language":120,"meta":70},[118],[50,15169,1082],{"__ignoreMap":70},[10,15171,1087],{},[10,15173,1090],{},[65,15175,15176],{"className":67,"code":1093,"language":69,"meta":70,"style":70},[50,15177,15178,15182,15186,15190,15194,15198],{"__ignoreMap":70},[74,15179,15180],{"class":76,"line":77},[74,15181,1100],{},[74,15183,15184],{"class":76,"line":83},[74,15185,93],{"emptyLinePlaceholder":92},[74,15187,15188],{"class":76,"line":89},[74,15189,1109],{},[74,15191,15192],{"class":76,"line":96},[74,15193,1114],{},[74,15195,15196],{"class":76,"line":102},[74,15197,1119],{},[74,15199,15200],{"class":76,"line":108},[74,15201,1124],{},[10,15203,15204,1130,15206,1134],{},[50,15205,1129],{},[50,15207,1133],{},[14,15209,1138],{"id":1137},[10,15211,1141,15212,1145],{},[50,15213,1144],{},[10,15215,1148],{},[65,15217,15218],{"className":67,"code":1151,"language":69,"meta":70,"style":70},[50,15219,15220,15224,15228,15232],{"__ignoreMap":70},[74,15221,15222],{"class":76,"line":77},[74,15223,1158],{},[74,15225,15226],{"class":76,"line":83},[74,15227,1163],{},[74,15229,15230],{"class":76,"line":89},[74,15231,1168],{},[74,15233,15234],{"class":76,"line":96},[74,15235,1173],{},[10,15237,1176],{},[65,15239,15240],{"className":564,"code":1179,"language":566,"meta":70,"style":70},[50,15241,15242],{"__ignoreMap":70},[74,15243,15244,15246],{"class":76,"line":77},[74,15245,664],{"class":573},[74,15247,1188],{"class":609},[10,15249,1191],{},[14,15251,1195],{"id":1194},[302,15253,1198],{"id":1198},[10,15255,1201],{},[302,15257,1204],{"id":1204},[10,15259,1207],{},[302,15261,1210],{"id":1210},[10,15263,1213],{},[10,15265,1216],{},[65,15267,15268],{"className":67,"code":1219,"language":69,"meta":70,"style":70},[50,15269,15270,15274,15278,15282],{"__ignoreMap":70},[74,15271,15272],{"class":76,"line":77},[74,15273,1226],{},[74,15275,15276],{"class":76,"line":83},[74,15277,93],{"emptyLinePlaceholder":92},[74,15279,15280],{"class":76,"line":89},[74,15281,1235],{},[74,15283,15284],{"class":76,"line":96},[74,15285,1240],{},[10,15287,1243],{},[302,15289,1246],{"id":1246},[10,15291,1249,15292,1252],{},[50,15293,234],{},[10,15295,1255],{},[302,15297,1258],{"id":1258},[10,15299,1261],{},[14,15301,1265],{"id":1264},[10,15303,15304],{},[26,15305],{"alt":1270,"src":1271},[10,15307,1274],{},[37,15309,15310,15312,15314,15316,15318,15320,15322,15324],{},[40,15311,1279],{},[40,15313,1282],{},[40,15315,1285],{},[40,15317,1288],{},[40,15319,1291],{},[40,15321,1294],{},[40,15323,1297],{},[40,15325,1300],{},[10,15327,1303],{},[14,15329,1307],{"id":1306},[10,15331,1310],{},[10,15333,1313],{},[14,15335,1317],{"id":1316},[10,15337,1320],{},[10,15339,1323],{},[10,15341,1326],{},[14,15343,1329],{"id":1329},[10,15345,1332],{},[10,15347,1335],{},[186,15349,1338],{},{"title":70,"searchDepth":83,"depth":83,"links":15351},[15352,15353,15354,15361,15362,15363,15364],{"id":1047,"depth":83,"text":1048},{"id":1137,"depth":83,"text":1138},{"id":1194,"depth":83,"text":1195,"children":15355},[15356,15357,15358,15359,15360],{"id":1198,"depth":89,"text":1198},{"id":1204,"depth":89,"text":1204},{"id":1210,"depth":89,"text":1210},{"id":1246,"depth":89,"text":1246},{"id":1258,"depth":89,"text":1258},{"id":1264,"depth":83,"text":1265},{"id":1306,"depth":83,"text":1307},{"id":1316,"depth":83,"text":1317},{"id":1329,"depth":83,"text":1329},{},{"title":1030,"description":70},[199,1362,1363],{"id":216,"title":217,"body":15369,"category":199,"cover":200,"description":70,"extension":201,"meta":15948,"navigation":92,"path":1018,"pinned":204,"publishedAt":1019,"seo":15949,"slug":1021,"stem":1022,"summary":1023,"tags":15950,"updatedAt":1019,"visible":92,"__hash__":1027},{"type":7,"value":15370,"toc":15924},[15371,15373,15375,15377,15381,15383,15385,15409,15421,15423,15425,15430,15434,15438,15450,15454,15458,15462,15464,15498,15500,15504,15508,15510,15532,15562,15574,15584,15592,15594,15600,15610,15612,15617,15621,15623,15637,15643,15663,15665,15667,15669,15679,15683,15685,15694,15698,15700,15702,15722,15726,15728,15730,15732,15734,15754,15756,15758,15760,15786,15788,15804,15806,15822,15826,15828,15830,15850,15852,15854,15856,15860,15870,15872,15874,15876,15886,15894,15896,15898,15912,15922],[14,15372,222],{"id":222},[10,15374,225],{},[10,15376,228],{},[10,15378,231,15379,235],{},[50,15380,234],{},[14,15382,238],{"id":238},[10,15384,241],{},[243,15386,15387,15389],{},[10,15388,247],{},[243,15390,15391,15397,15399,15403,15405],{},[10,15392,252,15393,256,15395,260],{},[50,15394,255],{},[50,15396,259],{},[10,15398,263],{},[10,15400,266,15401,271],{},[268,15402,270],{},[10,15404,274],{},[10,15406,15407],{},[26,15408],{"alt":279,"src":280},[243,15410,15411,15413],{},[10,15412,285],{},[243,15414,15415,15417],{},[10,15416,290],{},[10,15418,15419],{},[26,15420],{"alt":295,"src":296},[14,15422,300],{"id":299},[302,15424,305],{"id":304},[10,15426,308,15427,316],{},[310,15428,315],{"href":312,"rel":15429},[314],[243,15431,15432],{},[10,15433,321],{},[10,15435,15436],{},[26,15437],{"alt":326,"src":327},[37,15439,15440,15444,15448],{},[40,15441,332,15442,158],{},[268,15443,335],{},[40,15445,338,15446,158],{},[268,15447,341],{},[40,15449,344],{},[10,15451,15452],{},[26,15453],{"alt":349,"src":350},[243,15455,15456],{},[10,15457,355],{},[10,15459,15460],{},[26,15461],{"alt":360,"src":361},[302,15463,365],{"id":364},[243,15465,15466,15470,15474,15494],{},[243,15467,15468],{},[10,15469,372],{},[10,15471,375,15472,379],{},[268,15473,378],{},[65,15475,15476],{"className":67,"code":382,"language":69,"meta":70,"style":70},[50,15477,15478,15482,15486,15490],{"__ignoreMap":70},[74,15479,15480],{"class":76,"line":77},[74,15481,389],{},[74,15483,15484],{"class":76,"line":83},[74,15485,394],{},[74,15487,15488],{"class":76,"line":89},[74,15489,399],{},[74,15491,15492],{"class":76,"line":96},[74,15493,404],{},[10,15495,407,15496,411],{},[268,15497,410],{},[10,15499,414],{},[10,15501,417,15502,420],{},[50,15503,69],{},[10,15505,15506],{},[26,15507],{"alt":425,"src":426},[10,15509,429],{},[243,15511,15512,15514,15518],{},[10,15513,434],{},[10,15515,15516],{},[268,15517,439],{},[243,15519,15520,15524,15528],{},[10,15521,444,15522,447],{},[50,15523,69],{},[10,15525,450,15526,453],{},[50,15527,69],{},[10,15529,456,15530,460],{},[268,15531,459],{},[243,15533,15534,15536,15540],{},[10,15535,465],{},[10,15537,15538],{},[268,15539,470],{},[243,15541,15542,15548,15556,15558],{},[10,15543,15544,478,15546,482],{},[50,15545,477],{},[50,15547,481],{},[10,15549,485,15550,488,15552,492,15554,496],{},[50,15551,477],{},[268,15553,491],{},[268,15555,495],{},[10,15557,499],{},[10,15559,15560,505],{},[268,15561,504],{},[243,15563,15564,15566],{},[10,15565,510],{},[243,15567,15568,15572],{},[10,15569,515,15570,519],{},[268,15571,518],{},[10,15573,522],{},[243,15575,15576,15580],{},[10,15577,527,15578],{},[268,15579,530],{},[10,15581,15582],{},[26,15583],{"alt":535,"src":536},[243,15585,15586,15588],{},[10,15587,541],{},[10,15589,15590],{},[26,15591],{"alt":535,"src":546},[302,15593,550],{"id":549},[10,15595,553,15596,557,15598,561],{},[50,15597,556],{},[50,15599,560],{},[65,15601,15602],{"className":564,"code":565,"language":566,"meta":70,"style":70},[50,15603,15604],{"__ignoreMap":70},[74,15605,15606,15608],{"class":76,"line":77},[74,15607,69],{"class":573},[74,15609,577],{"class":576},[10,15611,580],{},[65,15613,15615],{"className":15614,"code":584,"language":120,"meta":70},[118],[50,15616,584],{"__ignoreMap":70},[10,15618,15619],{},[26,15620],{"alt":535,"src":591},[10,15622,594],{},[65,15624,15625],{"className":564,"code":597,"language":566,"meta":70,"style":70},[50,15626,15627],{"__ignoreMap":70},[74,15628,15629,15631,15633,15635],{"class":76,"line":77},[74,15630,69],{"class":573},[74,15632,606],{"class":576},[74,15634,610],{"class":609},[74,15636,577],{"class":576},[10,15638,615,15639,618,15641,622],{},[50,15640,69],{},[50,15642,621],{},[65,15644,15645],{"className":564,"code":625,"language":566,"meta":70,"style":70},[50,15646,15647,15653],{"__ignoreMap":70},[74,15648,15649,15651],{"class":76,"line":77},[74,15650,481],{"class":573},[74,15652,577],{"class":576},[74,15654,15655,15657,15659,15661],{"class":76,"line":83},[74,15656,481],{"class":573},[74,15658,606],{"class":576},[74,15660,610],{"class":609},[74,15662,577],{"class":576},[14,15664,647],{"id":646},[302,15666,651],{"id":650},[10,15668,654],{},[65,15670,15671],{"className":564,"code":657,"language":566,"meta":70,"style":70},[50,15672,15673],{"__ignoreMap":70},[74,15674,15675,15677],{"class":76,"line":77},[74,15676,664],{"class":573},[74,15678,577],{"class":576},[10,15680,669,15681,673],{},[50,15682,672],{},[302,15684,677],{"id":676},[10,15686,308,15687,685,15690,158,15692,692],{},[310,15688,684],{"href":682,"rel":15689},[314],[268,15691,688],{},[50,15693,691],{},[10,15695,695,15696,699],{},[50,15697,698],{},[302,15699,703],{"id":702},[10,15701,706],{},[65,15703,15704],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,15705,15706,15712],{"__ignoreMap":70},[74,15707,15708,15710],{"class":76,"line":77},[74,15709,664],{"class":573},[74,15711,577],{"class":576},[74,15713,15714,15716,15718,15720],{"class":76,"line":83},[74,15715,664],{"class":573},[74,15717,606],{"class":576},[74,15719,610],{"class":609},[74,15721,577],{"class":576},[10,15723,730,15724,733],{},[50,15725,664],{},[14,15727,737],{"id":736},[10,15729,740],{},[302,15731,744],{"id":743},[10,15733,747],{},[65,15735,15736],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,15737,15738,15744],{"__ignoreMap":70},[74,15739,15740,15742],{"class":76,"line":77},[74,15741,664],{"class":573},[74,15743,577],{"class":576},[74,15745,15746,15748,15750,15752],{"class":76,"line":83},[74,15747,664],{"class":573},[74,15749,606],{"class":576},[74,15751,610],{"class":609},[74,15753,577],{"class":576},[10,15755,770],{},[302,15757,774],{"id":773},[10,15759,777],{},[65,15761,15762],{"className":564,"code":780,"language":566,"meta":70,"style":70},[50,15763,15764,15772],{"__ignoreMap":70},[74,15765,15766,15768,15770],{"class":76,"line":77},[74,15767,787],{"class":573},[74,15769,790],{"class":609},[74,15771,793],{"class":609},[74,15773,15774,15776,15778,15780,15782,15784],{"class":76,"line":83},[74,15775,787],{"class":573},[74,15777,790],{"class":609},[74,15779,802],{"class":609},[74,15781,805],{"class":609},[74,15783,808],{"class":609},[74,15785,811],{"class":609},[10,15787,814],{},[65,15789,15790],{"className":564,"code":817,"language":566,"meta":70,"style":70},[50,15791,15792],{"__ignoreMap":70},[74,15793,15794,15796,15798,15800,15802],{"class":76,"line":77},[74,15795,787],{"class":573},[74,15797,826],{"class":609},[74,15799,802],{"class":609},[74,15801,805],{"class":609},[74,15803,833],{"class":609},[10,15805,836],{},[65,15807,15808],{"className":564,"code":839,"language":566,"meta":70,"style":70},[50,15809,15810],{"__ignoreMap":70},[74,15811,15812,15814,15816,15818,15820],{"class":76,"line":77},[74,15813,787],{"class":573},[74,15815,848],{"class":609},[74,15817,851],{"class":576},[74,15819,854],{"class":609},[74,15821,857],{"class":609},[10,15823,15824,862],{},[50,15825,787],{},[302,15827,866],{"id":865},[10,15829,869],{},[65,15831,15832],{"className":564,"code":709,"language":566,"meta":70,"style":70},[50,15833,15834,15840],{"__ignoreMap":70},[74,15835,15836,15838],{"class":76,"line":77},[74,15837,664],{"class":573},[74,15839,577],{"class":576},[74,15841,15842,15844,15846,15848],{"class":76,"line":83},[74,15843,664],{"class":573},[74,15845,606],{"class":576},[74,15847,610],{"class":609},[74,15849,577],{"class":576},[10,15851,892],{},[14,15853,895],{"id":895},[302,15855,899],{"id":898},[10,15857,902,15858,906],{},[50,15859,905],{},[130,15861,15862,15866,15868],{},[40,15863,911,15864,914],{},[50,15865,621],{},[40,15867,917],{},[40,15869,920],{},[10,15871,923],{},[302,15873,927],{"id":926},[10,15875,930],{},[65,15877,15878],{"className":564,"code":657,"language":566,"meta":70,"style":70},[50,15879,15880],{"__ignoreMap":70},[74,15881,15882,15884],{"class":76,"line":77},[74,15883,664],{"class":573},[74,15885,577],{"class":576},[10,15887,943,15888,946,15890,949,15892,158],{},[50,15889,664],{},[50,15891,69],{},[50,15893,664],{},[302,15895,955],{"id":954},[10,15897,958],{},[65,15899,15900],{"className":564,"code":961,"language":566,"meta":70,"style":70},[50,15901,15902],{"__ignoreMap":70},[74,15903,15904,15906,15908,15910],{"class":76,"line":77},[74,15905,664],{"class":573},[74,15907,606],{"class":576},[74,15909,610],{"class":609},[74,15911,577],{"class":576},[10,15913,976,15914,979,15916,982,15918,985,15920,989],{},[50,15915,664],{},[50,15917,69],{},[50,15919,481],{},[50,15921,988],{},[186,15923,992],{},{"title":70,"searchDepth":83,"depth":83,"links":15925},[15926,15927,15928,15933,15938,15943],{"id":222,"depth":83,"text":222},{"id":238,"depth":83,"text":238},{"id":299,"depth":83,"text":300,"children":15929},[15930,15931,15932],{"id":304,"depth":89,"text":305},{"id":364,"depth":89,"text":365},{"id":549,"depth":89,"text":550},{"id":646,"depth":83,"text":647,"children":15934},[15935,15936,15937],{"id":650,"depth":89,"text":651},{"id":676,"depth":89,"text":677},{"id":702,"depth":89,"text":703},{"id":736,"depth":83,"text":737,"children":15939},[15940,15941,15942],{"id":743,"depth":89,"text":744},{"id":773,"depth":89,"text":774},{"id":865,"depth":89,"text":866},{"id":895,"depth":83,"text":895,"children":15944},[15945,15946,15947],{"id":898,"depth":89,"text":899},{"id":926,"depth":89,"text":927},{"id":954,"depth":89,"text":955},{},{"title":217,"description":70},[199,1025,1026],1786973364681]