[{"data":1,"prerenderedAt":16066},["ShallowReactive",2],{"post-python-learning-record-cli-project":3,"sidebar-posts":383,"post-related-source":9257},{"id":4,"title":5,"body":6,"category":368,"cover":369,"description":12,"extension":370,"meta":371,"navigation":88,"path":372,"pinned":373,"publishedAt":374,"seo":375,"slug":376,"stem":377,"summary":378,"tags":379,"updatedAt":374,"visible":88,"__hash__":382},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8,"toc":355},"minimark",[9,13,17,20,23,30,33,36,54,57,60,236,239,247,250,253,268,272,275,281,284,287,290,296,303,306,317,320,342,345,348,351],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[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\u002F40-project-flow.svg",[10,31,32],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,44,45],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,47,48,49,53],{},"实际扩展前先为 ",[50,51,52],"code",{},"add()"," 和存储边界补充测试。",[14,55,56],{"id":56},"跟着示例运行",[10,58,59],{},"把下面代码保存到本课脚本并运行：",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"language-python shiki shiki-themes github-dark","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","python","",[50,68,69,77,83,90,96,102,108,114,119,125,131,137,143,149,154,160,166,172,177,183,188,194,200,206,212,218,224,230],{"__ignoreMap":66},[70,71,74],"span",{"class":72,"line":73},"line",1,[70,75,76],{},"import json\n",[70,78,80],{"class":72,"line":79},2,[70,81,82],{},"from pathlib import Path\n",[70,84,86],{"class":72,"line":85},3,[70,87,89],{"emptyLinePlaceholder":88},true,"\n",[70,91,93],{"class":72,"line":92},4,[70,94,95],{},"class LearningRecords:\n",[70,97,99],{"class":72,"line":98},5,[70,100,101],{},"    def __init__(self, file_path):\n",[70,103,105],{"class":72,"line":104},6,[70,106,107],{},"        self.file_path = Path(file_path)\n",[70,109,111],{"class":72,"line":110},7,[70,112,113],{},"        self.items = []\n",[70,115,117],{"class":72,"line":116},8,[70,118,89],{"emptyLinePlaceholder":88},[70,120,122],{"class":72,"line":121},9,[70,123,124],{},"    def add(self, title):\n",[70,126,128],{"class":72,"line":127},10,[70,129,130],{},"        title = title.strip()\n",[70,132,134],{"class":72,"line":133},11,[70,135,136],{},"        if not title:\n",[70,138,140],{"class":72,"line":139},12,[70,141,142],{},"            raise ValueError(\"课程名称不能为空\")\n",[70,144,146],{"class":72,"line":145},13,[70,147,148],{},"        self.items.append({\"title\": title, \"done\": False})\n",[70,150,152],{"class":72,"line":151},14,[70,153,89],{"emptyLinePlaceholder":88},[70,155,157],{"class":72,"line":156},15,[70,158,159],{},"    def save(self):\n",[70,161,163],{"class":72,"line":162},16,[70,164,165],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[70,167,169],{"class":72,"line":168},17,[70,170,171],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[70,173,175],{"class":72,"line":174},18,[70,176,89],{"emptyLinePlaceholder":88},[70,178,180],{"class":72,"line":179},19,[70,181,182],{},"records = LearningRecords(\"learning-records.json\")\n",[70,184,186],{"class":72,"line":185},20,[70,187,89],{"emptyLinePlaceholder":88},[70,189,191],{"class":72,"line":190},21,[70,192,193],{},"try:\n",[70,195,197],{"class":72,"line":196},22,[70,198,199],{},"    title = input(\"输入已学习课程：\")\n",[70,201,203],{"class":72,"line":202},23,[70,204,205],{},"    records.add(title)\n",[70,207,209],{"class":72,"line":208},24,[70,210,211],{},"    records.save()\n",[70,213,215],{"class":72,"line":214},25,[70,216,217],{},"except ValueError as error:\n",[70,219,221],{"class":72,"line":220},26,[70,222,223],{},"    print(\"无法保存：\", error)\n",[70,225,227],{"class":72,"line":226},27,[70,228,229],{},"else:\n",[70,231,233],{"class":72,"line":232},28,[70,234,235],{},"    print(\"已保存 1 条学习记录\")\n",[10,237,238],{},"预期结果：",[61,240,245],{"className":241,"code":243,"language":244,"meta":66},[242],"language-text","输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n","text",[50,246,243],{"__ignoreMap":66},[10,248,249],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,251,252],{"id":252},"按执行顺序拆开看",[254,255,256,262],"ol",{},[40,257,258,259,261],{},"输入层取得课程名后，",[50,260,52],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,263,264,267],{},[50,265,266],{},"save()"," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[269,270,271],"h3",{"id":271},"再看一个具体细节",[10,273,274],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,276,277],{},[26,278],{"alt":279,"src":280},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,282,283],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[269,285,271],{"id":286},"再看一个具体细节-1",[10,288,289],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,291,292],{},[26,293],{"alt":294,"src":295},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,297,298,299,302],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[50,300,301],{},"load()"," 把文件状态恢复到内存。",[14,304,305],{"id":305},"初学者容易混淆的地方",[37,307,308,311],{},[40,309,310],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,312,313,314,316],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[50,315,301],{}," 是下一项必要扩展。",[14,318,319],{"id":319},"练习",[254,321,322,328,331],{},[40,323,324,325,327],{},"增加 ",[50,326,301],{},"，文件不存在时从空列表开始。",[40,329,330],{},"增加按序号标记完成的功能，并校验序号范围。",[40,332,333,334,337,338,341],{},"把输入循环放进 ",[50,335,336],{},"main()","，通过 ",[50,339,340],{},"__name__"," 控制程序入口。",[10,343,344],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,346,347],{"id":347},"本篇边界",[10,349,350],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,353,354],"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":66,"searchDepth":79,"depth":79,"links":356},[357,358,359,360,361,365,366,367],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":362},[363,364],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",false,"2026-08-17",{"title":5,"description":12},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[368,380,381],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[384,1197,1533,1667,1819,1998,2186,2351,2535,2716,2908,3139,3323,3500,3657,3828,3993,4207,4434,4616,4780,4969,5157,5312,5472,5669,5866,6078,6245,6488,6669,6873,7068,7251,7452,7738,7930,8159,8353,8573,8811,9015],{"id":385,"title":386,"body":387,"category":368,"cover":369,"description":66,"extension":370,"meta":1186,"navigation":88,"path":1187,"pinned":373,"publishedAt":1188,"seo":1189,"slug":1190,"stem":1191,"summary":1192,"tags":1193,"updatedAt":1188,"visible":88,"__hash__":1196},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":388,"toc":1162},[389,392,395,398,405,408,411,450,466,470,474,485,490,496,514,520,525,531,535,581,584,590,596,599,630,675,692,706,716,720,731,747,750,756,761,764,782,792,813,817,821,824,836,843,847,862,869,873,876,897,903,907,910,914,917,937,940,944,947,981,984,1003,1006,1027,1032,1036,1039,1059,1062,1065,1069,1076,1090,1093,1097,1100,1110,1121,1125,1128,1143,1159],[14,390,391],{"id":391},"引言",[10,393,394],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,396,397],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,399,400,401,404],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[50,402,403],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,406,407],{"id":407},"扫盲",[10,409,410],{},"那么这里有几个概念：",[412,413,414,417],"blockquote",{},[10,415,416],{},"为什么需要安装python解释器？",[412,418,419,430,433,441,444],{},[10,420,421,422,425,426,429],{},"我们写的代码，电脑其实看不懂，电脑只认识",[50,423,424],{},"0","和",[50,427,428],{},"1","组成的机器指令。",[10,431,432],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,434,435,436,440],{},"这样，我们就能用",[437,438,439],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,442,443],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,445,446],{},[26,447],{"alt":448,"src":449},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[412,451,452,455],{},[10,453,454],{},"pip又是什么？",[412,456,457,460],{},[10,458,459],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,461,462],{},[26,463],{"alt":464,"src":465},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,467,469],{"id":468},"windows-安装","Windows 安装",[269,471,473],{"id":472},"_1-下载官方安装程序","1. 下载官方安装程序",[10,475,476,477,484],{},"打开 ",[478,479,483],"a",{"href":480,"rel":481},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[482],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[412,486,487],{},[10,488,489],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,491,492],{},[26,493],{"alt":494,"src":495},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,497,498,505,511],{},[40,499,500,501,504],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[437,502,503],{},"Windows installer (64-bit)","。",[40,506,507,508,504],{},"搭载 ARM 处理器的 Windows 设备选择 ",[437,509,510],{},"Windows installer (ARM64)",[40,512,513],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,515,516],{},[26,517],{"alt":518,"src":519},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[412,521,522],{},[10,523,524],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,526,527],{},[26,528],{"alt":529,"src":530},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[269,532,534],{"id":533},"_2-安装并加入-path","2. 安装并加入 PATH",[412,536,537,542,549,574],{},[412,538,539],{},[10,540,541],{},"PATH 环境变量",[10,543,544,545,548],{},"Windows 有一个特殊的变量叫 ",[437,546,547],{},"PATH","，它里面存了一串文件夹路径，比如：",[61,550,552],{"className":63,"code":551,"language":65,"meta":66,"style":66},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[50,553,554,559,564,569],{"__ignoreMap":66},[70,555,556],{"class":72,"line":73},[70,557,558],{},"D:\\Python313\\\n",[70,560,561],{"class":72,"line":79},[70,562,563],{},"D:\\Python313\\Scripts\\\n",[70,565,566],{"class":72,"line":85},[70,567,568],{},"C:\\Windows\\System32\\\n",[70,570,571],{"class":72,"line":92},[70,572,573],{},"...\n",[10,575,576,577,580],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[437,578,579],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,582,583],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,585,586,587,589],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[50,588,65],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,591,592],{},[26,593],{"alt":594,"src":595},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,597,598],{},"对安装界面最底部的两个勾选项分别解释 :",[412,600,601,604,609],{},[10,602,603],{},"Add python.exe to PATH",[10,605,606],{},[437,607,608],{},"把 Python 添加到系统环境变量",[412,610,611,617,623],{},[10,612,613,614,616],{},"勾选后，你可以在命令行任意位置直接输入 ",[50,615,65],{}," 就能运行",[10,618,619,620,622],{},"不勾选的话，命令行输入 ",[50,621,65],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,624,625,626,629],{},"必须",[437,627,628],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[412,631,632,635,640],{},[10,633,634],{},"Use admin privileges when installing py.exe",[10,636,637],{},[437,638,639],{},"使用管理员权限安装 py.exe（Python 启动器）",[412,641,642,652,666,669],{},[10,643,644,647,648,651],{},[50,645,646],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[50,649,650],{},"py"," 来启动 Python。",[10,653,654,655,657,658,661,662,665],{},"勾选后，",[50,656,646],{}," 会安装到",[437,659,660],{},"系统级目录","，电脑上",[437,663,664],{},"所有用户账户","都能用",[10,667,668],{},"不勾选，只有当前用户能用",[10,670,671,674],{},[437,672,673],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[412,676,677,680],{},[10,678,679],{},"操作建议",[412,681,682,689],{},[10,683,684,685,688],{},"两个都勾上之后，再点 ",[437,686,687],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,690,691],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[412,693,694,700],{},[10,695,696,697],{},"Python 安装的",[437,698,699],{},"可选功能页",[10,701,702],{},[26,703],{"alt":704,"src":705},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[412,707,708,711],{},[10,709,710],{},"高级选项页",[10,712,713],{},[26,714],{"alt":704,"src":715},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[269,717,719],{"id":718},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,721,722,723,726,727,730],{},"按 ",[50,724,725],{},"Win + R","，输入 ",[50,728,729],{},"cmd"," 并回车，然后执行：",[61,732,736],{"className":733,"code":734,"language":735,"meta":66,"style":66},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[50,737,738],{"__ignoreMap":66},[70,739,740,743],{"class":72,"line":73},[70,741,65],{"class":742},"svObZ",[70,744,746],{"class":745},"sDLfK"," --version\n",[10,748,749],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[61,751,754],{"className":752,"code":753,"language":244,"meta":66},[242],"Python 3.x.x\n",[50,755,753],{"__ignoreMap":66},[10,757,758],{},[26,759],{"alt":704,"src":760},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,762,763],{},"继续检查 pip：",[61,765,767],{"className":733,"code":766,"language":735,"meta":66,"style":66},"python -m pip --version\n",[50,768,769],{"__ignoreMap":66},[70,770,771,773,776,780],{"class":72,"line":73},[70,772,65],{"class":742},[70,774,775],{"class":745}," -m",[70,777,779],{"class":778},"sU2Wk"," pip",[70,781,746],{"class":745},[10,783,784,785,787,788,791],{},"如果 ",[50,786,65],{}," 无法识别，但 ",[50,789,790],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[61,793,795],{"className":733,"code":794,"language":735,"meta":66,"style":66},"py --version\npy -m pip --version\n",[50,796,797,803],{"__ignoreMap":66},[70,798,799,801],{"class":72,"line":73},[70,800,650],{"class":742},[70,802,746],{"class":745},[70,804,805,807,809,811],{"class":72,"line":79},[70,806,650],{"class":742},[70,808,775],{"class":745},[70,810,779],{"class":778},[70,812,746],{"class":745},[14,814,816],{"id":815},"macos-安装","macOS 安装",[269,818,820],{"id":819},"_1-先检查现有环境","1. 先检查现有环境",[10,822,823],{},"打开“终端”应用，执行：",[61,825,827],{"className":733,"code":826,"language":735,"meta":66,"style":66},"python3 --version\n",[50,828,829],{"__ignoreMap":66},[70,830,831,834],{"class":72,"line":73},[70,832,833],{"class":742},"python3",[70,835,746],{"class":745},[10,837,838,839,842],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[50,840,841],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[269,844,846],{"id":845},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,848,476,849,854,855,504,858,861],{},[478,850,853],{"href":851,"rel":852},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[482],"Python macOS 下载页","，下载当前稳定版的 ",[437,856,857],{},"macOS 64-bit universal2 installer",[50,859,860],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,863,864,865,868],{},"下载完成后打开 ",[50,866,867],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[269,870,872],{"id":871},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,874,875],{},"安装完成后重新打开终端，执行：",[61,877,879],{"className":733,"code":878,"language":735,"meta":66,"style":66},"python3 --version\npython3 -m pip --version\n",[50,880,881,887],{"__ignoreMap":66},[70,882,883,885],{"class":72,"line":73},[70,884,833],{"class":742},[70,886,746],{"class":745},[70,888,889,891,893,895],{"class":72,"line":79},[70,890,833],{"class":742},[70,892,775],{"class":745},[70,894,779],{"class":778},[70,896,746],{"class":745},[10,898,899,900,902],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[50,901,833],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,904,906],{"id":905},"linux-安装","Linux 安装",[10,908,909],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[269,911,913],{"id":912},"_1-检查是否已经安装","1. 检查是否已经安装",[10,915,916],{},"打开终端，执行：",[61,918,919],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,920,921,927],{"__ignoreMap":66},[70,922,923,925],{"class":72,"line":73},[70,924,833],{"class":742},[70,926,746],{"class":745},[70,928,929,931,933,935],{"class":72,"line":79},[70,930,833],{"class":742},[70,932,775],{"class":745},[70,934,779],{"class":778},[70,936,746],{"class":745},[10,938,939],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[269,941,943],{"id":942},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,945,946],{},"Ubuntu 或 Debian：",[61,948,950],{"className":733,"code":949,"language":735,"meta":66,"style":66},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[50,951,952,963],{"__ignoreMap":66},[70,953,954,957,960],{"class":72,"line":73},[70,955,956],{"class":742},"sudo",[70,958,959],{"class":778}," apt",[70,961,962],{"class":778}," update\n",[70,964,965,967,969,972,975,978],{"class":72,"line":79},[70,966,956],{"class":742},[70,968,959],{"class":778},[70,970,971],{"class":778}," install",[70,973,974],{"class":778}," python3",[70,976,977],{"class":778}," python3-pip",[70,979,980],{"class":778}," python3-venv\n",[10,982,983],{},"Fedora：",[61,985,987],{"className":733,"code":986,"language":735,"meta":66,"style":66},"sudo dnf install python3 python3-pip\n",[50,988,989],{"__ignoreMap":66},[70,990,991,993,996,998,1000],{"class":72,"line":73},[70,992,956],{"class":742},[70,994,995],{"class":778}," dnf",[70,997,971],{"class":778},[70,999,974],{"class":778},[70,1001,1002],{"class":778}," python3-pip\n",[10,1004,1005],{},"Arch Linux：",[61,1007,1009],{"className":733,"code":1008,"language":735,"meta":66,"style":66},"sudo pacman -S python python-pip\n",[50,1010,1011],{"__ignoreMap":66},[70,1012,1013,1015,1018,1021,1024],{"class":72,"line":73},[70,1014,956],{"class":742},[70,1016,1017],{"class":778}," pacman",[70,1019,1020],{"class":745}," -S",[70,1022,1023],{"class":778}," python",[70,1025,1026],{"class":778}," python-pip\n",[10,1028,1029,1031],{},[50,1030,956],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[269,1033,1035],{"id":1034},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,1037,1038],{},"安装结束后执行：",[61,1040,1041],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,1042,1043,1049],{"__ignoreMap":66},[70,1044,1045,1047],{"class":72,"line":73},[70,1046,833],{"class":742},[70,1048,746],{"class":745},[70,1050,1051,1053,1055,1057],{"class":72,"line":79},[70,1052,833],{"class":742},[70,1054,775],{"class":745},[70,1056,779],{"class":778},[70,1058,746],{"class":745},[10,1060,1061],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,1063,1064],{"id":1064},"常见问题",[269,1066,1068],{"id":1067},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,1070,1071,1072,1075],{},"先关闭当前命令提示符并重新打开，再执行 ",[50,1073,1074],{},"python --version","。如果仍然失败，按下面的顺序检查：",[254,1077,1078,1084,1087],{},[40,1079,1080,1081,1083],{},"执行 ",[50,1082,790],{},"，确认 Python Launcher 是否可用。",[40,1085,1086],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,1088,1089],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,1091,1092],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[269,1094,1096],{"id":1095},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,1098,1099],{},"先尝试：",[61,1101,1102],{"className":733,"code":826,"language":735,"meta":66,"style":66},[50,1103,1104],{"__ignoreMap":66},[70,1105,1106,1108],{"class":72,"line":73},[70,1107,833],{"class":742},[70,1109,746],{"class":745},[10,1111,1112,1113,1115,1116,1118,1119,504],{},"在这两个系统中，只有 ",[50,1114,833],{}," 命令而没有 ",[50,1117,65],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[50,1120,833],{},[269,1122,1124],{"id":1123},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1126,1127],{},"先使用模块方式检查：",[61,1129,1131],{"className":733,"code":1130,"language":735,"meta":66,"style":66},"python3 -m pip --version\n",[50,1132,1133],{"__ignoreMap":66},[70,1134,1135,1137,1139,1141],{"class":72,"line":73},[70,1136,833],{"class":742},[70,1138,775],{"class":745},[70,1140,779],{"class":778},[70,1142,746],{"class":745},[10,1144,1145,1146,1148,1149,1151,1152,1154,1155,1158],{},"Windows 用户将命令中的 ",[50,1147,833],{}," 换成 ",[50,1150,65],{}," 或 ",[50,1153,650],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[50,1156,1157],{},"python3-pip","；不要直接使用其他系统的安装命令。",[352,1160,1161],{},"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":66,"searchDepth":79,"depth":79,"links":1163},[1164,1165,1166,1171,1176,1181],{"id":391,"depth":79,"text":391},{"id":407,"depth":79,"text":407},{"id":468,"depth":79,"text":469,"children":1167},[1168,1169,1170],{"id":472,"depth":85,"text":473},{"id":533,"depth":85,"text":534},{"id":718,"depth":85,"text":719},{"id":815,"depth":79,"text":816,"children":1172},[1173,1174,1175],{"id":819,"depth":85,"text":820},{"id":845,"depth":85,"text":846},{"id":871,"depth":85,"text":872},{"id":905,"depth":79,"text":906,"children":1177},[1178,1179,1180],{"id":912,"depth":85,"text":913},{"id":942,"depth":85,"text":943},{"id":1034,"depth":85,"text":1035},{"id":1064,"depth":79,"text":1064,"children":1182},[1183,1184,1185],{"id":1067,"depth":85,"text":1068},{"id":1095,"depth":85,"text":1096},{"id":1123,"depth":85,"text":1124},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":386,"description":66},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[368,1194,1195],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1198,"title":1199,"body":1200,"category":368,"cover":1207,"description":66,"extension":370,"meta":1522,"navigation":88,"path":1523,"pinned":373,"publishedAt":1524,"seo":1525,"slug":1526,"stem":1527,"summary":1528,"tags":1529,"updatedAt":1524,"visible":88,"__hash__":1532},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1201,"toc":1507},[1202,1208,1211,1214,1218,1221,1245,1248,1254,1257,1260,1293,1303,1307,1314,1317,1342,1345,1357,1360,1364,1367,1370,1373,1376,1379,1382,1385,1409,1412,1415,1421,1424,1427,1430,1434,1440,1443,1469,1472,1476,1479,1482,1486,1489,1492,1495,1498,1501,1504],[10,1203,1204],{},[26,1205],{"alt":1206,"src":1207},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1209,1210],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1212,1213],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1215,1217],{"id":1216},"python-代码是什么样的","Python 代码是什么样的",[10,1219,1220],{},"下面是一段简单的 Python 代码：",[61,1222,1224],{"className":63,"code":1223,"language":65,"meta":66,"style":66},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[50,1225,1226,1231,1236,1240],{"__ignoreMap":66},[70,1227,1228],{"class":72,"line":73},[70,1229,1230],{},"name = \"Python\"\n",[70,1232,1233],{"class":72,"line":79},[70,1234,1235],{},"year = 2026\n",[70,1237,1238],{"class":72,"line":85},[70,1239,89],{"emptyLinePlaceholder":88},[70,1241,1242],{"class":72,"line":92},[70,1243,1244],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1246,1247],{},"运行结果：",[61,1249,1252],{"className":1250,"code":1251,"language":244,"meta":66},[242],"正在学习 Python，当前年份是 2026\n",[50,1253,1251],{"__ignoreMap":66},[10,1255,1256],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1258,1259],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[61,1261,1263],{"className":63,"code":1262,"language":65,"meta":66,"style":66},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[50,1264,1265,1270,1274,1279,1284,1288],{"__ignoreMap":66},[70,1266,1267],{"class":72,"line":73},[70,1268,1269],{},"score = 85\n",[70,1271,1272],{"class":72,"line":79},[70,1273,89],{"emptyLinePlaceholder":88},[70,1275,1276],{"class":72,"line":85},[70,1277,1278],{},"if score >= 60:\n",[70,1280,1281],{"class":72,"line":92},[70,1282,1283],{},"    print(\"成绩合格\")\n",[70,1285,1286],{"class":72,"line":98},[70,1287,229],{},[70,1289,1290],{"class":72,"line":104},[70,1291,1292],{},"    print(\"需要继续学习\")\n",[10,1294,1295,1298,1299,1302],{},[50,1296,1297],{},"if"," 和 ",[50,1300,1301],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1304,1306],{"id":1305},"python-如何运行代码","Python 如何运行代码",[10,1308,1309,1310,1313],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[50,1311,1312],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1315,1316],{},"交互式环境适合快速验证一个表达式：",[61,1318,1320],{"className":63,"code":1319,"language":65,"meta":66,"style":66},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[50,1321,1322,1327,1332,1337],{"__ignoreMap":66},[70,1323,1324],{"class":72,"line":73},[70,1325,1326],{},">>> 10 + 20\n",[70,1328,1329],{"class":72,"line":79},[70,1330,1331],{},"30\n",[70,1333,1334],{"class":72,"line":85},[70,1335,1336],{},">>> \"Python\".lower()\n",[70,1338,1339],{"class":72,"line":92},[70,1340,1341],{},"'python'\n",[10,1343,1344],{},"需要保存和重复运行的程序，则可以写入文件：",[61,1346,1348],{"className":733,"code":1347,"language":735,"meta":66,"style":66},"python3 hello.py\n",[50,1349,1350],{"__ignoreMap":66},[70,1351,1352,1354],{"class":72,"line":73},[70,1353,833],{"class":742},[70,1355,1356],{"class":778}," hello.py\n",[10,1358,1359],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1361,1363],{"id":1362},"python-的特点","Python 的特点",[269,1365,1366],{"id":1366},"语法相对简洁",[10,1368,1369],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[269,1371,1372],{"id":1372},"支持多种编程方式",[10,1374,1375],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[269,1377,1378],{"id":1378},"标准库比较完整",[10,1380,1381],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1383,1384],{},"例如，获取当前时间：",[61,1386,1388],{"className":63,"code":1387,"language":65,"meta":66,"style":66},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[50,1389,1390,1395,1399,1404],{"__ignoreMap":66},[70,1391,1392],{"class":72,"line":73},[70,1393,1394],{},"from datetime import datetime\n",[70,1396,1397],{"class":72,"line":79},[70,1398,89],{"emptyLinePlaceholder":88},[70,1400,1401],{"class":72,"line":85},[70,1402,1403],{},"now = datetime.now()\n",[70,1405,1406],{"class":72,"line":92},[70,1407,1408],{},"print(now)\n",[10,1410,1411],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[269,1413,1414],{"id":1414},"第三方工具丰富",[10,1416,1417,1418,1420],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[50,1419,403],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1422,1423],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[269,1425,1426],{"id":1426},"支持多个操作系统",[10,1428,1429],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1431,1433],{"id":1432},"python-可以做什么","Python 可以做什么",[10,1435,1436],{},[26,1437],{"alt":1438,"src":1439},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1441,1442],{},"Python 的应用范围比较广，常见方向包括：",[37,1444,1445,1448,1451,1454,1457,1460,1463,1466],{},[40,1446,1447],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1449,1450],{},"开发网站后端和 API 服务；",[40,1452,1453],{},"进行数据清洗、统计分析和图表展示；",[40,1455,1456],{},"编写网络爬虫和信息采集工具；",[40,1458,1459],{},"开发自动化测试程序；",[40,1461,1462],{},"进行机器学习和人工智能开发；",[40,1464,1465],{},"编写运维、监控和辅助开发工具；",[40,1467,1468],{},"开发部分桌面应用和插件。",[10,1470,1471],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1473,1475],{"id":1474},"python-的发展","Python 的发展",[10,1477,1478],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1480,1481],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1483,1485],{"id":1484},"python-也有局限","Python 也有局限",[10,1487,1488],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1490,1491],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1493,1494],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1496,1497],{"id":1497},"写在最后",[10,1499,1500],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1502,1503],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[352,1505,1506],{},"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":66,"searchDepth":79,"depth":79,"links":1508},[1509,1510,1511,1518,1519,1520,1521],{"id":1216,"depth":79,"text":1217},{"id":1305,"depth":79,"text":1306},{"id":1362,"depth":79,"text":1363,"children":1512},[1513,1514,1515,1516,1517],{"id":1366,"depth":85,"text":1366},{"id":1372,"depth":85,"text":1372},{"id":1378,"depth":85,"text":1378},{"id":1414,"depth":85,"text":1414},{"id":1426,"depth":85,"text":1426},{"id":1432,"depth":79,"text":1433},{"id":1474,"depth":79,"text":1475},{"id":1484,"depth":79,"text":1485},{"id":1497,"depth":79,"text":1497},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1199,"description":66},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[368,1530,1531],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1534,"title":1535,"body":1536,"category":368,"cover":369,"description":1540,"extension":370,"meta":1658,"navigation":88,"path":1659,"pinned":373,"publishedAt":374,"seo":1660,"slug":1661,"stem":1662,"summary":1663,"tags":1664,"updatedAt":374,"visible":88,"__hash__":1666},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1537,"toc":1648},[1538,1541,1543,1546,1548,1554,1559,1561,1575,1577,1579,1588,1590,1596,1598,1600,1616,1618,1629,1631,1639,1641,1643,1646],[10,1539,1540],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1542,16],{"id":16},[10,1544,1545],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1547,22],{"id":22},[10,1549,1550],{},[26,1551],{"alt":1552,"src":1553},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1555,1556,1558],{},[50,1557,1312],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1560,35],{"id":35},[37,1562,1563,1569,1572],{},[40,1564,1565,1566,1568],{},"源代码是人编写的文本，通常保存在 ",[50,1567,1312],{}," 文件中。",[40,1570,1571],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1573,1574],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1576,56],{"id":56},[10,1578,59],{},[61,1580,1582],{"className":63,"code":1581,"language":65,"meta":66,"style":66},"print(\"你好，Python\")\n",[50,1583,1584],{"__ignoreMap":66},[70,1585,1586],{"class":72,"line":73},[70,1587,1581],{},[10,1589,238],{},[61,1591,1594],{"className":1592,"code":1593,"language":244,"meta":66},[242],"你好，Python\n",[50,1595,1593],{"__ignoreMap":66},[10,1597,249],{},[14,1599,252],{"id":252},[254,1601,1602,1609],{},[40,1603,1604,1605,1608],{},"终端启动解释器后，解释器读取 ",[50,1606,1607],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1610,1611,1612,1615],{},"字符串对象先准备好，再交给 ",[50,1613,1614],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1617,305],{"id":305},[37,1619,1620,1623],{},[40,1621,1622],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1624,1625,1626,1628],{},"认为 ",[50,1627,1312],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1630,319],{"id":319},[254,1632,1633,1636],{},[40,1634,1635],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1637,1638],{},"把示例文字改成自己的学习目标并重新运行。",[10,1640,344],{},[14,1642,347],{"id":347},[10,1644,1645],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,1647,354],{},{"title":66,"searchDepth":79,"depth":79,"links":1649},[1650,1651,1652,1653,1654,1655,1656,1657],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1535,"description":1540},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[368,1530,1665],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1668,"title":1669,"body":1670,"category":368,"cover":369,"description":1674,"extension":370,"meta":1810,"navigation":88,"path":1811,"pinned":373,"publishedAt":374,"seo":1812,"slug":1813,"stem":1814,"summary":1815,"tags":1816,"updatedAt":374,"visible":88,"__hash__":1818},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1671,"toc":1800},[1672,1675,1677,1680,1682,1688,1694,1696,1711,1713,1716,1736,1738,1744,1746,1748,1761,1763,1777,1779,1790,1792,1794,1797],[10,1673,1674],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1676,16],{"id":16},[10,1678,1679],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1681,22],{"id":22},[10,1683,1684],{},[26,1685],{"alt":1686,"src":1687},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1689,1690,1691,1693],{},"终端收到 ",[50,1692,833],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1695,35],{"id":35},[37,1697,1698,1701,1704],{},[40,1699,1700],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1702,1703],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1705,1706,1707,1710],{},"检查 pip 时使用 ",[50,1708,1709],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1712,56],{"id":56},[10,1714,1715],{},"在 macOS 终端执行：",[61,1717,1718],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,1719,1720,1726],{"__ignoreMap":66},[70,1721,1722,1724],{"class":72,"line":73},[70,1723,833],{"class":742},[70,1725,746],{"class":745},[70,1727,1728,1730,1732,1734],{"class":72,"line":79},[70,1729,833],{"class":742},[70,1731,775],{"class":745},[70,1733,779],{"class":778},[70,1735,746],{"class":745},[10,1737,238],{},[61,1739,1742],{"className":1740,"code":1741,"language":244,"meta":66},[242],"Python 3.14.x\npip 版本信息与安装路径\n",[50,1743,1741],{"__ignoreMap":66},[10,1745,249],{},[14,1747,252],{"id":252},[254,1749,1750,1756],{},[40,1751,1752,1755],{},[50,1753,1754],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1757,1758,1760],{},[50,1759,841],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1762,305],{"id":305},[37,1764,1765,1771],{},[40,1766,1767,1768,1770],{},"看到系统已有 ",[50,1769,833],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1772,1773,1774,1776],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[50,1775,833],{},"，不修改系统自带工具。",[14,1778,319],{"id":319},[254,1780,1781,1787],{},[40,1782,1080,1783,1786],{},[50,1784,1785],{},"which python3","，记录当前解释器路径。",[40,1788,1789],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1791,344],{},[14,1793,347],{"id":347},[10,1795,1796],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,1798,1799],{},"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":66,"searchDepth":79,"depth":79,"links":1801},[1802,1803,1804,1805,1806,1807,1808,1809],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1669,"description":1674},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[368,1817,1194],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1820,"title":1821,"body":1822,"category":368,"cover":369,"description":1987,"extension":370,"meta":1988,"navigation":88,"path":1989,"pinned":373,"publishedAt":374,"seo":1990,"slug":1991,"stem":1992,"summary":1993,"tags":1994,"updatedAt":374,"visible":88,"__hash__":1997},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1823,"toc":1977},[1824,1830,1832,1835,1837,1843,1846,1848,1872,1874,1876,1903,1905,1911,1913,1915,1933,1935,1949,1951,1965,1967,1969,1975],[10,1825,1826,1827,1829],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[50,1828,1312],{}," 脚本。",[14,1831,16],{"id":16},[10,1833,1834],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1836,22],{"id":22},[10,1838,1839],{},[26,1840],{"alt":1841,"src":1842},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1844,1845],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1847,35],{"id":35},[37,1849,1850,1859,1866],{},[40,1851,1852,1853,1855,1856,504],{},"在终端输入 ",[50,1854,833],{}," 进入 REPL，提示符通常是 ",[50,1857,1858],{},">>>",[40,1860,1861,1862,1865],{},"输入 ",[50,1863,1864],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1867,1868,1869,1871],{},"需要保存、复查或多次运行的代码应写入 ",[50,1870,1312],{}," 文件。",[14,1873,56],{"id":56},[10,1875,59],{},[61,1877,1881],{"className":1878,"code":1879,"language":1880,"meta":66,"style":66},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[50,1882,1883,1888,1893,1898],{"__ignoreMap":66},[70,1884,1885],{"class":72,"line":73},[70,1886,1887],{},">>> 2 + 3\n",[70,1889,1890],{"class":72,"line":79},[70,1891,1892],{},"5\n",[70,1894,1895],{"class":72,"line":85},[70,1896,1897],{},">>> \"python\".upper()\n",[70,1899,1900],{"class":72,"line":92},[70,1901,1902],{},"'PYTHON'\n",[10,1904,238],{},[61,1906,1909],{"className":1907,"code":1908,"language":244,"meta":66},[242],"REPL 会直接显示表达式结果\n",[50,1910,1908],{"__ignoreMap":66},[10,1912,249],{},[14,1914,252],{"id":252},[254,1916,1917,1927],{},[40,1918,1919,1920,1923,1924,504],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[50,1921,1922],{},"2 + 3"," 能直接看到 ",[50,1925,1926],{},"5",[40,1928,1929,1930,1932],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[50,1931,1614],{}," 才会写到标准输出。",[14,1934,305],{"id":305},[37,1936,1937,1946],{},[40,1938,1939,1940,1942,1943,1945],{},"把提示符 ",[50,1941,1858],{}," 复制进 ",[50,1944,1312],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1947,1948],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1950,319],{"id":319},[254,1952,1953,1959],{},[40,1954,1955,1956,504],{},"在 REPL 计算 ",[50,1957,1958],{},"12 * 8",[40,1960,1961,1962,1964],{},"把同一表达式写入脚本；观察脚本中不调用 ",[50,1963,1614],{}," 时是否显示结果。",[10,1966,344],{},[14,1968,347],{"id":347},[10,1970,1971,1972,1974],{},"本篇目标是根据任务选择 REPL 或 ",[50,1973,1312],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,1976,354],{},{"title":66,"searchDepth":79,"depth":79,"links":1978},[1979,1980,1981,1982,1983,1984,1985,1986],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1821,"description":1987},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[368,1995,1996],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1999,"title":2000,"body":2001,"category":368,"cover":369,"description":2005,"extension":370,"meta":2176,"navigation":88,"path":2177,"pinned":373,"publishedAt":374,"seo":2178,"slug":2179,"stem":2180,"summary":2181,"tags":2182,"updatedAt":374,"visible":88,"__hash__":2185},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":2002,"toc":2166},[2003,2006,2008,2011,2013,2019,2025,2027,2045,2047,2049,2094,2096,2102,2104,2106,2128,2130,2142,2144,2156,2158,2160,2163],[10,2004,2005],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,2007,16],{"id":16},[10,2009,2010],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2012,22],{"id":22},[10,2014,2015],{},[26,2016],{"alt":2017,"src":2018},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,2020,2021,2024],{},[50,2022,2023],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,2026,35],{"id":35},[37,2028,2029,2032,2042],{},[40,2030,2031],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,2033,2034,2037,2038,2041],{},[50,2035,2036],{},"pwd"," 显示当前目录，",[50,2039,2040],{},"ls"," 显示目录里的文件。",[40,2043,2044],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,2046,56],{"id":56},[10,2048,1715],{},[61,2050,2052],{"className":733,"code":2051,"language":735,"meta":66,"style":66},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[50,2053,2054,2062,2069,2074,2088],{"__ignoreMap":66},[70,2055,2056,2059],{"class":72,"line":73},[70,2057,2058],{"class":742},"mkdir",[70,2060,2061],{"class":778}," python-study\n",[70,2063,2064,2067],{"class":72,"line":79},[70,2065,2066],{"class":745},"cd",[70,2068,2061],{"class":778},[70,2070,2071],{"class":72,"line":85},[70,2072,2073],{"class":745},"pwd\n",[70,2075,2076,2079,2082,2086],{"class":72,"line":92},[70,2077,2078],{"class":745},"printf",[70,2080,2081],{"class":778}," 'print(\"项目已经运行\")\\n'",[70,2083,2085],{"class":2084},"snl16"," >",[70,2087,1356],{"class":778},[70,2089,2090,2092],{"class":72,"line":98},[70,2091,833],{"class":742},[70,2093,1356],{"class":778},[10,2095,238],{},[61,2097,2100],{"className":2098,"code":2099,"language":244,"meta":66},[242],"项目已经运行\n",[50,2101,2099],{"__ignoreMap":66},[10,2103,249],{},[14,2105,252],{"id":252},[254,2107,2108,2119],{},[40,2109,2110,2112,2113,2115,2116,2118],{},[50,2111,2058],{}," 创建目录，",[50,2114,2066],{}," 改变终端当前目录，",[50,2117,2036],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,2120,2121,2123,2124,2127],{},[50,2122,2023],{}," 会在当前目录寻找 ",[50,2125,2126],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2129,305],{"id":305},[37,2131,2132,2139],{},[40,2133,2134,2135,1298,2137,504],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[50,2136,2036],{},[50,2138,2040],{},[40,2140,2141],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2143,319],{"id":319},[254,2145,2146,2153],{},[40,2147,2148,2149,2152],{},"新建 ",[50,2150,2151],{},"lesson01.py"," 并输出课程编号。",[40,2154,2155],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2157,344],{},[14,2159,347],{"id":347},[10,2161,2162],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,2164,2165],{},"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":66,"searchDepth":79,"depth":79,"links":2167},[2168,2169,2170,2171,2172,2173,2174,2175],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":2000,"description":2005},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[368,2183,2184],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2187,"title":2188,"body":2189,"category":368,"cover":369,"description":2193,"extension":370,"meta":2341,"navigation":88,"path":2342,"pinned":373,"publishedAt":374,"seo":2343,"slug":2344,"stem":2345,"summary":2346,"tags":2347,"updatedAt":374,"visible":88,"__hash__":2350},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2190,"toc":2331},[2191,2194,2196,2199,2201,2207,2218,2220,2240,2242,2244,2264,2266,2272,2274,2276,2295,2297,2305,2307,2322,2324,2326,2329],[10,2192,2193],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2195,16],{"id":16},[10,2197,2198],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2200,22],{"id":22},[10,2202,2203],{},[26,2204],{"alt":2205,"src":2206},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2208,2209,2210,504,2212,2215,2216,504],{},"Python 先计算表达式，再把得到的对象交给 ",[50,2211,1614],{},[50,2213,2214],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[50,2217,1922],{},[14,2219,35],{"id":35},[37,2221,2222,2228,2237],{},[40,2223,2224,2227],{},[50,2225,2226],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2229,2230,2233,2234,504],{},[50,2231,2232],{},"7 + 5"," 是表达式，运行时先求值得到 ",[50,2235,2236],{},"12",[40,2238,2239],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2241,56],{"id":56},[10,2243,59],{},[61,2245,2247],{"className":63,"code":2246,"language":65,"meta":66,"style":66},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[50,2248,2249,2254,2259],{"__ignoreMap":66},[70,2250,2251],{"class":72,"line":73},[70,2252,2253],{},"print(42)\n",[70,2255,2256],{"class":72,"line":79},[70,2257,2258],{},"print(7 + 5)\n",[70,2260,2261],{"class":72,"line":85},[70,2262,2263],{},"print(\"Python 基础课\")\n",[10,2265,238],{},[61,2267,2270],{"className":2268,"code":2269,"language":244,"meta":66},[242],"42\n12\nPython 基础课\n",[50,2271,2269],{"__ignoreMap":66},[10,2273,249],{},[14,2275,252],{"id":252},[254,2277,2278,2286],{},[40,2279,2280,2283,2284,504],{},[50,2281,2282],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[50,2285,2236],{},[40,2287,2288,2290,2291,2294],{},[50,2289,1614],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[50,2292,2293],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2296,305],{"id":305},[37,2298,2299,2302],{},[40,2300,2301],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2303,2304],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2306,319],{"id":319},[254,2308,2309,2312],{},[40,2310,2311],{},"分别输出一个整数、一个小数和一段文本。",[40,2313,2314,2315,2317,2318,2321],{},"比较 ",[50,2316,2214],{}," 与 ",[50,2319,2320],{},"print(\"2 + 3\")"," 的结果。",[10,2323,344],{},[14,2325,347],{"id":347},[10,2327,2328],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,2330,354],{},{"title":66,"searchDepth":79,"depth":79,"links":2332},[2333,2334,2335,2336,2337,2338,2339,2340],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2188,"description":2193},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[368,2348,2349],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2352,"title":2353,"body":2354,"category":368,"cover":369,"description":2358,"extension":370,"meta":2525,"navigation":88,"path":2526,"pinned":373,"publishedAt":374,"seo":2527,"slug":2528,"stem":2529,"summary":2530,"tags":2531,"updatedAt":374,"visible":88,"__hash__":2534},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2355,"toc":2515},[2356,2359,2361,2364,2366,2372,2375,2377,2403,2405,2407,2435,2437,2443,2445,2447,2471,2473,2489,2491,2506,2508,2510,2513],[10,2357,2358],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2360,16],{"id":16},[10,2362,2363],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2365,22],{"id":22},[10,2367,2368],{},[26,2369],{"alt":2370,"src":2371},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2373,2374],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2376,35],{"id":35},[37,2378,2379,2382,2392],{},[40,2380,2381],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2383,2384,2385,2317,2388,2391],{},"变量名区分大小写，",[50,2386,2387],{},"score",[50,2389,2390],{},"Score"," 是两个名字。",[40,2393,2394,2395,2398,2399,2402],{},"使用能表达含义的名称；不要用 ",[50,2396,2397],{},"list","、",[50,2400,2401],{},"str"," 等内置名称作为普通变量名。",[14,2404,56],{"id":56},[10,2406,59],{},[61,2408,2410],{"className":63,"code":2409,"language":65,"meta":66,"style":66},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[50,2411,2412,2417,2422,2426,2431],{"__ignoreMap":66},[70,2413,2414],{"class":72,"line":73},[70,2415,2416],{},"score = 90\n",[70,2418,2419],{"class":72,"line":79},[70,2420,2421],{},"print(score)\n",[70,2423,2424],{"class":72,"line":85},[70,2425,89],{"emptyLinePlaceholder":88},[70,2427,2428],{"class":72,"line":92},[70,2429,2430],{},"score = 95\n",[70,2432,2433],{"class":72,"line":98},[70,2434,2421],{},[10,2436,238],{},[61,2438,2441],{"className":2439,"code":2440,"language":244,"meta":66},[242],"90\n95\n",[50,2442,2440],{"__ignoreMap":66},[10,2444,249],{},[14,2446,252],{"id":252},[254,2448,2449,2458],{},[40,2450,1080,2451,2454,2455,2457],{},[50,2452,2453],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[50,2456,2387],{}," 再绑定到它。",[40,2459,1080,2460,2463,2464,2467,2468,504],{},[50,2461,2462],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[50,2465,2466],{},"90"," 没有被改造成 ",[50,2469,2470],{},"95",[14,2472,305],{"id":305},[37,2474,2475,2478],{},[40,2476,2477],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2479,2480,2481,2398,2483,2398,2485,2488],{},"使用 ",[50,2482,2397],{},[50,2484,2401],{},[50,2486,2487],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2490,319],{"id":319},[254,2492,2493,2503],{},[40,2494,2495,2496,1298,2499,2502],{},"创建 ",[50,2497,2498],{},"course_name",[50,2500,2501],{},"lesson_count"," 两个变量并输出。",[40,2504,2505],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2507,344],{},[14,2509,347],{"id":347},[10,2511,2512],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,2514,354],{},{"title":66,"searchDepth":79,"depth":79,"links":2516},[2517,2518,2519,2520,2521,2522,2523,2524],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2353,"description":2358},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[368,2532,2533],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2536,"title":2537,"body":2538,"category":368,"cover":369,"description":2542,"extension":370,"meta":2706,"navigation":88,"path":2707,"pinned":373,"publishedAt":374,"seo":2708,"slug":2709,"stem":2710,"summary":2711,"tags":2712,"updatedAt":374,"visible":88,"__hash__":2715},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2539,"toc":2696},[2540,2543,2545,2548,2550,2556,2559,2561,2590,2592,2594,2638,2640,2646,2648,2650,2664,2666,2677,2679,2687,2689,2691,2694],[10,2541,2542],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2544,16],{"id":16},[10,2546,2547],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2549,22],{"id":22},[10,2551,2552],{},[26,2553],{"alt":2554,"src":2555},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2557,2558],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2560,35],{"id":35},[37,2562,2563,2573,2587],{},[40,2564,2565,2568,2569,2572],{},[50,2566,2567],{},"int"," 表示整数，",[50,2570,2571],{},"float"," 表示浮点数。",[40,2574,2575,2578,2579,2582,2583,2586],{},[50,2576,2577],{},"\u002F"," 总是进行真除法；",[50,2580,2581],{},"\u002F\u002F"," 是向下取整除法，",[50,2584,2585],{},"%"," 得到余数。",[40,2588,2589],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2591,56],{"id":56},[10,2593,59],{},[61,2595,2597],{"className":63,"code":2596,"language":65,"meta":66,"style":66},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[50,2598,2599,2604,2609,2614,2618,2623,2628,2633],{"__ignoreMap":66},[70,2600,2601],{"class":72,"line":73},[70,2602,2603],{},"price = 25\n",[70,2605,2606],{"class":72,"line":79},[70,2607,2608],{},"count = 4\n",[70,2610,2611],{"class":72,"line":85},[70,2612,2613],{},"discount = 0.9\n",[70,2615,2616],{"class":72,"line":92},[70,2617,89],{"emptyLinePlaceholder":88},[70,2619,2620],{"class":72,"line":98},[70,2621,2622],{},"total = price * count * discount\n",[70,2624,2625],{"class":72,"line":104},[70,2626,2627],{},"average = total \u002F count\n",[70,2629,2630],{"class":72,"line":110},[70,2631,2632],{},"print(total)\n",[70,2634,2635],{"class":72,"line":116},[70,2636,2637],{},"print(average)\n",[10,2639,238],{},[61,2641,2644],{"className":2642,"code":2643,"language":244,"meta":66},[242],"90.0\n22.5\n",[50,2645,2643],{"__ignoreMap":66},[10,2647,249],{},[14,2649,252],{"id":252},[254,2651,2652,2658],{},[40,2653,2654,2657],{},[50,2655,2656],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2659,2660,2663],{},[50,2661,2662],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2665,305],{"id":305},[37,2667,2668,2674],{},[40,2669,2670,2671,504],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[50,2672,2673],{},"decimal.Decimal",[40,2675,2676],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2678,319],{"id":319},[254,2680,2681,2684],{},[40,2682,2683],{},"计算 137 除以 10 的商和余数。",[40,2685,2686],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2688,344],{},[14,2690,347],{"id":347},[10,2692,2693],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,2695,354],{},{"title":66,"searchDepth":79,"depth":79,"links":2697},[2698,2699,2700,2701,2702,2703,2704,2705],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2537,"description":2542},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[368,2713,2714],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2717,"title":2718,"body":2719,"category":368,"cover":369,"description":2723,"extension":370,"meta":2898,"navigation":88,"path":2899,"pinned":373,"publishedAt":374,"seo":2900,"slug":2901,"stem":2902,"summary":2903,"tags":2904,"updatedAt":374,"visible":88,"__hash__":2907},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2720,"toc":2886},[2721,2724,2726,2729,2731,2737,2747,2749,2760,2762,2764,2794,2796,2802,2804,2806,2836,2838,2841,2847,2850,2852,2860,2862,2877,2879,2881,2884],[10,2722,2723],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2725,16],{"id":16},[10,2727,2728],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2730,22],{"id":22},[10,2732,2733],{},[26,2734],{"alt":2735,"src":2736},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2738,2739,2740,2743,2744,504],{},"切片 ",[50,2741,2742],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[50,2745,2746],{},"stop - start",[14,2748,35],{"id":35},[37,2750,2751,2754,2757],{},[40,2752,2753],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2755,2756],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2758,2759],{},"切片会创建新的字符串，不会修改原字符串。",[14,2761,56],{"id":56},[10,2763,59],{},[61,2765,2767],{"className":63,"code":2766,"language":65,"meta":66,"style":66},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[50,2768,2769,2774,2779,2784,2789],{"__ignoreMap":66},[70,2770,2771],{"class":72,"line":73},[70,2772,2773],{},"language = \"Python\"\n",[70,2775,2776],{"class":72,"line":79},[70,2777,2778],{},"print(language[0])\n",[70,2780,2781],{"class":72,"line":85},[70,2782,2783],{},"print(language[-1])\n",[70,2785,2786],{"class":72,"line":92},[70,2787,2788],{},"print(language[0:3])\n",[70,2790,2791],{"class":72,"line":98},[70,2792,2793],{},"print(language + \" 3.14\")\n",[10,2795,238],{},[61,2797,2800],{"className":2798,"code":2799,"language":244,"meta":66},[242],"P\nn\nPyt\nPython 3.14\n",[50,2801,2799],{"__ignoreMap":66},[10,2803,249],{},[14,2805,252],{"id":252},[254,2807,2808,2822],{},[40,2809,2810,2811,2813,2814,2817,2818,2821],{},"字符串 ",[50,2812,368],{}," 的正索引从 ",[50,2815,2816],{},"P"," 的 0 开始，负索引从末尾 ",[50,2819,2820],{},"n"," 的 -1 开始。",[40,2823,2824,2827,2828,2831,2832,2835],{},[50,2825,2826],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[50,2829,2830],{},"Pyt","；索引 3 的 ",[50,2833,2834],{},"h"," 不在结果中。",[269,2837,271],{"id":271},[10,2839,2840],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2842,2843],{},[26,2844],{"alt":2845,"src":2846},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2848,2849],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2851,305],{"id":305},[37,2853,2854,2857],{},[40,2855,2856],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2858,2859],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2861,319],{"id":319},[254,2863,2864,2874],{},[40,2865,2866,2867,2870,2871,504],{},"从 ",[50,2868,2869],{},"\"programming\""," 中切出 ",[50,2872,2873],{},"\"gram\"",[40,2875,2876],{},"使用负索引取得字符串倒数第二个字符。",[10,2878,344],{},[14,2880,347],{"id":347},[10,2882,2883],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,2885,354],{},{"title":66,"searchDepth":79,"depth":79,"links":2887},[2888,2889,2890,2891,2892,2895,2896,2897],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":2893},[2894],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2718,"description":2723},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[368,2905,2906],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2909,"title":2910,"body":2911,"category":368,"cover":369,"description":2915,"extension":370,"meta":3129,"navigation":88,"path":3130,"pinned":373,"publishedAt":374,"seo":3131,"slug":3132,"stem":3133,"summary":3134,"tags":3135,"updatedAt":374,"visible":88,"__hash__":3138},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2912,"toc":3117},[2913,2916,2918,2921,2923,2929,2939,2941,2974,2976,2978,3022,3024,3030,3032,3034,3055,3057,3060,3066,3074,3076,3090,3092,3108,3110,3112,3115],[10,2914,2915],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2917,16],{"id":16},[10,2919,2920],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2922,22],{"id":22},[10,2924,2925],{},[26,2926],{"alt":2927,"src":2928},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2930,2931,2932,1151,2935,2938],{},"比较表达式先产生 ",[50,2933,2934],{},"True",[50,2936,2937],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2940,35],{"id":35},[37,2942,2943,2957,2971],{},[40,2944,2945,2948,2949,2952,2953,2956],{},[50,2946,2947],{},"=="," 判断是否相等，",[50,2950,2951],{},"!="," 判断是否不等；单个 ",[50,2954,2955],{},"="," 是赋值。",[40,2958,2959,2962,2963,2966,2967,2970],{},[50,2960,2961],{},"and"," 要求两侧都为真，",[50,2964,2965],{},"or"," 只需一侧为真，",[50,2968,2969],{},"not"," 取反。",[40,2972,2973],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2975,56],{"id":56},[10,2977,59],{},[61,2979,2981],{"className":63,"code":2980,"language":65,"meta":66,"style":66},"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,2982,2983,2988,2993,2997,3002,3007,3012,3017],{"__ignoreMap":66},[70,2984,2985],{"class":72,"line":73},[70,2986,2987],{},"age = 20\n",[70,2989,2990],{"class":72,"line":79},[70,2991,2992],{},"has_ticket = True\n",[70,2994,2995],{"class":72,"line":85},[70,2996,89],{"emptyLinePlaceholder":88},[70,2998,2999],{"class":72,"line":92},[70,3000,3001],{},"is_adult = age >= 18\n",[70,3003,3004],{"class":72,"line":98},[70,3005,3006],{},"can_enter = is_adult and has_ticket\n",[70,3008,3009],{"class":72,"line":104},[70,3010,3011],{},"print(is_adult)\n",[70,3013,3014],{"class":72,"line":110},[70,3015,3016],{},"print(can_enter)\n",[70,3018,3019],{"class":72,"line":116},[70,3020,3021],{},"print(not has_ticket)\n",[10,3023,238],{},[61,3025,3028],{"className":3026,"code":3027,"language":244,"meta":66},[242],"True\nTrue\nFalse\n",[50,3029,3027],{"__ignoreMap":66},[10,3031,249],{},[14,3033,252],{"id":252},[254,3035,3036,3046],{},[40,3037,3038,3041,3042,3045],{},[50,3039,3040],{},"age >= 18"," 先产生布尔值并绑定给 ",[50,3043,3044],{},"is_adult","，这一步没有任何分支跳转。",[40,3047,3048,3051,3052,3054],{},[50,3049,3050],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[50,3053,2969],{}," 只对紧随其后的值取反。",[269,3056,271],{"id":271},[10,3058,3059],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,3061,3062],{},[26,3063],{"alt":3064,"src":3065},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,3067,3068,3070,3071,3073],{},[50,3069,2961],{}," 只有“真、真”得到真；",[50,3072,2965],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,3075,305],{"id":305},[37,3077,3078,3087],{},[40,3079,3080,3081,3083,3084,3086],{},"用单个等号判断相等。",[50,3082,2955],{}," 是赋值，",[50,3085,2947],{}," 才是相等比较。",[40,3088,3089],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,3091,319],{"id":319},[254,3093,3094,3101],{},[40,3095,3096,3097,3100],{},"判断数字 ",[50,3098,3099],{},"15"," 是否同时大于 10 且小于 20。",[40,3102,3103,3104,3107],{},"分别修改年龄和票据状态，记录 ",[50,3105,3106],{},"can_enter"," 的四种组合结果。",[10,3109,344],{},[14,3111,347],{"id":347},[10,3113,3114],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3116,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3118},[3119,3120,3121,3122,3123,3126,3127,3128],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":3124},[3125],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2910,"description":2915},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[368,3136,3137],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3140,"title":3141,"body":3142,"category":368,"cover":369,"description":3146,"extension":370,"meta":3314,"navigation":88,"path":3315,"pinned":373,"publishedAt":374,"seo":3316,"slug":3317,"stem":3318,"summary":3319,"tags":3320,"updatedAt":374,"visible":88,"__hash__":3322},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3143,"toc":3304},[3144,3147,3149,3152,3154,3160,3178,3180,3193,3195,3197,3231,3233,3239,3241,3243,3265,3267,3279,3281,3295,3297,3299,3302],[10,3145,3146],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3148,16],{"id":16},[10,3150,3151],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3153,22],{"id":22},[10,3155,3156],{},[26,3157],{"alt":3158,"src":3159},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3161,3162,3165,3166,3169,3170,3173,3174,3177],{},[50,3163,3164],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[50,3167,3168],{},"18","，程序首先得到的也是 ",[50,3171,3172],{},"\"18\"","，需要 ",[50,3175,3176],{},"int()"," 后才能按整数参与计算。",[14,3179,35],{"id":35},[37,3181,3182,3185,3190],{},[40,3183,3184],{},"提示文字应告诉用户需要输入什么。",[40,3186,3187,3189],{},[50,3188,3176],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3191,3192],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3194,56],{"id":56},[10,3196,59],{},[61,3198,3200],{"className":63,"code":3199,"language":65,"meta":66,"style":66},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[50,3201,3202,3207,3212,3217,3221,3226],{"__ignoreMap":66},[70,3203,3204],{"class":72,"line":73},[70,3205,3206],{},"name = input(\"请输入姓名：\")\n",[70,3208,3209],{"class":72,"line":79},[70,3210,3211],{},"age_text = input(\"请输入年龄：\")\n",[70,3213,3214],{"class":72,"line":85},[70,3215,3216],{},"age = int(age_text)\n",[70,3218,3219],{"class":72,"line":92},[70,3220,89],{"emptyLinePlaceholder":88},[70,3222,3223],{"class":72,"line":98},[70,3224,3225],{},"print(\"你好，\" + name)\n",[70,3227,3228],{"class":72,"line":104},[70,3229,3230],{},"print(age + 1)\n",[10,3232,238],{},[61,3234,3237],{"className":3235,"code":3236,"language":244,"meta":66},[242],"根据输入显示姓名，并输出下一年的年龄\n",[50,3238,3236],{"__ignoreMap":66},[10,3240,249],{},[14,3242,252],{"id":252},[254,3244,3245,3255],{},[40,3246,3247,3248,3250,3251,3254],{},"两次 ",[50,3249,3164],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[50,3252,3253],{},"age_text"," 用来提醒这仍是文本。",[40,3256,3257,3260,3261,3264],{},[50,3258,3259],{},"int(age_text)"," 创建整数对象，后面的 ",[50,3262,3263],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3266,305],{"id":305},[37,3268,3269,3276],{},[40,3270,3271,3272,3275],{},"直接计算 ",[50,3273,3274],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3277,3278],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3280,319],{"id":319},[254,3282,3283,3286],{},[40,3284,3285],{},"接收两个整数并输出它们的和。",[40,3287,1861,3288,3291,3292,3294],{},[50,3289,3290],{},"18.5"," 给 ",[50,3293,3176],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3296,344],{},[14,3298,347],{"id":347},[10,3300,3301],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3303,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3305},[3306,3307,3308,3309,3310,3311,3312,3313],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3141,"description":3146},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[368,2487,3321],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3324,"title":3325,"body":3326,"category":368,"cover":369,"description":3330,"extension":370,"meta":3490,"navigation":88,"path":3491,"pinned":373,"publishedAt":374,"seo":3492,"slug":3493,"stem":3494,"summary":3495,"tags":3496,"updatedAt":374,"visible":88,"__hash__":3499},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3327,"toc":3480},[3328,3331,3333,3336,3338,3344,3351,3353,3367,3369,3371,3410,3412,3418,3420,3422,3441,3443,3458,3460,3471,3473,3475,3478],[10,3329,3330],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3332,16],{"id":16},[10,3334,3335],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3337,22],{"id":22},[10,3339,3340],{},[26,3341],{"alt":3342,"src":3343},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3345,3346,3347,3350],{},"列表为元素维护从 0 开始的位置索引。修改 ",[50,3348,3349],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3352,35],{"id":35},[37,3354,3355,3358,3361],{},[40,3356,3357],{},"列表使用方括号，元素之间用逗号分隔。",[40,3359,3360],{},"列表可变，可以替换、追加和删除元素。",[40,3362,3363,3364,504],{},"访问不存在的索引会产生 ",[50,3365,3366],{},"IndexError",[14,3368,56],{"id":56},[10,3370,59],{},[61,3372,3374],{"className":63,"code":3373,"language":65,"meta":66,"style":66},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[50,3375,3376,3381,3386,3390,3395,3400,3405],{"__ignoreMap":66},[70,3377,3378],{"class":72,"line":73},[70,3379,3380],{},"scores = [82, 90, 76]\n",[70,3382,3383],{"class":72,"line":79},[70,3384,3385],{},"print(scores[0])\n",[70,3387,3388],{"class":72,"line":85},[70,3389,89],{"emptyLinePlaceholder":88},[70,3391,3392],{"class":72,"line":92},[70,3393,3394],{},"scores[1] = 95\n",[70,3396,3397],{"class":72,"line":98},[70,3398,3399],{},"scores.append(88)\n",[70,3401,3402],{"class":72,"line":104},[70,3403,3404],{},"print(scores)\n",[70,3406,3407],{"class":72,"line":110},[70,3408,3409],{},"print(len(scores))\n",[10,3411,238],{},[61,3413,3416],{"className":3414,"code":3415,"language":244,"meta":66},[242],"82\n[82, 95, 76, 88]\n4\n",[50,3417,3415],{"__ignoreMap":66},[10,3419,249],{},[14,3421,252],{"id":252},[254,3423,3424,3427],{},[40,3425,3426],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3428,3429,3432,3433,3436,3437,3440],{},[50,3430,3431],{},"scores[1] = 95"," 替换第二个位置，",[50,3434,3435],{},"append(88)"," 在末尾增加新位置，",[50,3438,3439],{},"len()"," 因而从 3 变为 4。",[14,3442,305],{"id":305},[37,3444,3445,3455],{},[40,3446,3447,3448,3451,3452,504],{},"访问 ",[50,3449,3450],{},"scores[len(scores)]","。最后一个合法正索引是 ",[50,3453,3454],{},"len(scores) - 1",[40,3456,3457],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3459,319],{"id":319},[254,3461,3462,3465],{},[40,3463,3464],{},"建立三项学习任务列表，再追加第四项。",[40,3466,3467,3468,3470],{},"修改第二项，并用 ",[50,3469,3439],{}," 检查元素数量。",[10,3472,344],{},[14,3474,347],{"id":347},[10,3476,3477],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3479,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3481},[3482,3483,3484,3485,3486,3487,3488,3489],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3325,"description":3330},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[368,3497,3498],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3501,"title":3502,"body":3503,"category":368,"cover":369,"description":3507,"extension":370,"meta":3648,"navigation":88,"path":3649,"pinned":373,"publishedAt":374,"seo":3650,"slug":3651,"stem":3652,"summary":3653,"tags":3654,"updatedAt":374,"visible":88,"__hash__":3656},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3504,"toc":3638},[3505,3508,3510,3513,3515,3521,3524,3526,3537,3539,3541,3575,3577,3583,3585,3587,3601,3603,3615,3617,3629,3631,3633,3636],[10,3506,3507],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3509,16],{"id":16},[10,3511,3512],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3514,22],{"id":22},[10,3516,3517],{},[26,3518],{"alt":3519,"src":3520},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3522,3523],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3525,35],{"id":35},[37,3527,3528,3531,3534],{},[40,3529,3530],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3532,3533],{},"只有一个元素的元组必须保留尾随逗号。",[40,3535,3536],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3538,56],{"id":56},[10,3540,59],{},[61,3542,3544],{"className":63,"code":3543,"language":65,"meta":66,"style":66},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[50,3545,3546,3551,3556,3561,3565,3570],{"__ignoreMap":66},[70,3547,3548],{"class":72,"line":73},[70,3549,3550],{},"point = (120, 80)\n",[70,3552,3553],{"class":72,"line":79},[70,3554,3555],{},"print(point[0])\n",[70,3557,3558],{"class":72,"line":85},[70,3559,3560],{},"print(point[1])\n",[70,3562,3563],{"class":72,"line":92},[70,3564,89],{"emptyLinePlaceholder":88},[70,3566,3567],{"class":72,"line":98},[70,3568,3569],{},"single = (5,)\n",[70,3571,3572],{"class":72,"line":104},[70,3573,3574],{},"print(single)\n",[10,3576,238],{},[61,3578,3581],{"className":3579,"code":3580,"language":244,"meta":66},[242],"120\n80\n(5,)\n",[50,3582,3580],{"__ignoreMap":66},[10,3584,249],{},[14,3586,252],{"id":252},[254,3588,3589,3595],{},[40,3590,3591,3594],{},[50,3592,3593],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3596,3597,3600],{},[50,3598,3599],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3602,305],{"id":305},[37,3604,3605,3612],{},[40,3606,3607,3608,3611],{},"把 ",[50,3609,3610],{},"(5)"," 当作元组，实际它仍是整数。",[40,3613,3614],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3616,319],{"id":319},[254,3618,3619,3622],{},[40,3620,3621],{},"用元组表示宽度和高度。",[40,3623,2314,3624,2317,3626,3628],{},[50,3625,3610],{},[50,3627,3599],{}," 的类型。",[10,3630,344],{},[14,3632,347],{"id":347},[10,3634,3635],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3637,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3639},[3640,3641,3642,3643,3644,3645,3646,3647],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3502,"description":3507},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[368,3655,3498],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3658,"title":3659,"body":3660,"category":368,"cover":369,"description":3664,"extension":370,"meta":3819,"navigation":88,"path":3820,"pinned":373,"publishedAt":374,"seo":3821,"slug":3822,"stem":3823,"summary":3824,"tags":3825,"updatedAt":374,"visible":88,"__hash__":3827},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3661,"toc":3809},[3662,3665,3667,3670,3672,3678,3688,3690,3704,3706,3708,3742,3744,3750,3752,3754,3769,3771,3790,3792,3800,3802,3804,3807],[10,3663,3664],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3666,16],{"id":16},[10,3668,3669],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3671,22],{"id":22},[10,3673,3674],{},[26,3675],{"alt":3676,"src":3677},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3679,3680,3681,3684,3685,3687],{},"字典通过键定位值，不使用连续位置表达含义。",[50,3682,3683],{},"student[\"score\"]"," 读取的是键 ",[50,3686,2387],{}," 对应的值，而不是“第几个元素”。",[14,3689,35],{"id":35},[37,3691,3692,3695,3701],{},[40,3693,3694],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3696,2480,3697,3700],{},[50,3698,3699],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3702,3703],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3705,56],{"id":56},[10,3707,59],{},[61,3709,3711],{"className":63,"code":3710,"language":65,"meta":66,"style":66},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[50,3712,3713,3718,3723,3727,3732,3737],{"__ignoreMap":66},[70,3714,3715],{"class":72,"line":73},[70,3716,3717],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[70,3719,3720],{"class":72,"line":79},[70,3721,3722],{},"print(student[\"name\"])\n",[70,3724,3725],{"class":72,"line":85},[70,3726,89],{"emptyLinePlaceholder":88},[70,3728,3729],{"class":72,"line":92},[70,3730,3731],{},"student[\"score\"] = 95\n",[70,3733,3734],{"class":72,"line":98},[70,3735,3736],{},"student[\"city\"] = \"郑州\"\n",[70,3738,3739],{"class":72,"line":104},[70,3740,3741],{},"print(student)\n",[10,3743,238],{},[61,3745,3748],{"className":3746,"code":3747,"language":244,"meta":66},[242],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[50,3749,3747],{"__ignoreMap":66},[10,3751,249],{},[14,3753,252],{"id":252},[254,3755,3756,3759],{},[40,3757,3758],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3760,3761,3762,3764,3765,3768],{},"给已有键 ",[50,3763,2387],{}," 赋值会更新映射，给新键 ",[50,3766,3767],{},"city"," 赋值会增加映射。",[14,3770,305],{"id":305},[37,3772,3773,3780],{},[40,3774,3775,3776,3779],{},"按位置理解字典并尝试 ",[50,3777,3778],{},"student[0]","，而实际键是字符串。",[40,3781,3782,3783,3786,3787,504],{},"直接读取不确定存在的键并忽略 ",[50,3784,3785],{},"KeyError","；后续可根据场景使用成员检查或 ",[50,3788,3789],{},"get()",[14,3791,319],{"id":319},[254,3793,3794,3797],{},[40,3795,3796],{},"建立一本书的标题、作者和页数字典。",[40,3798,3799],{},"添加分类键，再修改页数。",[10,3801,344],{},[14,3803,347],{"id":347},[10,3805,3806],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3808,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3810},[3811,3812,3813,3814,3815,3816,3817,3818],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3659,"description":3664},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[368,3826,3498],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3829,"title":3830,"body":3831,"category":368,"cover":369,"description":3835,"extension":370,"meta":3984,"navigation":88,"path":3985,"pinned":373,"publishedAt":374,"seo":3986,"slug":3987,"stem":3988,"summary":3989,"tags":3990,"updatedAt":374,"visible":88,"__hash__":3992},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3832,"toc":3974},[3833,3836,3838,3841,3843,3849,3852,3854,3873,3875,3877,3911,3913,3919,3921,3923,3938,3940,3952,3954,3965,3967,3969,3972],[10,3834,3835],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3837,16],{"id":16},[10,3839,3840],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3842,22],{"id":22},[10,3844,3845],{},[26,3846],{"alt":3847,"src":3848},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3850,3851],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3853,35],{"id":35},[37,3855,3856,3859,3862],{},[40,3857,3858],{},"集合中的元素不重复。",[40,3860,3861],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3863,3864,3865,3868,3869,3872],{},"创建空集合必须写 ",[50,3866,3867],{},"set()","；",[50,3870,3871],{},"{}"," 创建的是空字典。",[14,3874,56],{"id":56},[10,3876,59],{},[61,3878,3880],{"className":63,"code":3879,"language":65,"meta":66,"style":66},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[50,3881,3882,3887,3892,3896,3901,3906],{"__ignoreMap":66},[70,3883,3884],{"class":72,"line":73},[70,3885,3886],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[70,3888,3889],{"class":72,"line":79},[70,3890,3891],{},"right = {\"Python\", \"Docker\"}\n",[70,3893,3894],{"class":72,"line":85},[70,3895,89],{"emptyLinePlaceholder":88},[70,3897,3898],{"class":72,"line":92},[70,3899,3900],{},"print(left & right)\n",[70,3902,3903],{"class":72,"line":98},[70,3904,3905],{},"print(left | right)\n",[70,3907,3908],{"class":72,"line":104},[70,3909,3910],{},"print(\"Git\" in left)\n",[10,3912,238],{},[61,3914,3917],{"className":3915,"code":3916,"language":244,"meta":66},[242],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[50,3918,3916],{"__ignoreMap":66},[10,3920,249],{},[14,3922,252],{"id":252},[254,3924,3925,3928],{},[40,3926,3927],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3929,3930,3933,3934,3937],{},[50,3931,3932],{},"&"," 计算交集，",[50,3935,3936],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3939,305],{"id":305},[37,3941,3942,3949],{},[40,3943,2480,3944,3946,3947,504],{},[50,3945,3871],{}," 创建空集合，实际得到空字典；空集合应写 ",[50,3948,3867],{},[40,3950,3951],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3953,319],{"id":319},[254,3955,3956,3962],{},[40,3957,3958,3959,3961],{},"把包含重复标签的列表交给 ",[50,3960,3867],{}," 去重。",[40,3963,3964],{},"计算两组课程标签的交集和差集。",[10,3966,344],{},[14,3968,347],{"id":347},[10,3970,3971],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,3973,354],{},{"title":66,"searchDepth":79,"depth":79,"links":3975},[3976,3977,3978,3979,3980,3981,3982,3983],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3830,"description":3835},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[368,3991,3498],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3994,"title":3995,"body":3996,"category":368,"cover":369,"description":4000,"extension":370,"meta":4197,"navigation":88,"path":4198,"pinned":373,"publishedAt":374,"seo":4199,"slug":4200,"stem":4201,"summary":4202,"tags":4203,"updatedAt":374,"visible":88,"__hash__":4206},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3997,"toc":4185},[3998,4001,4003,4006,4008,4014,4024,4026,4043,4045,4047,4096,4098,4104,4106,4108,4130,4132,4135,4141,4144,4146,4159,4161,4176,4178,4180,4183],[10,3999,4000],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,4002,16],{"id":16},[10,4004,4005],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4007,22],{"id":22},[10,4009,4010],{},[26,4011],{"alt":4012,"src":4013},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,4015,4016,4019,4020,4023],{},[50,4017,4018],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[50,4021,4022],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,4025,35],{"id":35},[37,4027,4028,4037,4040],{},[40,4029,4030,4032,4033,4036],{},[50,4031,2947],{}," 比较内容是否相等，",[50,4034,4035],{},"is"," 比较是否为同一个对象。",[40,4038,4039],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,4041,4042],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,4044,56],{"id":56},[10,4046,59],{},[61,4048,4050],{"className":63,"code":4049,"language":65,"meta":66,"style":66},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[50,4051,4052,4057,4062,4067,4071,4076,4081,4086,4091],{"__ignoreMap":66},[70,4053,4054],{"class":72,"line":73},[70,4055,4056],{},"tasks = [\"变量\", \"字符串\"]\n",[70,4058,4059],{"class":72,"line":79},[70,4060,4061],{},"shared = tasks\n",[70,4063,4064],{"class":72,"line":85},[70,4065,4066],{},"backup = tasks.copy()\n",[70,4068,4069],{"class":72,"line":92},[70,4070,89],{"emptyLinePlaceholder":88},[70,4072,4073],{"class":72,"line":98},[70,4074,4075],{},"tasks.append(\"列表\")\n",[70,4077,4078],{"class":72,"line":104},[70,4079,4080],{},"print(shared)\n",[70,4082,4083],{"class":72,"line":110},[70,4084,4085],{},"print(backup)\n",[70,4087,4088],{"class":72,"line":116},[70,4089,4090],{},"print(tasks is shared)\n",[70,4092,4093],{"class":72,"line":121},[70,4094,4095],{},"print(tasks is backup)\n",[10,4097,238],{},[61,4099,4102],{"className":4100,"code":4101,"language":244,"meta":66},[242],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[50,4103,4101],{"__ignoreMap":66},[10,4105,249],{},[14,4107,252],{"id":252},[254,4109,4110,4116],{},[40,4111,4112,4115],{},[50,4113,4114],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,4117,4118,4121,4122,4125,4126,4129],{},[50,4119,4120],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[50,4123,4124],{},"shared"," 能观察到变化，",[50,4127,4128],{},"backup"," 不会。",[269,4131,271],{"id":271},[10,4133,4134],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4136,4137],{},[26,4138],{"alt":4139,"src":4140},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4142,4143],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4145,305],{"id":305},[37,4147,4148,4156],{},[40,4149,4150,4151,4153,4154,504],{},"用 ",[50,4152,2947],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[50,4155,4035],{},[40,4157,4158],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4160,319],{"id":319},[254,4162,4163,4166],{},[40,4164,4165],{},"让两个变量引用同一个字典并修改其中一个。",[40,4167,2480,4168,4171,4172,1298,4174,504],{},[50,4169,4170],{},"copy()"," 创建外层副本，再比较 ",[50,4173,4035],{},[50,4175,2947],{},[10,4177,344],{},[14,4179,347],{"id":347},[10,4181,4182],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,4184,354],{},{"title":66,"searchDepth":79,"depth":79,"links":4186},[4187,4188,4189,4190,4191,4194,4195,4196],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":4192},[4193],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3995,"description":4000},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[368,4204,4205],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4208,"title":4209,"body":4210,"category":368,"cover":369,"description":4214,"extension":370,"meta":4425,"navigation":88,"path":4426,"pinned":373,"publishedAt":374,"seo":4427,"slug":4428,"stem":4429,"summary":4430,"tags":4431,"updatedAt":374,"visible":88,"__hash__":4433},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4211,"toc":4412},[4212,4215,4217,4220,4222,4228,4238,4240,4251,4253,4255,4307,4309,4315,4317,4319,4337,4339,4342,4348,4356,4358,4361,4367,4373,4375,4393,4395,4403,4405,4407,4410],[10,4213,4214],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4216,16],{"id":16},[10,4218,4219],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4221,22],{"id":22},[10,4223,4224],{},[26,4225],{"alt":4226,"src":4227},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4229,4230,2398,4232,2398,4235,4237],{},[50,4231,1297],{},[50,4233,4234],{},"elif",[50,4236,1301],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4239,35],{"id":35},[37,4241,4242,4245,4248],{},[40,4243,4244],{},"冒号表示接下来开始一个代码块。",[40,4246,4247],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4249,4250],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4252,56],{"id":56},[10,4254,59],{},[61,4256,4258],{"className":63,"code":4257,"language":65,"meta":66,"style":66},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[50,4259,4260,4265,4269,4274,4279,4284,4289,4293,4298,4302],{"__ignoreMap":66},[70,4261,4262],{"class":72,"line":73},[70,4263,4264],{},"score = int(input(\"请输入分数：\"))\n",[70,4266,4267],{"class":72,"line":79},[70,4268,89],{"emptyLinePlaceholder":88},[70,4270,4271],{"class":72,"line":85},[70,4272,4273],{},"if score >= 90:\n",[70,4275,4276],{"class":72,"line":92},[70,4277,4278],{},"    level = \"优秀\"\n",[70,4280,4281],{"class":72,"line":98},[70,4282,4283],{},"elif score >= 60:\n",[70,4285,4286],{"class":72,"line":104},[70,4287,4288],{},"    level = \"合格\"\n",[70,4290,4291],{"class":72,"line":110},[70,4292,229],{},[70,4294,4295],{"class":72,"line":116},[70,4296,4297],{},"    level = \"需要继续学习\"\n",[70,4299,4300],{"class":72,"line":121},[70,4301,89],{"emptyLinePlaceholder":88},[70,4303,4304],{"class":72,"line":127},[70,4305,4306],{},"print(level)\n",[10,4308,238],{},[61,4310,4313],{"className":4311,"code":4312,"language":244,"meta":66},[242],"输入 85 时输出：合格\n",[50,4314,4312],{"__ignoreMap":66},[10,4316,249],{},[14,4318,252],{"id":252},[254,4320,4321,4328],{},[40,4322,4323,4324,4327],{},"输入先转换为整数，程序从 ",[50,4325,4326],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4329,4330,4333,4334,4336],{},[50,4331,4332],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[50,4335,1301],{}," 被跳过；最终三个分支只会选择一个。",[269,4338,271],{"id":271},[10,4340,4341],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4343,4344],{},[26,4345],{"alt":4346,"src":4347},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4349,4350,4352,4353,4355],{},[50,4351,4326],{}," 必须放在 ",[50,4354,4332],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[269,4357,271],{"id":286},[10,4359,4360],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4362,4363],{},[26,4364],{"alt":4365,"src":4366},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4368,4369,4370,4372],{},"同一缩进层级属于同一个代码块；回到 ",[50,4371,1297],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4374,305],{"id":305},[37,4376,4377,4383],{},[40,4378,4379,4380,4382],{},"先写 ",[50,4381,4332],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4384,4385,4386,4388,4389,4392],{},"混用多个独立 ",[50,4387,1297],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[50,4390,4391],{},"if\u002Felif\u002Felse"," 链。",[14,4394,319],{"id":319},[254,4396,4397,4400],{},[40,4398,4399],{},"根据温度输出“冷、适中、热”三个等级。",[40,4401,4402],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4404,344],{},[14,4406,347],{"id":347},[10,4408,4409],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,4411,354],{},{"title":66,"searchDepth":79,"depth":79,"links":4413},[4414,4415,4416,4417,4418,4422,4423,4424],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":4419},[4420,4421],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4209,"description":4214},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[368,1297,4432],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4435,"title":4436,"body":4437,"category":368,"cover":369,"description":4441,"extension":370,"meta":4607,"navigation":88,"path":4608,"pinned":373,"publishedAt":374,"seo":4609,"slug":4610,"stem":4611,"summary":4612,"tags":4613,"updatedAt":374,"visible":88,"__hash__":4615},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4438,"toc":4595},[4439,4442,4444,4447,4449,4455,4461,4463,4478,4480,4482,4520,4522,4528,4530,4532,4547,4549,4552,4558,4564,4566,4574,4576,4586,4588,4590,4593],[10,4440,4441],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4443,16],{"id":16},[10,4445,4446],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4448,22],{"id":22},[10,4450,4451],{},[26,4452],{"alt":4453,"src":4454},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4456,4457,4460],{},[50,4458,4459],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4462,35],{"id":35},[37,4464,4465,4468,4471],{},[40,4466,4467],{},"进入循环前先准备参与条件判断的状态。",[40,4469,4470],{},"循环体中必须有机会让条件变为假。",[40,4472,4473,4474,4477],{},"能够预先确定遍历对象时，后续介绍的 ",[50,4475,4476],{},"for"," 通常更直接。",[14,4479,56],{"id":56},[10,4481,59],{},[61,4483,4485],{"className":63,"code":4484,"language":65,"meta":66,"style":66},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[50,4486,4487,4492,4496,4501,4506,4511,4515],{"__ignoreMap":66},[70,4488,4489],{"class":72,"line":73},[70,4490,4491],{},"count = 1\n",[70,4493,4494],{"class":72,"line":79},[70,4495,89],{"emptyLinePlaceholder":88},[70,4497,4498],{"class":72,"line":85},[70,4499,4500],{},"while count \u003C= 3:\n",[70,4502,4503],{"class":72,"line":92},[70,4504,4505],{},"    print(\"第\", count, \"次练习\")\n",[70,4507,4508],{"class":72,"line":98},[70,4509,4510],{},"    count = count + 1\n",[70,4512,4513],{"class":72,"line":104},[70,4514,89],{"emptyLinePlaceholder":88},[70,4516,4517],{"class":72,"line":110},[70,4518,4519],{},"print(\"练习结束\")\n",[10,4521,238],{},[61,4523,4526],{"className":4524,"code":4525,"language":244,"meta":66},[242],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[50,4527,4525],{"__ignoreMap":66},[10,4529,249],{},[14,4531,252],{"id":252},[254,4533,4534,4541],{},[40,4535,4536,4537,4540],{},"进入循环前 ",[50,4538,4539],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4542,4543,4544,4546],{},"循环体末尾把 ",[50,4545,4539],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[269,4548,271],{"id":271},[10,4550,4551],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4553,4554],{},[26,4555],{"alt":4556,"src":4557},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4559,4560,4561,4563],{},"第4次检查时 ",[50,4562,4539],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4565,305],{"id":305},[37,4567,4568,4571],{},[40,4569,4570],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4572,4573],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4575,319],{"id":319},[254,4577,4578,4583],{},[40,4579,2480,4580,4582],{},[50,4581,4459],{}," 输出 1 到 5。",[40,4584,4585],{},"计算 1 到 10 的累加和。",[10,4587,344],{},[14,4589,347],{"id":347},[10,4591,4592],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,4594,354],{},{"title":66,"searchDepth":79,"depth":79,"links":4596},[4597,4598,4599,4600,4601,4604,4605,4606],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":4602},[4603],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4436,"description":4441},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[368,4459,4614],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4617,"title":4618,"body":4619,"category":368,"cover":369,"description":4623,"extension":370,"meta":4771,"navigation":88,"path":4772,"pinned":373,"publishedAt":374,"seo":4773,"slug":4774,"stem":4775,"summary":4776,"tags":4777,"updatedAt":374,"visible":88,"__hash__":4779},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4620,"toc":4761},[4621,4624,4626,4629,4631,4637,4642,4644,4658,4660,4662,4700,4702,4708,4710,4712,4729,4731,4739,4741,4752,4754,4756,4759],[10,4622,4623],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4625,16],{"id":16},[10,4627,4628],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4630,22],{"id":22},[10,4632,4633],{},[26,4634],{"alt":4635,"src":4636},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4638,4639,4641],{},[50,4640,4476],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4643,35],{"id":35},[37,4645,4646,4652,4655],{},[40,4647,4648,4651],{},[50,4649,4650],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4653,4654],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4656,4657],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4659,56],{"id":56},[10,4661,59],{},[61,4663,4665],{"className":63,"code":4664,"language":65,"meta":66,"style":66},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[50,4666,4667,4672,4676,4681,4686,4690,4695],{"__ignoreMap":66},[70,4668,4669],{"class":72,"line":73},[70,4670,4671],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[70,4673,4674],{"class":72,"line":79},[70,4675,89],{"emptyLinePlaceholder":88},[70,4677,4678],{"class":72,"line":85},[70,4679,4680],{},"for course in courses:\n",[70,4682,4683],{"class":72,"line":92},[70,4684,4685],{},"    print(course)\n",[70,4687,4688],{"class":72,"line":98},[70,4689,89],{"emptyLinePlaceholder":88},[70,4691,4692],{"class":72,"line":104},[70,4693,4694],{},"for number in range(1, 4):\n",[70,4696,4697],{"class":72,"line":110},[70,4698,4699],{},"    print(number)\n",[10,4701,238],{},[61,4703,4706],{"className":4704,"code":4705,"language":244,"meta":66},[242],"变量\n字符串\n列表\n1\n2\n3\n",[50,4707,4705],{"__ignoreMap":66},[10,4709,249],{},[14,4711,252],{"id":252},[254,4713,4714,4724],{},[40,4715,4716,4717,4719,4720,4723],{},"第一个 ",[50,4718,4476],{}," 依次从列表取得字符串，循环变量 ",[50,4721,4722],{},"course"," 每轮重新绑定。",[40,4725,4726,4728],{},[50,4727,4650],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4730,305],{"id":305},[37,4732,4733,4736],{},[40,4734,4735],{},"只需要元素却手工维护索引，增加越界风险。",[40,4737,4738],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4740,319],{"id":319},[254,4742,4743,4746],{},[40,4744,4745],{},"逐项输出一个字符串中的字符。",[40,4747,2480,4748,4751],{},[50,4749,4750],{},"range()"," 输出 2、4、6、8。",[10,4753,344],{},[14,4755,347],{"id":347},[10,4757,4758],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,4760,354],{},{"title":66,"searchDepth":79,"depth":79,"links":4762},[4763,4764,4765,4766,4767,4768,4769,4770],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4618,"description":4623},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[368,4476,4778],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4781,"title":4782,"body":4783,"category":368,"cover":369,"description":4787,"extension":370,"meta":4961,"navigation":88,"path":4962,"pinned":373,"publishedAt":374,"seo":4963,"slug":4964,"stem":4965,"summary":4966,"tags":4967,"updatedAt":374,"visible":88,"__hash__":4968},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4784,"toc":4951},[4785,4788,4790,4793,4795,4801,4811,4813,4832,4834,4836,4888,4890,4896,4898,4900,4914,4916,4932,4934,4942,4944,4946,4949],[10,4786,4787],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4789,16],{"id":16},[10,4791,4792],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4794,22],{"id":22},[10,4796,4797],{},[26,4798],{"alt":4799,"src":4800},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4802,4803,4806,4807,4810],{},[50,4804,4805],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[50,4808,4809],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4812,35],{"id":35},[37,4814,4815,4818,4826],{},[40,4816,4817],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4819,4820,4822,4823,4825],{},[50,4821,4805],{}," 前要确认不会跳过 ",[50,4824,4459],{}," 循环中的状态更新。",[40,4827,4828,4829,4831],{},"多层嵌套中 ",[50,4830,4809],{}," 只结束它所在的最内层循环。",[14,4833,56],{"id":56},[10,4835,59],{},[61,4837,4839],{"className":63,"code":4838,"language":65,"meta":66,"style":66},"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,4840,4841,4846,4850,4855,4860,4865,4870,4875,4879,4883],{"__ignoreMap":66},[70,4842,4843],{"class":72,"line":73},[70,4844,4845],{},"numbers = [3, -1, 0, 8, 12]\n",[70,4847,4848],{"class":72,"line":79},[70,4849,89],{"emptyLinePlaceholder":88},[70,4851,4852],{"class":72,"line":85},[70,4853,4854],{},"for number in numbers:\n",[70,4856,4857],{"class":72,"line":92},[70,4858,4859],{},"    if number \u003C 0:\n",[70,4861,4862],{"class":72,"line":98},[70,4863,4864],{},"        continue\n",[70,4866,4867],{"class":72,"line":104},[70,4868,4869],{},"    if number == 0:\n",[70,4871,4872],{"class":72,"line":110},[70,4873,4874],{},"        break\n",[70,4876,4877],{"class":72,"line":116},[70,4878,4699],{},[70,4880,4881],{"class":72,"line":121},[70,4882,89],{"emptyLinePlaceholder":88},[70,4884,4885],{"class":72,"line":127},[70,4886,4887],{},"print(\"循环结束\")\n",[10,4889,238],{},[61,4891,4894],{"className":4892,"code":4893,"language":244,"meta":66},[242],"3\n循环结束\n",[50,4895,4893],{"__ignoreMap":66},[10,4897,249],{},[14,4899,252],{"id":252},[254,4901,4902,4908],{},[40,4903,4904,4905,4907],{},"遇到 -1 时 ",[50,4906,4805],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4909,4910,4911,4913],{},"遇到 0 时 ",[50,4912,4809],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4915,305],{"id":305},[37,4917,4918,4923],{},[40,4919,3607,4920,4922],{},[50,4921,4805],{}," 当作结束循环，实际它只跳到下一轮。",[40,4924,4925,4926,4928,4929,4931],{},"在 ",[50,4927,4459],{}," 中把状态更新放在可能被 ",[50,4930,4805],{}," 跳过的位置，造成无限循环。",[14,4933,319],{"id":319},[254,4935,4936,4939],{},[40,4937,4938],{},"跳过列表中的空字符串并输出其他内容。",[40,4940,4941],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4943,344],{},[14,4945,347],{"id":347},[10,4947,4948],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,4950,354],{},{"title":66,"searchDepth":79,"depth":79,"links":4952},[4953,4954,4955,4956,4957,4958,4959,4960],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4782,"description":4787},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[368,4809,4805],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4970,"title":4971,"body":4972,"category":368,"cover":369,"description":4976,"extension":370,"meta":5147,"navigation":88,"path":5148,"pinned":373,"publishedAt":374,"seo":5149,"slug":5150,"stem":5151,"summary":5152,"tags":5153,"updatedAt":374,"visible":88,"__hash__":5156},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4973,"toc":5135},[4974,4977,4979,4982,4984,4990,4993,4995,5019,5021,5023,5057,5059,5065,5067,5069,5086,5088,5091,5097,5100,5102,5116,5118,5126,5128,5130,5133],[10,4975,4976],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4978,16],{"id":16},[10,4980,4981],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4983,22],{"id":22},[10,4985,4986],{},[26,4987],{"alt":4988,"src":4989},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4991,4992],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4994,35],{"id":35},[37,4996,4997,5000,5003],{},[40,4998,4999],{},"每增加一层嵌套，阅读成本都会上升。",[40,5001,5002],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,5004,5005,5006,2398,5009,5012,5013,2398,5016,504],{},"变量名使用 ",[50,5007,5008],{},"row",[50,5010,5011],{},"cell"," 等层级含义，避免全部写成 ",[50,5014,5015],{},"i",[50,5017,5018],{},"j",[14,5020,56],{"id":56},[10,5022,59],{},[61,5024,5026],{"className":63,"code":5025,"language":65,"meta":66,"style":66},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[50,5027,5028,5033,5037,5042,5047,5052],{"__ignoreMap":66},[70,5029,5030],{"class":72,"line":73},[70,5031,5032],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[70,5034,5035],{"class":72,"line":79},[70,5036,89],{"emptyLinePlaceholder":88},[70,5038,5039],{"class":72,"line":85},[70,5040,5041],{},"for row in table:\n",[70,5043,5044],{"class":72,"line":92},[70,5045,5046],{},"    for cell in row:\n",[70,5048,5049],{"class":72,"line":98},[70,5050,5051],{},"        print(cell)\n",[70,5053,5054],{"class":72,"line":104},[70,5055,5056],{},"    print(\"一行结束\")\n",[10,5058,238],{},[61,5060,5063],{"className":5061,"code":5062,"language":244,"meta":66},[242],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[50,5064,5062],{"__ignoreMap":66},[10,5066,249],{},[14,5068,252],{"id":252},[254,5070,5071,5083],{},[40,5072,5073,5074,5076,5077,1298,5080,504],{},"外层变量 ",[50,5075,5008],{}," 先引用第一行列表，内层才依次处理 ",[50,5078,5079],{},"A1",[50,5081,5082],{},"A2",[40,5084,5085],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[269,5087,271],{"id":271},[10,5089,5090],{},"二维列表的输出顺序可以展开成一条时间线。",[10,5092,5093],{},[26,5094],{"alt":5095,"src":5096},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,5098,5099],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,5101,305],{"id":305},[37,5103,5104,5113],{},[40,5105,5106,5107,1151,5110,5112],{},"把两层循环变量都叫 ",[50,5108,5109],{},"item",[50,5111,5015],{},"，难以确认当前层级。",[40,5114,5115],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,5117,319],{"id":319},[254,5119,5120,5123],{},[40,5121,5122],{},"打印一个 2×3 数字表。",[40,5124,5125],{},"在内层增加条件，只输出大于 3 的元素。",[10,5127,344],{},[14,5129,347],{"id":347},[10,5131,5132],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,5134,354],{},{"title":66,"searchDepth":79,"depth":79,"links":5136},[5137,5138,5139,5140,5141,5144,5145,5146],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":5142},[5143],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4971,"description":4976},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[368,5154,5155],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5158,"title":5159,"body":5160,"category":368,"cover":369,"description":5164,"extension":370,"meta":5302,"navigation":88,"path":5303,"pinned":373,"publishedAt":374,"seo":5304,"slug":5305,"stem":5306,"summary":5307,"tags":5308,"updatedAt":374,"visible":88,"__hash__":5311},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5161,"toc":5292},[5162,5165,5167,5170,5172,5178,5181,5183,5194,5196,5198,5236,5238,5244,5246,5248,5260,5262,5273,5275,5283,5285,5287,5290],[10,5163,5164],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5166,16],{"id":16},[10,5168,5169],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5171,22],{"id":22},[10,5173,5174],{},[26,5175],{"alt":5176,"src":5177},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5179,5180],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5182,35],{"id":35},[37,5184,5185,5188,5191],{},[40,5186,5187],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5189,5190],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5192,5193],{},"推导式创建新列表，不修改输入列表。",[14,5195,56],{"id":56},[10,5197,59],{},[61,5199,5201],{"className":63,"code":5200,"language":65,"meta":66,"style":66},"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,5202,5203,5208,5212,5217,5222,5226,5231],{"__ignoreMap":66},[70,5204,5205],{"class":72,"line":73},[70,5206,5207],{},"numbers = [1, 2, 3, 4, 5]\n",[70,5209,5210],{"class":72,"line":79},[70,5211,89],{"emptyLinePlaceholder":88},[70,5213,5214],{"class":72,"line":85},[70,5215,5216],{},"squares = [number * number for number in numbers]\n",[70,5218,5219],{"class":72,"line":92},[70,5220,5221],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[70,5223,5224],{"class":72,"line":98},[70,5225,89],{"emptyLinePlaceholder":88},[70,5227,5228],{"class":72,"line":104},[70,5229,5230],{},"print(squares)\n",[70,5232,5233],{"class":72,"line":110},[70,5234,5235],{},"print(even_squares)\n",[10,5237,238],{},[61,5239,5242],{"className":5240,"code":5241,"language":244,"meta":66},[242],"[1, 4, 9, 16, 25]\n[4, 16]\n",[50,5243,5241],{"__ignoreMap":66},[10,5245,249],{},[14,5247,252],{"id":252},[254,5249,5250,5253],{},[40,5251,5252],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5254,5255,5256,5259],{},"第二条先用 ",[50,5257,5258],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5261,305],{"id":305},[37,5263,5264,5270],{},[40,5265,5266,5267,5269],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[50,5268,4476],{}," 开始找输入。",[40,5271,5272],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5274,319],{"id":319},[254,5276,5277,5280],{},[40,5278,5279],{},"把字符串列表转换为长度列表。",[40,5281,5282],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5284,344],{},[14,5286,347],{"id":347},[10,5288,5289],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,5291,354],{},{"title":66,"searchDepth":79,"depth":79,"links":5293},[5294,5295,5296,5297,5298,5299,5300,5301],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5159,"description":5164},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[368,5309,5310],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5313,"title":5314,"body":5315,"category":368,"cover":369,"description":5319,"extension":370,"meta":5462,"navigation":88,"path":5463,"pinned":373,"publishedAt":374,"seo":5464,"slug":5465,"stem":5466,"summary":5467,"tags":5468,"updatedAt":374,"visible":88,"__hash__":5471},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5316,"toc":5452},[5317,5320,5322,5325,5327,5333,5336,5338,5349,5351,5353,5392,5394,5400,5402,5404,5419,5421,5429,5431,5443,5445,5447,5450],[10,5318,5319],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5321,16],{"id":16},[10,5323,5324],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5326,22],{"id":22},[10,5328,5329],{},[26,5330],{"alt":5331,"src":5332},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5334,5335],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5337,35],{"id":35},[37,5339,5340,5343,5346],{},[40,5341,5342],{},"函数名描述动作，使用小写字母和下划线。",[40,5344,5345],{},"函数定义要先执行，之后才能调用。",[40,5347,5348],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5350,56],{"id":56},[10,5352,59],{},[61,5354,5356],{"className":63,"code":5355,"language":65,"meta":66,"style":66},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[50,5357,5358,5363,5368,5373,5377,5382,5387],{"__ignoreMap":66},[70,5359,5360],{"class":72,"line":73},[70,5361,5362],{},"def show_progress():\n",[70,5364,5365],{"class":72,"line":79},[70,5366,5367],{},"    print(\"正在学习函数\")\n",[70,5369,5370],{"class":72,"line":85},[70,5371,5372],{},"    print(\"本节完成 50%\")\n",[70,5374,5375],{"class":72,"line":92},[70,5376,89],{"emptyLinePlaceholder":88},[70,5378,5379],{"class":72,"line":98},[70,5380,5381],{},"print(\"调用前\")\n",[70,5383,5384],{"class":72,"line":104},[70,5385,5386],{},"show_progress()\n",[70,5388,5389],{"class":72,"line":110},[70,5390,5391],{},"print(\"调用后\")\n",[10,5393,238],{},[61,5395,5398],{"className":5396,"code":5397,"language":244,"meta":66},[242],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[50,5399,5397],{"__ignoreMap":66},[10,5401,249],{},[14,5403,252],{"id":252},[254,5405,5406,5412],{},[40,5407,1080,5408,5411],{},[50,5409,5410],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5413,5414,5415,5418],{},"运行到 ",[50,5416,5417],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5420,305],{"id":305},[37,5422,5423,5426],{},[40,5424,5425],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5427,5428],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5430,319],{"id":319},[254,5432,5433,5440],{},[40,5434,5435,5436,5439],{},"定义 ",[50,5437,5438],{},"show_plan()"," 输出两行学习计划。",[40,5441,5442],{},"连续调用同一个函数两次，观察执行顺序。",[10,5444,344],{},[14,5446,347],{"id":347},[10,5448,5449],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,5451,354],{},{"title":66,"searchDepth":79,"depth":79,"links":5453},[5454,5455,5456,5457,5458,5459,5460,5461],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5314,"description":5319},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[368,5469,5470],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5473,"title":5474,"body":5475,"category":368,"cover":369,"description":5479,"extension":370,"meta":5659,"navigation":88,"path":5660,"pinned":373,"publishedAt":374,"seo":5661,"slug":5662,"stem":5663,"summary":5664,"tags":5665,"updatedAt":374,"visible":88,"__hash__":5668},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5476,"toc":5647},[5477,5480,5482,5485,5487,5493,5500,5502,5519,5521,5523,5557,5559,5565,5567,5569,5590,5592,5595,5601,5611,5613,5628,5630,5638,5640,5642,5645],[10,5478,5479],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5481,16],{"id":16},[10,5483,5484],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5486,22],{"id":22},[10,5488,5489],{},[26,5490],{"alt":5491,"src":5492},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5494,5495,5496,5499],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[50,5497,5498],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5501,35],{"id":35},[37,5503,5504,5507,5510],{},[40,5505,5506],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5508,5509],{},"局部变量默认只在函数内部可见。",[40,5511,5512,5513,5515,5516,504],{},"没有显式 ",[50,5514,5498],{}," 的函数会返回 ",[50,5517,5518],{},"None",[14,5520,56],{"id":56},[10,5522,59],{},[61,5524,5526],{"className":63,"code":5525,"language":65,"meta":66,"style":66},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[50,5527,5528,5533,5538,5543,5547,5552],{"__ignoreMap":66},[70,5529,5530],{"class":72,"line":73},[70,5531,5532],{},"def calculate_total(price, count):\n",[70,5534,5535],{"class":72,"line":79},[70,5536,5537],{},"    total = price * count\n",[70,5539,5540],{"class":72,"line":85},[70,5541,5542],{},"    return total\n",[70,5544,5545],{"class":72,"line":92},[70,5546,89],{"emptyLinePlaceholder":88},[70,5548,5549],{"class":72,"line":98},[70,5550,5551],{},"result = calculate_total(25, 4)\n",[70,5553,5554],{"class":72,"line":104},[70,5555,5556],{},"print(result)\n",[10,5558,238],{},[61,5560,5563],{"className":5561,"code":5562,"language":244,"meta":66},[242],"100\n",[50,5564,5562],{"__ignoreMap":66},[10,5566,249],{},[14,5568,252],{"id":252},[254,5570,5571,5580],{},[40,5572,5573,5574,2398,5577,5579],{},"调用时 25 和 4 分别绑定到 ",[50,5575,5576],{},"price",[50,5578,4539],{},"，它们只在本次函数调用的局部范围中使用。",[40,5581,5582,5585,5586,5589],{},[50,5583,5584],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[50,5587,5588],{},"result"," 并输出。",[269,5591,271],{"id":271},[10,5593,5594],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5596,5597],{},[26,5598],{"alt":5599,"src":5600},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5602,5603,2398,5605,1298,5607,5610],{},[50,5604,5576],{},[50,5606,4539],{},[50,5608,5609],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5612,305],{"id":305},[37,5614,5615,5622],{},[40,5616,5617,5618,5621],{},"在函数内部只 ",[50,5619,5620],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5623,5624,5625,5627],{},"试图在函数外直接访问局部变量 ",[50,5626,5609],{},"，它的名字只在调用期间的局部作用域存在。",[14,5629,319],{"id":319},[254,5631,5632,5635],{},[40,5633,5634],{},"编写计算长方形面积的函数。",[40,5636,5637],{},"让函数返回结果后在调用方加上单位再输出。",[10,5639,344],{},[14,5641,347],{"id":347},[10,5643,5644],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,5646,354],{},{"title":66,"searchDepth":79,"depth":79,"links":5648},[5649,5650,5651,5652,5653,5656,5657,5658],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":5654},[5655],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5474,"description":5479},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[368,5666,5667],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5670,"title":5671,"body":5672,"category":368,"cover":369,"description":5676,"extension":370,"meta":5856,"navigation":88,"path":5857,"pinned":373,"publishedAt":374,"seo":5858,"slug":5859,"stem":5860,"summary":5861,"tags":5862,"updatedAt":374,"visible":88,"__hash__":5865},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5673,"toc":5844},[5674,5677,5679,5682,5684,5690,5693,5695,5712,5714,5716,5768,5770,5776,5778,5780,5798,5800,5803,5809,5812,5814,5825,5827,5835,5837,5839,5842],[10,5675,5676],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5678,16],{"id":16},[10,5680,5681],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5683,22],{"id":22},[10,5685,5686],{},[26,5687],{"alt":5688,"src":5689},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5691,5692],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5694,35],{"id":35},[37,5696,5697,5700,5706],{},[40,5698,5699],{},"必需参数应放在有默认值的参数之前。",[40,5701,5702,5705],{},[50,5703,5704],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5707,5708,5711],{},[50,5709,5710],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5713,56],{"id":56},[10,5715,59],{},[61,5717,5719],{"className":63,"code":5718,"language":65,"meta":66,"style":66},"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,5720,5721,5726,5731,5735,5740,5745,5749,5754,5759,5763],{"__ignoreMap":66},[70,5722,5723],{"class":72,"line":73},[70,5724,5725],{},"def build_title(name, level=\"基础\"):\n",[70,5727,5728],{"class":72,"line":79},[70,5729,5730],{},"    return name + \"｜\" + level\n",[70,5732,5733],{"class":72,"line":85},[70,5734,89],{"emptyLinePlaceholder":88},[70,5736,5737],{"class":72,"line":92},[70,5738,5739],{},"print(build_title(\"Python\"))\n",[70,5741,5742],{"class":72,"line":98},[70,5743,5744],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[70,5746,5747],{"class":72,"line":104},[70,5748,89],{"emptyLinePlaceholder":88},[70,5750,5751],{"class":72,"line":110},[70,5752,5753],{},"def total(*numbers):\n",[70,5755,5756],{"class":72,"line":116},[70,5757,5758],{},"    return sum(numbers)\n",[70,5760,5761],{"class":72,"line":121},[70,5762,89],{"emptyLinePlaceholder":88},[70,5764,5765],{"class":72,"line":127},[70,5766,5767],{},"print(total(10, 20, 30))\n",[10,5769,238],{},[61,5771,5774],{"className":5772,"code":5773,"language":244,"meta":66},[242],"Python｜基础\n异常处理｜进阶\n60\n",[50,5775,5773],{"__ignoreMap":66},[10,5777,249],{},[14,5779,252],{"id":252},[254,5781,5782,5789],{},[40,5783,5784,5785,5788],{},"第一次调用只提供必需参数，",[50,5786,5787],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5790,5791,5794,5795,504],{},[50,5792,5793],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[50,5796,5797],{},"sum()",[269,5799,271],{"id":271},[10,5801,5802],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5804,5805],{},[26,5806],{"alt":5807,"src":5808},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5810,5811],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5813,305],{"id":305},[37,5815,5816,5822],{},[40,5817,5818,5819,5821],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[50,5820,5518],{}," 再在函数内创建。",[40,5823,5824],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5826,319],{"id":319},[254,5828,5829,5832],{},[40,5830,5831],{},"给问候函数增加默认称呼。",[40,5833,5834],{},"编写接收任意数量分数并返回总分的函数。",[10,5836,344],{},[14,5838,347],{"id":347},[10,5840,5841],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,5843,354],{},{"title":66,"searchDepth":79,"depth":79,"links":5845},[5846,5847,5848,5849,5850,5853,5854,5855],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":5851},[5852],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5671,"description":5676},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[368,5863,5864],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5867,"title":5868,"body":5869,"category":368,"cover":369,"description":5873,"extension":370,"meta":6068,"navigation":88,"path":6069,"pinned":373,"publishedAt":374,"seo":6070,"slug":6071,"stem":6072,"summary":6073,"tags":6074,"updatedAt":374,"visible":88,"__hash__":6077},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5870,"toc":6056},[5871,5874,5876,5879,5881,5887,5890,5892,5909,5911,5913,5974,5976,5982,5984,5986,6013,6015,6018,6024,6027,6029,6037,6039,6047,6049,6051,6054],[10,5872,5873],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5875,16],{"id":16},[10,5877,5878],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5880,22],{"id":22},[10,5882,5883],{},[26,5884],{"alt":5885,"src":5886},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5888,5889],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5891,35],{"id":35},[37,5893,5894,5897,5900],{},[40,5895,5896],{},"函数内部赋值默认创建局部变量。",[40,5898,5899],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5901,5902,2317,5905,5908],{},[50,5903,5904],{},"global",[50,5906,5907],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5910,56],{"id":56},[10,5912,59],{},[61,5914,5916],{"className":63,"code":5915,"language":65,"meta":66,"style":66},"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,5917,5918,5923,5927,5932,5937,5941,5946,5951,5956,5960,5965,5969],{"__ignoreMap":66},[70,5919,5920],{"class":72,"line":73},[70,5921,5922],{},"course = \"Python\"\n",[70,5924,5925],{"class":72,"line":79},[70,5926,89],{"emptyLinePlaceholder":88},[70,5928,5929],{"class":72,"line":85},[70,5930,5931],{},"def outer():\n",[70,5933,5934],{"class":72,"line":92},[70,5935,5936],{},"    level = \"基础\"\n",[70,5938,5939],{"class":72,"line":98},[70,5940,89],{"emptyLinePlaceholder":88},[70,5942,5943],{"class":72,"line":104},[70,5944,5945],{},"    def show():\n",[70,5947,5948],{"class":72,"line":110},[70,5949,5950],{},"        lesson = \"作用域\"\n",[70,5952,5953],{"class":72,"line":116},[70,5954,5955],{},"        print(course, level, lesson)\n",[70,5957,5958],{"class":72,"line":121},[70,5959,89],{"emptyLinePlaceholder":88},[70,5961,5962],{"class":72,"line":127},[70,5963,5964],{},"    show()\n",[70,5966,5967],{"class":72,"line":133},[70,5968,89],{"emptyLinePlaceholder":88},[70,5970,5971],{"class":72,"line":139},[70,5972,5973],{},"outer()\n",[10,5975,238],{},[61,5977,5980],{"className":5978,"code":5979,"language":244,"meta":66},[242],"Python 基础 作用域\n",[50,5981,5979],{"__ignoreMap":66},[10,5983,249],{},[14,5985,252],{"id":252},[254,5987,5988,6005],{},[40,5989,5990,5993,5994,5997,5998,6000,6001,6004],{},[50,5991,5992],{},"show()"," 中查找 ",[50,5995,5996],{},"lesson"," 时先在局部找到，查找 ",[50,5999,5787],{}," 时到外层 ",[50,6002,6003],{},"outer()"," 找到。",[40,6006,6007,6009,6010,6012],{},[50,6008,4722],{}," 在局部和外层都不存在，继续到模块全局找到；",[50,6011,2349],{}," 最后在内置作用域找到。",[269,6014,271],{"id":271},[10,6016,6017],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,6019,6020],{},[26,6021],{"alt":6022,"src":6023},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,6025,6026],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,6028,305],{"id":305},[37,6030,6031,6034],{},[40,6032,6033],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,6035,6036],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,6038,319],{"id":319},[254,6040,6041,6044],{},[40,6042,6043],{},"在内外层定义同名变量，观察最近作用域优先。",[40,6045,6046],{},"尝试在函数外访问局部变量，记录异常类型。",[10,6048,344],{},[14,6050,347],{"id":347},[10,6052,6053],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,6055,354],{},{"title":66,"searchDepth":79,"depth":79,"links":6057},[6058,6059,6060,6061,6062,6065,6066,6067],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":6063},[6064],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5868,"description":5873},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[368,6075,6076],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":6079,"title":6080,"body":6081,"category":368,"cover":369,"description":6085,"extension":370,"meta":6235,"navigation":88,"path":6236,"pinned":373,"publishedAt":374,"seo":6237,"slug":6238,"stem":6239,"summary":6240,"tags":6241,"updatedAt":374,"visible":88,"__hash__":6244},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":6082,"toc":6225},[6083,6086,6088,6091,6093,6099,6102,6104,6123,6125,6127,6161,6163,6169,6171,6173,6188,6190,6202,6204,6216,6218,6220,6223],[10,6084,6085],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,6087,16],{"id":16},[10,6089,6090],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6092,22],{"id":22},[10,6094,6095],{},[26,6096],{"alt":6097,"src":6098},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,6100,6101],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,6103,35],{"id":35},[37,6105,6106,6109,6112],{},[40,6107,6108],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,6110,6111],{},"注解表达接口意图，不代替输入校验和测试。",[40,6113,6114,6115,2398,6117,2398,6119,6122],{},"基础注解优先使用 ",[50,6116,2401],{},[50,6118,2567],{},[50,6120,6121],{},"list[str]"," 等直接写法。",[14,6124,56],{"id":56},[10,6126,59],{},[61,6128,6130],{"className":63,"code":6129,"language":65,"meta":66,"style":66},"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,6131,6132,6137,6142,6147,6151,6156],{"__ignoreMap":66},[70,6133,6134],{"class":72,"line":73},[70,6135,6136],{},"def format_score(name: str, score: int) -> str:\n",[70,6138,6139],{"class":72,"line":79},[70,6140,6141],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[70,6143,6144],{"class":72,"line":85},[70,6145,6146],{},"    return name + \"：\" + str(score)\n",[70,6148,6149],{"class":72,"line":92},[70,6150,89],{"emptyLinePlaceholder":88},[70,6152,6153],{"class":72,"line":98},[70,6154,6155],{},"print(format_score(\"小郑\", 95))\n",[70,6157,6158],{"class":72,"line":104},[70,6159,6160],{},"print(format_score.__doc__)\n",[10,6162,238],{},[61,6164,6167],{"className":6165,"code":6166,"language":244,"meta":66},[242],"小郑：95\n返回带姓名的分数文本。\n",[50,6168,6166],{"__ignoreMap":66},[10,6170,249],{},[14,6172,252],{"id":252},[254,6174,6175,6185],{},[40,6176,6177,6178,6181,6182,6184],{},"函数签名说明 ",[50,6179,6180],{},"name"," 预期为字符串、",[50,6183,2387],{}," 预期为整数，返回值预期为字符串。",[40,6186,6187],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6189,305],{"id":305},[37,6191,6192,6199],{},[40,6193,6194,6195,6198],{},"认为加了 ",[50,6196,6197],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6200,6201],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6203,319],{"id":319},[254,6205,6206,6209],{},[40,6207,6208],{},"为面积函数补充参数和返回值注解。",[40,6210,6211,6212,6215],{},"通过 ",[50,6213,6214],{},"函数名.__doc__"," 查看文档字符串。",[10,6217,344],{},[14,6219,347],{"id":347},[10,6221,6222],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,6224,354],{},{"title":66,"searchDepth":79,"depth":79,"links":6226},[6227,6228,6229,6230,6231,6232,6233,6234],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":6080,"description":6085},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[368,6242,6243],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6246,"title":6247,"body":6248,"category":368,"cover":369,"description":6252,"extension":370,"meta":6478,"navigation":88,"path":6479,"pinned":373,"publishedAt":374,"seo":6480,"slug":6481,"stem":6482,"summary":6483,"tags":6484,"updatedAt":374,"visible":88,"__hash__":6487},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6249,"toc":6466},[6250,6253,6255,6261,6263,6269,6279,6281,6299,6301,6308,6337,6344,6363,6372,6374,6380,6382,6384,6407,6409,6412,6418,6424,6426,6442,6444,6457,6459,6461,6464],[10,6251,6252],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6254,16],{"id":16},[10,6256,6257,6258,6260],{},"本篇只处理“模块、import 与 ",[437,6259,6180],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6262,22],{"id":22},[10,6264,6265],{},[26,6266],{"alt":6267,"src":6268},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6270,6271,6272,6274,6275,6278],{},"同一个文件直接运行时 ",[50,6273,340],{}," 等于 ",[50,6276,6277],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6280,35],{"id":35},[37,6282,6283,6289,6292],{},[40,6284,6285,6286,6288],{},"一个 ",[50,6287,1312],{}," 文件就是一个模块。",[40,6290,6291],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6293,6294,6295,6298],{},"避免使用 ",[50,6296,6297],{},"from module import *","，它会让名字来源不清楚。",[14,6300,56],{"id":56},[10,6302,6303,6304,6307],{},"先在同一个目录中创建两个文件。把函数放进 ",[50,6305,6306],{},"calculator.py","：",[61,6309,6311],{"className":63,"code":6310,"language":65,"meta":66,"style":66},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[50,6312,6313,6318,6323,6327,6332],{"__ignoreMap":66},[70,6314,6315],{"class":72,"line":73},[70,6316,6317],{},"def add(left, right):\n",[70,6319,6320],{"class":72,"line":79},[70,6321,6322],{},"    return left + right\n",[70,6324,6325],{"class":72,"line":85},[70,6326,89],{"emptyLinePlaceholder":88},[70,6328,6329],{"class":72,"line":92},[70,6330,6331],{},"if __name__ == \"__main__\":\n",[70,6333,6334],{"class":72,"line":98},[70,6335,6336],{},"    print(add(2, 3))\n",[10,6338,6339,6340,6343],{},"再创建 ",[50,6341,6342],{},"app.py","，从模块中导入函数：",[61,6345,6347],{"className":63,"code":6346,"language":65,"meta":66,"style":66},"from calculator import add\n\nprint(add(10, 20))\n",[50,6348,6349,6354,6358],{"__ignoreMap":66},[70,6350,6351],{"class":72,"line":73},[70,6352,6353],{},"from calculator import add\n",[70,6355,6356],{"class":72,"line":79},[70,6357,89],{"emptyLinePlaceholder":88},[70,6359,6360],{"class":72,"line":85},[70,6361,6362],{},"print(add(10, 20))\n",[10,6364,6365,6366,1298,6369,504],{},"分别执行 ",[50,6367,6368],{},"python3 calculator.py",[50,6370,6371],{},"python3 app.py",[10,6373,238],{},[61,6375,6378],{"className":6376,"code":6377,"language":244,"meta":66},[242],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[50,6379,6377],{"__ignoreMap":66},[10,6381,249],{},[14,6383,252],{"id":252},[254,6385,6386,6396],{},[40,6387,6388,6389,6391,6392,6395],{},"直接运行 ",[50,6390,6306],{}," 时，模块名是 ",[50,6393,6394],{},"__main__","，入口代码输出 5。",[40,6397,6398,6400,6401,6403,6404,6406],{},[50,6399,6342],{}," 导入模块时，",[50,6402,6306],{}," 的函数定义会执行，但入口判断为假；随后 ",[50,6405,6342],{}," 调用函数输出 30。",[269,6408,271],{"id":271},[10,6410,6411],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6413,6414],{},[26,6415],{"alt":6416,"src":6417},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6419,6420,6421,6423],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[50,6422,6394],{}," 保护下的演示代码。",[14,6425,305],{"id":305},[37,6427,6428,6435],{},[40,6429,6430,6431,1298,6433,504],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[50,6432,6306],{},[50,6434,6342],{},[40,6436,6437,6438,6441],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[50,6439,6440],{},"json.py","，导致导入目标被遮蔽。",[14,6443,319],{"id":319},[254,6445,6446,6452],{},[40,6447,2495,6448,6451],{},[50,6449,6450],{},"text_tools.py"," 并导出一个格式化函数。",[40,6453,6454,6455,504],{},"分别直接运行模块和从另一个脚本导入，输出 ",[50,6456,340],{},[10,6458,344],{},[14,6460,347],{"id":347},[10,6462,6463],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,6465,354],{},{"title":66,"searchDepth":79,"depth":79,"links":6467},[6468,6469,6470,6471,6472,6475,6476,6477],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":6473},[6474],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6247,"description":6252},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[368,6485,6486],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6489,"title":6490,"body":6491,"category":368,"cover":369,"description":6495,"extension":370,"meta":6660,"navigation":88,"path":6661,"pinned":373,"publishedAt":374,"seo":6662,"slug":6663,"stem":6664,"summary":6665,"tags":6666,"updatedAt":374,"visible":88,"__hash__":6668},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6492,"toc":6650},[6493,6496,6498,6501,6503,6509,6512,6514,6528,6530,6532,6578,6580,6586,6588,6590,6616,6618,6628,6630,6641,6643,6645,6648],[10,6494,6495],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6497,16],{"id":16},[10,6499,6500],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6502,22],{"id":22},[10,6504,6505],{},[26,6506],{"alt":6507,"src":6508},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6510,6511],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6513,35],{"id":35},[37,6515,6516,6522,6525],{},[40,6517,6518,6521],{},[50,6519,6520],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6523,6524],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6526,6527],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6529,56],{"id":56},[10,6531,1715],{},[61,6533,6535],{"className":733,"code":6534,"language":735,"meta":66,"style":66},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[50,6536,6537,6549,6557,6563,6573],{"__ignoreMap":66},[70,6538,6539,6541,6543,6546],{"class":72,"line":73},[70,6540,833],{"class":742},[70,6542,775],{"class":745},[70,6544,6545],{"class":778}," venv",[70,6547,6548],{"class":778}," .venv\n",[70,6550,6551,6554],{"class":72,"line":79},[70,6552,6553],{"class":745},"source",[70,6555,6556],{"class":778}," .venv\u002Fbin\u002Factivate\n",[70,6558,6559,6561],{"class":72,"line":85},[70,6560,65],{"class":742},[70,6562,746],{"class":745},[70,6564,6565,6567,6569,6571],{"class":72,"line":92},[70,6566,65],{"class":742},[70,6568,775],{"class":745},[70,6570,779],{"class":778},[70,6572,746],{"class":745},[70,6574,6575],{"class":72,"line":98},[70,6576,6577],{"class":742},"deactivate\n",[10,6579,238],{},[61,6581,6584],{"className":6582,"code":6583,"language":244,"meta":66},[242],"Python 和 pip 的路径应指向当前项目的 .venv\n",[50,6585,6583],{"__ignoreMap":66},[10,6587,249],{},[14,6589,252],{"id":252},[254,6591,6592,6601],{},[40,6593,6594,6597,6598,6600],{},[50,6595,6596],{},"venv"," 根据当前 ",[50,6599,833],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6602,6603,6604,2317,6606,6609,6610,3868,6612,6615],{},"激活后 ",[50,6605,65],{},[50,6607,6608],{},"python -m pip"," 优先指向 ",[50,6611,6520],{},[50,6613,6614],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6617,305],{"id":305},[37,6619,6620,6623],{},[40,6621,6622],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6624,3607,6625,6627],{},[50,6626,6520],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6629,319],{"id":319},[254,6631,6632,6638],{},[40,6633,6634,6635,504],{},"创建虚拟环境并记录激活前后的 ",[50,6636,6637],{},"which python",[40,6639,6640],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6642,344],{},[14,6644,347],{"id":347},[10,6646,6647],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,6649,1799],{},{"title":66,"searchDepth":79,"depth":79,"links":6651},[6652,6653,6654,6655,6656,6657,6658,6659],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6490,"description":6495},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[368,6667,403],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6670,"title":6671,"body":6672,"category":368,"cover":369,"description":6676,"extension":370,"meta":6863,"navigation":88,"path":6864,"pinned":373,"publishedAt":374,"seo":6865,"slug":6866,"stem":6867,"summary":6868,"tags":6869,"updatedAt":374,"visible":88,"__hash__":6872},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6673,"toc":6853},[6674,6677,6679,6682,6684,6690,6699,6701,6725,6727,6729,6781,6783,6789,6791,6793,6809,6811,6830,6832,6844,6846,6848,6851],[10,6675,6676],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6678,16],{"id":16},[10,6680,6681],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6683,22],{"id":22},[10,6685,6686],{},[26,6687],{"alt":6688,"src":6689},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6691,6692,6695,6696,6698],{},[50,6693,6694],{},"Path"," 使用 ",[50,6697,2577],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6700,35],{"id":35},[37,6702,6703,6706,6718],{},[40,6704,6705],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6707,6708,2398,6711,2398,6714,6717],{},[50,6709,6710],{},"exists()",[50,6712,6713],{},"is_file()",[50,6715,6716],{},"is_dir()"," 检查真实文件系统状态。",[40,6719,6720,6721,6724],{},"创建目录前明确目标；",[50,6722,6723],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6726,56],{"id":56},[10,6728,59],{},[61,6730,6732],{"className":63,"code":6731,"language":65,"meta":66,"style":66},"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,6733,6734,6738,6742,6747,6752,6757,6761,6766,6771,6776],{"__ignoreMap":66},[70,6735,6736],{"class":72,"line":73},[70,6737,82],{},[70,6739,6740],{"class":72,"line":79},[70,6741,89],{"emptyLinePlaceholder":88},[70,6743,6744],{"class":72,"line":85},[70,6745,6746],{},"project = Path.cwd()\n",[70,6748,6749],{"class":72,"line":92},[70,6750,6751],{},"data_dir = project \u002F \"data\"\n",[70,6753,6754],{"class":72,"line":98},[70,6755,6756],{},"file_path = data_dir \u002F \"records.json\"\n",[70,6758,6759],{"class":72,"line":104},[70,6760,89],{"emptyLinePlaceholder":88},[70,6762,6763],{"class":72,"line":110},[70,6764,6765],{},"print(project)\n",[70,6767,6768],{"class":72,"line":116},[70,6769,6770],{},"print(file_path.name)\n",[70,6772,6773],{"class":72,"line":121},[70,6774,6775],{},"print(file_path.suffix)\n",[70,6777,6778],{"class":72,"line":127},[70,6779,6780],{},"print(file_path.exists())\n",[10,6782,238],{},[61,6784,6787],{"className":6785,"code":6786,"language":244,"meta":66},[242],"显示当前项目路径、records.json、.json 和存在状态\n",[50,6788,6786],{"__ignoreMap":66},[10,6790,249],{},[14,6792,252],{"id":252},[254,6794,6795,6801],{},[40,6796,6797,6800],{},[50,6798,6799],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6802,2480,6803,6805,6806,6808],{},[50,6804,2577],{}," 组合路径片段只创建新的 ",[50,6807,6694],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6810,305],{"id":305},[37,6812,6813,6821],{},[40,6814,3607,6815,6817,6818,6820],{},[50,6816,6694],{}," 对象存在当成真实文件存在，仍需调用 ",[50,6819,6710],{}," 等方法确认。",[40,6822,6823,6824,1151,6826,6829],{},"手工拼接 ",[50,6825,2577],{},[50,6827,6828],{},"\\"," 分隔符，降低跨平台可读性。",[14,6831,319],{"id":319},[254,6833,6834,6841],{},[40,6835,6836,6837,6840],{},"组合 ",[50,6838,6839],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6842,6843],{},"输出路径的父目录、文件名和扩展名。",[10,6845,344],{},[14,6847,347],{"id":347},[10,6849,6850],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,6852,354],{},{"title":66,"searchDepth":79,"depth":79,"links":6854},[6855,6856,6857,6858,6859,6860,6861,6862],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6671,"description":6676},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[368,6870,6871],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6874,"title":6875,"body":6876,"category":368,"cover":369,"description":6880,"extension":370,"meta":7058,"navigation":88,"path":7059,"pinned":373,"publishedAt":374,"seo":7060,"slug":7061,"stem":7062,"summary":7063,"tags":7064,"updatedAt":374,"visible":88,"__hash__":7067},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6877,"toc":7048},[6878,6881,6883,6886,6888,6894,6897,6899,6927,6929,6931,6988,6990,6996,6998,7000,7011,7013,7026,7028,7039,7041,7043,7046],[10,6879,6880],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6882,16],{"id":16},[10,6884,6885],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6887,22],{"id":22},[10,6889,6890],{},[26,6891],{"alt":6892,"src":6893},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6895,6896],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6898,35],{"id":35},[37,6900,6901,6907,6916],{},[40,6902,6903,6906],{},[50,6904,6905],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6908,6909,6912,6913,504],{},[50,6910,6911],{},"r"," 模式读取不存在文件会产生 ",[50,6914,6915],{},"FileNotFoundError",[40,6917,6918,6919,6922,6923,6926],{},"本篇显式调用 ",[50,6920,6921],{},"close()","；第 34 篇会用 ",[50,6924,6925],{},"with"," 更可靠地管理关闭动作。",[14,6928,56],{"id":56},[10,6930,59],{},[61,6932,6934],{"className":63,"code":6933,"language":65,"meta":66,"style":66},"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,6935,6936,6940,6944,6949,6954,6959,6964,6968,6973,6978,6983],{"__ignoreMap":66},[70,6937,6938],{"class":72,"line":73},[70,6939,82],{},[70,6941,6942],{"class":72,"line":79},[70,6943,89],{"emptyLinePlaceholder":88},[70,6945,6946],{"class":72,"line":85},[70,6947,6948],{},"file_path = Path(\"notes.txt\")\n",[70,6950,6951],{"class":72,"line":92},[70,6952,6953],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[70,6955,6956],{"class":72,"line":98},[70,6957,6958],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[70,6960,6961],{"class":72,"line":104},[70,6962,6963],{},"writer.close()\n",[70,6965,6966],{"class":72,"line":110},[70,6967,89],{"emptyLinePlaceholder":88},[70,6969,6970],{"class":72,"line":116},[70,6971,6972],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[70,6974,6975],{"class":72,"line":121},[70,6976,6977],{},"content = reader.read()\n",[70,6979,6980],{"class":72,"line":127},[70,6981,6982],{},"reader.close()\n",[70,6984,6985],{"class":72,"line":133},[70,6986,6987],{},"print(content)\n",[10,6989,238],{},[61,6991,6994],{"className":6992,"code":6993,"language":244,"meta":66},[242],"变量\n循环\n函数\n",[50,6995,6993],{"__ignoreMap":66},[10,6997,249],{},[14,6999,252],{"id":252},[254,7001,7002,7008],{},[40,7003,7004,7005,7007],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[50,7006,6921],{}," 确保缓冲内容交给文件系统。",[40,7009,7010],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,7012,305],{"id":305},[37,7014,7015,7020],{},[40,7016,2480,7017,7019],{},[50,7018,6905],{}," 模式打开重要文件却未确认覆盖风险。",[40,7021,7022,7023,504],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[50,7024,7025],{},"encoding=\"utf-8\"",[14,7027,319],{"id":319},[254,7029,7030,7033],{},[40,7031,7032],{},"写入三行学习记录并读取。",[40,7034,7035,7036,7038],{},"改用 ",[50,7037,478],{}," 模式追加一行，确认原内容仍保留。",[10,7040,344],{},[14,7042,347],{"id":347},[10,7044,7045],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,7047,354],{},{"title":66,"searchDepth":79,"depth":79,"links":7049},[7050,7051,7052,7053,7054,7055,7056,7057],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6875,"description":6880},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[368,7065,7066],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":7069,"title":7070,"body":7071,"category":368,"cover":369,"description":7075,"extension":370,"meta":7241,"navigation":88,"path":7242,"pinned":373,"publishedAt":374,"seo":7243,"slug":7244,"stem":7245,"summary":7246,"tags":7247,"updatedAt":374,"visible":88,"__hash__":7250},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":7072,"toc":7231},[7073,7076,7078,7081,7083,7089,7099,7101,7115,7117,7119,7178,7180,7186,7188,7190,7202,7204,7212,7214,7222,7224,7226,7229],[10,7074,7075],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,7077,16],{"id":16},[10,7079,7080],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7082,22],{"id":22},[10,7084,7085],{},[26,7086],{"alt":7087,"src":7088},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,7090,7091,7094,7095,7098],{},[50,7092,7093],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[50,7096,7097],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,7100,35],{"id":35},[37,7102,7103,7106,7112],{},[40,7104,7105],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,7107,7108,7111],{},[50,7109,7110],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,7113,7114],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,7116,56],{"id":56},[10,7118,59],{},[61,7120,7122],{"className":63,"code":7121,"language":65,"meta":66,"style":66},"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,7123,7124,7128,7132,7137,7141,7146,7151,7155,7159,7164,7169,7173],{"__ignoreMap":66},[70,7125,7126],{"class":72,"line":73},[70,7127,76],{},[70,7129,7130],{"class":72,"line":79},[70,7131,89],{"emptyLinePlaceholder":88},[70,7133,7134],{"class":72,"line":85},[70,7135,7136],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[70,7138,7139],{"class":72,"line":92},[70,7140,89],{"emptyLinePlaceholder":88},[70,7142,7143],{"class":72,"line":98},[70,7144,7145],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[70,7147,7148],{"class":72,"line":104},[70,7149,7150],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[70,7152,7153],{"class":72,"line":110},[70,7154,6963],{},[70,7156,7157],{"class":72,"line":116},[70,7158,89],{"emptyLinePlaceholder":88},[70,7160,7161],{"class":72,"line":121},[70,7162,7163],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[70,7165,7166],{"class":72,"line":127},[70,7167,7168],{},"loaded = json.load(reader)\n",[70,7170,7171],{"class":72,"line":133},[70,7172,6982],{},[70,7174,7175],{"class":72,"line":139},[70,7176,7177],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7179,238],{},[61,7181,7184],{"className":7182,"code":7183,"language":244,"meta":66},[242],"Python 60\n",[50,7185,7183],{"__ignoreMap":66},[10,7187,249],{},[14,7189,252],{"id":252},[254,7191,7192,7197],{},[40,7193,7194,7196],{},[50,7195,7093],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7198,7199,7201],{},[50,7200,7097],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7203,305],{"id":305},[37,7205,7206,7209],{},[40,7207,7208],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7210,7211],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7213,319],{"id":319},[254,7215,7216,7219],{},[40,7217,7218],{},"保存包含两条学习记录的列表。",[40,7220,7221],{},"读取后修改进度，再重新写回文件。",[10,7223,344],{},[14,7225,347],{"id":347},[10,7227,7228],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,7230,354],{},{"title":66,"searchDepth":79,"depth":79,"links":7232},[7233,7234,7235,7236,7237,7238,7239,7240],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":7070,"description":7075},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[368,7248,7249],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7252,"title":7253,"body":7254,"category":368,"cover":369,"description":7258,"extension":370,"meta":7442,"navigation":88,"path":7443,"pinned":373,"publishedAt":374,"seo":7444,"slug":7445,"stem":7446,"summary":7447,"tags":7448,"updatedAt":374,"visible":88,"__hash__":7451},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7255,"toc":7432},[7256,7259,7261,7264,7266,7272,7278,7280,7302,7304,7306,7369,7371,7377,7379,7381,7397,7399,7413,7415,7423,7425,7427,7430],[10,7257,7258],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7260,16],{"id":16},[10,7262,7263],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7265,22],{"id":22},[10,7267,7268],{},[26,7269],{"alt":7270,"src":7271},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7273,7274,7277],{},[50,7275,7276],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7279,35],{"id":35},[37,7281,7282,7292,7299],{},[40,7283,2480,7284,7287,7288,7291],{},[50,7285,7286],{},"newline=\"\""," 让 ",[50,7289,7290],{},"csv"," 模块正确处理换行。",[40,7293,7294,7295,7298],{},"字段顺序由 ",[50,7296,7297],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7300,7301],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7303,56],{"id":56},[10,7305,59],{},[61,7307,7309],{"className":63,"code":7308,"language":65,"meta":66,"style":66},"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,7310,7311,7316,7320,7325,7330,7335,7340,7345,7349,7354,7359,7364],{"__ignoreMap":66},[70,7312,7313],{"class":72,"line":73},[70,7314,7315],{},"import csv\n",[70,7317,7318],{"class":72,"line":79},[70,7319,89],{"emptyLinePlaceholder":88},[70,7321,7322],{"class":72,"line":85},[70,7323,7324],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[70,7326,7327],{"class":72,"line":92},[70,7328,7329],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[70,7331,7332],{"class":72,"line":98},[70,7333,7334],{},"writer.writeheader()\n",[70,7336,7337],{"class":72,"line":104},[70,7338,7339],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[70,7341,7342],{"class":72,"line":110},[70,7343,7344],{},"writer_file.close()\n",[70,7346,7347],{"class":72,"line":116},[70,7348,89],{"emptyLinePlaceholder":88},[70,7350,7351],{"class":72,"line":121},[70,7352,7353],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[70,7355,7356],{"class":72,"line":127},[70,7357,7358],{},"for row in csv.DictReader(reader_file):\n",[70,7360,7361],{"class":72,"line":133},[70,7362,7363],{},"    print(row[\"name\"], row[\"score\"])\n",[70,7365,7366],{"class":72,"line":139},[70,7367,7368],{},"reader_file.close()\n",[10,7370,238],{},[61,7372,7375],{"className":7373,"code":7374,"language":244,"meta":66},[242],"小郑 95\n",[50,7376,7374],{"__ignoreMap":66},[10,7378,249],{},[14,7380,252],{"id":252},[254,7382,7383,7392],{},[40,7384,7385,7388,7389,7391],{},[50,7386,7387],{},"DictWriter"," 按 ",[50,7390,7297],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7393,7394,7396],{},[50,7395,7276],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7398,305],{"id":305},[37,7400,7401,7404],{},[40,7402,7403],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7405,7406,7407,7409,7410,7412],{},"在 macOS 以外环境忽略 ",[50,7408,7286],{}," 可能出现额外空行；统一交给 ",[50,7411,7290],{}," 模块管理换行。",[14,7414,319],{"id":319},[254,7416,7417,7420],{},[40,7418,7419],{},"写入三名学习者的课程和分数。",[40,7421,7422],{},"读取 CSV 后把分数字符串转换为整数。",[10,7424,344],{},[14,7426,347],{"id":347},[10,7428,7429],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,7431,354],{},{"title":66,"searchDepth":79,"depth":79,"links":7433},[7434,7435,7436,7437,7438,7439,7440,7441],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7253,"description":7258},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[368,7449,7450],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7453,"title":7454,"body":7455,"category":368,"cover":369,"description":7459,"extension":370,"meta":7728,"navigation":88,"path":7729,"pinned":373,"publishedAt":374,"seo":7730,"slug":7731,"stem":7732,"summary":7733,"tags":7734,"updatedAt":374,"visible":88,"__hash__":7737},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7456,"toc":7715},[7457,7460,7462,7465,7467,7473,7484,7486,7503,7505,7507,7578,7580,7586,7588,7590,7615,7617,7626,7632,7643,7645,7651,7657,7666,7668,7683,7685,7706,7708,7710,7713],[10,7458,7459],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7461,16],{"id":16},[10,7463,7464],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7466,22],{"id":22},[10,7468,7469],{},[26,7470],{"alt":7471,"src":7472},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7474,7475,7476,7479,7480,7483],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[50,7477,7478],{},"except","；无论是否异常，",[50,7481,7482],{},"finally"," 都会在离开结构前执行。",[14,7485,35],{"id":35},[37,7487,7488,7494,7500],{},[40,7489,7490,7491,7493],{},"只捕获能够处理的具体异常，不使用空的 ",[50,7492,7478],{}," 吞掉全部错误。",[40,7495,7496,7499],{},[50,7497,7498],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7501,7502],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7504,56],{"id":56},[10,7506,59],{},[61,7508,7510],{"className":63,"code":7509,"language":65,"meta":66,"style":66},"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,7511,7512,7517,7522,7527,7532,7537,7541,7545,7550,7554,7559,7563,7568,7573],{"__ignoreMap":66},[70,7513,7514],{"class":72,"line":73},[70,7515,7516],{},"def parse_age(text):\n",[70,7518,7519],{"class":72,"line":79},[70,7520,7521],{},"    age = int(text)\n",[70,7523,7524],{"class":72,"line":85},[70,7525,7526],{},"    if age \u003C 0:\n",[70,7528,7529],{"class":72,"line":92},[70,7530,7531],{},"        raise ValueError(\"年龄不能为负数\")\n",[70,7533,7534],{"class":72,"line":98},[70,7535,7536],{},"    return age\n",[70,7538,7539],{"class":72,"line":104},[70,7540,89],{"emptyLinePlaceholder":88},[70,7542,7543],{"class":72,"line":110},[70,7544,193],{},[70,7546,7547],{"class":72,"line":116},[70,7548,7549],{},"    age = parse_age(\"18\")\n",[70,7551,7552],{"class":72,"line":121},[70,7553,217],{},[70,7555,7556],{"class":72,"line":127},[70,7557,7558],{},"    print(\"输入错误：\", error)\n",[70,7560,7561],{"class":72,"line":133},[70,7562,229],{},[70,7564,7565],{"class":72,"line":139},[70,7566,7567],{},"    print(\"年龄：\", age)\n",[70,7569,7570],{"class":72,"line":145},[70,7571,7572],{},"finally:\n",[70,7574,7575],{"class":72,"line":151},[70,7576,7577],{},"    print(\"处理结束\")\n",[10,7579,238],{},[61,7581,7584],{"className":7582,"code":7583,"language":244,"meta":66},[242],"年龄： 18\n处理结束\n",[50,7585,7583],{"__ignoreMap":66},[10,7587,249],{},[14,7589,252],{"id":252},[254,7591,7592,7604],{},[40,7593,7594,7596,7597,7599,7600,7603],{},[50,7595,3176],{}," 或主动 ",[50,7598,7498],{}," 都可能产生 ",[50,7601,7602],{},"ValueError","，控制流立即离开当前正常路径。",[40,7605,7606,7607,7609,7610,7612,7613,504],{},"有异常时进入匹配的 ",[50,7608,7478],{},"；没有异常时执行 ",[50,7611,1301],{},"；两种情况最后都会执行 ",[50,7614,7482],{},[269,7616,271],{"id":271},[10,7618,7619,2398,7621,1298,7623,7625],{},[50,7620,7478],{},[50,7622,1301],{},[50,7624,7482],{}," 的职责不同，不能只看它们出现的顺序。",[10,7627,7628],{},[26,7629],{"alt":7630,"src":7631},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7633,7634,7636,7637,7639,7640,7642],{},[50,7635,7478],{}," 处理匹配异常，",[50,7638,1301],{}," 只在无异常时运行，",[50,7641,7482],{}," 负责两条路径都需要的清理动作。",[269,7644,271],{"id":286},[10,7646,7647,7650],{},[50,7648,7649],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7652,7653],{},[26,7654],{"alt":7655,"src":7656},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7658,7659,7660,7662,7663,7665],{},"只把可能产生预期异常的操作放进 ",[50,7661,7649],{},"，后续正常业务放进 ",[50,7664,1301],{},"，错误边界会更清楚。",[14,7667,305],{"id":305},[37,7669,7670,7677],{},[40,7671,7672,7673,7676],{},"使用裸 ",[50,7674,7675],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7678,7679,7680,7682],{},"把整个程序包在一个巨大 ",[50,7681,7649],{}," 中，无法判断究竟哪一步允许失败。",[14,7684,319],{"id":319},[254,7686,7687,7700],{},[40,7688,7689,7690,7693,7694,1298,7697,504],{},"让 ",[50,7691,7692],{},"parse_age"," 分别处理 ",[50,7695,7696],{},"\"abc\"",[50,7698,7699],{},"\"-1\"",[40,7701,7702,7703,7705],{},"为文件读取捕获 ",[50,7704,6915],{}," 并给出清晰提示。",[10,7707,344],{},[14,7709,347],{"id":347},[10,7711,7712],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,7714,354],{},{"title":66,"searchDepth":79,"depth":79,"links":7716},[7717,7718,7719,7720,7721,7725,7726,7727],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":7722},[7723,7724],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7454,"description":7459},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[368,7735,7736],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7739,"title":7740,"body":7741,"category":368,"cover":369,"description":7745,"extension":370,"meta":7921,"navigation":88,"path":7922,"pinned":373,"publishedAt":374,"seo":7923,"slug":7924,"stem":7925,"summary":7926,"tags":7927,"updatedAt":374,"visible":88,"__hash__":7929},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7742,"toc":7911},[7743,7746,7748,7751,7753,7759,7765,7767,7783,7785,7787,7841,7843,7849,7851,7853,7866,7868,7881,7883,7902,7904,7906,7909],[10,7744,7745],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7747,16],{"id":16},[10,7749,7750],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7752,22],{"id":22},[10,7754,7755],{},[26,7756],{"alt":7757,"src":7758},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7760,7761,7762,7764],{},"进入 ",[50,7763,6925],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7766,35],{"id":35},[37,7768,7769,7774,7780],{},[40,7770,7771,7773],{},[50,7772,6925],{}," 把资源获取和释放配成一个清晰边界。",[40,7775,7776,7779],{},[50,7777,7778],{},"as file"," 得到的是上下文返回的资源对象。",[40,7781,7782],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7784,56],{"id":56},[10,7786,59],{},[61,7788,7790],{"className":63,"code":7789,"language":65,"meta":66,"style":66},"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,7791,7792,7796,7800,7804,7808,7813,7818,7822,7827,7832,7836],{"__ignoreMap":66},[70,7793,7794],{"class":72,"line":73},[70,7795,82],{},[70,7797,7798],{"class":72,"line":79},[70,7799,89],{"emptyLinePlaceholder":88},[70,7801,7802],{"class":72,"line":85},[70,7803,6948],{},[70,7805,7806],{"class":72,"line":92},[70,7807,89],{"emptyLinePlaceholder":88},[70,7809,7810],{"class":72,"line":98},[70,7811,7812],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[70,7814,7815],{"class":72,"line":104},[70,7816,7817],{},"    file.write(\"上下文管理器\\n\")\n",[70,7819,7820],{"class":72,"line":110},[70,7821,89],{"emptyLinePlaceholder":88},[70,7823,7824],{"class":72,"line":116},[70,7825,7826],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[70,7828,7829],{"class":72,"line":121},[70,7830,7831],{},"    print(file.read())\n",[70,7833,7834],{"class":72,"line":127},[70,7835,89],{"emptyLinePlaceholder":88},[70,7837,7838],{"class":72,"line":133},[70,7839,7840],{},"print(file.closed)\n",[10,7842,238],{},[61,7844,7847],{"className":7845,"code":7846,"language":244,"meta":66},[242],"上下文管理器\n\nTrue\n",[50,7848,7846],{"__ignoreMap":66},[10,7850,249],{},[14,7852,252],{"id":252},[254,7854,7855,7863],{},[40,7856,7761,7857,7859,7860,504],{},[50,7858,6925],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[50,7861,7862],{},"file",[40,7864,7865],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7867,305],{"id":305},[37,7869,7870,7875],{},[40,7871,4925,7872,7874],{},[50,7873,6925],{}," 代码块外继续读写已经关闭的文件对象。",[40,7876,7877,7878,7880],{},"误以为 ",[50,7879,6925],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7882,319],{"id":319},[254,7884,7885,7894],{},[40,7886,7887,7888,7891,7892,504],{},"把第 30 篇的手动 ",[50,7889,7890],{},"open\u002Fclose"," 改写为 ",[50,7893,6925],{},[40,7895,4925,7896,7898,7899,504],{},[50,7897,6925],{}," 块后检查 ",[50,7900,7901],{},"file.closed",[10,7903,344],{},[14,7905,347],{"id":347},[10,7907,7908],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,7910,354],{},{"title":66,"searchDepth":79,"depth":79,"links":7912},[7913,7914,7915,7916,7917,7918,7919,7920],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7740,"description":7745},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[368,6925,7928],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7931,"title":7932,"body":7933,"category":368,"cover":369,"description":7937,"extension":370,"meta":8149,"navigation":88,"path":8150,"pinned":373,"publishedAt":374,"seo":8151,"slug":8152,"stem":8153,"summary":8154,"tags":8155,"updatedAt":374,"visible":88,"__hash__":8158},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7934,"toc":8137},[7935,7938,7940,7943,7945,7951,7954,7956,7973,7975,7977,8045,8047,8053,8055,8057,8082,8084,8087,8093,8102,8104,8115,8117,8128,8130,8132,8135],[10,7936,7937],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7939,16],{"id":16},[10,7941,7942],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7944,22],{"id":22},[10,7946,7947],{},[26,7948],{"alt":7949,"src":7950},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7952,7953],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7955,35],{"id":35},[37,7957,7958,7964,7970],{},[40,7959,7960,7963],{},[50,7961,7962],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7965,7966,7969],{},[50,7967,7968],{},"__init__"," 在实例创建过程中初始化属性。",[40,7971,7972],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7974,56],{"id":56},[10,7976,59],{},[61,7978,7980],{"className":63,"code":7979,"language":65,"meta":66,"style":66},"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,7981,7982,7987,7992,7997,8002,8006,8011,8016,8021,8026,8030,8035,8040],{"__ignoreMap":66},[70,7983,7984],{"class":72,"line":73},[70,7985,7986],{},"class LearningRecord:\n",[70,7988,7989],{"class":72,"line":79},[70,7990,7991],{},"    def __init__(self, course, progress=0):\n",[70,7993,7994],{"class":72,"line":85},[70,7995,7996],{},"        self.course = course\n",[70,7998,7999],{"class":72,"line":92},[70,8000,8001],{},"        self.progress = progress\n",[70,8003,8004],{"class":72,"line":98},[70,8005,89],{"emptyLinePlaceholder":88},[70,8007,8008],{"class":72,"line":104},[70,8009,8010],{},"    def advance(self, amount):\n",[70,8012,8013],{"class":72,"line":110},[70,8014,8015],{},"        self.progress = self.progress + amount\n",[70,8017,8018],{"class":72,"line":116},[70,8019,8020],{},"        if self.progress > 100:\n",[70,8022,8023],{"class":72,"line":121},[70,8024,8025],{},"            self.progress = 100\n",[70,8027,8028],{"class":72,"line":127},[70,8029,89],{"emptyLinePlaceholder":88},[70,8031,8032],{"class":72,"line":133},[70,8033,8034],{},"record = LearningRecord(\"Python\", 40)\n",[70,8036,8037],{"class":72,"line":139},[70,8038,8039],{},"record.advance(15)\n",[70,8041,8042],{"class":72,"line":145},[70,8043,8044],{},"print(record.course, record.progress)\n",[10,8046,238],{},[61,8048,8051],{"className":8049,"code":8050,"language":244,"meta":66},[242],"Python 55\n",[50,8052,8050],{"__ignoreMap":66},[10,8054,249],{},[14,8056,252],{"id":252},[254,8058,8059,8069],{},[40,8060,8061,8062,8065,8066,8068],{},"调用 ",[50,8063,8064],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[50,8067,7968],{}," 把课程和进度保存在该实例属性中。",[40,8070,8071,8074,8075,8078,8079,8081],{},[50,8072,8073],{},"record.advance(15)"," 自动把 ",[50,8076,8077],{},"record"," 作为 ",[50,8080,7962],{},"，方法更新同一实例的进度并限制上限。",[269,8083,271],{"id":271},[10,8085,8086],{},"类是共同定义，实例则各自保存状态。",[10,8088,8089],{},[26,8090],{"alt":8091,"src":8092},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,8094,8095,8096,1298,8098,8101],{},"两个实例共享同一套方法定义，但 ",[50,8097,4722],{},[50,8099,8100],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,8103,305],{"id":305},[37,8105,8106,8112],{},[40,8107,8108,8109,8111],{},"调用实例方法时手工再传一次 ",[50,8110,7962],{},"。通过实例调用时 Python 会自动绑定。",[40,8113,8114],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,8116,319],{"id":319},[254,8118,8119,8125],{},[40,8120,5435,8121,8124],{},[50,8122,8123],{},"Book"," 类，保存标题和阅读页数。",[40,8126,8127],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,8129,344],{},[14,8131,347],{"id":347},[10,8133,8134],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,8136,354],{},{"title":66,"searchDepth":79,"depth":79,"links":8138},[8139,8140,8141,8142,8143,8146,8147,8148],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":8144},[8145],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7932,"description":7937},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[368,8156,8157],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":8160,"title":8161,"body":8162,"category":368,"cover":369,"description":8166,"extension":370,"meta":8343,"navigation":88,"path":8344,"pinned":373,"publishedAt":374,"seo":8345,"slug":8346,"stem":8347,"summary":8348,"tags":8349,"updatedAt":374,"visible":88,"__hash__":8352},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8163,"toc":8333},[8164,8167,8169,8172,8174,8180,8183,8185,8196,8198,8200,8267,8269,8275,8277,8279,8297,8299,8307,8309,8324,8326,8328,8331],[10,8165,8166],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8168,16],{"id":16},[10,8170,8171],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8173,22],{"id":22},[10,8175,8176],{},[26,8177],{"alt":8178,"src":8179},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8181,8182],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8184,35],{"id":35},[37,8186,8187,8190,8193],{},[40,8188,8189],{},"封装让对象通过方法维护自己的有效状态。",[40,8191,8192],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8194,8195],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8197,56],{"id":56},[10,8199,59],{},[61,8201,8203],{"className":63,"code":8202,"language":65,"meta":66,"style":66},"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,8204,8205,8210,8215,8220,8224,8229,8234,8239,8243,8248,8253,8257,8262],{"__ignoreMap":66},[70,8206,8207],{"class":72,"line":73},[70,8208,8209],{},"class Storage:\n",[70,8211,8212],{"class":72,"line":79},[70,8213,8214],{},"    def save(self, text):\n",[70,8216,8217],{"class":72,"line":85},[70,8218,8219],{},"        print(\"保存：\", text)\n",[70,8221,8222],{"class":72,"line":92},[70,8223,89],{"emptyLinePlaceholder":88},[70,8225,8226],{"class":72,"line":98},[70,8227,8228],{},"class LearningService:\n",[70,8230,8231],{"class":72,"line":104},[70,8232,8233],{},"    def __init__(self, storage):\n",[70,8235,8236],{"class":72,"line":110},[70,8237,8238],{},"        self.storage = storage\n",[70,8240,8241],{"class":72,"line":116},[70,8242,89],{"emptyLinePlaceholder":88},[70,8244,8245],{"class":72,"line":121},[70,8246,8247],{},"    def finish_lesson(self, title):\n",[70,8249,8250],{"class":72,"line":127},[70,8251,8252],{},"        self.storage.save(title)\n",[70,8254,8255],{"class":72,"line":133},[70,8256,89],{"emptyLinePlaceholder":88},[70,8258,8259],{"class":72,"line":139},[70,8260,8261],{},"service = LearningService(Storage())\n",[70,8263,8264],{"class":72,"line":145},[70,8265,8266],{},"service.finish_lesson(\"异常处理\")\n",[10,8268,238],{},[61,8270,8273],{"className":8271,"code":8272,"language":244,"meta":66},[242],"保存： 异常处理\n",[50,8274,8272],{"__ignoreMap":66},[10,8276,249],{},[14,8278,252],{"id":252},[254,8280,8281,8290],{},[40,8282,8283,8286,8287,8289],{},[50,8284,8285],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[50,8288,266],{}," 的协作对象。",[40,8291,8292,8293,8296],{},"调用业务方法时，服务把保存动作委托给 ",[50,8294,8295],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8298,305],{"id":305},[37,8300,8301,8304],{},[40,8302,8303],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8305,8306],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8308,319],{"id":319},[254,8310,8311,8321],{},[40,8312,8313,8314,8317,8318,504],{},"用组合让 ",[50,8315,8316],{},"OrderService"," 使用一个 ",[50,8319,8320],{},"Notifier",[40,8322,8323],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8325,344],{},[14,8327,347],{"id":347},[10,8329,8330],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,8332,354],{},{"title":66,"searchDepth":79,"depth":79,"links":8334},[8335,8336,8337,8338,8339,8340,8341,8342],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":8161,"description":8166},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[368,8350,8351],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8354,"title":8355,"body":8356,"category":368,"cover":369,"description":8360,"extension":370,"meta":8563,"navigation":88,"path":8564,"pinned":373,"publishedAt":374,"seo":8565,"slug":8566,"stem":8567,"summary":8568,"tags":8569,"updatedAt":374,"visible":88,"__hash__":8572},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8357,"toc":8551},[8358,8361,8363,8366,8368,8374,8381,8383,8408,8410,8412,8464,8466,8472,8474,8476,8497,8499,8505,8511,8517,8519,8527,8529,8542,8544,8546,8549],[10,8359,8360],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8362,16],{"id":16},[10,8364,8365],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8367,22],{"id":22},[10,8369,8370],{},[26,8371],{"alt":8372,"src":8373},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8375,8376,8377,8380],{},"生成器运行到 ",[50,8378,8379],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8382,35],{"id":35},[37,8384,8385,8395,8405],{},[40,8386,8387,8390,8391,8394],{},[50,8388,8389],{},"iter()"," 从可迭代对象取得迭代器，",[50,8392,8393],{},"next()"," 请求下一个值。",[40,8396,8397,8398,8401,8402,8404],{},"没有更多值时迭代器抛出 ",[50,8399,8400],{},"StopIteration","，",[50,8403,4476],{}," 会自动处理。",[40,8406,8407],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8409,56],{"id":56},[10,8411,59],{},[61,8413,8415],{"className":63,"code":8414,"language":65,"meta":66,"style":66},"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,8416,8417,8422,8427,8432,8437,8442,8446,8451,8456,8460],{"__ignoreMap":66},[70,8418,8419],{"class":72,"line":73},[70,8420,8421],{},"def countdown(start):\n",[70,8423,8424],{"class":72,"line":79},[70,8425,8426],{},"    current = start\n",[70,8428,8429],{"class":72,"line":85},[70,8430,8431],{},"    while current > 0:\n",[70,8433,8434],{"class":72,"line":92},[70,8435,8436],{},"        yield current\n",[70,8438,8439],{"class":72,"line":98},[70,8440,8441],{},"        current = current - 1\n",[70,8443,8444],{"class":72,"line":104},[70,8445,89],{"emptyLinePlaceholder":88},[70,8447,8448],{"class":72,"line":110},[70,8449,8450],{},"iterator = countdown(3)\n",[70,8452,8453],{"class":72,"line":116},[70,8454,8455],{},"print(next(iterator))\n",[70,8457,8458],{"class":72,"line":121},[70,8459,8455],{},[70,8461,8462],{"class":72,"line":127},[70,8463,8455],{},[10,8465,238],{},[61,8467,8470],{"className":8468,"code":8469,"language":244,"meta":66},[242],"3\n2\n1\n",[50,8471,8469],{"__ignoreMap":66},[10,8473,249],{},[14,8475,252],{"id":252},[254,8477,8478,8484],{},[40,8479,8061,8480,8483],{},[50,8481,8482],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8485,8486,8487,8489,8490,8492,8493,8496],{},"每次 ",[50,8488,8393],{}," 运行到下一个 ",[50,8491,8379],{}," 并暂停，局部变量 ",[50,8494,8495],{},"current"," 和执行位置被保留。",[269,8498,271],{"id":271},[10,8500,8501,8502,8504],{},"生成器的暂停位置可以展开成多次 ",[50,8503,8393],{}," 的时间线。",[10,8506,8507],{},[26,8508],{"alt":8509,"src":8510},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8512,8513,8514,8516],{},"每次请求只推进到下一个 ",[50,8515,8379],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8518,305],{"id":305},[37,8520,8521,8524],{},[40,8522,8523],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8525,8526],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8528,319],{"id":319},[254,8530,8531,8534],{},[40,8532,8533],{},"编写产生 1 到指定上限偶数的生成器。",[40,8535,4150,8536,8538,8539,8541],{},[50,8537,4476],{}," 遍历生成器，比较手动 ",[50,8540,8393],{}," 的差异。",[10,8543,344],{},[14,8545,347],{"id":347},[10,8547,8548],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,8550,354],{},{"title":66,"searchDepth":79,"depth":79,"links":8552},[8553,8554,8555,8556,8557,8560,8561,8562],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":8558},[8559],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8355,"description":8360},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[368,8570,8571],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8574,"title":8575,"body":8576,"category":368,"cover":369,"description":8580,"extension":370,"meta":8802,"navigation":88,"path":8803,"pinned":373,"publishedAt":374,"seo":8804,"slug":8805,"stem":8806,"summary":8807,"tags":8808,"updatedAt":374,"visible":88,"__hash__":8810},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8577,"toc":8790},[8578,8581,8583,8586,8588,8594,8597,8599,8619,8621,8623,8703,8705,8711,8713,8715,8737,8739,8742,8748,8755,8757,8767,8769,8781,8783,8785,8788],[10,8579,8580],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8582,16],{"id":16},[10,8584,8585],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8587,22],{"id":22},[10,8589,8590],{},[26,8591],{"alt":8592,"src":8593},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8595,8596],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8598,35],{"id":35},[37,8600,8601,8610,8613],{},[40,8602,8603,8606,8607,504],{},[50,8604,8605],{},"@trace"," 等价于 ",[50,8608,8609],{},"add = trace(add)",[40,8611,8612],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8614,8615,8618],{},[50,8616,8617],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8620,56],{"id":56},[10,8622,59],{},[61,8624,8626],{"className":63,"code":8625,"language":65,"meta":66,"style":66},"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,8627,8628,8633,8637,8642,8647,8652,8657,8662,8667,8672,8677,8681,8686,8690,8694,8698],{"__ignoreMap":66},[70,8629,8630],{"class":72,"line":73},[70,8631,8632],{},"from functools import wraps\n",[70,8634,8635],{"class":72,"line":79},[70,8636,89],{"emptyLinePlaceholder":88},[70,8638,8639],{"class":72,"line":85},[70,8640,8641],{},"def trace(function):\n",[70,8643,8644],{"class":72,"line":92},[70,8645,8646],{},"    @wraps(function)\n",[70,8648,8649],{"class":72,"line":98},[70,8650,8651],{},"    def wrapper(*args, **kwargs):\n",[70,8653,8654],{"class":72,"line":104},[70,8655,8656],{},"        print(\"开始：\", function.__name__)\n",[70,8658,8659],{"class":72,"line":110},[70,8660,8661],{},"        result = function(*args, **kwargs)\n",[70,8663,8664],{"class":72,"line":116},[70,8665,8666],{},"        print(\"结束：\", function.__name__)\n",[70,8668,8669],{"class":72,"line":121},[70,8670,8671],{},"        return result\n",[70,8673,8674],{"class":72,"line":127},[70,8675,8676],{},"    return wrapper\n",[70,8678,8679],{"class":72,"line":133},[70,8680,89],{"emptyLinePlaceholder":88},[70,8682,8683],{"class":72,"line":139},[70,8684,8685],{},"@trace\n",[70,8687,8688],{"class":72,"line":145},[70,8689,6317],{},[70,8691,8692],{"class":72,"line":151},[70,8693,6322],{},[70,8695,8696],{"class":72,"line":156},[70,8697,89],{"emptyLinePlaceholder":88},[70,8699,8700],{"class":72,"line":162},[70,8701,8702],{},"print(add(2, 3))\n",[10,8704,238],{},[61,8706,8709],{"className":8707,"code":8708,"language":244,"meta":66},[242],"开始： add\n结束： add\n5\n",[50,8710,8708],{"__ignoreMap":66},[10,8712,249],{},[14,8714,252],{"id":252},[254,8716,8717,8734],{},[40,8718,8719,8720,8723,8724,8727,8728,8731,8732,504],{},"解释器执行定义时，把原 ",[50,8721,8722],{},"add"," 函数交给 ",[50,8725,8726],{},"trace","，返回的 ",[50,8729,8730],{},"wrapper"," 重新绑定到名字 ",[50,8733,8722],{},[40,8735,8736],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[269,8738,271],{"id":271},[10,8740,8741],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8743,8744],{},[26,8745],{"alt":8746,"src":8747},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8749,8750,8752,8753,504],{},[50,8751,8605],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[50,8754,8609],{},[14,8756,305],{"id":305},[37,8758,8759,8764],{},[40,8760,8761,8762,504],{},"包装函数忘记返回原函数结果，调用方得到 ",[50,8763,5518],{},[40,8765,8766],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8768,319],{"id":319},[254,8770,8771,8774],{},[40,8772,8773],{},"编写只记录调用次数的简单装饰器。",[40,8775,8776,8777,8780],{},"删除包装函数的 ",[50,8778,8779],{},"return result","，观察调用方得到什么。",[10,8782,344],{},[14,8784,347],{"id":347},[10,8786,8787],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,8789,354],{},{"title":66,"searchDepth":79,"depth":79,"links":8791},[8792,8793,8794,8795,8796,8799,8800,8801],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":8797},[8798],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8575,"description":8580},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[368,8809,5469],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8812,"title":8813,"body":8814,"category":368,"cover":369,"description":8818,"extension":370,"meta":9005,"navigation":88,"path":9006,"pinned":373,"publishedAt":374,"seo":9007,"slug":9008,"stem":9009,"summary":9010,"tags":9011,"updatedAt":374,"visible":88,"__hash__":9014},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8815,"toc":8993},[8816,8819,8821,8824,8826,8832,8835,8837,8848,8850,8852,8927,8929,8935,8937,8939,8950,8952,8955,8961,8964,8966,8974,8976,8984,8986,8988,8991],[10,8817,8818],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8820,16],{"id":16},[10,8822,8823],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8825,22],{"id":22},[10,8827,8828],{},[26,8829],{"alt":8830,"src":8831},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8833,8834],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8836,35],{"id":35},[37,8838,8839,8842,8845],{},[40,8840,8841],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8843,8844],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8846,8847],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8849,56],{"id":56},[10,8851,59],{},[61,8853,8855],{"className":63,"code":8854,"language":65,"meta":66,"style":66},"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,8856,8857,8862,8867,8871,8876,8880,8885,8890,8895,8899,8904,8909,8914,8918,8922],{"__ignoreMap":66},[70,8858,8859],{"class":72,"line":73},[70,8860,8861],{},"import logging\n",[70,8863,8864],{"class":72,"line":79},[70,8865,8866],{},"import unittest\n",[70,8868,8869],{"class":72,"line":85},[70,8870,89],{"emptyLinePlaceholder":88},[70,8872,8873],{"class":72,"line":92},[70,8874,8875],{},"logging.basicConfig(level=logging.INFO)\n",[70,8877,8878],{"class":72,"line":98},[70,8879,89],{"emptyLinePlaceholder":88},[70,8881,8882],{"class":72,"line":104},[70,8883,8884],{},"def clamp_progress(value):\n",[70,8886,8887],{"class":72,"line":110},[70,8888,8889],{},"    logging.info(\"检查进度：%s\", value)\n",[70,8891,8892],{"class":72,"line":116},[70,8893,8894],{},"    return max(0, min(100, value))\n",[70,8896,8897],{"class":72,"line":121},[70,8898,89],{"emptyLinePlaceholder":88},[70,8900,8901],{"class":72,"line":127},[70,8902,8903],{},"class ProgressTest(unittest.TestCase):\n",[70,8905,8906],{"class":72,"line":133},[70,8907,8908],{},"    def test_upper_limit(self):\n",[70,8910,8911],{"class":72,"line":139},[70,8912,8913],{},"        self.assertEqual(clamp_progress(120), 100)\n",[70,8915,8916],{"class":72,"line":145},[70,8917,89],{"emptyLinePlaceholder":88},[70,8919,8920],{"class":72,"line":151},[70,8921,6331],{},[70,8923,8924],{"class":72,"line":156},[70,8925,8926],{},"    unittest.main()\n",[10,8928,238],{},[61,8930,8933],{"className":8931,"code":8932,"language":244,"meta":66},[242],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[50,8934,8932],{"__ignoreMap":66},[10,8936,249],{},[14,8938,252],{"id":252},[254,8940,8941,8947],{},[40,8942,8943,8946],{},[50,8944,8945],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8948,8949],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[269,8951,271],{"id":271},[10,8953,8954],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8956,8957],{},[26,8958],{"alt":8959,"src":8960},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8962,8963],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8965,305],{"id":305},[37,8967,8968,8971],{},[40,8969,8970],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8972,8973],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8975,319],{"id":319},[254,8977,8978,8981],{},[40,8979,8980],{},"为负数进度增加测试。",[40,8982,8983],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8985,344],{},[14,8987,347],{"id":347},[10,8989,8990],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[352,8992,354],{},{"title":66,"searchDepth":79,"depth":79,"links":8994},[8995,8996,8997,8998,8999,9002,9003,9004],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":9000},[9001],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8813,"description":8818},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[368,9012,9013],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":4,"title":5,"body":9016,"category":368,"cover":369,"description":12,"extension":370,"meta":9254,"navigation":88,"path":372,"pinned":373,"publishedAt":374,"seo":9255,"slug":376,"stem":377,"summary":378,"tags":9256,"updatedAt":374,"visible":88,"__hash__":382},{"type":7,"value":9017,"toc":9241},[9018,9020,9022,9024,9026,9030,9032,9034,9044,9046,9048,9164,9166,9171,9173,9175,9185,9187,9189,9193,9195,9197,9199,9203,9207,9209,9217,9219,9233,9235,9237,9239],[10,9019,12],{},[14,9021,16],{"id":16},[10,9023,19],{},[14,9025,22],{"id":22},[10,9027,9028],{},[26,9029],{"alt":28,"src":29},[10,9031,32],{},[14,9033,35],{"id":35},[37,9035,9036,9038,9040],{},[40,9037,42],{},[40,9039,45],{},[40,9041,48,9042,53],{},[50,9043,52],{},[14,9045,56],{"id":56},[10,9047,59],{},[61,9049,9050],{"className":63,"code":64,"language":65,"meta":66,"style":66},[50,9051,9052,9056,9060,9064,9068,9072,9076,9080,9084,9088,9092,9096,9100,9104,9108,9112,9116,9120,9124,9128,9132,9136,9140,9144,9148,9152,9156,9160],{"__ignoreMap":66},[70,9053,9054],{"class":72,"line":73},[70,9055,76],{},[70,9057,9058],{"class":72,"line":79},[70,9059,82],{},[70,9061,9062],{"class":72,"line":85},[70,9063,89],{"emptyLinePlaceholder":88},[70,9065,9066],{"class":72,"line":92},[70,9067,95],{},[70,9069,9070],{"class":72,"line":98},[70,9071,101],{},[70,9073,9074],{"class":72,"line":104},[70,9075,107],{},[70,9077,9078],{"class":72,"line":110},[70,9079,113],{},[70,9081,9082],{"class":72,"line":116},[70,9083,89],{"emptyLinePlaceholder":88},[70,9085,9086],{"class":72,"line":121},[70,9087,124],{},[70,9089,9090],{"class":72,"line":127},[70,9091,130],{},[70,9093,9094],{"class":72,"line":133},[70,9095,136],{},[70,9097,9098],{"class":72,"line":139},[70,9099,142],{},[70,9101,9102],{"class":72,"line":145},[70,9103,148],{},[70,9105,9106],{"class":72,"line":151},[70,9107,89],{"emptyLinePlaceholder":88},[70,9109,9110],{"class":72,"line":156},[70,9111,159],{},[70,9113,9114],{"class":72,"line":162},[70,9115,165],{},[70,9117,9118],{"class":72,"line":168},[70,9119,171],{},[70,9121,9122],{"class":72,"line":174},[70,9123,89],{"emptyLinePlaceholder":88},[70,9125,9126],{"class":72,"line":179},[70,9127,182],{},[70,9129,9130],{"class":72,"line":185},[70,9131,89],{"emptyLinePlaceholder":88},[70,9133,9134],{"class":72,"line":190},[70,9135,193],{},[70,9137,9138],{"class":72,"line":196},[70,9139,199],{},[70,9141,9142],{"class":72,"line":202},[70,9143,205],{},[70,9145,9146],{"class":72,"line":208},[70,9147,211],{},[70,9149,9150],{"class":72,"line":214},[70,9151,217],{},[70,9153,9154],{"class":72,"line":220},[70,9155,223],{},[70,9157,9158],{"class":72,"line":226},[70,9159,229],{},[70,9161,9162],{"class":72,"line":232},[70,9163,235],{},[10,9165,238],{},[61,9167,9169],{"className":9168,"code":243,"language":244,"meta":66},[242],[50,9170,243],{"__ignoreMap":66},[10,9172,249],{},[14,9174,252],{"id":252},[254,9176,9177,9181],{},[40,9178,258,9179,261],{},[50,9180,52],{},[40,9182,9183,267],{},[50,9184,266],{},[269,9186,271],{"id":271},[10,9188,274],{},[10,9190,9191],{},[26,9192],{"alt":279,"src":280},[10,9194,283],{},[269,9196,271],{"id":286},[10,9198,289],{},[10,9200,9201],{},[26,9202],{"alt":294,"src":295},[10,9204,298,9205,302],{},[50,9206,301],{},[14,9208,305],{"id":305},[37,9210,9211,9213],{},[40,9212,310],{},[40,9214,313,9215,316],{},[50,9216,301],{},[14,9218,319],{"id":319},[254,9220,9221,9225,9227],{},[40,9222,324,9223,327],{},[50,9224,301],{},[40,9226,330],{},[40,9228,333,9229,337,9231,341],{},[50,9230,336],{},[50,9232,340],{},[10,9234,344],{},[14,9236,347],{"id":347},[10,9238,350],{},[352,9240,354],{},{"title":66,"searchDepth":79,"depth":79,"links":9242},[9243,9244,9245,9246,9247,9251,9252,9253],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":9248},[9249,9250],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5,"description":12},[368,380,381],[9258,9361,9480,9611,9754,9879,10016,10153,10294,10463,10600,10733,10856,10985,11112,11275,11451,11592,11721,11870,12013,12134,12257,12406,12559,12724,12851,13032,13175,13332,13483,13630,13785,14003,14158,14333,14484,14651,14838,15001,15243,15483],{"id":1534,"title":1535,"body":9259,"category":368,"cover":369,"description":1540,"extension":370,"meta":9358,"navigation":88,"path":1659,"pinned":373,"publishedAt":374,"seo":9359,"slug":1661,"stem":1662,"summary":1663,"tags":9360,"updatedAt":374,"visible":88,"__hash__":1666},{"type":7,"value":9260,"toc":9348},[9261,9263,9265,9267,9269,9273,9277,9279,9289,9291,9293,9301,9303,9308,9310,9312,9322,9324,9332,9334,9340,9342,9344,9346],[10,9262,1540],{},[14,9264,16],{"id":16},[10,9266,1545],{},[14,9268,22],{"id":22},[10,9270,9271],{},[26,9272],{"alt":1552,"src":1553},[10,9274,9275,1558],{},[50,9276,1312],{},[14,9278,35],{"id":35},[37,9280,9281,9285,9287],{},[40,9282,1565,9283,1568],{},[50,9284,1312],{},[40,9286,1571],{},[40,9288,1574],{},[14,9290,56],{"id":56},[10,9292,59],{},[61,9294,9295],{"className":63,"code":1581,"language":65,"meta":66,"style":66},[50,9296,9297],{"__ignoreMap":66},[70,9298,9299],{"class":72,"line":73},[70,9300,1581],{},[10,9302,238],{},[61,9304,9306],{"className":9305,"code":1593,"language":244,"meta":66},[242],[50,9307,1593],{"__ignoreMap":66},[10,9309,249],{},[14,9311,252],{"id":252},[254,9313,9314,9318],{},[40,9315,1604,9316,1608],{},[50,9317,1607],{},[40,9319,1611,9320,1615],{},[50,9321,1614],{},[14,9323,305],{"id":305},[37,9325,9326,9328],{},[40,9327,1622],{},[40,9329,1625,9330,1628],{},[50,9331,1312],{},[14,9333,319],{"id":319},[254,9335,9336,9338],{},[40,9337,1635],{},[40,9339,1638],{},[10,9341,344],{},[14,9343,347],{"id":347},[10,9345,1645],{},[352,9347,354],{},{"title":66,"searchDepth":79,"depth":79,"links":9349},[9350,9351,9352,9353,9354,9355,9356,9357],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":1535,"description":1540},[368,1530,1665],{"id":1668,"title":1669,"body":9362,"category":368,"cover":369,"description":1674,"extension":370,"meta":9477,"navigation":88,"path":1811,"pinned":373,"publishedAt":374,"seo":9478,"slug":1813,"stem":1814,"summary":1815,"tags":9479,"updatedAt":374,"visible":88,"__hash__":1818},{"type":7,"value":9363,"toc":9467},[9364,9366,9368,9370,9372,9376,9380,9382,9392,9394,9396,9416,9418,9423,9425,9427,9437,9439,9449,9451,9459,9461,9463,9465],[10,9365,1674],{},[14,9367,16],{"id":16},[10,9369,1679],{},[14,9371,22],{"id":22},[10,9373,9374],{},[26,9375],{"alt":1686,"src":1687},[10,9377,1690,9378,1693],{},[50,9379,833],{},[14,9381,35],{"id":35},[37,9383,9384,9386,9388],{},[40,9385,1700],{},[40,9387,1703],{},[40,9389,1706,9390,1710],{},[50,9391,1709],{},[14,9393,56],{"id":56},[10,9395,1715],{},[61,9397,9398],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,9399,9400,9406],{"__ignoreMap":66},[70,9401,9402,9404],{"class":72,"line":73},[70,9403,833],{"class":742},[70,9405,746],{"class":745},[70,9407,9408,9410,9412,9414],{"class":72,"line":79},[70,9409,833],{"class":742},[70,9411,775],{"class":745},[70,9413,779],{"class":778},[70,9415,746],{"class":745},[10,9417,238],{},[61,9419,9421],{"className":9420,"code":1741,"language":244,"meta":66},[242],[50,9422,1741],{"__ignoreMap":66},[10,9424,249],{},[14,9426,252],{"id":252},[254,9428,9429,9433],{},[40,9430,9431,1755],{},[50,9432,1754],{},[40,9434,9435,1760],{},[50,9436,841],{},[14,9438,305],{"id":305},[37,9440,9441,9445],{},[40,9442,1767,9443,1770],{},[50,9444,833],{},[40,9446,1773,9447,1776],{},[50,9448,833],{},[14,9450,319],{"id":319},[254,9452,9453,9457],{},[40,9454,1080,9455,1786],{},[50,9456,1785],{},[40,9458,1789],{},[10,9460,344],{},[14,9462,347],{"id":347},[10,9464,1796],{},[352,9466,1799],{},{"title":66,"searchDepth":79,"depth":79,"links":9468},[9469,9470,9471,9472,9473,9474,9475,9476],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":1669,"description":1674},[368,1817,1194],{"id":1820,"title":1821,"body":9481,"category":368,"cover":369,"description":1987,"extension":370,"meta":9608,"navigation":88,"path":1989,"pinned":373,"publishedAt":374,"seo":9609,"slug":1991,"stem":1992,"summary":1993,"tags":9610,"updatedAt":374,"visible":88,"__hash__":1997},{"type":7,"value":9482,"toc":9598},[9483,9487,9489,9491,9493,9497,9499,9501,9517,9519,9521,9541,9543,9548,9550,9552,9564,9566,9576,9578,9588,9590,9592,9596],[10,9484,1826,9485,1829],{},[50,9486,1312],{},[14,9488,16],{"id":16},[10,9490,1834],{},[14,9492,22],{"id":22},[10,9494,9495],{},[26,9496],{"alt":1841,"src":1842},[10,9498,1845],{},[14,9500,35],{"id":35},[37,9502,9503,9509,9513],{},[40,9504,1852,9505,1855,9507,504],{},[50,9506,833],{},[50,9508,1858],{},[40,9510,1861,9511,1865],{},[50,9512,1864],{},[40,9514,1868,9515,1871],{},[50,9516,1312],{},[14,9518,56],{"id":56},[10,9520,59],{},[61,9522,9523],{"className":1878,"code":1879,"language":1880,"meta":66,"style":66},[50,9524,9525,9529,9533,9537],{"__ignoreMap":66},[70,9526,9527],{"class":72,"line":73},[70,9528,1887],{},[70,9530,9531],{"class":72,"line":79},[70,9532,1892],{},[70,9534,9535],{"class":72,"line":85},[70,9536,1897],{},[70,9538,9539],{"class":72,"line":92},[70,9540,1902],{},[10,9542,238],{},[61,9544,9546],{"className":9545,"code":1908,"language":244,"meta":66},[242],[50,9547,1908],{"__ignoreMap":66},[10,9549,249],{},[14,9551,252],{"id":252},[254,9553,9554,9560],{},[40,9555,1919,9556,1923,9558,504],{},[50,9557,1922],{},[50,9559,1926],{},[40,9561,1929,9562,1932],{},[50,9563,1614],{},[14,9565,305],{"id":305},[37,9567,9568,9574],{},[40,9569,1939,9570,1942,9572,1945],{},[50,9571,1858],{},[50,9573,1312],{},[40,9575,1948],{},[14,9577,319],{"id":319},[254,9579,9580,9584],{},[40,9581,1955,9582,504],{},[50,9583,1958],{},[40,9585,1961,9586,1964],{},[50,9587,1614],{},[10,9589,344],{},[14,9591,347],{"id":347},[10,9593,1971,9594,1974],{},[50,9595,1312],{},[352,9597,354],{},{"title":66,"searchDepth":79,"depth":79,"links":9599},[9600,9601,9602,9603,9604,9605,9606,9607],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":1821,"description":1987},[368,1995,1996],{"id":1999,"title":2000,"body":9612,"category":368,"cover":369,"description":2005,"extension":370,"meta":9751,"navigation":88,"path":2177,"pinned":373,"publishedAt":374,"seo":9752,"slug":2179,"stem":2180,"summary":2181,"tags":9753,"updatedAt":374,"visible":88,"__hash__":2185},{"type":7,"value":9613,"toc":9741},[9614,9616,9618,9620,9622,9626,9630,9632,9644,9646,9648,9684,9686,9691,9693,9695,9711,9713,9723,9725,9733,9735,9737,9739],[10,9615,2005],{},[14,9617,16],{"id":16},[10,9619,2010],{},[14,9621,22],{"id":22},[10,9623,9624],{},[26,9625],{"alt":2017,"src":2018},[10,9627,9628,2024],{},[50,9629,2023],{},[14,9631,35],{"id":35},[37,9633,9634,9636,9642],{},[40,9635,2031],{},[40,9637,9638,2037,9640,2041],{},[50,9639,2036],{},[50,9641,2040],{},[40,9643,2044],{},[14,9645,56],{"id":56},[10,9647,1715],{},[61,9649,9650],{"className":733,"code":2051,"language":735,"meta":66,"style":66},[50,9651,9652,9658,9664,9668,9678],{"__ignoreMap":66},[70,9653,9654,9656],{"class":72,"line":73},[70,9655,2058],{"class":742},[70,9657,2061],{"class":778},[70,9659,9660,9662],{"class":72,"line":79},[70,9661,2066],{"class":745},[70,9663,2061],{"class":778},[70,9665,9666],{"class":72,"line":85},[70,9667,2073],{"class":745},[70,9669,9670,9672,9674,9676],{"class":72,"line":92},[70,9671,2078],{"class":745},[70,9673,2081],{"class":778},[70,9675,2085],{"class":2084},[70,9677,1356],{"class":778},[70,9679,9680,9682],{"class":72,"line":98},[70,9681,833],{"class":742},[70,9683,1356],{"class":778},[10,9685,238],{},[61,9687,9689],{"className":9688,"code":2099,"language":244,"meta":66},[242],[50,9690,2099],{"__ignoreMap":66},[10,9692,249],{},[14,9694,252],{"id":252},[254,9696,9697,9705],{},[40,9698,9699,2112,9701,2115,9703,2118],{},[50,9700,2058],{},[50,9702,2066],{},[50,9704,2036],{},[40,9706,9707,2123,9709,2127],{},[50,9708,2023],{},[50,9710,2126],{},[14,9712,305],{"id":305},[37,9714,9715,9721],{},[40,9716,2134,9717,1298,9719,504],{},[50,9718,2036],{},[50,9720,2040],{},[40,9722,2141],{},[14,9724,319],{"id":319},[254,9726,9727,9731],{},[40,9728,2148,9729,2152],{},[50,9730,2151],{},[40,9732,2155],{},[10,9734,344],{},[14,9736,347],{"id":347},[10,9738,2162],{},[352,9740,2165],{},{"title":66,"searchDepth":79,"depth":79,"links":9742},[9743,9744,9745,9746,9747,9748,9749,9750],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2000,"description":2005},[368,2183,2184],{"id":2187,"title":2188,"body":9755,"category":368,"cover":369,"description":2193,"extension":370,"meta":9876,"navigation":88,"path":2342,"pinned":373,"publishedAt":374,"seo":9877,"slug":2344,"stem":2345,"summary":2346,"tags":9878,"updatedAt":374,"visible":88,"__hash__":2350},{"type":7,"value":9756,"toc":9866},[9757,9759,9761,9763,9765,9769,9777,9779,9793,9795,9797,9813,9815,9820,9822,9824,9838,9840,9846,9848,9858,9860,9862,9864],[10,9758,2193],{},[14,9760,16],{"id":16},[10,9762,2198],{},[14,9764,22],{"id":22},[10,9766,9767],{},[26,9768],{"alt":2205,"src":2206},[10,9770,2209,9771,504,9773,2215,9775,504],{},[50,9772,1614],{},[50,9774,2214],{},[50,9776,1922],{},[14,9778,35],{"id":35},[37,9780,9781,9785,9791],{},[40,9782,9783,2227],{},[50,9784,2226],{},[40,9786,9787,2233,9789,504],{},[50,9788,2232],{},[50,9790,2236],{},[40,9792,2239],{},[14,9794,56],{"id":56},[10,9796,59],{},[61,9798,9799],{"className":63,"code":2246,"language":65,"meta":66,"style":66},[50,9800,9801,9805,9809],{"__ignoreMap":66},[70,9802,9803],{"class":72,"line":73},[70,9804,2253],{},[70,9806,9807],{"class":72,"line":79},[70,9808,2258],{},[70,9810,9811],{"class":72,"line":85},[70,9812,2263],{},[10,9814,238],{},[61,9816,9818],{"className":9817,"code":2269,"language":244,"meta":66},[242],[50,9819,2269],{"__ignoreMap":66},[10,9821,249],{},[14,9823,252],{"id":252},[254,9825,9826,9832],{},[40,9827,9828,2283,9830,504],{},[50,9829,2282],{},[50,9831,2236],{},[40,9833,9834,2290,9836,2294],{},[50,9835,1614],{},[50,9837,2293],{},[14,9839,305],{"id":305},[37,9841,9842,9844],{},[40,9843,2301],{},[40,9845,2304],{},[14,9847,319],{"id":319},[254,9849,9850,9852],{},[40,9851,2311],{},[40,9853,2314,9854,2317,9856,2321],{},[50,9855,2214],{},[50,9857,2320],{},[10,9859,344],{},[14,9861,347],{"id":347},[10,9863,2328],{},[352,9865,354],{},{"title":66,"searchDepth":79,"depth":79,"links":9867},[9868,9869,9870,9871,9872,9873,9874,9875],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2188,"description":2193},[368,2348,2349],{"id":2352,"title":2353,"body":9880,"category":368,"cover":369,"description":2358,"extension":370,"meta":10013,"navigation":88,"path":2526,"pinned":373,"publishedAt":374,"seo":10014,"slug":2528,"stem":2529,"summary":2530,"tags":10015,"updatedAt":374,"visible":88,"__hash__":2534},{"type":7,"value":9881,"toc":10003},[9882,9884,9886,9888,9890,9894,9896,9898,9914,9916,9918,9942,9944,9949,9951,9953,9969,9971,9983,9985,9995,9997,9999,10001],[10,9883,2358],{},[14,9885,16],{"id":16},[10,9887,2363],{},[14,9889,22],{"id":22},[10,9891,9892],{},[26,9893],{"alt":2370,"src":2371},[10,9895,2374],{},[14,9897,35],{"id":35},[37,9899,9900,9902,9908],{},[40,9901,2381],{},[40,9903,2384,9904,2317,9906,2391],{},[50,9905,2387],{},[50,9907,2390],{},[40,9909,2394,9910,2398,9912,2402],{},[50,9911,2397],{},[50,9913,2401],{},[14,9915,56],{"id":56},[10,9917,59],{},[61,9919,9920],{"className":63,"code":2409,"language":65,"meta":66,"style":66},[50,9921,9922,9926,9930,9934,9938],{"__ignoreMap":66},[70,9923,9924],{"class":72,"line":73},[70,9925,2416],{},[70,9927,9928],{"class":72,"line":79},[70,9929,2421],{},[70,9931,9932],{"class":72,"line":85},[70,9933,89],{"emptyLinePlaceholder":88},[70,9935,9936],{"class":72,"line":92},[70,9937,2430],{},[70,9939,9940],{"class":72,"line":98},[70,9941,2421],{},[10,9943,238],{},[61,9945,9947],{"className":9946,"code":2440,"language":244,"meta":66},[242],[50,9948,2440],{"__ignoreMap":66},[10,9950,249],{},[14,9952,252],{"id":252},[254,9954,9955,9961],{},[40,9956,1080,9957,2454,9959,2457],{},[50,9958,2453],{},[50,9960,2387],{},[40,9962,1080,9963,2463,9965,2467,9967,504],{},[50,9964,2462],{},[50,9966,2466],{},[50,9968,2470],{},[14,9970,305],{"id":305},[37,9972,9973,9975],{},[40,9974,2477],{},[40,9976,2480,9977,2398,9979,2398,9981,2488],{},[50,9978,2397],{},[50,9980,2401],{},[50,9982,2487],{},[14,9984,319],{"id":319},[254,9986,9987,9993],{},[40,9988,2495,9989,1298,9991,2502],{},[50,9990,2498],{},[50,9992,2501],{},[40,9994,2505],{},[10,9996,344],{},[14,9998,347],{"id":347},[10,10000,2512],{},[352,10002,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10004},[10005,10006,10007,10008,10009,10010,10011,10012],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2353,"description":2358},[368,2532,2533],{"id":2536,"title":2537,"body":10017,"category":368,"cover":369,"description":2542,"extension":370,"meta":10150,"navigation":88,"path":2707,"pinned":373,"publishedAt":374,"seo":10151,"slug":2709,"stem":2710,"summary":2711,"tags":10152,"updatedAt":374,"visible":88,"__hash__":2715},{"type":7,"value":10018,"toc":10140},[10019,10021,10023,10025,10027,10031,10033,10035,10053,10055,10057,10093,10095,10100,10102,10104,10114,10116,10124,10126,10132,10134,10136,10138],[10,10020,2542],{},[14,10022,16],{"id":16},[10,10024,2547],{},[14,10026,22],{"id":22},[10,10028,10029],{},[26,10030],{"alt":2554,"src":2555},[10,10032,2558],{},[14,10034,35],{"id":35},[37,10036,10037,10043,10051],{},[40,10038,10039,2568,10041,2572],{},[50,10040,2567],{},[50,10042,2571],{},[40,10044,10045,2578,10047,2582,10049,2586],{},[50,10046,2577],{},[50,10048,2581],{},[50,10050,2585],{},[40,10052,2589],{},[14,10054,56],{"id":56},[10,10056,59],{},[61,10058,10059],{"className":63,"code":2596,"language":65,"meta":66,"style":66},[50,10060,10061,10065,10069,10073,10077,10081,10085,10089],{"__ignoreMap":66},[70,10062,10063],{"class":72,"line":73},[70,10064,2603],{},[70,10066,10067],{"class":72,"line":79},[70,10068,2608],{},[70,10070,10071],{"class":72,"line":85},[70,10072,2613],{},[70,10074,10075],{"class":72,"line":92},[70,10076,89],{"emptyLinePlaceholder":88},[70,10078,10079],{"class":72,"line":98},[70,10080,2622],{},[70,10082,10083],{"class":72,"line":104},[70,10084,2627],{},[70,10086,10087],{"class":72,"line":110},[70,10088,2632],{},[70,10090,10091],{"class":72,"line":116},[70,10092,2637],{},[10,10094,238],{},[61,10096,10098],{"className":10097,"code":2643,"language":244,"meta":66},[242],[50,10099,2643],{"__ignoreMap":66},[10,10101,249],{},[14,10103,252],{"id":252},[254,10105,10106,10110],{},[40,10107,10108,2657],{},[50,10109,2656],{},[40,10111,10112,2663],{},[50,10113,2662],{},[14,10115,305],{"id":305},[37,10117,10118,10122],{},[40,10119,2670,10120,504],{},[50,10121,2673],{},[40,10123,2676],{},[14,10125,319],{"id":319},[254,10127,10128,10130],{},[40,10129,2683],{},[40,10131,2686],{},[10,10133,344],{},[14,10135,347],{"id":347},[10,10137,2693],{},[352,10139,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10141},[10142,10143,10144,10145,10146,10147,10148,10149],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2537,"description":2542},[368,2713,2714],{"id":2717,"title":2718,"body":10154,"category":368,"cover":369,"description":2723,"extension":370,"meta":10291,"navigation":88,"path":2899,"pinned":373,"publishedAt":374,"seo":10292,"slug":2901,"stem":2902,"summary":2903,"tags":10293,"updatedAt":374,"visible":88,"__hash__":2907},{"type":7,"value":10155,"toc":10279},[10156,10158,10160,10162,10164,10168,10174,10176,10184,10186,10188,10212,10214,10219,10221,10223,10241,10243,10245,10249,10251,10253,10259,10261,10271,10273,10275,10277],[10,10157,2723],{},[14,10159,16],{"id":16},[10,10161,2728],{},[14,10163,22],{"id":22},[10,10165,10166],{},[26,10167],{"alt":2735,"src":2736},[10,10169,2739,10170,2743,10172,504],{},[50,10171,2742],{},[50,10173,2746],{},[14,10175,35],{"id":35},[37,10177,10178,10180,10182],{},[40,10179,2753],{},[40,10181,2756],{},[40,10183,2759],{},[14,10185,56],{"id":56},[10,10187,59],{},[61,10189,10190],{"className":63,"code":2766,"language":65,"meta":66,"style":66},[50,10191,10192,10196,10200,10204,10208],{"__ignoreMap":66},[70,10193,10194],{"class":72,"line":73},[70,10195,2773],{},[70,10197,10198],{"class":72,"line":79},[70,10199,2778],{},[70,10201,10202],{"class":72,"line":85},[70,10203,2783],{},[70,10205,10206],{"class":72,"line":92},[70,10207,2788],{},[70,10209,10210],{"class":72,"line":98},[70,10211,2793],{},[10,10213,238],{},[61,10215,10217],{"className":10216,"code":2799,"language":244,"meta":66},[242],[50,10218,2799],{"__ignoreMap":66},[10,10220,249],{},[14,10222,252],{"id":252},[254,10224,10225,10233],{},[40,10226,2810,10227,2813,10229,2817,10231,2821],{},[50,10228,368],{},[50,10230,2816],{},[50,10232,2820],{},[40,10234,10235,2827,10237,2831,10239,2835],{},[50,10236,2826],{},[50,10238,2830],{},[50,10240,2834],{},[269,10242,271],{"id":271},[10,10244,2840],{},[10,10246,10247],{},[26,10248],{"alt":2845,"src":2846},[10,10250,2849],{},[14,10252,305],{"id":305},[37,10254,10255,10257],{},[40,10256,2856],{},[40,10258,2859],{},[14,10260,319],{"id":319},[254,10262,10263,10269],{},[40,10264,2866,10265,2870,10267,504],{},[50,10266,2869],{},[50,10268,2873],{},[40,10270,2876],{},[10,10272,344],{},[14,10274,347],{"id":347},[10,10276,2883],{},[352,10278,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10280},[10281,10282,10283,10284,10285,10288,10289,10290],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":10286},[10287],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2718,"description":2723},[368,2905,2906],{"id":2909,"title":2910,"body":10295,"category":368,"cover":369,"description":2915,"extension":370,"meta":10460,"navigation":88,"path":3130,"pinned":373,"publishedAt":374,"seo":10461,"slug":3132,"stem":3133,"summary":3134,"tags":10462,"updatedAt":374,"visible":88,"__hash__":3138},{"type":7,"value":10296,"toc":10448},[10297,10299,10301,10303,10305,10309,10315,10317,10337,10339,10341,10377,10379,10384,10386,10388,10402,10404,10406,10410,10416,10418,10428,10430,10440,10442,10444,10446],[10,10298,2915],{},[14,10300,16],{"id":16},[10,10302,2920],{},[14,10304,22],{"id":22},[10,10306,10307],{},[26,10308],{"alt":2927,"src":2928},[10,10310,2931,10311,1151,10313,2938],{},[50,10312,2934],{},[50,10314,2937],{},[14,10316,35],{"id":35},[37,10318,10319,10327,10335],{},[40,10320,10321,2948,10323,2952,10325,2956],{},[50,10322,2947],{},[50,10324,2951],{},[50,10326,2955],{},[40,10328,10329,2962,10331,2966,10333,2970],{},[50,10330,2961],{},[50,10332,2965],{},[50,10334,2969],{},[40,10336,2973],{},[14,10338,56],{"id":56},[10,10340,59],{},[61,10342,10343],{"className":63,"code":2980,"language":65,"meta":66,"style":66},[50,10344,10345,10349,10353,10357,10361,10365,10369,10373],{"__ignoreMap":66},[70,10346,10347],{"class":72,"line":73},[70,10348,2987],{},[70,10350,10351],{"class":72,"line":79},[70,10352,2992],{},[70,10354,10355],{"class":72,"line":85},[70,10356,89],{"emptyLinePlaceholder":88},[70,10358,10359],{"class":72,"line":92},[70,10360,3001],{},[70,10362,10363],{"class":72,"line":98},[70,10364,3006],{},[70,10366,10367],{"class":72,"line":104},[70,10368,3011],{},[70,10370,10371],{"class":72,"line":110},[70,10372,3016],{},[70,10374,10375],{"class":72,"line":116},[70,10376,3021],{},[10,10378,238],{},[61,10380,10382],{"className":10381,"code":3027,"language":244,"meta":66},[242],[50,10383,3027],{"__ignoreMap":66},[10,10385,249],{},[14,10387,252],{"id":252},[254,10389,10390,10396],{},[40,10391,10392,3041,10394,3045],{},[50,10393,3040],{},[50,10395,3044],{},[40,10397,10398,3051,10400,3054],{},[50,10399,3050],{},[50,10401,2969],{},[269,10403,271],{"id":271},[10,10405,3059],{},[10,10407,10408],{},[26,10409],{"alt":3064,"src":3065},[10,10411,10412,3070,10414,3073],{},[50,10413,2961],{},[50,10415,2965],{},[14,10417,305],{"id":305},[37,10419,10420,10426],{},[40,10421,3080,10422,3083,10424,3086],{},[50,10423,2955],{},[50,10425,2947],{},[40,10427,3089],{},[14,10429,319],{"id":319},[254,10431,10432,10436],{},[40,10433,3096,10434,3100],{},[50,10435,3099],{},[40,10437,3103,10438,3107],{},[50,10439,3106],{},[10,10441,344],{},[14,10443,347],{"id":347},[10,10445,3114],{},[352,10447,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10449},[10450,10451,10452,10453,10454,10457,10458,10459],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":10455},[10456],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":2910,"description":2915},[368,3136,3137],{"id":3140,"title":3141,"body":10464,"category":368,"cover":369,"description":3146,"extension":370,"meta":10597,"navigation":88,"path":3315,"pinned":373,"publishedAt":374,"seo":10598,"slug":3317,"stem":3318,"summary":3319,"tags":10599,"updatedAt":374,"visible":88,"__hash__":3322},{"type":7,"value":10465,"toc":10587},[10466,10468,10470,10472,10474,10478,10488,10490,10500,10502,10504,10532,10534,10539,10541,10543,10557,10559,10567,10569,10579,10581,10583,10585],[10,10467,3146],{},[14,10469,16],{"id":16},[10,10471,3151],{},[14,10473,22],{"id":22},[10,10475,10476],{},[26,10477],{"alt":3158,"src":3159},[10,10479,10480,3165,10482,3169,10484,3173,10486,3177],{},[50,10481,3164],{},[50,10483,3168],{},[50,10485,3172],{},[50,10487,3176],{},[14,10489,35],{"id":35},[37,10491,10492,10494,10498],{},[40,10493,3184],{},[40,10495,10496,3189],{},[50,10497,3176],{},[40,10499,3192],{},[14,10501,56],{"id":56},[10,10503,59],{},[61,10505,10506],{"className":63,"code":3199,"language":65,"meta":66,"style":66},[50,10507,10508,10512,10516,10520,10524,10528],{"__ignoreMap":66},[70,10509,10510],{"class":72,"line":73},[70,10511,3206],{},[70,10513,10514],{"class":72,"line":79},[70,10515,3211],{},[70,10517,10518],{"class":72,"line":85},[70,10519,3216],{},[70,10521,10522],{"class":72,"line":92},[70,10523,89],{"emptyLinePlaceholder":88},[70,10525,10526],{"class":72,"line":98},[70,10527,3225],{},[70,10529,10530],{"class":72,"line":104},[70,10531,3230],{},[10,10533,238],{},[61,10535,10537],{"className":10536,"code":3236,"language":244,"meta":66},[242],[50,10538,3236],{"__ignoreMap":66},[10,10540,249],{},[14,10542,252],{"id":252},[254,10544,10545,10551],{},[40,10546,3247,10547,3250,10549,3254],{},[50,10548,3164],{},[50,10550,3253],{},[40,10552,10553,3260,10555,3264],{},[50,10554,3259],{},[50,10556,3263],{},[14,10558,305],{"id":305},[37,10560,10561,10565],{},[40,10562,3271,10563,3275],{},[50,10564,3274],{},[40,10566,3278],{},[14,10568,319],{"id":319},[254,10570,10571,10573],{},[40,10572,3285],{},[40,10574,1861,10575,3291,10577,3294],{},[50,10576,3290],{},[50,10578,3176],{},[10,10580,344],{},[14,10582,347],{"id":347},[10,10584,3301],{},[352,10586,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10588},[10589,10590,10591,10592,10593,10594,10595,10596],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3141,"description":3146},[368,2487,3321],{"id":3324,"title":3325,"body":10601,"category":368,"cover":369,"description":3330,"extension":370,"meta":10730,"navigation":88,"path":3491,"pinned":373,"publishedAt":374,"seo":10731,"slug":3493,"stem":3494,"summary":3495,"tags":10732,"updatedAt":374,"visible":88,"__hash__":3499},{"type":7,"value":10602,"toc":10720},[10603,10605,10607,10609,10611,10615,10619,10621,10631,10633,10635,10667,10669,10674,10676,10678,10690,10692,10702,10704,10712,10714,10716,10718],[10,10604,3330],{},[14,10606,16],{"id":16},[10,10608,3335],{},[14,10610,22],{"id":22},[10,10612,10613],{},[26,10614],{"alt":3342,"src":3343},[10,10616,3346,10617,3350],{},[50,10618,3349],{},[14,10620,35],{"id":35},[37,10622,10623,10625,10627],{},[40,10624,3357],{},[40,10626,3360],{},[40,10628,3363,10629,504],{},[50,10630,3366],{},[14,10632,56],{"id":56},[10,10634,59],{},[61,10636,10637],{"className":63,"code":3373,"language":65,"meta":66,"style":66},[50,10638,10639,10643,10647,10651,10655,10659,10663],{"__ignoreMap":66},[70,10640,10641],{"class":72,"line":73},[70,10642,3380],{},[70,10644,10645],{"class":72,"line":79},[70,10646,3385],{},[70,10648,10649],{"class":72,"line":85},[70,10650,89],{"emptyLinePlaceholder":88},[70,10652,10653],{"class":72,"line":92},[70,10654,3394],{},[70,10656,10657],{"class":72,"line":98},[70,10658,3399],{},[70,10660,10661],{"class":72,"line":104},[70,10662,3404],{},[70,10664,10665],{"class":72,"line":110},[70,10666,3409],{},[10,10668,238],{},[61,10670,10672],{"className":10671,"code":3415,"language":244,"meta":66},[242],[50,10673,3415],{"__ignoreMap":66},[10,10675,249],{},[14,10677,252],{"id":252},[254,10679,10680,10682],{},[40,10681,3426],{},[40,10683,10684,3432,10686,3436,10688,3440],{},[50,10685,3431],{},[50,10687,3435],{},[50,10689,3439],{},[14,10691,305],{"id":305},[37,10693,10694,10700],{},[40,10695,3447,10696,3451,10698,504],{},[50,10697,3450],{},[50,10699,3454],{},[40,10701,3457],{},[14,10703,319],{"id":319},[254,10705,10706,10708],{},[40,10707,3464],{},[40,10709,3467,10710,3470],{},[50,10711,3439],{},[10,10713,344],{},[14,10715,347],{"id":347},[10,10717,3477],{},[352,10719,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10721},[10722,10723,10724,10725,10726,10727,10728,10729],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3325,"description":3330},[368,3497,3498],{"id":3501,"title":3502,"body":10734,"category":368,"cover":369,"description":3507,"extension":370,"meta":10853,"navigation":88,"path":3649,"pinned":373,"publishedAt":374,"seo":10854,"slug":3651,"stem":3652,"summary":3653,"tags":10855,"updatedAt":374,"visible":88,"__hash__":3656},{"type":7,"value":10735,"toc":10843},[10736,10738,10740,10742,10744,10748,10750,10752,10760,10762,10764,10792,10794,10799,10801,10803,10813,10815,10823,10825,10835,10837,10839,10841],[10,10737,3507],{},[14,10739,16],{"id":16},[10,10741,3512],{},[14,10743,22],{"id":22},[10,10745,10746],{},[26,10747],{"alt":3519,"src":3520},[10,10749,3523],{},[14,10751,35],{"id":35},[37,10753,10754,10756,10758],{},[40,10755,3530],{},[40,10757,3533],{},[40,10759,3536],{},[14,10761,56],{"id":56},[10,10763,59],{},[61,10765,10766],{"className":63,"code":3543,"language":65,"meta":66,"style":66},[50,10767,10768,10772,10776,10780,10784,10788],{"__ignoreMap":66},[70,10769,10770],{"class":72,"line":73},[70,10771,3550],{},[70,10773,10774],{"class":72,"line":79},[70,10775,3555],{},[70,10777,10778],{"class":72,"line":85},[70,10779,3560],{},[70,10781,10782],{"class":72,"line":92},[70,10783,89],{"emptyLinePlaceholder":88},[70,10785,10786],{"class":72,"line":98},[70,10787,3569],{},[70,10789,10790],{"class":72,"line":104},[70,10791,3574],{},[10,10793,238],{},[61,10795,10797],{"className":10796,"code":3580,"language":244,"meta":66},[242],[50,10798,3580],{"__ignoreMap":66},[10,10800,249],{},[14,10802,252],{"id":252},[254,10804,10805,10809],{},[40,10806,10807,3594],{},[50,10808,3593],{},[40,10810,10811,3600],{},[50,10812,3599],{},[14,10814,305],{"id":305},[37,10816,10817,10821],{},[40,10818,3607,10819,3611],{},[50,10820,3610],{},[40,10822,3614],{},[14,10824,319],{"id":319},[254,10826,10827,10829],{},[40,10828,3621],{},[40,10830,2314,10831,2317,10833,3628],{},[50,10832,3610],{},[50,10834,3599],{},[10,10836,344],{},[14,10838,347],{"id":347},[10,10840,3635],{},[352,10842,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10844},[10845,10846,10847,10848,10849,10850,10851,10852],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3502,"description":3507},[368,3655,3498],{"id":3658,"title":3659,"body":10857,"category":368,"cover":369,"description":3664,"extension":370,"meta":10982,"navigation":88,"path":3820,"pinned":373,"publishedAt":374,"seo":10983,"slug":3822,"stem":3823,"summary":3824,"tags":10984,"updatedAt":374,"visible":88,"__hash__":3827},{"type":7,"value":10858,"toc":10972},[10859,10861,10863,10865,10867,10871,10877,10879,10889,10891,10893,10921,10923,10928,10930,10932,10942,10944,10956,10958,10964,10966,10968,10970],[10,10860,3664],{},[14,10862,16],{"id":16},[10,10864,3669],{},[14,10866,22],{"id":22},[10,10868,10869],{},[26,10870],{"alt":3676,"src":3677},[10,10872,3680,10873,3684,10875,3687],{},[50,10874,3683],{},[50,10876,2387],{},[14,10878,35],{"id":35},[37,10880,10881,10883,10887],{},[40,10882,3694],{},[40,10884,2480,10885,3700],{},[50,10886,3699],{},[40,10888,3703],{},[14,10890,56],{"id":56},[10,10892,59],{},[61,10894,10895],{"className":63,"code":3710,"language":65,"meta":66,"style":66},[50,10896,10897,10901,10905,10909,10913,10917],{"__ignoreMap":66},[70,10898,10899],{"class":72,"line":73},[70,10900,3717],{},[70,10902,10903],{"class":72,"line":79},[70,10904,3722],{},[70,10906,10907],{"class":72,"line":85},[70,10908,89],{"emptyLinePlaceholder":88},[70,10910,10911],{"class":72,"line":92},[70,10912,3731],{},[70,10914,10915],{"class":72,"line":98},[70,10916,3736],{},[70,10918,10919],{"class":72,"line":104},[70,10920,3741],{},[10,10922,238],{},[61,10924,10926],{"className":10925,"code":3747,"language":244,"meta":66},[242],[50,10927,3747],{"__ignoreMap":66},[10,10929,249],{},[14,10931,252],{"id":252},[254,10933,10934,10936],{},[40,10935,3758],{},[40,10937,3761,10938,3764,10940,3768],{},[50,10939,2387],{},[50,10941,3767],{},[14,10943,305],{"id":305},[37,10945,10946,10950],{},[40,10947,3775,10948,3779],{},[50,10949,3778],{},[40,10951,3782,10952,3786,10954,504],{},[50,10953,3785],{},[50,10955,3789],{},[14,10957,319],{"id":319},[254,10959,10960,10962],{},[40,10961,3796],{},[40,10963,3799],{},[10,10965,344],{},[14,10967,347],{"id":347},[10,10969,3806],{},[352,10971,354],{},{"title":66,"searchDepth":79,"depth":79,"links":10973},[10974,10975,10976,10977,10978,10979,10980,10981],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3659,"description":3664},[368,3826,3498],{"id":3829,"title":3830,"body":10986,"category":368,"cover":369,"description":3835,"extension":370,"meta":11109,"navigation":88,"path":3985,"pinned":373,"publishedAt":374,"seo":11110,"slug":3987,"stem":3988,"summary":3989,"tags":11111,"updatedAt":374,"visible":88,"__hash__":3992},{"type":7,"value":10987,"toc":11099},[10988,10990,10992,10994,10996,11000,11002,11004,11016,11018,11020,11048,11050,11055,11057,11059,11069,11071,11081,11083,11091,11093,11095,11097],[10,10989,3835],{},[14,10991,16],{"id":16},[10,10993,3840],{},[14,10995,22],{"id":22},[10,10997,10998],{},[26,10999],{"alt":3847,"src":3848},[10,11001,3851],{},[14,11003,35],{"id":35},[37,11005,11006,11008,11010],{},[40,11007,3858],{},[40,11009,3861],{},[40,11011,3864,11012,3868,11014,3872],{},[50,11013,3867],{},[50,11015,3871],{},[14,11017,56],{"id":56},[10,11019,59],{},[61,11021,11022],{"className":63,"code":3879,"language":65,"meta":66,"style":66},[50,11023,11024,11028,11032,11036,11040,11044],{"__ignoreMap":66},[70,11025,11026],{"class":72,"line":73},[70,11027,3886],{},[70,11029,11030],{"class":72,"line":79},[70,11031,3891],{},[70,11033,11034],{"class":72,"line":85},[70,11035,89],{"emptyLinePlaceholder":88},[70,11037,11038],{"class":72,"line":92},[70,11039,3900],{},[70,11041,11042],{"class":72,"line":98},[70,11043,3905],{},[70,11045,11046],{"class":72,"line":104},[70,11047,3910],{},[10,11049,238],{},[61,11051,11053],{"className":11052,"code":3916,"language":244,"meta":66},[242],[50,11054,3916],{"__ignoreMap":66},[10,11056,249],{},[14,11058,252],{"id":252},[254,11060,11061,11063],{},[40,11062,3927],{},[40,11064,11065,3933,11067,3937],{},[50,11066,3932],{},[50,11068,3936],{},[14,11070,305],{"id":305},[37,11072,11073,11079],{},[40,11074,2480,11075,3946,11077,504],{},[50,11076,3871],{},[50,11078,3867],{},[40,11080,3951],{},[14,11082,319],{"id":319},[254,11084,11085,11089],{},[40,11086,3958,11087,3961],{},[50,11088,3867],{},[40,11090,3964],{},[10,11092,344],{},[14,11094,347],{"id":347},[10,11096,3971],{},[352,11098,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11100},[11101,11102,11103,11104,11105,11106,11107,11108],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3830,"description":3835},[368,3991,3498],{"id":3994,"title":3995,"body":11113,"category":368,"cover":369,"description":4000,"extension":370,"meta":11272,"navigation":88,"path":4198,"pinned":373,"publishedAt":374,"seo":11273,"slug":4200,"stem":4201,"summary":4202,"tags":11274,"updatedAt":374,"visible":88,"__hash__":4206},{"type":7,"value":11114,"toc":11260},[11115,11117,11119,11121,11123,11127,11133,11135,11147,11149,11151,11191,11193,11198,11200,11202,11216,11218,11220,11224,11226,11228,11238,11240,11252,11254,11256,11258],[10,11116,4000],{},[14,11118,16],{"id":16},[10,11120,4005],{},[14,11122,22],{"id":22},[10,11124,11125],{},[26,11126],{"alt":4012,"src":4013},[10,11128,11129,4019,11131,4023],{},[50,11130,4018],{},[50,11132,4022],{},[14,11134,35],{"id":35},[37,11136,11137,11143,11145],{},[40,11138,11139,4032,11141,4036],{},[50,11140,2947],{},[50,11142,4035],{},[40,11144,4039],{},[40,11146,4042],{},[14,11148,56],{"id":56},[10,11150,59],{},[61,11152,11153],{"className":63,"code":4049,"language":65,"meta":66,"style":66},[50,11154,11155,11159,11163,11167,11171,11175,11179,11183,11187],{"__ignoreMap":66},[70,11156,11157],{"class":72,"line":73},[70,11158,4056],{},[70,11160,11161],{"class":72,"line":79},[70,11162,4061],{},[70,11164,11165],{"class":72,"line":85},[70,11166,4066],{},[70,11168,11169],{"class":72,"line":92},[70,11170,89],{"emptyLinePlaceholder":88},[70,11172,11173],{"class":72,"line":98},[70,11174,4075],{},[70,11176,11177],{"class":72,"line":104},[70,11178,4080],{},[70,11180,11181],{"class":72,"line":110},[70,11182,4085],{},[70,11184,11185],{"class":72,"line":116},[70,11186,4090],{},[70,11188,11189],{"class":72,"line":121},[70,11190,4095],{},[10,11192,238],{},[61,11194,11196],{"className":11195,"code":4101,"language":244,"meta":66},[242],[50,11197,4101],{"__ignoreMap":66},[10,11199,249],{},[14,11201,252],{"id":252},[254,11203,11204,11208],{},[40,11205,11206,4115],{},[50,11207,4114],{},[40,11209,11210,4121,11212,4125,11214,4129],{},[50,11211,4120],{},[50,11213,4124],{},[50,11215,4128],{},[269,11217,271],{"id":271},[10,11219,4134],{},[10,11221,11222],{},[26,11223],{"alt":4139,"src":4140},[10,11225,4143],{},[14,11227,305],{"id":305},[37,11229,11230,11236],{},[40,11231,4150,11232,4153,11234,504],{},[50,11233,2947],{},[50,11235,4035],{},[40,11237,4158],{},[14,11239,319],{"id":319},[254,11241,11242,11244],{},[40,11243,4165],{},[40,11245,2480,11246,4171,11248,1298,11250,504],{},[50,11247,4170],{},[50,11249,4035],{},[50,11251,2947],{},[10,11253,344],{},[14,11255,347],{"id":347},[10,11257,4182],{},[352,11259,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11261},[11262,11263,11264,11265,11266,11269,11270,11271],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":11267},[11268],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":3995,"description":4000},[368,4204,4205],{"id":4208,"title":4209,"body":11276,"category":368,"cover":369,"description":4214,"extension":370,"meta":11448,"navigation":88,"path":4426,"pinned":373,"publishedAt":374,"seo":11449,"slug":4428,"stem":4429,"summary":4430,"tags":11450,"updatedAt":374,"visible":88,"__hash__":4433},{"type":7,"value":11277,"toc":11435},[11278,11280,11282,11284,11286,11290,11298,11300,11308,11310,11312,11356,11358,11363,11365,11367,11379,11381,11383,11387,11393,11395,11397,11401,11405,11407,11419,11421,11427,11429,11431,11433],[10,11279,4214],{},[14,11281,16],{"id":16},[10,11283,4219],{},[14,11285,22],{"id":22},[10,11287,11288],{},[26,11289],{"alt":4226,"src":4227},[10,11291,11292,2398,11294,2398,11296,4237],{},[50,11293,1297],{},[50,11295,4234],{},[50,11297,1301],{},[14,11299,35],{"id":35},[37,11301,11302,11304,11306],{},[40,11303,4244],{},[40,11305,4247],{},[40,11307,4250],{},[14,11309,56],{"id":56},[10,11311,59],{},[61,11313,11314],{"className":63,"code":4257,"language":65,"meta":66,"style":66},[50,11315,11316,11320,11324,11328,11332,11336,11340,11344,11348,11352],{"__ignoreMap":66},[70,11317,11318],{"class":72,"line":73},[70,11319,4264],{},[70,11321,11322],{"class":72,"line":79},[70,11323,89],{"emptyLinePlaceholder":88},[70,11325,11326],{"class":72,"line":85},[70,11327,4273],{},[70,11329,11330],{"class":72,"line":92},[70,11331,4278],{},[70,11333,11334],{"class":72,"line":98},[70,11335,4283],{},[70,11337,11338],{"class":72,"line":104},[70,11339,4288],{},[70,11341,11342],{"class":72,"line":110},[70,11343,229],{},[70,11345,11346],{"class":72,"line":116},[70,11347,4297],{},[70,11349,11350],{"class":72,"line":121},[70,11351,89],{"emptyLinePlaceholder":88},[70,11353,11354],{"class":72,"line":127},[70,11355,4306],{},[10,11357,238],{},[61,11359,11361],{"className":11360,"code":4312,"language":244,"meta":66},[242],[50,11362,4312],{"__ignoreMap":66},[10,11364,249],{},[14,11366,252],{"id":252},[254,11368,11369,11373],{},[40,11370,4323,11371,4327],{},[50,11372,4326],{},[40,11374,11375,4333,11377,4336],{},[50,11376,4332],{},[50,11378,1301],{},[269,11380,271],{"id":271},[10,11382,4341],{},[10,11384,11385],{},[26,11386],{"alt":4346,"src":4347},[10,11388,11389,4352,11391,4355],{},[50,11390,4326],{},[50,11392,4332],{},[269,11394,271],{"id":286},[10,11396,4360],{},[10,11398,11399],{},[26,11400],{"alt":4365,"src":4366},[10,11402,4369,11403,4372],{},[50,11404,1297],{},[14,11406,305],{"id":305},[37,11408,11409,11413],{},[40,11410,4379,11411,4382],{},[50,11412,4332],{},[40,11414,4385,11415,4388,11417,4392],{},[50,11416,1297],{},[50,11418,4391],{},[14,11420,319],{"id":319},[254,11422,11423,11425],{},[40,11424,4399],{},[40,11426,4402],{},[10,11428,344],{},[14,11430,347],{"id":347},[10,11432,4409],{},[352,11434,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11436},[11437,11438,11439,11440,11441,11445,11446,11447],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":11442},[11443,11444],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":4209,"description":4214},[368,1297,4432],{"id":4435,"title":4436,"body":11452,"category":368,"cover":369,"description":4441,"extension":370,"meta":11589,"navigation":88,"path":4608,"pinned":373,"publishedAt":374,"seo":11590,"slug":4610,"stem":4611,"summary":4612,"tags":11591,"updatedAt":374,"visible":88,"__hash__":4615},{"type":7,"value":11453,"toc":11577},[11454,11456,11458,11460,11462,11466,11470,11472,11482,11484,11486,11518,11520,11525,11527,11529,11539,11541,11543,11547,11551,11553,11559,11561,11569,11571,11573,11575],[10,11455,4441],{},[14,11457,16],{"id":16},[10,11459,4446],{},[14,11461,22],{"id":22},[10,11463,11464],{},[26,11465],{"alt":4453,"src":4454},[10,11467,11468,4460],{},[50,11469,4459],{},[14,11471,35],{"id":35},[37,11473,11474,11476,11478],{},[40,11475,4467],{},[40,11477,4470],{},[40,11479,4473,11480,4477],{},[50,11481,4476],{},[14,11483,56],{"id":56},[10,11485,59],{},[61,11487,11488],{"className":63,"code":4484,"language":65,"meta":66,"style":66},[50,11489,11490,11494,11498,11502,11506,11510,11514],{"__ignoreMap":66},[70,11491,11492],{"class":72,"line":73},[70,11493,4491],{},[70,11495,11496],{"class":72,"line":79},[70,11497,89],{"emptyLinePlaceholder":88},[70,11499,11500],{"class":72,"line":85},[70,11501,4500],{},[70,11503,11504],{"class":72,"line":92},[70,11505,4505],{},[70,11507,11508],{"class":72,"line":98},[70,11509,4510],{},[70,11511,11512],{"class":72,"line":104},[70,11513,89],{"emptyLinePlaceholder":88},[70,11515,11516],{"class":72,"line":110},[70,11517,4519],{},[10,11519,238],{},[61,11521,11523],{"className":11522,"code":4525,"language":244,"meta":66},[242],[50,11524,4525],{"__ignoreMap":66},[10,11526,249],{},[14,11528,252],{"id":252},[254,11530,11531,11535],{},[40,11532,4536,11533,4540],{},[50,11534,4539],{},[40,11536,4543,11537,4546],{},[50,11538,4539],{},[269,11540,271],{"id":271},[10,11542,4551],{},[10,11544,11545],{},[26,11546],{"alt":4556,"src":4557},[10,11548,4560,11549,4563],{},[50,11550,4539],{},[14,11552,305],{"id":305},[37,11554,11555,11557],{},[40,11556,4570],{},[40,11558,4573],{},[14,11560,319],{"id":319},[254,11562,11563,11567],{},[40,11564,2480,11565,4582],{},[50,11566,4459],{},[40,11568,4585],{},[10,11570,344],{},[14,11572,347],{"id":347},[10,11574,4592],{},[352,11576,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11578},[11579,11580,11581,11582,11583,11586,11587,11588],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":11584},[11585],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":4436,"description":4441},[368,4459,4614],{"id":4617,"title":4618,"body":11593,"category":368,"cover":369,"description":4623,"extension":370,"meta":11718,"navigation":88,"path":4772,"pinned":373,"publishedAt":374,"seo":11719,"slug":4774,"stem":4775,"summary":4776,"tags":11720,"updatedAt":374,"visible":88,"__hash__":4779},{"type":7,"value":11594,"toc":11708},[11595,11597,11599,11601,11603,11607,11611,11613,11623,11625,11627,11659,11661,11666,11668,11670,11682,11684,11690,11692,11700,11702,11704,11706],[10,11596,4623],{},[14,11598,16],{"id":16},[10,11600,4628],{},[14,11602,22],{"id":22},[10,11604,11605],{},[26,11606],{"alt":4635,"src":4636},[10,11608,11609,4641],{},[50,11610,4476],{},[14,11612,35],{"id":35},[37,11614,11615,11619,11621],{},[40,11616,11617,4651],{},[50,11618,4650],{},[40,11620,4654],{},[40,11622,4657],{},[14,11624,56],{"id":56},[10,11626,59],{},[61,11628,11629],{"className":63,"code":4664,"language":65,"meta":66,"style":66},[50,11630,11631,11635,11639,11643,11647,11651,11655],{"__ignoreMap":66},[70,11632,11633],{"class":72,"line":73},[70,11634,4671],{},[70,11636,11637],{"class":72,"line":79},[70,11638,89],{"emptyLinePlaceholder":88},[70,11640,11641],{"class":72,"line":85},[70,11642,4680],{},[70,11644,11645],{"class":72,"line":92},[70,11646,4685],{},[70,11648,11649],{"class":72,"line":98},[70,11650,89],{"emptyLinePlaceholder":88},[70,11652,11653],{"class":72,"line":104},[70,11654,4694],{},[70,11656,11657],{"class":72,"line":110},[70,11658,4699],{},[10,11660,238],{},[61,11662,11664],{"className":11663,"code":4705,"language":244,"meta":66},[242],[50,11665,4705],{"__ignoreMap":66},[10,11667,249],{},[14,11669,252],{"id":252},[254,11671,11672,11678],{},[40,11673,4716,11674,4719,11676,4723],{},[50,11675,4476],{},[50,11677,4722],{},[40,11679,11680,4728],{},[50,11681,4650],{},[14,11683,305],{"id":305},[37,11685,11686,11688],{},[40,11687,4735],{},[40,11689,4738],{},[14,11691,319],{"id":319},[254,11693,11694,11696],{},[40,11695,4745],{},[40,11697,2480,11698,4751],{},[50,11699,4750],{},[10,11701,344],{},[14,11703,347],{"id":347},[10,11705,4758],{},[352,11707,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11709},[11710,11711,11712,11713,11714,11715,11716,11717],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":4618,"description":4623},[368,4476,4778],{"id":4781,"title":4782,"body":11722,"category":368,"cover":369,"description":4787,"extension":370,"meta":11867,"navigation":88,"path":4962,"pinned":373,"publishedAt":374,"seo":11868,"slug":4964,"stem":4965,"summary":4966,"tags":11869,"updatedAt":374,"visible":88,"__hash__":4968},{"type":7,"value":11723,"toc":11857},[11724,11726,11728,11730,11732,11736,11742,11744,11758,11760,11762,11806,11808,11813,11815,11817,11827,11829,11841,11843,11849,11851,11853,11855],[10,11725,4787],{},[14,11727,16],{"id":16},[10,11729,4792],{},[14,11731,22],{"id":22},[10,11733,11734],{},[26,11735],{"alt":4799,"src":4800},[10,11737,11738,4806,11740,4810],{},[50,11739,4805],{},[50,11741,4809],{},[14,11743,35],{"id":35},[37,11745,11746,11748,11754],{},[40,11747,4817],{},[40,11749,11750,4822,11752,4825],{},[50,11751,4805],{},[50,11753,4459],{},[40,11755,4828,11756,4831],{},[50,11757,4809],{},[14,11759,56],{"id":56},[10,11761,59],{},[61,11763,11764],{"className":63,"code":4838,"language":65,"meta":66,"style":66},[50,11765,11766,11770,11774,11778,11782,11786,11790,11794,11798,11802],{"__ignoreMap":66},[70,11767,11768],{"class":72,"line":73},[70,11769,4845],{},[70,11771,11772],{"class":72,"line":79},[70,11773,89],{"emptyLinePlaceholder":88},[70,11775,11776],{"class":72,"line":85},[70,11777,4854],{},[70,11779,11780],{"class":72,"line":92},[70,11781,4859],{},[70,11783,11784],{"class":72,"line":98},[70,11785,4864],{},[70,11787,11788],{"class":72,"line":104},[70,11789,4869],{},[70,11791,11792],{"class":72,"line":110},[70,11793,4874],{},[70,11795,11796],{"class":72,"line":116},[70,11797,4699],{},[70,11799,11800],{"class":72,"line":121},[70,11801,89],{"emptyLinePlaceholder":88},[70,11803,11804],{"class":72,"line":127},[70,11805,4887],{},[10,11807,238],{},[61,11809,11811],{"className":11810,"code":4893,"language":244,"meta":66},[242],[50,11812,4893],{"__ignoreMap":66},[10,11814,249],{},[14,11816,252],{"id":252},[254,11818,11819,11823],{},[40,11820,4904,11821,4907],{},[50,11822,4805],{},[40,11824,4910,11825,4913],{},[50,11826,4809],{},[14,11828,305],{"id":305},[37,11830,11831,11835],{},[40,11832,3607,11833,4922],{},[50,11834,4805],{},[40,11836,4925,11837,4928,11839,4931],{},[50,11838,4459],{},[50,11840,4805],{},[14,11842,319],{"id":319},[254,11844,11845,11847],{},[40,11846,4938],{},[40,11848,4941],{},[10,11850,344],{},[14,11852,347],{"id":347},[10,11854,4948],{},[352,11856,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11858},[11859,11860,11861,11862,11863,11864,11865,11866],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":4782,"description":4787},[368,4809,4805],{"id":4970,"title":4971,"body":11871,"category":368,"cover":369,"description":4976,"extension":370,"meta":12010,"navigation":88,"path":5148,"pinned":373,"publishedAt":374,"seo":12011,"slug":5150,"stem":5151,"summary":5152,"tags":12012,"updatedAt":374,"visible":88,"__hash__":5156},{"type":7,"value":11872,"toc":11998},[11873,11875,11877,11879,11881,11885,11887,11889,11905,11907,11909,11937,11939,11944,11946,11948,11960,11962,11964,11968,11970,11972,11982,11984,11990,11992,11994,11996],[10,11874,4976],{},[14,11876,16],{"id":16},[10,11878,4981],{},[14,11880,22],{"id":22},[10,11882,11883],{},[26,11884],{"alt":4988,"src":4989},[10,11886,4992],{},[14,11888,35],{"id":35},[37,11890,11891,11893,11895],{},[40,11892,4999],{},[40,11894,5002],{},[40,11896,5005,11897,2398,11899,5012,11901,2398,11903,504],{},[50,11898,5008],{},[50,11900,5011],{},[50,11902,5015],{},[50,11904,5018],{},[14,11906,56],{"id":56},[10,11908,59],{},[61,11910,11911],{"className":63,"code":5025,"language":65,"meta":66,"style":66},[50,11912,11913,11917,11921,11925,11929,11933],{"__ignoreMap":66},[70,11914,11915],{"class":72,"line":73},[70,11916,5032],{},[70,11918,11919],{"class":72,"line":79},[70,11920,89],{"emptyLinePlaceholder":88},[70,11922,11923],{"class":72,"line":85},[70,11924,5041],{},[70,11926,11927],{"class":72,"line":92},[70,11928,5046],{},[70,11930,11931],{"class":72,"line":98},[70,11932,5051],{},[70,11934,11935],{"class":72,"line":104},[70,11936,5056],{},[10,11938,238],{},[61,11940,11942],{"className":11941,"code":5062,"language":244,"meta":66},[242],[50,11943,5062],{"__ignoreMap":66},[10,11945,249],{},[14,11947,252],{"id":252},[254,11949,11950,11958],{},[40,11951,5073,11952,5076,11954,1298,11956,504],{},[50,11953,5008],{},[50,11955,5079],{},[50,11957,5082],{},[40,11959,5085],{},[269,11961,271],{"id":271},[10,11963,5090],{},[10,11965,11966],{},[26,11967],{"alt":5095,"src":5096},[10,11969,5099],{},[14,11971,305],{"id":305},[37,11973,11974,11980],{},[40,11975,5106,11976,1151,11978,5112],{},[50,11977,5109],{},[50,11979,5015],{},[40,11981,5115],{},[14,11983,319],{"id":319},[254,11985,11986,11988],{},[40,11987,5122],{},[40,11989,5125],{},[10,11991,344],{},[14,11993,347],{"id":347},[10,11995,5132],{},[352,11997,354],{},{"title":66,"searchDepth":79,"depth":79,"links":11999},[12000,12001,12002,12003,12004,12007,12008,12009],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":12005},[12006],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":4971,"description":4976},[368,5154,5155],{"id":5158,"title":5159,"body":12014,"category":368,"cover":369,"description":5164,"extension":370,"meta":12131,"navigation":88,"path":5303,"pinned":373,"publishedAt":374,"seo":12132,"slug":5305,"stem":5306,"summary":5307,"tags":12133,"updatedAt":374,"visible":88,"__hash__":5311},{"type":7,"value":12015,"toc":12121},[12016,12018,12020,12022,12024,12028,12030,12032,12040,12042,12044,12076,12078,12083,12085,12087,12095,12097,12105,12107,12113,12115,12117,12119],[10,12017,5164],{},[14,12019,16],{"id":16},[10,12021,5169],{},[14,12023,22],{"id":22},[10,12025,12026],{},[26,12027],{"alt":5176,"src":5177},[10,12029,5180],{},[14,12031,35],{"id":35},[37,12033,12034,12036,12038],{},[40,12035,5187],{},[40,12037,5190],{},[40,12039,5193],{},[14,12041,56],{"id":56},[10,12043,59],{},[61,12045,12046],{"className":63,"code":5200,"language":65,"meta":66,"style":66},[50,12047,12048,12052,12056,12060,12064,12068,12072],{"__ignoreMap":66},[70,12049,12050],{"class":72,"line":73},[70,12051,5207],{},[70,12053,12054],{"class":72,"line":79},[70,12055,89],{"emptyLinePlaceholder":88},[70,12057,12058],{"class":72,"line":85},[70,12059,5216],{},[70,12061,12062],{"class":72,"line":92},[70,12063,5221],{},[70,12065,12066],{"class":72,"line":98},[70,12067,89],{"emptyLinePlaceholder":88},[70,12069,12070],{"class":72,"line":104},[70,12071,5230],{},[70,12073,12074],{"class":72,"line":110},[70,12075,5235],{},[10,12077,238],{},[61,12079,12081],{"className":12080,"code":5241,"language":244,"meta":66},[242],[50,12082,5241],{"__ignoreMap":66},[10,12084,249],{},[14,12086,252],{"id":252},[254,12088,12089,12091],{},[40,12090,5252],{},[40,12092,5255,12093,5259],{},[50,12094,5258],{},[14,12096,305],{"id":305},[37,12098,12099,12103],{},[40,12100,5266,12101,5269],{},[50,12102,4476],{},[40,12104,5272],{},[14,12106,319],{"id":319},[254,12108,12109,12111],{},[40,12110,5279],{},[40,12112,5282],{},[10,12114,344],{},[14,12116,347],{"id":347},[10,12118,5289],{},[352,12120,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12122},[12123,12124,12125,12126,12127,12128,12129,12130],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5159,"description":5164},[368,5309,5310],{"id":5313,"title":5314,"body":12135,"category":368,"cover":369,"description":5319,"extension":370,"meta":12254,"navigation":88,"path":5463,"pinned":373,"publishedAt":374,"seo":12255,"slug":5465,"stem":5466,"summary":5467,"tags":12256,"updatedAt":374,"visible":88,"__hash__":5471},{"type":7,"value":12136,"toc":12244},[12137,12139,12141,12143,12145,12149,12151,12153,12161,12163,12165,12197,12199,12204,12206,12208,12218,12220,12226,12228,12236,12238,12240,12242],[10,12138,5319],{},[14,12140,16],{"id":16},[10,12142,5324],{},[14,12144,22],{"id":22},[10,12146,12147],{},[26,12148],{"alt":5331,"src":5332},[10,12150,5335],{},[14,12152,35],{"id":35},[37,12154,12155,12157,12159],{},[40,12156,5342],{},[40,12158,5345],{},[40,12160,5348],{},[14,12162,56],{"id":56},[10,12164,59],{},[61,12166,12167],{"className":63,"code":5355,"language":65,"meta":66,"style":66},[50,12168,12169,12173,12177,12181,12185,12189,12193],{"__ignoreMap":66},[70,12170,12171],{"class":72,"line":73},[70,12172,5362],{},[70,12174,12175],{"class":72,"line":79},[70,12176,5367],{},[70,12178,12179],{"class":72,"line":85},[70,12180,5372],{},[70,12182,12183],{"class":72,"line":92},[70,12184,89],{"emptyLinePlaceholder":88},[70,12186,12187],{"class":72,"line":98},[70,12188,5381],{},[70,12190,12191],{"class":72,"line":104},[70,12192,5386],{},[70,12194,12195],{"class":72,"line":110},[70,12196,5391],{},[10,12198,238],{},[61,12200,12202],{"className":12201,"code":5397,"language":244,"meta":66},[242],[50,12203,5397],{"__ignoreMap":66},[10,12205,249],{},[14,12207,252],{"id":252},[254,12209,12210,12214],{},[40,12211,1080,12212,5411],{},[50,12213,5410],{},[40,12215,5414,12216,5418],{},[50,12217,5417],{},[14,12219,305],{"id":305},[37,12221,12222,12224],{},[40,12223,5425],{},[40,12225,5428],{},[14,12227,319],{"id":319},[254,12229,12230,12234],{},[40,12231,5435,12232,5439],{},[50,12233,5438],{},[40,12235,5442],{},[10,12237,344],{},[14,12239,347],{"id":347},[10,12241,5449],{},[352,12243,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12245},[12246,12247,12248,12249,12250,12251,12252,12253],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5314,"description":5319},[368,5469,5470],{"id":5473,"title":5474,"body":12258,"category":368,"cover":369,"description":5479,"extension":370,"meta":12403,"navigation":88,"path":5660,"pinned":373,"publishedAt":374,"seo":12404,"slug":5662,"stem":5663,"summary":5664,"tags":12405,"updatedAt":374,"visible":88,"__hash__":5668},{"type":7,"value":12259,"toc":12391},[12260,12262,12264,12266,12268,12272,12276,12278,12290,12292,12294,12322,12324,12329,12331,12333,12347,12349,12351,12355,12363,12365,12375,12377,12383,12385,12387,12389],[10,12261,5479],{},[14,12263,16],{"id":16},[10,12265,5484],{},[14,12267,22],{"id":22},[10,12269,12270],{},[26,12271],{"alt":5491,"src":5492},[10,12273,5495,12274,5499],{},[50,12275,5498],{},[14,12277,35],{"id":35},[37,12279,12280,12282,12284],{},[40,12281,5506],{},[40,12283,5509],{},[40,12285,5512,12286,5515,12288,504],{},[50,12287,5498],{},[50,12289,5518],{},[14,12291,56],{"id":56},[10,12293,59],{},[61,12295,12296],{"className":63,"code":5525,"language":65,"meta":66,"style":66},[50,12297,12298,12302,12306,12310,12314,12318],{"__ignoreMap":66},[70,12299,12300],{"class":72,"line":73},[70,12301,5532],{},[70,12303,12304],{"class":72,"line":79},[70,12305,5537],{},[70,12307,12308],{"class":72,"line":85},[70,12309,5542],{},[70,12311,12312],{"class":72,"line":92},[70,12313,89],{"emptyLinePlaceholder":88},[70,12315,12316],{"class":72,"line":98},[70,12317,5551],{},[70,12319,12320],{"class":72,"line":104},[70,12321,5556],{},[10,12323,238],{},[61,12325,12327],{"className":12326,"code":5562,"language":244,"meta":66},[242],[50,12328,5562],{"__ignoreMap":66},[10,12330,249],{},[14,12332,252],{"id":252},[254,12334,12335,12341],{},[40,12336,5573,12337,2398,12339,5579],{},[50,12338,5576],{},[50,12340,4539],{},[40,12342,12343,5585,12345,5589],{},[50,12344,5584],{},[50,12346,5588],{},[269,12348,271],{"id":271},[10,12350,5594],{},[10,12352,12353],{},[26,12354],{"alt":5599,"src":5600},[10,12356,12357,2398,12359,1298,12361,5610],{},[50,12358,5576],{},[50,12360,4539],{},[50,12362,5609],{},[14,12364,305],{"id":305},[37,12366,12367,12371],{},[40,12368,5617,12369,5621],{},[50,12370,5620],{},[40,12372,5624,12373,5627],{},[50,12374,5609],{},[14,12376,319],{"id":319},[254,12378,12379,12381],{},[40,12380,5634],{},[40,12382,5637],{},[10,12384,344],{},[14,12386,347],{"id":347},[10,12388,5644],{},[352,12390,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12392},[12393,12394,12395,12396,12397,12400,12401,12402],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":12398},[12399],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5474,"description":5479},[368,5666,5667],{"id":5670,"title":5671,"body":12407,"category":368,"cover":369,"description":5676,"extension":370,"meta":12556,"navigation":88,"path":5857,"pinned":373,"publishedAt":374,"seo":12557,"slug":5859,"stem":5860,"summary":5861,"tags":12558,"updatedAt":374,"visible":88,"__hash__":5865},{"type":7,"value":12408,"toc":12544},[12409,12411,12413,12415,12417,12421,12423,12425,12437,12439,12441,12485,12487,12492,12494,12496,12508,12510,12512,12516,12518,12520,12528,12530,12536,12538,12540,12542],[10,12410,5676],{},[14,12412,16],{"id":16},[10,12414,5681],{},[14,12416,22],{"id":22},[10,12418,12419],{},[26,12420],{"alt":5688,"src":5689},[10,12422,5692],{},[14,12424,35],{"id":35},[37,12426,12427,12429,12433],{},[40,12428,5699],{},[40,12430,12431,5705],{},[50,12432,5704],{},[40,12434,12435,5711],{},[50,12436,5710],{},[14,12438,56],{"id":56},[10,12440,59],{},[61,12442,12443],{"className":63,"code":5718,"language":65,"meta":66,"style":66},[50,12444,12445,12449,12453,12457,12461,12465,12469,12473,12477,12481],{"__ignoreMap":66},[70,12446,12447],{"class":72,"line":73},[70,12448,5725],{},[70,12450,12451],{"class":72,"line":79},[70,12452,5730],{},[70,12454,12455],{"class":72,"line":85},[70,12456,89],{"emptyLinePlaceholder":88},[70,12458,12459],{"class":72,"line":92},[70,12460,5739],{},[70,12462,12463],{"class":72,"line":98},[70,12464,5744],{},[70,12466,12467],{"class":72,"line":104},[70,12468,89],{"emptyLinePlaceholder":88},[70,12470,12471],{"class":72,"line":110},[70,12472,5753],{},[70,12474,12475],{"class":72,"line":116},[70,12476,5758],{},[70,12478,12479],{"class":72,"line":121},[70,12480,89],{"emptyLinePlaceholder":88},[70,12482,12483],{"class":72,"line":127},[70,12484,5767],{},[10,12486,238],{},[61,12488,12490],{"className":12489,"code":5773,"language":244,"meta":66},[242],[50,12491,5773],{"__ignoreMap":66},[10,12493,249],{},[14,12495,252],{"id":252},[254,12497,12498,12502],{},[40,12499,5784,12500,5788],{},[50,12501,5787],{},[40,12503,12504,5794,12506,504],{},[50,12505,5793],{},[50,12507,5797],{},[269,12509,271],{"id":271},[10,12511,5802],{},[10,12513,12514],{},[26,12515],{"alt":5807,"src":5808},[10,12517,5811],{},[14,12519,305],{"id":305},[37,12521,12522,12526],{},[40,12523,5818,12524,5821],{},[50,12525,5518],{},[40,12527,5824],{},[14,12529,319],{"id":319},[254,12531,12532,12534],{},[40,12533,5831],{},[40,12535,5834],{},[10,12537,344],{},[14,12539,347],{"id":347},[10,12541,5841],{},[352,12543,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12545},[12546,12547,12548,12549,12550,12553,12554,12555],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":12551},[12552],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5671,"description":5676},[368,5863,5864],{"id":5867,"title":5868,"body":12560,"category":368,"cover":369,"description":5873,"extension":370,"meta":12721,"navigation":88,"path":6069,"pinned":373,"publishedAt":374,"seo":12722,"slug":6071,"stem":6072,"summary":6073,"tags":12723,"updatedAt":374,"visible":88,"__hash__":6077},{"type":7,"value":12561,"toc":12709},[12562,12564,12566,12568,12570,12574,12576,12578,12590,12592,12594,12646,12648,12653,12655,12657,12675,12677,12679,12683,12685,12687,12693,12695,12701,12703,12705,12707],[10,12563,5873],{},[14,12565,16],{"id":16},[10,12567,5878],{},[14,12569,22],{"id":22},[10,12571,12572],{},[26,12573],{"alt":5885,"src":5886},[10,12575,5889],{},[14,12577,35],{"id":35},[37,12579,12580,12582,12584],{},[40,12581,5896],{},[40,12583,5899],{},[40,12585,12586,2317,12588,5908],{},[50,12587,5904],{},[50,12589,5907],{},[14,12591,56],{"id":56},[10,12593,59],{},[61,12595,12596],{"className":63,"code":5915,"language":65,"meta":66,"style":66},[50,12597,12598,12602,12606,12610,12614,12618,12622,12626,12630,12634,12638,12642],{"__ignoreMap":66},[70,12599,12600],{"class":72,"line":73},[70,12601,5922],{},[70,12603,12604],{"class":72,"line":79},[70,12605,89],{"emptyLinePlaceholder":88},[70,12607,12608],{"class":72,"line":85},[70,12609,5931],{},[70,12611,12612],{"class":72,"line":92},[70,12613,5936],{},[70,12615,12616],{"class":72,"line":98},[70,12617,89],{"emptyLinePlaceholder":88},[70,12619,12620],{"class":72,"line":104},[70,12621,5945],{},[70,12623,12624],{"class":72,"line":110},[70,12625,5950],{},[70,12627,12628],{"class":72,"line":116},[70,12629,5955],{},[70,12631,12632],{"class":72,"line":121},[70,12633,89],{"emptyLinePlaceholder":88},[70,12635,12636],{"class":72,"line":127},[70,12637,5964],{},[70,12639,12640],{"class":72,"line":133},[70,12641,89],{"emptyLinePlaceholder":88},[70,12643,12644],{"class":72,"line":139},[70,12645,5973],{},[10,12647,238],{},[61,12649,12651],{"className":12650,"code":5979,"language":244,"meta":66},[242],[50,12652,5979],{"__ignoreMap":66},[10,12654,249],{},[14,12656,252],{"id":252},[254,12658,12659,12669],{},[40,12660,12661,5993,12663,5997,12665,6000,12667,6004],{},[50,12662,5992],{},[50,12664,5996],{},[50,12666,5787],{},[50,12668,6003],{},[40,12670,12671,6009,12673,6012],{},[50,12672,4722],{},[50,12674,2349],{},[269,12676,271],{"id":271},[10,12678,6017],{},[10,12680,12681],{},[26,12682],{"alt":6022,"src":6023},[10,12684,6026],{},[14,12686,305],{"id":305},[37,12688,12689,12691],{},[40,12690,6033],{},[40,12692,6036],{},[14,12694,319],{"id":319},[254,12696,12697,12699],{},[40,12698,6043],{},[40,12700,6046],{},[10,12702,344],{},[14,12704,347],{"id":347},[10,12706,6053],{},[352,12708,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12710},[12711,12712,12713,12714,12715,12718,12719,12720],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":12716},[12717],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5868,"description":5873},[368,6075,6076],{"id":6079,"title":6080,"body":12725,"category":368,"cover":369,"description":6085,"extension":370,"meta":12848,"navigation":88,"path":6236,"pinned":373,"publishedAt":374,"seo":12849,"slug":6238,"stem":6239,"summary":6240,"tags":12850,"updatedAt":374,"visible":88,"__hash__":6244},{"type":7,"value":12726,"toc":12838},[12727,12729,12731,12733,12735,12739,12741,12743,12757,12759,12761,12789,12791,12796,12798,12800,12810,12812,12820,12822,12830,12832,12834,12836],[10,12728,6085],{},[14,12730,16],{"id":16},[10,12732,6090],{},[14,12734,22],{"id":22},[10,12736,12737],{},[26,12738],{"alt":6097,"src":6098},[10,12740,6101],{},[14,12742,35],{"id":35},[37,12744,12745,12747,12749],{},[40,12746,6108],{},[40,12748,6111],{},[40,12750,6114,12751,2398,12753,2398,12755,6122],{},[50,12752,2401],{},[50,12754,2567],{},[50,12756,6121],{},[14,12758,56],{"id":56},[10,12760,59],{},[61,12762,12763],{"className":63,"code":6129,"language":65,"meta":66,"style":66},[50,12764,12765,12769,12773,12777,12781,12785],{"__ignoreMap":66},[70,12766,12767],{"class":72,"line":73},[70,12768,6136],{},[70,12770,12771],{"class":72,"line":79},[70,12772,6141],{},[70,12774,12775],{"class":72,"line":85},[70,12776,6146],{},[70,12778,12779],{"class":72,"line":92},[70,12780,89],{"emptyLinePlaceholder":88},[70,12782,12783],{"class":72,"line":98},[70,12784,6155],{},[70,12786,12787],{"class":72,"line":104},[70,12788,6160],{},[10,12790,238],{},[61,12792,12794],{"className":12793,"code":6166,"language":244,"meta":66},[242],[50,12795,6166],{"__ignoreMap":66},[10,12797,249],{},[14,12799,252],{"id":252},[254,12801,12802,12808],{},[40,12803,6177,12804,6181,12806,6184],{},[50,12805,6180],{},[50,12807,2387],{},[40,12809,6187],{},[14,12811,305],{"id":305},[37,12813,12814,12818],{},[40,12815,6194,12816,6198],{},[50,12817,6197],{},[40,12819,6201],{},[14,12821,319],{"id":319},[254,12823,12824,12826],{},[40,12825,6208],{},[40,12827,6211,12828,6215],{},[50,12829,6214],{},[10,12831,344],{},[14,12833,347],{"id":347},[10,12835,6222],{},[352,12837,354],{},{"title":66,"searchDepth":79,"depth":79,"links":12839},[12840,12841,12842,12843,12844,12845,12846,12847],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":6080,"description":6085},[368,6242,6243],{"id":6246,"title":6247,"body":12852,"category":368,"cover":369,"description":6252,"extension":370,"meta":13029,"navigation":88,"path":6479,"pinned":373,"publishedAt":374,"seo":13030,"slug":6481,"stem":6482,"summary":6483,"tags":13031,"updatedAt":374,"visible":88,"__hash__":6487},{"type":7,"value":12853,"toc":13017},[12854,12856,12858,12862,12864,12868,12874,12876,12888,12890,12894,12918,12922,12938,12944,12946,12951,12953,12955,12971,12973,12975,12979,12983,12985,12997,12999,13009,13011,13013,13015],[10,12855,6252],{},[14,12857,16],{"id":16},[10,12859,6257,12860,6260],{},[437,12861,6180],{},[14,12863,22],{"id":22},[10,12865,12866],{},[26,12867],{"alt":6267,"src":6268},[10,12869,6271,12870,6274,12872,6278],{},[50,12871,340],{},[50,12873,6277],{},[14,12875,35],{"id":35},[37,12877,12878,12882,12884],{},[40,12879,6285,12880,6288],{},[50,12881,1312],{},[40,12883,6291],{},[40,12885,6294,12886,6298],{},[50,12887,6297],{},[14,12889,56],{"id":56},[10,12891,6303,12892,6307],{},[50,12893,6306],{},[61,12895,12896],{"className":63,"code":6310,"language":65,"meta":66,"style":66},[50,12897,12898,12902,12906,12910,12914],{"__ignoreMap":66},[70,12899,12900],{"class":72,"line":73},[70,12901,6317],{},[70,12903,12904],{"class":72,"line":79},[70,12905,6322],{},[70,12907,12908],{"class":72,"line":85},[70,12909,89],{"emptyLinePlaceholder":88},[70,12911,12912],{"class":72,"line":92},[70,12913,6331],{},[70,12915,12916],{"class":72,"line":98},[70,12917,6336],{},[10,12919,6339,12920,6343],{},[50,12921,6342],{},[61,12923,12924],{"className":63,"code":6346,"language":65,"meta":66,"style":66},[50,12925,12926,12930,12934],{"__ignoreMap":66},[70,12927,12928],{"class":72,"line":73},[70,12929,6353],{},[70,12931,12932],{"class":72,"line":79},[70,12933,89],{"emptyLinePlaceholder":88},[70,12935,12936],{"class":72,"line":85},[70,12937,6362],{},[10,12939,6365,12940,1298,12942,504],{},[50,12941,6368],{},[50,12943,6371],{},[10,12945,238],{},[61,12947,12949],{"className":12948,"code":6377,"language":244,"meta":66},[242],[50,12950,6377],{"__ignoreMap":66},[10,12952,249],{},[14,12954,252],{"id":252},[254,12956,12957,12963],{},[40,12958,6388,12959,6391,12961,6395],{},[50,12960,6306],{},[50,12962,6394],{},[40,12964,12965,6400,12967,6403,12969,6406],{},[50,12966,6342],{},[50,12968,6306],{},[50,12970,6342],{},[269,12972,271],{"id":271},[10,12974,6411],{},[10,12976,12977],{},[26,12978],{"alt":6416,"src":6417},[10,12980,6420,12981,6423],{},[50,12982,6394],{},[14,12984,305],{"id":305},[37,12986,12987,12993],{},[40,12988,6430,12989,1298,12991,504],{},[50,12990,6306],{},[50,12992,6342],{},[40,12994,6437,12995,6441],{},[50,12996,6440],{},[14,12998,319],{"id":319},[254,13000,13001,13005],{},[40,13002,2495,13003,6451],{},[50,13004,6450],{},[40,13006,6454,13007,504],{},[50,13008,340],{},[10,13010,344],{},[14,13012,347],{"id":347},[10,13014,6463],{},[352,13016,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13018},[13019,13020,13021,13022,13023,13026,13027,13028],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":13024},[13025],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":6247,"description":6252},[368,6485,6486],{"id":6489,"title":6490,"body":13033,"category":368,"cover":369,"description":6495,"extension":370,"meta":13172,"navigation":88,"path":6661,"pinned":373,"publishedAt":374,"seo":13173,"slug":6663,"stem":6664,"summary":6665,"tags":13174,"updatedAt":374,"visible":88,"__hash__":6668},{"type":7,"value":13034,"toc":13162},[13035,13037,13039,13041,13043,13047,13049,13051,13061,13063,13065,13105,13107,13112,13114,13116,13134,13136,13144,13146,13154,13156,13158,13160],[10,13036,6495],{},[14,13038,16],{"id":16},[10,13040,6500],{},[14,13042,22],{"id":22},[10,13044,13045],{},[26,13046],{"alt":6507,"src":6508},[10,13048,6511],{},[14,13050,35],{"id":35},[37,13052,13053,13057,13059],{},[40,13054,13055,6521],{},[50,13056,6520],{},[40,13058,6524],{},[40,13060,6527],{},[14,13062,56],{"id":56},[10,13064,1715],{},[61,13066,13067],{"className":733,"code":6534,"language":735,"meta":66,"style":66},[50,13068,13069,13079,13085,13091,13101],{"__ignoreMap":66},[70,13070,13071,13073,13075,13077],{"class":72,"line":73},[70,13072,833],{"class":742},[70,13074,775],{"class":745},[70,13076,6545],{"class":778},[70,13078,6548],{"class":778},[70,13080,13081,13083],{"class":72,"line":79},[70,13082,6553],{"class":745},[70,13084,6556],{"class":778},[70,13086,13087,13089],{"class":72,"line":85},[70,13088,65],{"class":742},[70,13090,746],{"class":745},[70,13092,13093,13095,13097,13099],{"class":72,"line":92},[70,13094,65],{"class":742},[70,13096,775],{"class":745},[70,13098,779],{"class":778},[70,13100,746],{"class":745},[70,13102,13103],{"class":72,"line":98},[70,13104,6577],{"class":742},[10,13106,238],{},[61,13108,13110],{"className":13109,"code":6583,"language":244,"meta":66},[242],[50,13111,6583],{"__ignoreMap":66},[10,13113,249],{},[14,13115,252],{"id":252},[254,13117,13118,13124],{},[40,13119,13120,6597,13122,6600],{},[50,13121,6596],{},[50,13123,833],{},[40,13125,6603,13126,2317,13128,6609,13130,3868,13132,6615],{},[50,13127,65],{},[50,13129,6608],{},[50,13131,6520],{},[50,13133,6614],{},[14,13135,305],{"id":305},[37,13137,13138,13140],{},[40,13139,6622],{},[40,13141,3607,13142,6627],{},[50,13143,6520],{},[14,13145,319],{"id":319},[254,13147,13148,13152],{},[40,13149,6634,13150,504],{},[50,13151,6637],{},[40,13153,6640],{},[10,13155,344],{},[14,13157,347],{"id":347},[10,13159,6647],{},[352,13161,1799],{},{"title":66,"searchDepth":79,"depth":79,"links":13163},[13164,13165,13166,13167,13168,13169,13170,13171],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":6490,"description":6495},[368,6667,403],{"id":6670,"title":6671,"body":13176,"category":368,"cover":369,"description":6676,"extension":370,"meta":13329,"navigation":88,"path":6864,"pinned":373,"publishedAt":374,"seo":13330,"slug":6866,"stem":6867,"summary":6868,"tags":13331,"updatedAt":374,"visible":88,"__hash__":6872},{"type":7,"value":13177,"toc":13319},[13178,13180,13182,13184,13186,13190,13196,13198,13214,13216,13218,13262,13264,13269,13271,13273,13285,13287,13301,13303,13311,13313,13315,13317],[10,13179,6676],{},[14,13181,16],{"id":16},[10,13183,6681],{},[14,13185,22],{"id":22},[10,13187,13188],{},[26,13189],{"alt":6688,"src":6689},[10,13191,13192,6695,13194,6698],{},[50,13193,6694],{},[50,13195,2577],{},[14,13197,35],{"id":35},[37,13199,13200,13202,13210],{},[40,13201,6705],{},[40,13203,13204,2398,13206,2398,13208,6717],{},[50,13205,6710],{},[50,13207,6713],{},[50,13209,6716],{},[40,13211,6720,13212,6724],{},[50,13213,6723],{},[14,13215,56],{"id":56},[10,13217,59],{},[61,13219,13220],{"className":63,"code":6731,"language":65,"meta":66,"style":66},[50,13221,13222,13226,13230,13234,13238,13242,13246,13250,13254,13258],{"__ignoreMap":66},[70,13223,13224],{"class":72,"line":73},[70,13225,82],{},[70,13227,13228],{"class":72,"line":79},[70,13229,89],{"emptyLinePlaceholder":88},[70,13231,13232],{"class":72,"line":85},[70,13233,6746],{},[70,13235,13236],{"class":72,"line":92},[70,13237,6751],{},[70,13239,13240],{"class":72,"line":98},[70,13241,6756],{},[70,13243,13244],{"class":72,"line":104},[70,13245,89],{"emptyLinePlaceholder":88},[70,13247,13248],{"class":72,"line":110},[70,13249,6765],{},[70,13251,13252],{"class":72,"line":116},[70,13253,6770],{},[70,13255,13256],{"class":72,"line":121},[70,13257,6775],{},[70,13259,13260],{"class":72,"line":127},[70,13261,6780],{},[10,13263,238],{},[61,13265,13267],{"className":13266,"code":6786,"language":244,"meta":66},[242],[50,13268,6786],{"__ignoreMap":66},[10,13270,249],{},[14,13272,252],{"id":252},[254,13274,13275,13279],{},[40,13276,13277,6800],{},[50,13278,6799],{},[40,13280,2480,13281,6805,13283,6808],{},[50,13282,2577],{},[50,13284,6694],{},[14,13286,305],{"id":305},[37,13288,13289,13295],{},[40,13290,3607,13291,6817,13293,6820],{},[50,13292,6694],{},[50,13294,6710],{},[40,13296,6823,13297,1151,13299,6829],{},[50,13298,2577],{},[50,13300,6828],{},[14,13302,319],{"id":319},[254,13304,13305,13309],{},[40,13306,6836,13307,6840],{},[50,13308,6839],{},[40,13310,6843],{},[10,13312,344],{},[14,13314,347],{"id":347},[10,13316,6850],{},[352,13318,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13320},[13321,13322,13323,13324,13325,13326,13327,13328],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":6671,"description":6676},[368,6870,6871],{"id":6874,"title":6875,"body":13333,"category":368,"cover":369,"description":6880,"extension":370,"meta":13480,"navigation":88,"path":7059,"pinned":373,"publishedAt":374,"seo":13481,"slug":7061,"stem":7062,"summary":7063,"tags":13482,"updatedAt":374,"visible":88,"__hash__":7067},{"type":7,"value":13334,"toc":13470},[13335,13337,13339,13341,13343,13347,13349,13351,13369,13371,13373,13421,13423,13428,13430,13432,13440,13442,13452,13454,13462,13464,13466,13468],[10,13336,6880],{},[14,13338,16],{"id":16},[10,13340,6885],{},[14,13342,22],{"id":22},[10,13344,13345],{},[26,13346],{"alt":6892,"src":6893},[10,13348,6896],{},[14,13350,35],{"id":35},[37,13352,13353,13357,13363],{},[40,13354,13355,6906],{},[50,13356,6905],{},[40,13358,13359,6912,13361,504],{},[50,13360,6911],{},[50,13362,6915],{},[40,13364,6918,13365,6922,13367,6926],{},[50,13366,6921],{},[50,13368,6925],{},[14,13370,56],{"id":56},[10,13372,59],{},[61,13374,13375],{"className":63,"code":6933,"language":65,"meta":66,"style":66},[50,13376,13377,13381,13385,13389,13393,13397,13401,13405,13409,13413,13417],{"__ignoreMap":66},[70,13378,13379],{"class":72,"line":73},[70,13380,82],{},[70,13382,13383],{"class":72,"line":79},[70,13384,89],{"emptyLinePlaceholder":88},[70,13386,13387],{"class":72,"line":85},[70,13388,6948],{},[70,13390,13391],{"class":72,"line":92},[70,13392,6953],{},[70,13394,13395],{"class":72,"line":98},[70,13396,6958],{},[70,13398,13399],{"class":72,"line":104},[70,13400,6963],{},[70,13402,13403],{"class":72,"line":110},[70,13404,89],{"emptyLinePlaceholder":88},[70,13406,13407],{"class":72,"line":116},[70,13408,6972],{},[70,13410,13411],{"class":72,"line":121},[70,13412,6977],{},[70,13414,13415],{"class":72,"line":127},[70,13416,6982],{},[70,13418,13419],{"class":72,"line":133},[70,13420,6987],{},[10,13422,238],{},[61,13424,13426],{"className":13425,"code":6993,"language":244,"meta":66},[242],[50,13427,6993],{"__ignoreMap":66},[10,13429,249],{},[14,13431,252],{"id":252},[254,13433,13434,13438],{},[40,13435,7004,13436,7007],{},[50,13437,6921],{},[40,13439,7010],{},[14,13441,305],{"id":305},[37,13443,13444,13448],{},[40,13445,2480,13446,7019],{},[50,13447,6905],{},[40,13449,7022,13450,504],{},[50,13451,7025],{},[14,13453,319],{"id":319},[254,13455,13456,13458],{},[40,13457,7032],{},[40,13459,7035,13460,7038],{},[50,13461,478],{},[10,13463,344],{},[14,13465,347],{"id":347},[10,13467,7045],{},[352,13469,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13471},[13472,13473,13474,13475,13476,13477,13478,13479],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":6875,"description":6880},[368,7065,7066],{"id":7069,"title":7070,"body":13484,"category":368,"cover":369,"description":7075,"extension":370,"meta":13627,"navigation":88,"path":7242,"pinned":373,"publishedAt":374,"seo":13628,"slug":7244,"stem":7245,"summary":7246,"tags":13629,"updatedAt":374,"visible":88,"__hash__":7250},{"type":7,"value":13485,"toc":13617},[13486,13488,13490,13492,13494,13498,13504,13506,13516,13518,13520,13572,13574,13579,13581,13583,13593,13595,13601,13603,13609,13611,13613,13615],[10,13487,7075],{},[14,13489,16],{"id":16},[10,13491,7080],{},[14,13493,22],{"id":22},[10,13495,13496],{},[26,13497],{"alt":7087,"src":7088},[10,13499,13500,7094,13502,7098],{},[50,13501,7093],{},[50,13503,7097],{},[14,13505,35],{"id":35},[37,13507,13508,13510,13514],{},[40,13509,7105],{},[40,13511,13512,7111],{},[50,13513,7110],{},[40,13515,7114],{},[14,13517,56],{"id":56},[10,13519,59],{},[61,13521,13522],{"className":63,"code":7121,"language":65,"meta":66,"style":66},[50,13523,13524,13528,13532,13536,13540,13544,13548,13552,13556,13560,13564,13568],{"__ignoreMap":66},[70,13525,13526],{"class":72,"line":73},[70,13527,76],{},[70,13529,13530],{"class":72,"line":79},[70,13531,89],{"emptyLinePlaceholder":88},[70,13533,13534],{"class":72,"line":85},[70,13535,7136],{},[70,13537,13538],{"class":72,"line":92},[70,13539,89],{"emptyLinePlaceholder":88},[70,13541,13542],{"class":72,"line":98},[70,13543,7145],{},[70,13545,13546],{"class":72,"line":104},[70,13547,7150],{},[70,13549,13550],{"class":72,"line":110},[70,13551,6963],{},[70,13553,13554],{"class":72,"line":116},[70,13555,89],{"emptyLinePlaceholder":88},[70,13557,13558],{"class":72,"line":121},[70,13559,7163],{},[70,13561,13562],{"class":72,"line":127},[70,13563,7168],{},[70,13565,13566],{"class":72,"line":133},[70,13567,6982],{},[70,13569,13570],{"class":72,"line":139},[70,13571,7177],{},[10,13573,238],{},[61,13575,13577],{"className":13576,"code":7183,"language":244,"meta":66},[242],[50,13578,7183],{"__ignoreMap":66},[10,13580,249],{},[14,13582,252],{"id":252},[254,13584,13585,13589],{},[40,13586,13587,7196],{},[50,13588,7093],{},[40,13590,13591,7201],{},[50,13592,7097],{},[14,13594,305],{"id":305},[37,13596,13597,13599],{},[40,13598,7208],{},[40,13600,7211],{},[14,13602,319],{"id":319},[254,13604,13605,13607],{},[40,13606,7218],{},[40,13608,7221],{},[10,13610,344],{},[14,13612,347],{"id":347},[10,13614,7228],{},[352,13616,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13618},[13619,13620,13621,13622,13623,13624,13625,13626],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":7070,"description":7075},[368,7248,7249],{"id":7252,"title":7253,"body":13631,"category":368,"cover":369,"description":7258,"extension":370,"meta":13782,"navigation":88,"path":7443,"pinned":373,"publishedAt":374,"seo":13783,"slug":7445,"stem":7446,"summary":7447,"tags":13784,"updatedAt":374,"visible":88,"__hash__":7451},{"type":7,"value":13632,"toc":13772},[13633,13635,13637,13639,13641,13645,13649,13651,13665,13667,13669,13721,13723,13728,13730,13732,13744,13746,13756,13758,13764,13766,13768,13770],[10,13634,7258],{},[14,13636,16],{"id":16},[10,13638,7263],{},[14,13640,22],{"id":22},[10,13642,13643],{},[26,13644],{"alt":7270,"src":7271},[10,13646,13647,7277],{},[50,13648,7276],{},[14,13650,35],{"id":35},[37,13652,13653,13659,13663],{},[40,13654,2480,13655,7287,13657,7291],{},[50,13656,7286],{},[50,13658,7290],{},[40,13660,7294,13661,7298],{},[50,13662,7297],{},[40,13664,7301],{},[14,13666,56],{"id":56},[10,13668,59],{},[61,13670,13671],{"className":63,"code":7308,"language":65,"meta":66,"style":66},[50,13672,13673,13677,13681,13685,13689,13693,13697,13701,13705,13709,13713,13717],{"__ignoreMap":66},[70,13674,13675],{"class":72,"line":73},[70,13676,7315],{},[70,13678,13679],{"class":72,"line":79},[70,13680,89],{"emptyLinePlaceholder":88},[70,13682,13683],{"class":72,"line":85},[70,13684,7324],{},[70,13686,13687],{"class":72,"line":92},[70,13688,7329],{},[70,13690,13691],{"class":72,"line":98},[70,13692,7334],{},[70,13694,13695],{"class":72,"line":104},[70,13696,7339],{},[70,13698,13699],{"class":72,"line":110},[70,13700,7344],{},[70,13702,13703],{"class":72,"line":116},[70,13704,89],{"emptyLinePlaceholder":88},[70,13706,13707],{"class":72,"line":121},[70,13708,7353],{},[70,13710,13711],{"class":72,"line":127},[70,13712,7358],{},[70,13714,13715],{"class":72,"line":133},[70,13716,7363],{},[70,13718,13719],{"class":72,"line":139},[70,13720,7368],{},[10,13722,238],{},[61,13724,13726],{"className":13725,"code":7374,"language":244,"meta":66},[242],[50,13727,7374],{"__ignoreMap":66},[10,13729,249],{},[14,13731,252],{"id":252},[254,13733,13734,13740],{},[40,13735,13736,7388,13738,7391],{},[50,13737,7387],{},[50,13739,7297],{},[40,13741,13742,7396],{},[50,13743,7276],{},[14,13745,305],{"id":305},[37,13747,13748,13750],{},[40,13749,7403],{},[40,13751,7406,13752,7409,13754,7412],{},[50,13753,7286],{},[50,13755,7290],{},[14,13757,319],{"id":319},[254,13759,13760,13762],{},[40,13761,7419],{},[40,13763,7422],{},[10,13765,344],{},[14,13767,347],{"id":347},[10,13769,7429],{},[352,13771,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13773},[13774,13775,13776,13777,13778,13779,13780,13781],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":7253,"description":7258},[368,7449,7450],{"id":7453,"title":7454,"body":13786,"category":368,"cover":369,"description":7459,"extension":370,"meta":14000,"navigation":88,"path":7729,"pinned":373,"publishedAt":374,"seo":14001,"slug":7731,"stem":7732,"summary":7733,"tags":14002,"updatedAt":374,"visible":88,"__hash__":7737},{"type":7,"value":13787,"toc":13987},[13788,13790,13792,13794,13796,13800,13806,13808,13820,13822,13824,13884,13886,13891,13893,13895,13913,13915,13923,13927,13935,13937,13941,13945,13951,13953,13963,13965,13979,13981,13983,13985],[10,13789,7459],{},[14,13791,16],{"id":16},[10,13793,7464],{},[14,13795,22],{"id":22},[10,13797,13798],{},[26,13799],{"alt":7471,"src":7472},[10,13801,7475,13802,7479,13804,7483],{},[50,13803,7478],{},[50,13805,7482],{},[14,13807,35],{"id":35},[37,13809,13810,13814,13818],{},[40,13811,7490,13812,7493],{},[50,13813,7478],{},[40,13815,13816,7499],{},[50,13817,7498],{},[40,13819,7502],{},[14,13821,56],{"id":56},[10,13823,59],{},[61,13825,13826],{"className":63,"code":7509,"language":65,"meta":66,"style":66},[50,13827,13828,13832,13836,13840,13844,13848,13852,13856,13860,13864,13868,13872,13876,13880],{"__ignoreMap":66},[70,13829,13830],{"class":72,"line":73},[70,13831,7516],{},[70,13833,13834],{"class":72,"line":79},[70,13835,7521],{},[70,13837,13838],{"class":72,"line":85},[70,13839,7526],{},[70,13841,13842],{"class":72,"line":92},[70,13843,7531],{},[70,13845,13846],{"class":72,"line":98},[70,13847,7536],{},[70,13849,13850],{"class":72,"line":104},[70,13851,89],{"emptyLinePlaceholder":88},[70,13853,13854],{"class":72,"line":110},[70,13855,193],{},[70,13857,13858],{"class":72,"line":116},[70,13859,7549],{},[70,13861,13862],{"class":72,"line":121},[70,13863,217],{},[70,13865,13866],{"class":72,"line":127},[70,13867,7558],{},[70,13869,13870],{"class":72,"line":133},[70,13871,229],{},[70,13873,13874],{"class":72,"line":139},[70,13875,7567],{},[70,13877,13878],{"class":72,"line":145},[70,13879,7572],{},[70,13881,13882],{"class":72,"line":151},[70,13883,7577],{},[10,13885,238],{},[61,13887,13889],{"className":13888,"code":7583,"language":244,"meta":66},[242],[50,13890,7583],{"__ignoreMap":66},[10,13892,249],{},[14,13894,252],{"id":252},[254,13896,13897,13905],{},[40,13898,13899,7596,13901,7599,13903,7603],{},[50,13900,3176],{},[50,13902,7498],{},[50,13904,7602],{},[40,13906,7606,13907,7609,13909,7612,13911,504],{},[50,13908,7478],{},[50,13910,1301],{},[50,13912,7482],{},[269,13914,271],{"id":271},[10,13916,13917,2398,13919,1298,13921,7625],{},[50,13918,7478],{},[50,13920,1301],{},[50,13922,7482],{},[10,13924,13925],{},[26,13926],{"alt":7630,"src":7631},[10,13928,13929,7636,13931,7639,13933,7642],{},[50,13930,7478],{},[50,13932,1301],{},[50,13934,7482],{},[269,13936,271],{"id":286},[10,13938,13939,7650],{},[50,13940,7649],{},[10,13942,13943],{},[26,13944],{"alt":7655,"src":7656},[10,13946,7659,13947,7662,13949,7665],{},[50,13948,7649],{},[50,13950,1301],{},[14,13952,305],{"id":305},[37,13954,13955,13959],{},[40,13956,7672,13957,7676],{},[50,13958,7675],{},[40,13960,7679,13961,7682],{},[50,13962,7649],{},[14,13964,319],{"id":319},[254,13966,13967,13975],{},[40,13968,7689,13969,7693,13971,1298,13973,504],{},[50,13970,7692],{},[50,13972,7696],{},[50,13974,7699],{},[40,13976,7702,13977,7705],{},[50,13978,6915],{},[10,13980,344],{},[14,13982,347],{"id":347},[10,13984,7712],{},[352,13986,354],{},{"title":66,"searchDepth":79,"depth":79,"links":13988},[13989,13990,13991,13992,13993,13997,13998,13999],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":13994},[13995,13996],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":7454,"description":7459},[368,7735,7736],{"id":7739,"title":7740,"body":14004,"category":368,"cover":369,"description":7745,"extension":370,"meta":14155,"navigation":88,"path":7922,"pinned":373,"publishedAt":374,"seo":14156,"slug":7924,"stem":7925,"summary":7926,"tags":14157,"updatedAt":374,"visible":88,"__hash__":7929},{"type":7,"value":14005,"toc":14145},[14006,14008,14010,14012,14014,14018,14022,14024,14036,14038,14040,14088,14090,14095,14097,14099,14109,14111,14121,14123,14137,14139,14141,14143],[10,14007,7745],{},[14,14009,16],{"id":16},[10,14011,7750],{},[14,14013,22],{"id":22},[10,14015,14016],{},[26,14017],{"alt":7757,"src":7758},[10,14019,7761,14020,7764],{},[50,14021,6925],{},[14,14023,35],{"id":35},[37,14025,14026,14030,14034],{},[40,14027,14028,7773],{},[50,14029,6925],{},[40,14031,14032,7779],{},[50,14033,7778],{},[40,14035,7782],{},[14,14037,56],{"id":56},[10,14039,59],{},[61,14041,14042],{"className":63,"code":7789,"language":65,"meta":66,"style":66},[50,14043,14044,14048,14052,14056,14060,14064,14068,14072,14076,14080,14084],{"__ignoreMap":66},[70,14045,14046],{"class":72,"line":73},[70,14047,82],{},[70,14049,14050],{"class":72,"line":79},[70,14051,89],{"emptyLinePlaceholder":88},[70,14053,14054],{"class":72,"line":85},[70,14055,6948],{},[70,14057,14058],{"class":72,"line":92},[70,14059,89],{"emptyLinePlaceholder":88},[70,14061,14062],{"class":72,"line":98},[70,14063,7812],{},[70,14065,14066],{"class":72,"line":104},[70,14067,7817],{},[70,14069,14070],{"class":72,"line":110},[70,14071,89],{"emptyLinePlaceholder":88},[70,14073,14074],{"class":72,"line":116},[70,14075,7826],{},[70,14077,14078],{"class":72,"line":121},[70,14079,7831],{},[70,14081,14082],{"class":72,"line":127},[70,14083,89],{"emptyLinePlaceholder":88},[70,14085,14086],{"class":72,"line":133},[70,14087,7840],{},[10,14089,238],{},[61,14091,14093],{"className":14092,"code":7846,"language":244,"meta":66},[242],[50,14094,7846],{"__ignoreMap":66},[10,14096,249],{},[14,14098,252],{"id":252},[254,14100,14101,14107],{},[40,14102,7761,14103,7859,14105,504],{},[50,14104,6925],{},[50,14106,7862],{},[40,14108,7865],{},[14,14110,305],{"id":305},[37,14112,14113,14117],{},[40,14114,4925,14115,7874],{},[50,14116,6925],{},[40,14118,7877,14119,7880],{},[50,14120,6925],{},[14,14122,319],{"id":319},[254,14124,14125,14131],{},[40,14126,7887,14127,7891,14129,504],{},[50,14128,7890],{},[50,14130,6925],{},[40,14132,4925,14133,7898,14135,504],{},[50,14134,6925],{},[50,14136,7901],{},[10,14138,344],{},[14,14140,347],{"id":347},[10,14142,7908],{},[352,14144,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14146},[14147,14148,14149,14150,14151,14152,14153,14154],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":7740,"description":7745},[368,6925,7928],{"id":7931,"title":7932,"body":14159,"category":368,"cover":369,"description":7937,"extension":370,"meta":14330,"navigation":88,"path":8150,"pinned":373,"publishedAt":374,"seo":14331,"slug":8152,"stem":8153,"summary":8154,"tags":14332,"updatedAt":374,"visible":88,"__hash__":8158},{"type":7,"value":14160,"toc":14318},[14161,14163,14165,14167,14169,14173,14175,14177,14189,14191,14193,14249,14251,14256,14258,14260,14276,14278,14280,14284,14290,14292,14300,14302,14310,14312,14314,14316],[10,14162,7937],{},[14,14164,16],{"id":16},[10,14166,7942],{},[14,14168,22],{"id":22},[10,14170,14171],{},[26,14172],{"alt":7949,"src":7950},[10,14174,7953],{},[14,14176,35],{"id":35},[37,14178,14179,14183,14187],{},[40,14180,14181,7963],{},[50,14182,7962],{},[40,14184,14185,7969],{},[50,14186,7968],{},[40,14188,7972],{},[14,14190,56],{"id":56},[10,14192,59],{},[61,14194,14195],{"className":63,"code":7979,"language":65,"meta":66,"style":66},[50,14196,14197,14201,14205,14209,14213,14217,14221,14225,14229,14233,14237,14241,14245],{"__ignoreMap":66},[70,14198,14199],{"class":72,"line":73},[70,14200,7986],{},[70,14202,14203],{"class":72,"line":79},[70,14204,7991],{},[70,14206,14207],{"class":72,"line":85},[70,14208,7996],{},[70,14210,14211],{"class":72,"line":92},[70,14212,8001],{},[70,14214,14215],{"class":72,"line":98},[70,14216,89],{"emptyLinePlaceholder":88},[70,14218,14219],{"class":72,"line":104},[70,14220,8010],{},[70,14222,14223],{"class":72,"line":110},[70,14224,8015],{},[70,14226,14227],{"class":72,"line":116},[70,14228,8020],{},[70,14230,14231],{"class":72,"line":121},[70,14232,8025],{},[70,14234,14235],{"class":72,"line":127},[70,14236,89],{"emptyLinePlaceholder":88},[70,14238,14239],{"class":72,"line":133},[70,14240,8034],{},[70,14242,14243],{"class":72,"line":139},[70,14244,8039],{},[70,14246,14247],{"class":72,"line":145},[70,14248,8044],{},[10,14250,238],{},[61,14252,14254],{"className":14253,"code":8050,"language":244,"meta":66},[242],[50,14255,8050],{"__ignoreMap":66},[10,14257,249],{},[14,14259,252],{"id":252},[254,14261,14262,14268],{},[40,14263,8061,14264,8065,14266,8068],{},[50,14265,8064],{},[50,14267,7968],{},[40,14269,14270,8074,14272,8078,14274,8081],{},[50,14271,8073],{},[50,14273,8077],{},[50,14275,7962],{},[269,14277,271],{"id":271},[10,14279,8086],{},[10,14281,14282],{},[26,14283],{"alt":8091,"src":8092},[10,14285,8095,14286,1298,14288,8101],{},[50,14287,4722],{},[50,14289,8100],{},[14,14291,305],{"id":305},[37,14293,14294,14298],{},[40,14295,8108,14296,8111],{},[50,14297,7962],{},[40,14299,8114],{},[14,14301,319],{"id":319},[254,14303,14304,14308],{},[40,14305,5435,14306,8124],{},[50,14307,8123],{},[40,14309,8127],{},[10,14311,344],{},[14,14313,347],{"id":347},[10,14315,8134],{},[352,14317,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14319},[14320,14321,14322,14323,14324,14327,14328,14329],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":14325},[14326],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":7932,"description":7937},[368,8156,8157],{"id":8160,"title":8161,"body":14334,"category":368,"cover":369,"description":8166,"extension":370,"meta":14481,"navigation":88,"path":8344,"pinned":373,"publishedAt":374,"seo":14482,"slug":8346,"stem":8347,"summary":8348,"tags":14483,"updatedAt":374,"visible":88,"__hash__":8352},{"type":7,"value":14335,"toc":14471},[14336,14338,14340,14342,14344,14348,14350,14352,14360,14362,14364,14420,14422,14427,14429,14431,14443,14445,14451,14453,14463,14465,14467,14469],[10,14337,8166],{},[14,14339,16],{"id":16},[10,14341,8171],{},[14,14343,22],{"id":22},[10,14345,14346],{},[26,14347],{"alt":8178,"src":8179},[10,14349,8182],{},[14,14351,35],{"id":35},[37,14353,14354,14356,14358],{},[40,14355,8189],{},[40,14357,8192],{},[40,14359,8195],{},[14,14361,56],{"id":56},[10,14363,59],{},[61,14365,14366],{"className":63,"code":8202,"language":65,"meta":66,"style":66},[50,14367,14368,14372,14376,14380,14384,14388,14392,14396,14400,14404,14408,14412,14416],{"__ignoreMap":66},[70,14369,14370],{"class":72,"line":73},[70,14371,8209],{},[70,14373,14374],{"class":72,"line":79},[70,14375,8214],{},[70,14377,14378],{"class":72,"line":85},[70,14379,8219],{},[70,14381,14382],{"class":72,"line":92},[70,14383,89],{"emptyLinePlaceholder":88},[70,14385,14386],{"class":72,"line":98},[70,14387,8228],{},[70,14389,14390],{"class":72,"line":104},[70,14391,8233],{},[70,14393,14394],{"class":72,"line":110},[70,14395,8238],{},[70,14397,14398],{"class":72,"line":116},[70,14399,89],{"emptyLinePlaceholder":88},[70,14401,14402],{"class":72,"line":121},[70,14403,8247],{},[70,14405,14406],{"class":72,"line":127},[70,14407,8252],{},[70,14409,14410],{"class":72,"line":133},[70,14411,89],{"emptyLinePlaceholder":88},[70,14413,14414],{"class":72,"line":139},[70,14415,8261],{},[70,14417,14418],{"class":72,"line":145},[70,14419,8266],{},[10,14421,238],{},[61,14423,14425],{"className":14424,"code":8272,"language":244,"meta":66},[242],[50,14426,8272],{"__ignoreMap":66},[10,14428,249],{},[14,14430,252],{"id":252},[254,14432,14433,14439],{},[40,14434,14435,8286,14437,8289],{},[50,14436,8285],{},[50,14438,266],{},[40,14440,8292,14441,8296],{},[50,14442,8295],{},[14,14444,305],{"id":305},[37,14446,14447,14449],{},[40,14448,8303],{},[40,14450,8306],{},[14,14452,319],{"id":319},[254,14454,14455,14461],{},[40,14456,8313,14457,8317,14459,504],{},[50,14458,8316],{},[50,14460,8320],{},[40,14462,8323],{},[10,14464,344],{},[14,14466,347],{"id":347},[10,14468,8330],{},[352,14470,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14472},[14473,14474,14475,14476,14477,14478,14479,14480],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":8161,"description":8166},[368,8350,8351],{"id":8354,"title":8355,"body":14485,"category":368,"cover":369,"description":8360,"extension":370,"meta":14648,"navigation":88,"path":8564,"pinned":373,"publishedAt":374,"seo":14649,"slug":8566,"stem":8567,"summary":8568,"tags":14650,"updatedAt":374,"visible":88,"__hash__":8572},{"type":7,"value":14486,"toc":14636},[14487,14489,14491,14493,14495,14499,14503,14505,14521,14523,14525,14569,14571,14576,14578,14580,14594,14596,14600,14604,14608,14610,14616,14618,14628,14630,14632,14634],[10,14488,8360],{},[14,14490,16],{"id":16},[10,14492,8365],{},[14,14494,22],{"id":22},[10,14496,14497],{},[26,14498],{"alt":8372,"src":8373},[10,14500,8376,14501,8380],{},[50,14502,8379],{},[14,14504,35],{"id":35},[37,14506,14507,14513,14519],{},[40,14508,14509,8390,14511,8394],{},[50,14510,8389],{},[50,14512,8393],{},[40,14514,8397,14515,8401,14517,8404],{},[50,14516,8400],{},[50,14518,4476],{},[40,14520,8407],{},[14,14522,56],{"id":56},[10,14524,59],{},[61,14526,14527],{"className":63,"code":8414,"language":65,"meta":66,"style":66},[50,14528,14529,14533,14537,14541,14545,14549,14553,14557,14561,14565],{"__ignoreMap":66},[70,14530,14531],{"class":72,"line":73},[70,14532,8421],{},[70,14534,14535],{"class":72,"line":79},[70,14536,8426],{},[70,14538,14539],{"class":72,"line":85},[70,14540,8431],{},[70,14542,14543],{"class":72,"line":92},[70,14544,8436],{},[70,14546,14547],{"class":72,"line":98},[70,14548,8441],{},[70,14550,14551],{"class":72,"line":104},[70,14552,89],{"emptyLinePlaceholder":88},[70,14554,14555],{"class":72,"line":110},[70,14556,8450],{},[70,14558,14559],{"class":72,"line":116},[70,14560,8455],{},[70,14562,14563],{"class":72,"line":121},[70,14564,8455],{},[70,14566,14567],{"class":72,"line":127},[70,14568,8455],{},[10,14570,238],{},[61,14572,14574],{"className":14573,"code":8469,"language":244,"meta":66},[242],[50,14575,8469],{"__ignoreMap":66},[10,14577,249],{},[14,14579,252],{"id":252},[254,14581,14582,14586],{},[40,14583,8061,14584,8483],{},[50,14585,8482],{},[40,14587,8486,14588,8489,14590,8492,14592,8496],{},[50,14589,8393],{},[50,14591,8379],{},[50,14593,8495],{},[269,14595,271],{"id":271},[10,14597,8501,14598,8504],{},[50,14599,8393],{},[10,14601,14602],{},[26,14603],{"alt":8509,"src":8510},[10,14605,8513,14606,8516],{},[50,14607,8379],{},[14,14609,305],{"id":305},[37,14611,14612,14614],{},[40,14613,8523],{},[40,14615,8526],{},[14,14617,319],{"id":319},[254,14619,14620,14622],{},[40,14621,8533],{},[40,14623,4150,14624,8538,14626,8541],{},[50,14625,4476],{},[50,14627,8393],{},[10,14629,344],{},[14,14631,347],{"id":347},[10,14633,8548],{},[352,14635,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14637},[14638,14639,14640,14641,14642,14645,14646,14647],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":14643},[14644],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":8355,"description":8360},[368,8570,8571],{"id":8574,"title":8575,"body":14652,"category":368,"cover":369,"description":8580,"extension":370,"meta":14835,"navigation":88,"path":8803,"pinned":373,"publishedAt":374,"seo":14836,"slug":8805,"stem":8806,"summary":8807,"tags":14837,"updatedAt":374,"visible":88,"__hash__":8810},{"type":7,"value":14653,"toc":14823},[14654,14656,14658,14660,14662,14666,14668,14670,14684,14686,14688,14756,14758,14763,14765,14767,14781,14783,14785,14789,14795,14797,14805,14807,14815,14817,14819,14821],[10,14655,8580],{},[14,14657,16],{"id":16},[10,14659,8585],{},[14,14661,22],{"id":22},[10,14663,14664],{},[26,14665],{"alt":8592,"src":8593},[10,14667,8596],{},[14,14669,35],{"id":35},[37,14671,14672,14678,14680],{},[40,14673,14674,8606,14676,504],{},[50,14675,8605],{},[50,14677,8609],{},[40,14679,8612],{},[40,14681,14682,8618],{},[50,14683,8617],{},[14,14685,56],{"id":56},[10,14687,59],{},[61,14689,14690],{"className":63,"code":8625,"language":65,"meta":66,"style":66},[50,14691,14692,14696,14700,14704,14708,14712,14716,14720,14724,14728,14732,14736,14740,14744,14748,14752],{"__ignoreMap":66},[70,14693,14694],{"class":72,"line":73},[70,14695,8632],{},[70,14697,14698],{"class":72,"line":79},[70,14699,89],{"emptyLinePlaceholder":88},[70,14701,14702],{"class":72,"line":85},[70,14703,8641],{},[70,14705,14706],{"class":72,"line":92},[70,14707,8646],{},[70,14709,14710],{"class":72,"line":98},[70,14711,8651],{},[70,14713,14714],{"class":72,"line":104},[70,14715,8656],{},[70,14717,14718],{"class":72,"line":110},[70,14719,8661],{},[70,14721,14722],{"class":72,"line":116},[70,14723,8666],{},[70,14725,14726],{"class":72,"line":121},[70,14727,8671],{},[70,14729,14730],{"class":72,"line":127},[70,14731,8676],{},[70,14733,14734],{"class":72,"line":133},[70,14735,89],{"emptyLinePlaceholder":88},[70,14737,14738],{"class":72,"line":139},[70,14739,8685],{},[70,14741,14742],{"class":72,"line":145},[70,14743,6317],{},[70,14745,14746],{"class":72,"line":151},[70,14747,6322],{},[70,14749,14750],{"class":72,"line":156},[70,14751,89],{"emptyLinePlaceholder":88},[70,14753,14754],{"class":72,"line":162},[70,14755,8702],{},[10,14757,238],{},[61,14759,14761],{"className":14760,"code":8708,"language":244,"meta":66},[242],[50,14762,8708],{"__ignoreMap":66},[10,14764,249],{},[14,14766,252],{"id":252},[254,14768,14769,14779],{},[40,14770,8719,14771,8723,14773,8727,14775,8731,14777,504],{},[50,14772,8722],{},[50,14774,8726],{},[50,14776,8730],{},[50,14778,8722],{},[40,14780,8736],{},[269,14782,271],{"id":271},[10,14784,8741],{},[10,14786,14787],{},[26,14788],{"alt":8746,"src":8747},[10,14790,14791,8752,14793,504],{},[50,14792,8605],{},[50,14794,8609],{},[14,14796,305],{"id":305},[37,14798,14799,14803],{},[40,14800,8761,14801,504],{},[50,14802,5518],{},[40,14804,8766],{},[14,14806,319],{"id":319},[254,14808,14809,14811],{},[40,14810,8773],{},[40,14812,8776,14813,8780],{},[50,14814,8779],{},[10,14816,344],{},[14,14818,347],{"id":347},[10,14820,8787],{},[352,14822,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14824},[14825,14826,14827,14828,14829,14832,14833,14834],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":14830},[14831],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":8575,"description":8580},[368,8809,5469],{"id":8812,"title":8813,"body":14839,"category":368,"cover":369,"description":8818,"extension":370,"meta":14998,"navigation":88,"path":9006,"pinned":373,"publishedAt":374,"seo":14999,"slug":9008,"stem":9009,"summary":9010,"tags":15000,"updatedAt":374,"visible":88,"__hash__":9014},{"type":7,"value":14840,"toc":14986},[14841,14843,14845,14847,14849,14853,14855,14857,14865,14867,14869,14933,14935,14940,14942,14944,14952,14954,14956,14960,14962,14964,14970,14972,14978,14980,14982,14984],[10,14842,8818],{},[14,14844,16],{"id":16},[10,14846,8823],{},[14,14848,22],{"id":22},[10,14850,14851],{},[26,14852],{"alt":8830,"src":8831},[10,14854,8834],{},[14,14856,35],{"id":35},[37,14858,14859,14861,14863],{},[40,14860,8841],{},[40,14862,8844],{},[40,14864,8847],{},[14,14866,56],{"id":56},[10,14868,59],{},[61,14870,14871],{"className":63,"code":8854,"language":65,"meta":66,"style":66},[50,14872,14873,14877,14881,14885,14889,14893,14897,14901,14905,14909,14913,14917,14921,14925,14929],{"__ignoreMap":66},[70,14874,14875],{"class":72,"line":73},[70,14876,8861],{},[70,14878,14879],{"class":72,"line":79},[70,14880,8866],{},[70,14882,14883],{"class":72,"line":85},[70,14884,89],{"emptyLinePlaceholder":88},[70,14886,14887],{"class":72,"line":92},[70,14888,8875],{},[70,14890,14891],{"class":72,"line":98},[70,14892,89],{"emptyLinePlaceholder":88},[70,14894,14895],{"class":72,"line":104},[70,14896,8884],{},[70,14898,14899],{"class":72,"line":110},[70,14900,8889],{},[70,14902,14903],{"class":72,"line":116},[70,14904,8894],{},[70,14906,14907],{"class":72,"line":121},[70,14908,89],{"emptyLinePlaceholder":88},[70,14910,14911],{"class":72,"line":127},[70,14912,8903],{},[70,14914,14915],{"class":72,"line":133},[70,14916,8908],{},[70,14918,14919],{"class":72,"line":139},[70,14920,8913],{},[70,14922,14923],{"class":72,"line":145},[70,14924,89],{"emptyLinePlaceholder":88},[70,14926,14927],{"class":72,"line":151},[70,14928,6331],{},[70,14930,14931],{"class":72,"line":156},[70,14932,8926],{},[10,14934,238],{},[61,14936,14938],{"className":14937,"code":8932,"language":244,"meta":66},[242],[50,14939,8932],{"__ignoreMap":66},[10,14941,249],{},[14,14943,252],{"id":252},[254,14945,14946,14950],{},[40,14947,14948,8946],{},[50,14949,8945],{},[40,14951,8949],{},[269,14953,271],{"id":271},[10,14955,8954],{},[10,14957,14958],{},[26,14959],{"alt":8959,"src":8960},[10,14961,8963],{},[14,14963,305],{"id":305},[37,14965,14966,14968],{},[40,14967,8970],{},[40,14969,8973],{},[14,14971,319],{"id":319},[254,14973,14974,14976],{},[40,14975,8980],{},[40,14977,8983],{},[10,14979,344],{},[14,14981,347],{"id":347},[10,14983,8990],{},[352,14985,354],{},{"title":66,"searchDepth":79,"depth":79,"links":14987},[14988,14989,14990,14991,14992,14995,14996,14997],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":14993},[14994],{"id":271,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":8813,"description":8818},[368,9012,9013],{"id":4,"title":5,"body":15002,"category":368,"cover":369,"description":12,"extension":370,"meta":15240,"navigation":88,"path":372,"pinned":373,"publishedAt":374,"seo":15241,"slug":376,"stem":377,"summary":378,"tags":15242,"updatedAt":374,"visible":88,"__hash__":382},{"type":7,"value":15003,"toc":15227},[15004,15006,15008,15010,15012,15016,15018,15020,15030,15032,15034,15150,15152,15157,15159,15161,15171,15173,15175,15179,15181,15183,15185,15189,15193,15195,15203,15205,15219,15221,15223,15225],[10,15005,12],{},[14,15007,16],{"id":16},[10,15009,19],{},[14,15011,22],{"id":22},[10,15013,15014],{},[26,15015],{"alt":28,"src":29},[10,15017,32],{},[14,15019,35],{"id":35},[37,15021,15022,15024,15026],{},[40,15023,42],{},[40,15025,45],{},[40,15027,48,15028,53],{},[50,15029,52],{},[14,15031,56],{"id":56},[10,15033,59],{},[61,15035,15036],{"className":63,"code":64,"language":65,"meta":66,"style":66},[50,15037,15038,15042,15046,15050,15054,15058,15062,15066,15070,15074,15078,15082,15086,15090,15094,15098,15102,15106,15110,15114,15118,15122,15126,15130,15134,15138,15142,15146],{"__ignoreMap":66},[70,15039,15040],{"class":72,"line":73},[70,15041,76],{},[70,15043,15044],{"class":72,"line":79},[70,15045,82],{},[70,15047,15048],{"class":72,"line":85},[70,15049,89],{"emptyLinePlaceholder":88},[70,15051,15052],{"class":72,"line":92},[70,15053,95],{},[70,15055,15056],{"class":72,"line":98},[70,15057,101],{},[70,15059,15060],{"class":72,"line":104},[70,15061,107],{},[70,15063,15064],{"class":72,"line":110},[70,15065,113],{},[70,15067,15068],{"class":72,"line":116},[70,15069,89],{"emptyLinePlaceholder":88},[70,15071,15072],{"class":72,"line":121},[70,15073,124],{},[70,15075,15076],{"class":72,"line":127},[70,15077,130],{},[70,15079,15080],{"class":72,"line":133},[70,15081,136],{},[70,15083,15084],{"class":72,"line":139},[70,15085,142],{},[70,15087,15088],{"class":72,"line":145},[70,15089,148],{},[70,15091,15092],{"class":72,"line":151},[70,15093,89],{"emptyLinePlaceholder":88},[70,15095,15096],{"class":72,"line":156},[70,15097,159],{},[70,15099,15100],{"class":72,"line":162},[70,15101,165],{},[70,15103,15104],{"class":72,"line":168},[70,15105,171],{},[70,15107,15108],{"class":72,"line":174},[70,15109,89],{"emptyLinePlaceholder":88},[70,15111,15112],{"class":72,"line":179},[70,15113,182],{},[70,15115,15116],{"class":72,"line":185},[70,15117,89],{"emptyLinePlaceholder":88},[70,15119,15120],{"class":72,"line":190},[70,15121,193],{},[70,15123,15124],{"class":72,"line":196},[70,15125,199],{},[70,15127,15128],{"class":72,"line":202},[70,15129,205],{},[70,15131,15132],{"class":72,"line":208},[70,15133,211],{},[70,15135,15136],{"class":72,"line":214},[70,15137,217],{},[70,15139,15140],{"class":72,"line":220},[70,15141,223],{},[70,15143,15144],{"class":72,"line":226},[70,15145,229],{},[70,15147,15148],{"class":72,"line":232},[70,15149,235],{},[10,15151,238],{},[61,15153,15155],{"className":15154,"code":243,"language":244,"meta":66},[242],[50,15156,243],{"__ignoreMap":66},[10,15158,249],{},[14,15160,252],{"id":252},[254,15162,15163,15167],{},[40,15164,258,15165,261],{},[50,15166,52],{},[40,15168,15169,267],{},[50,15170,266],{},[269,15172,271],{"id":271},[10,15174,274],{},[10,15176,15177],{},[26,15178],{"alt":279,"src":280},[10,15180,283],{},[269,15182,271],{"id":286},[10,15184,289],{},[10,15186,15187],{},[26,15188],{"alt":294,"src":295},[10,15190,298,15191,302],{},[50,15192,301],{},[14,15194,305],{"id":305},[37,15196,15197,15199],{},[40,15198,310],{},[40,15200,313,15201,316],{},[50,15202,301],{},[14,15204,319],{"id":319},[254,15206,15207,15211,15213],{},[40,15208,324,15209,327],{},[50,15210,301],{},[40,15212,330],{},[40,15214,333,15215,337,15217,341],{},[50,15216,336],{},[50,15218,340],{},[10,15220,344],{},[14,15222,347],{"id":347},[10,15224,350],{},[352,15226,354],{},{"title":66,"searchDepth":79,"depth":79,"links":15228},[15229,15230,15231,15232,15233,15237,15238,15239],{"id":16,"depth":79,"text":16},{"id":22,"depth":79,"text":22},{"id":35,"depth":79,"text":35},{"id":56,"depth":79,"text":56},{"id":252,"depth":79,"text":252,"children":15234},[15235,15236],{"id":271,"depth":85,"text":271},{"id":286,"depth":85,"text":271},{"id":305,"depth":79,"text":305},{"id":319,"depth":79,"text":319},{"id":347,"depth":79,"text":347},{},{"title":5,"description":12},[368,380,381],{"id":1198,"title":1199,"body":15244,"category":368,"cover":1207,"description":66,"extension":370,"meta":15480,"navigation":88,"path":1523,"pinned":373,"publishedAt":1524,"seo":15481,"slug":1526,"stem":1527,"summary":1528,"tags":15482,"updatedAt":1524,"visible":88,"__hash__":1532},{"type":7,"value":15245,"toc":15465},[15246,15250,15252,15254,15256,15258,15278,15280,15285,15287,15289,15317,15323,15325,15329,15331,15351,15353,15363,15365,15367,15369,15371,15373,15375,15377,15379,15381,15401,15403,15405,15409,15411,15413,15415,15417,15421,15423,15441,15443,15445,15447,15449,15451,15453,15455,15457,15459,15461,15463],[10,15247,15248],{},[26,15249],{"alt":1206,"src":1207},[10,15251,1210],{},[10,15253,1213],{},[14,15255,1217],{"id":1216},[10,15257,1220],{},[61,15259,15260],{"className":63,"code":1223,"language":65,"meta":66,"style":66},[50,15261,15262,15266,15270,15274],{"__ignoreMap":66},[70,15263,15264],{"class":72,"line":73},[70,15265,1230],{},[70,15267,15268],{"class":72,"line":79},[70,15269,1235],{},[70,15271,15272],{"class":72,"line":85},[70,15273,89],{"emptyLinePlaceholder":88},[70,15275,15276],{"class":72,"line":92},[70,15277,1244],{},[10,15279,1247],{},[61,15281,15283],{"className":15282,"code":1251,"language":244,"meta":66},[242],[50,15284,1251],{"__ignoreMap":66},[10,15286,1256],{},[10,15288,1259],{},[61,15290,15291],{"className":63,"code":1262,"language":65,"meta":66,"style":66},[50,15292,15293,15297,15301,15305,15309,15313],{"__ignoreMap":66},[70,15294,15295],{"class":72,"line":73},[70,15296,1269],{},[70,15298,15299],{"class":72,"line":79},[70,15300,89],{"emptyLinePlaceholder":88},[70,15302,15303],{"class":72,"line":85},[70,15304,1278],{},[70,15306,15307],{"class":72,"line":92},[70,15308,1283],{},[70,15310,15311],{"class":72,"line":98},[70,15312,229],{},[70,15314,15315],{"class":72,"line":104},[70,15316,1292],{},[10,15318,15319,1298,15321,1302],{},[50,15320,1297],{},[50,15322,1301],{},[14,15324,1306],{"id":1305},[10,15326,1309,15327,1313],{},[50,15328,1312],{},[10,15330,1316],{},[61,15332,15333],{"className":63,"code":1319,"language":65,"meta":66,"style":66},[50,15334,15335,15339,15343,15347],{"__ignoreMap":66},[70,15336,15337],{"class":72,"line":73},[70,15338,1326],{},[70,15340,15341],{"class":72,"line":79},[70,15342,1331],{},[70,15344,15345],{"class":72,"line":85},[70,15346,1336],{},[70,15348,15349],{"class":72,"line":92},[70,15350,1341],{},[10,15352,1344],{},[61,15354,15355],{"className":733,"code":1347,"language":735,"meta":66,"style":66},[50,15356,15357],{"__ignoreMap":66},[70,15358,15359,15361],{"class":72,"line":73},[70,15360,833],{"class":742},[70,15362,1356],{"class":778},[10,15364,1359],{},[14,15366,1363],{"id":1362},[269,15368,1366],{"id":1366},[10,15370,1369],{},[269,15372,1372],{"id":1372},[10,15374,1375],{},[269,15376,1378],{"id":1378},[10,15378,1381],{},[10,15380,1384],{},[61,15382,15383],{"className":63,"code":1387,"language":65,"meta":66,"style":66},[50,15384,15385,15389,15393,15397],{"__ignoreMap":66},[70,15386,15387],{"class":72,"line":73},[70,15388,1394],{},[70,15390,15391],{"class":72,"line":79},[70,15392,89],{"emptyLinePlaceholder":88},[70,15394,15395],{"class":72,"line":85},[70,15396,1403],{},[70,15398,15399],{"class":72,"line":92},[70,15400,1408],{},[10,15402,1411],{},[269,15404,1414],{"id":1414},[10,15406,1417,15407,1420],{},[50,15408,403],{},[10,15410,1423],{},[269,15412,1426],{"id":1426},[10,15414,1429],{},[14,15416,1433],{"id":1432},[10,15418,15419],{},[26,15420],{"alt":1438,"src":1439},[10,15422,1442],{},[37,15424,15425,15427,15429,15431,15433,15435,15437,15439],{},[40,15426,1447],{},[40,15428,1450],{},[40,15430,1453],{},[40,15432,1456],{},[40,15434,1459],{},[40,15436,1462],{},[40,15438,1465],{},[40,15440,1468],{},[10,15442,1471],{},[14,15444,1475],{"id":1474},[10,15446,1478],{},[10,15448,1481],{},[14,15450,1485],{"id":1484},[10,15452,1488],{},[10,15454,1491],{},[10,15456,1494],{},[14,15458,1497],{"id":1497},[10,15460,1500],{},[10,15462,1503],{},[352,15464,1506],{},{"title":66,"searchDepth":79,"depth":79,"links":15466},[15467,15468,15469,15476,15477,15478,15479],{"id":1216,"depth":79,"text":1217},{"id":1305,"depth":79,"text":1306},{"id":1362,"depth":79,"text":1363,"children":15470},[15471,15472,15473,15474,15475],{"id":1366,"depth":85,"text":1366},{"id":1372,"depth":85,"text":1372},{"id":1378,"depth":85,"text":1378},{"id":1414,"depth":85,"text":1414},{"id":1426,"depth":85,"text":1426},{"id":1432,"depth":79,"text":1433},{"id":1474,"depth":79,"text":1475},{"id":1484,"depth":79,"text":1485},{"id":1497,"depth":79,"text":1497},{},{"title":1199,"description":66},[368,1530,1531],{"id":385,"title":386,"body":15484,"category":368,"cover":369,"description":66,"extension":370,"meta":16063,"navigation":88,"path":1187,"pinned":373,"publishedAt":1188,"seo":16064,"slug":1190,"stem":1191,"summary":1192,"tags":16065,"updatedAt":1188,"visible":88,"__hash__":1196},{"type":7,"value":15485,"toc":16039},[15486,15488,15490,15492,15496,15498,15500,15524,15536,15538,15540,15545,15549,15553,15565,15569,15573,15577,15579,15613,15615,15619,15623,15625,15647,15677,15689,15699,15707,15709,15715,15725,15727,15732,15736,15738,15752,15758,15778,15780,15782,15784,15794,15798,15800,15809,15813,15815,15817,15837,15841,15843,15845,15847,15849,15869,15871,15873,15875,15901,15903,15919,15921,15937,15941,15943,15945,15965,15967,15969,15971,15975,15985,15987,15989,15991,16001,16009,16011,16013,16027,16037],[14,15487,391],{"id":391},[10,15489,394],{},[10,15491,397],{},[10,15493,400,15494,404],{},[50,15495,403],{},[14,15497,407],{"id":407},[10,15499,410],{},[412,15501,15502,15504],{},[10,15503,416],{},[412,15505,15506,15512,15514,15518,15520],{},[10,15507,421,15508,425,15510,429],{},[50,15509,424],{},[50,15511,428],{},[10,15513,432],{},[10,15515,435,15516,440],{},[437,15517,439],{},[10,15519,443],{},[10,15521,15522],{},[26,15523],{"alt":448,"src":449},[412,15525,15526,15528],{},[10,15527,454],{},[412,15529,15530,15532],{},[10,15531,459],{},[10,15533,15534],{},[26,15535],{"alt":464,"src":465},[14,15537,469],{"id":468},[269,15539,473],{"id":472},[10,15541,476,15542,484],{},[478,15543,483],{"href":480,"rel":15544},[482],[412,15546,15547],{},[10,15548,489],{},[10,15550,15551],{},[26,15552],{"alt":494,"src":495},[37,15554,15555,15559,15563],{},[40,15556,500,15557,504],{},[437,15558,503],{},[40,15560,507,15561,504],{},[437,15562,510],{},[40,15564,513],{},[10,15566,15567],{},[26,15568],{"alt":518,"src":519},[412,15570,15571],{},[10,15572,524],{},[10,15574,15575],{},[26,15576],{"alt":529,"src":530},[269,15578,534],{"id":533},[412,15580,15581,15585,15589,15609],{},[412,15582,15583],{},[10,15584,541],{},[10,15586,544,15587,548],{},[437,15588,547],{},[61,15590,15591],{"className":63,"code":551,"language":65,"meta":66,"style":66},[50,15592,15593,15597,15601,15605],{"__ignoreMap":66},[70,15594,15595],{"class":72,"line":73},[70,15596,558],{},[70,15598,15599],{"class":72,"line":79},[70,15600,563],{},[70,15602,15603],{"class":72,"line":85},[70,15604,568],{},[70,15606,15607],{"class":72,"line":92},[70,15608,573],{},[10,15610,576,15611,580],{},[437,15612,579],{},[10,15614,583],{},[10,15616,586,15617,589],{},[50,15618,65],{},[10,15620,15621],{},[26,15622],{"alt":594,"src":595},[10,15624,598],{},[412,15626,15627,15629,15633],{},[10,15628,603],{},[10,15630,15631],{},[437,15632,608],{},[412,15634,15635,15639,15643],{},[10,15636,613,15637,616],{},[50,15638,65],{},[10,15640,619,15641,622],{},[50,15642,65],{},[10,15644,625,15645,629],{},[437,15646,628],{},[412,15648,15649,15651,15655],{},[10,15650,634],{},[10,15652,15653],{},[437,15654,639],{},[412,15656,15657,15663,15671,15673],{},[10,15658,15659,647,15661,651],{},[50,15660,646],{},[50,15662,650],{},[10,15664,654,15665,657,15667,661,15669,665],{},[50,15666,646],{},[437,15668,660],{},[437,15670,664],{},[10,15672,668],{},[10,15674,15675,674],{},[437,15676,673],{},[412,15678,15679,15681],{},[10,15680,679],{},[412,15682,15683,15687],{},[10,15684,684,15685,688],{},[437,15686,687],{},[10,15688,691],{},[412,15690,15691,15695],{},[10,15692,696,15693],{},[437,15694,699],{},[10,15696,15697],{},[26,15698],{"alt":704,"src":705},[412,15700,15701,15703],{},[10,15702,710],{},[10,15704,15705],{},[26,15706],{"alt":704,"src":715},[269,15708,719],{"id":718},[10,15710,722,15711,726,15713,730],{},[50,15712,725],{},[50,15714,729],{},[61,15716,15717],{"className":733,"code":734,"language":735,"meta":66,"style":66},[50,15718,15719],{"__ignoreMap":66},[70,15720,15721,15723],{"class":72,"line":73},[70,15722,65],{"class":742},[70,15724,746],{"class":745},[10,15726,749],{},[61,15728,15730],{"className":15729,"code":753,"language":244,"meta":66},[242],[50,15731,753],{"__ignoreMap":66},[10,15733,15734],{},[26,15735],{"alt":704,"src":760},[10,15737,763],{},[61,15739,15740],{"className":733,"code":766,"language":735,"meta":66,"style":66},[50,15741,15742],{"__ignoreMap":66},[70,15743,15744,15746,15748,15750],{"class":72,"line":73},[70,15745,65],{"class":742},[70,15747,775],{"class":745},[70,15749,779],{"class":778},[70,15751,746],{"class":745},[10,15753,784,15754,787,15756,791],{},[50,15755,65],{},[50,15757,790],{},[61,15759,15760],{"className":733,"code":794,"language":735,"meta":66,"style":66},[50,15761,15762,15768],{"__ignoreMap":66},[70,15763,15764,15766],{"class":72,"line":73},[70,15765,650],{"class":742},[70,15767,746],{"class":745},[70,15769,15770,15772,15774,15776],{"class":72,"line":79},[70,15771,650],{"class":742},[70,15773,775],{"class":745},[70,15775,779],{"class":778},[70,15777,746],{"class":745},[14,15779,816],{"id":815},[269,15781,820],{"id":819},[10,15783,823],{},[61,15785,15786],{"className":733,"code":826,"language":735,"meta":66,"style":66},[50,15787,15788],{"__ignoreMap":66},[70,15789,15790,15792],{"class":72,"line":73},[70,15791,833],{"class":742},[70,15793,746],{"class":745},[10,15795,838,15796,842],{},[50,15797,841],{},[269,15799,846],{"id":845},[10,15801,476,15802,854,15805,504,15807,861],{},[478,15803,853],{"href":851,"rel":15804},[482],[437,15806,857],{},[50,15808,860],{},[10,15810,864,15811,868],{},[50,15812,867],{},[269,15814,872],{"id":871},[10,15816,875],{},[61,15818,15819],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,15820,15821,15827],{"__ignoreMap":66},[70,15822,15823,15825],{"class":72,"line":73},[70,15824,833],{"class":742},[70,15826,746],{"class":745},[70,15828,15829,15831,15833,15835],{"class":72,"line":79},[70,15830,833],{"class":742},[70,15832,775],{"class":745},[70,15834,779],{"class":778},[70,15836,746],{"class":745},[10,15838,899,15839,902],{},[50,15840,833],{},[14,15842,906],{"id":905},[10,15844,909],{},[269,15846,913],{"id":912},[10,15848,916],{},[61,15850,15851],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,15852,15853,15859],{"__ignoreMap":66},[70,15854,15855,15857],{"class":72,"line":73},[70,15856,833],{"class":742},[70,15858,746],{"class":745},[70,15860,15861,15863,15865,15867],{"class":72,"line":79},[70,15862,833],{"class":742},[70,15864,775],{"class":745},[70,15866,779],{"class":778},[70,15868,746],{"class":745},[10,15870,939],{},[269,15872,943],{"id":942},[10,15874,946],{},[61,15876,15877],{"className":733,"code":949,"language":735,"meta":66,"style":66},[50,15878,15879,15887],{"__ignoreMap":66},[70,15880,15881,15883,15885],{"class":72,"line":73},[70,15882,956],{"class":742},[70,15884,959],{"class":778},[70,15886,962],{"class":778},[70,15888,15889,15891,15893,15895,15897,15899],{"class":72,"line":79},[70,15890,956],{"class":742},[70,15892,959],{"class":778},[70,15894,971],{"class":778},[70,15896,974],{"class":778},[70,15898,977],{"class":778},[70,15900,980],{"class":778},[10,15902,983],{},[61,15904,15905],{"className":733,"code":986,"language":735,"meta":66,"style":66},[50,15906,15907],{"__ignoreMap":66},[70,15908,15909,15911,15913,15915,15917],{"class":72,"line":73},[70,15910,956],{"class":742},[70,15912,995],{"class":778},[70,15914,971],{"class":778},[70,15916,974],{"class":778},[70,15918,1002],{"class":778},[10,15920,1005],{},[61,15922,15923],{"className":733,"code":1008,"language":735,"meta":66,"style":66},[50,15924,15925],{"__ignoreMap":66},[70,15926,15927,15929,15931,15933,15935],{"class":72,"line":73},[70,15928,956],{"class":742},[70,15930,1017],{"class":778},[70,15932,1020],{"class":745},[70,15934,1023],{"class":778},[70,15936,1026],{"class":778},[10,15938,15939,1031],{},[50,15940,956],{},[269,15942,1035],{"id":1034},[10,15944,1038],{},[61,15946,15947],{"className":733,"code":878,"language":735,"meta":66,"style":66},[50,15948,15949,15955],{"__ignoreMap":66},[70,15950,15951,15953],{"class":72,"line":73},[70,15952,833],{"class":742},[70,15954,746],{"class":745},[70,15956,15957,15959,15961,15963],{"class":72,"line":79},[70,15958,833],{"class":742},[70,15960,775],{"class":745},[70,15962,779],{"class":778},[70,15964,746],{"class":745},[10,15966,1061],{},[14,15968,1064],{"id":1064},[269,15970,1068],{"id":1067},[10,15972,1071,15973,1075],{},[50,15974,1074],{},[254,15976,15977,15981,15983],{},[40,15978,1080,15979,1083],{},[50,15980,790],{},[40,15982,1086],{},[40,15984,1089],{},[10,15986,1092],{},[269,15988,1096],{"id":1095},[10,15990,1099],{},[61,15992,15993],{"className":733,"code":826,"language":735,"meta":66,"style":66},[50,15994,15995],{"__ignoreMap":66},[70,15996,15997,15999],{"class":72,"line":73},[70,15998,833],{"class":742},[70,16000,746],{"class":745},[10,16002,1112,16003,1115,16005,1118,16007,504],{},[50,16004,833],{},[50,16006,65],{},[50,16008,833],{},[269,16010,1124],{"id":1123},[10,16012,1127],{},[61,16014,16015],{"className":733,"code":1130,"language":735,"meta":66,"style":66},[50,16016,16017],{"__ignoreMap":66},[70,16018,16019,16021,16023,16025],{"class":72,"line":73},[70,16020,833],{"class":742},[70,16022,775],{"class":745},[70,16024,779],{"class":778},[70,16026,746],{"class":745},[10,16028,1145,16029,1148,16031,1151,16033,1154,16035,1158],{},[50,16030,833],{},[50,16032,65],{},[50,16034,650],{},[50,16036,1157],{},[352,16038,1161],{},{"title":66,"searchDepth":79,"depth":79,"links":16040},[16041,16042,16043,16048,16053,16058],{"id":391,"depth":79,"text":391},{"id":407,"depth":79,"text":407},{"id":468,"depth":79,"text":469,"children":16044},[16045,16046,16047],{"id":472,"depth":85,"text":473},{"id":533,"depth":85,"text":534},{"id":718,"depth":85,"text":719},{"id":815,"depth":79,"text":816,"children":16049},[16050,16051,16052],{"id":819,"depth":85,"text":820},{"id":845,"depth":85,"text":846},{"id":871,"depth":85,"text":872},{"id":905,"depth":79,"text":906,"children":16054},[16055,16056,16057],{"id":912,"depth":85,"text":913},{"id":942,"depth":85,"text":943},{"id":1034,"depth":85,"text":1035},{"id":1064,"depth":79,"text":1064,"children":16059},[16060,16061,16062],{"id":1067,"depth":85,"text":1068},{"id":1095,"depth":85,"text":1096},{"id":1123,"depth":85,"text":1124},{},{"title":386,"description":66},[368,1194,1195],1786973366450]