[{"data":1,"prerenderedAt":15953},["ShallowReactive",2],{"post-python-for-range":3,"sidebar-posts":213,"post-related-source":9144},{"id":4,"title":5,"body":6,"category":199,"cover":200,"description":12,"extension":201,"meta":202,"navigation":84,"path":203,"pinned":204,"publishedAt":205,"seo":206,"slug":207,"stem":208,"summary":209,"tags":210,"updatedAt":205,"visible":84,"__hash__":212},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":8,"toc":189},"minimark",[9,13,17,20,23,30,37,40,56,59,62,115,118,126,129,132,150,153,161,164,176,179,182,185],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,31,32,36],{},[33,34,35],"code",{},"for"," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,38,39],{"id":39},"核心概念",[41,42,43,50,53],"ul",{},[44,45,46,49],"li",{},[33,47,48],{},"range(1, 4)"," 包含 1，不包含 4。",[44,51,52],{},"只需要元素时直接遍历元素，不必手工维护索引。",[44,54,55],{},"循环变量应使用单数名称，容器使用复数名称。",[14,57,58],{"id":58},"跟着示例运行",[10,60,61],{},"把下面代码保存到本课脚本并运行：",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-python shiki shiki-themes github-dark","courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n","python","",[33,70,71,79,86,92,98,103,109],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,78],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[72,80,82],{"class":74,"line":81},2,[72,83,85],{"emptyLinePlaceholder":84},true,"\n",[72,87,89],{"class":74,"line":88},3,[72,90,91],{},"for course in courses:\n",[72,93,95],{"class":74,"line":94},4,[72,96,97],{},"    print(course)\n",[72,99,101],{"class":74,"line":100},5,[72,102,85],{"emptyLinePlaceholder":84},[72,104,106],{"class":74,"line":105},6,[72,107,108],{},"for number in range(1, 4):\n",[72,110,112],{"class":74,"line":111},7,[72,113,114],{},"    print(number)\n",[10,116,117],{},"预期结果：",[63,119,124],{"className":120,"code":122,"language":123,"meta":68},[121],"language-text","变量\n字符串\n列表\n1\n2\n3\n","text",[33,125,122],{"__ignoreMap":68},[10,127,128],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,130,131],{"id":131},"按执行顺序拆开看",[133,134,135,145],"ol",{},[44,136,137,138,140,141,144],{},"第一个 ",[33,139,35],{}," 依次从列表取得字符串，循环变量 ",[33,142,143],{},"course"," 每轮重新绑定。",[44,146,147,149],{},[33,148,48],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,151,152],{"id":152},"初学者容易混淆的地方",[41,154,155,158],{},[44,156,157],{},"只需要元素却手工维护索引，增加越界风险。",[44,159,160],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,162,163],{"id":163},"练习",[133,165,166,169],{},[44,167,168],{},"逐项输出一个字符串中的字符。",[44,170,171,172,175],{},"使用 ",[33,173,174],{},"range()"," 输出 2、4、6、8。",[10,177,178],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,180,181],{"id":181},"本篇边界",[10,183,184],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,187,188],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":190},[191,192,193,194,195,196,197,198],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F18-python-for-range",false,"2026-08-17",{"title":5,"description":12},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[199,35,211],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",[214,1028,1365,1499,1651,1830,2018,2183,2366,2548,2741,2972,3156,3333,3490,3661,3826,4041,4270,4451,4580,4769,4957,5112,5272,5469,5666,5880,6047,6291,6472,6677,6872,7056,7257,7547,7739,7968,8163,8383,8623,8827],{"id":215,"title":216,"body":217,"category":199,"cover":200,"description":68,"extension":201,"meta":1017,"navigation":84,"path":1018,"pinned":204,"publishedAt":1019,"seo":1020,"slug":1021,"stem":1022,"summary":1023,"tags":1024,"updatedAt":1019,"visible":84,"__hash__":1027},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":218,"toc":993},[219,222,225,228,235,238,241,280,296,300,305,316,321,327,345,351,356,362,366,412,415,421,427,430,461,506,523,537,547,551,562,578,581,587,592,595,613,623,644,648,652,655,667,674,678,693,700,704,707,728,734,738,741,745,748,768,771,775,778,812,815,834,837,858,863,867,870,890,893,896,900,907,921,924,928,931,941,952,956,959,974,990],[14,220,221],{"id":221},"引言",[10,223,224],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,226,227],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,229,230,231,234],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,232,233],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,236,237],{"id":237},"扫盲",[10,239,240],{},"那么这里有几个概念：",[242,243,244,247],"blockquote",{},[10,245,246],{},"为什么需要安装python解释器？",[242,248,249,260,263,271,274],{},[10,250,251,252,255,256,259],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,253,254],{},"0","和",[33,257,258],{},"1","组成的机器指令。",[10,261,262],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,264,265,266,270],{},"这样，我们就能用",[267,268,269],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,272,273],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,275,276],{},[26,277],{"alt":278,"src":279},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[242,281,282,285],{},[10,283,284],{},"pip又是什么？",[242,286,287,290],{},[10,288,289],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,291,292],{},[26,293],{"alt":294,"src":295},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,297,299],{"id":298},"windows-安装","Windows 安装",[301,302,304],"h3",{"id":303},"_1-下载官方安装程序","1. 下载官方安装程序",[10,306,307,308,315],{},"打开 ",[309,310,314],"a",{"href":311,"rel":312},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[313],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[242,317,318],{},[10,319,320],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,322,323],{},[26,324],{"alt":325,"src":326},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[41,328,329,336,342],{},[44,330,331,332,335],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[267,333,334],{},"Windows installer (64-bit)","。",[44,337,338,339,335],{},"搭载 ARM 处理器的 Windows 设备选择 ",[267,340,341],{},"Windows installer (ARM64)",[44,343,344],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,346,347],{},[26,348],{"alt":349,"src":350},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[242,352,353],{},[10,354,355],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,357,358],{},[26,359],{"alt":360,"src":361},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[301,363,365],{"id":364},"_2-安装并加入-path","2. 安装并加入 PATH",[242,367,368,373,380,405],{},[242,369,370],{},[10,371,372],{},"PATH 环境变量",[10,374,375,376,379],{},"Windows 有一个特殊的变量叫 ",[267,377,378],{},"PATH","，它里面存了一串文件夹路径，比如：",[63,381,383],{"className":65,"code":382,"language":67,"meta":68,"style":68},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,384,385,390,395,400],{"__ignoreMap":68},[72,386,387],{"class":74,"line":75},[72,388,389],{},"D:\\Python313\\\n",[72,391,392],{"class":74,"line":81},[72,393,394],{},"D:\\Python313\\Scripts\\\n",[72,396,397],{"class":74,"line":88},[72,398,399],{},"C:\\Windows\\System32\\\n",[72,401,402],{"class":74,"line":94},[72,403,404],{},"...\n",[10,406,407,408,411],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[267,409,410],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,413,414],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,416,417,418,420],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,419,67],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,422,423],{},[26,424],{"alt":425,"src":426},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,428,429],{},"对安装界面最底部的两个勾选项分别解释 :",[242,431,432,435,440],{},[10,433,434],{},"Add python.exe to PATH",[10,436,437],{},[267,438,439],{},"把 Python 添加到系统环境变量",[242,441,442,448,454],{},[10,443,444,445,447],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,446,67],{}," 就能运行",[10,449,450,451,453],{},"不勾选的话，命令行输入 ",[33,452,67],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,455,456,457,460],{},"必须",[267,458,459],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[242,462,463,466,471],{},[10,464,465],{},"Use admin privileges when installing py.exe",[10,467,468],{},[267,469,470],{},"使用管理员权限安装 py.exe（Python 启动器）",[242,472,473,483,497,500],{},[10,474,475,478,479,482],{},[33,476,477],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,480,481],{},"py"," 来启动 Python。",[10,484,485,486,488,489,492,493,496],{},"勾选后，",[33,487,477],{}," 会安装到",[267,490,491],{},"系统级目录","，电脑上",[267,494,495],{},"所有用户账户","都能用",[10,498,499],{},"不勾选，只有当前用户能用",[10,501,502,505],{},[267,503,504],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[242,507,508,511],{},[10,509,510],{},"操作建议",[242,512,513,520],{},[10,514,515,516,519],{},"两个都勾上之后，再点 ",[267,517,518],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,521,522],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[242,524,525,531],{},[10,526,527,528],{},"Python 安装的",[267,529,530],{},"可选功能页",[10,532,533],{},[26,534],{"alt":535,"src":536},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[242,538,539,542],{},[10,540,541],{},"高级选项页",[10,543,544],{},[26,545],{"alt":535,"src":546},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[301,548,550],{"id":549},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,552,553,554,557,558,561],{},"按 ",[33,555,556],{},"Win + R","，输入 ",[33,559,560],{},"cmd"," 并回车，然后执行：",[63,563,567],{"className":564,"code":565,"language":566,"meta":68,"style":68},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,568,569],{"__ignoreMap":68},[72,570,571,574],{"class":74,"line":75},[72,572,67],{"class":573},"svObZ",[72,575,577],{"class":576},"sDLfK"," --version\n",[10,579,580],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[63,582,585],{"className":583,"code":584,"language":123,"meta":68},[121],"Python 3.x.x\n",[33,586,584],{"__ignoreMap":68},[10,588,589],{},[26,590],{"alt":535,"src":591},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,593,594],{},"继续检查 pip：",[63,596,598],{"className":564,"code":597,"language":566,"meta":68,"style":68},"python -m pip --version\n",[33,599,600],{"__ignoreMap":68},[72,601,602,604,607,611],{"class":74,"line":75},[72,603,67],{"class":573},[72,605,606],{"class":576}," -m",[72,608,610],{"class":609},"sU2Wk"," pip",[72,612,577],{"class":576},[10,614,615,616,618,619,622],{},"如果 ",[33,617,67],{}," 无法识别，但 ",[33,620,621],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[63,624,626],{"className":564,"code":625,"language":566,"meta":68,"style":68},"py --version\npy -m pip --version\n",[33,627,628,634],{"__ignoreMap":68},[72,629,630,632],{"class":74,"line":75},[72,631,481],{"class":573},[72,633,577],{"class":576},[72,635,636,638,640,642],{"class":74,"line":81},[72,637,481],{"class":573},[72,639,606],{"class":576},[72,641,610],{"class":609},[72,643,577],{"class":576},[14,645,647],{"id":646},"macos-安装","macOS 安装",[301,649,651],{"id":650},"_1-先检查现有环境","1. 先检查现有环境",[10,653,654],{},"打开“终端”应用，执行：",[63,656,658],{"className":564,"code":657,"language":566,"meta":68,"style":68},"python3 --version\n",[33,659,660],{"__ignoreMap":68},[72,661,662,665],{"class":74,"line":75},[72,663,664],{"class":573},"python3",[72,666,577],{"class":576},[10,668,669,670,673],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,671,672],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[301,675,677],{"id":676},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,679,307,680,685,686,335,689,692],{},[309,681,684],{"href":682,"rel":683},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[313],"Python macOS 下载页","，下载当前稳定版的 ",[267,687,688],{},"macOS 64-bit universal2 installer",[33,690,691],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,694,695,696,699],{},"下载完成后打开 ",[33,697,698],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[301,701,703],{"id":702},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,705,706],{},"安装完成后重新打开终端，执行：",[63,708,710],{"className":564,"code":709,"language":566,"meta":68,"style":68},"python3 --version\npython3 -m pip --version\n",[33,711,712,718],{"__ignoreMap":68},[72,713,714,716],{"class":74,"line":75},[72,715,664],{"class":573},[72,717,577],{"class":576},[72,719,720,722,724,726],{"class":74,"line":81},[72,721,664],{"class":573},[72,723,606],{"class":576},[72,725,610],{"class":609},[72,727,577],{"class":576},[10,729,730,731,733],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,732,664],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,735,737],{"id":736},"linux-安装","Linux 安装",[10,739,740],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[301,742,744],{"id":743},"_1-检查是否已经安装","1. 检查是否已经安装",[10,746,747],{},"打开终端，执行：",[63,749,750],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,751,752,758],{"__ignoreMap":68},[72,753,754,756],{"class":74,"line":75},[72,755,664],{"class":573},[72,757,577],{"class":576},[72,759,760,762,764,766],{"class":74,"line":81},[72,761,664],{"class":573},[72,763,606],{"class":576},[72,765,610],{"class":609},[72,767,577],{"class":576},[10,769,770],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[301,772,774],{"id":773},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,776,777],{},"Ubuntu 或 Debian：",[63,779,781],{"className":564,"code":780,"language":566,"meta":68,"style":68},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,782,783,794],{"__ignoreMap":68},[72,784,785,788,791],{"class":74,"line":75},[72,786,787],{"class":573},"sudo",[72,789,790],{"class":609}," apt",[72,792,793],{"class":609}," update\n",[72,795,796,798,800,803,806,809],{"class":74,"line":81},[72,797,787],{"class":573},[72,799,790],{"class":609},[72,801,802],{"class":609}," install",[72,804,805],{"class":609}," python3",[72,807,808],{"class":609}," python3-pip",[72,810,811],{"class":609}," python3-venv\n",[10,813,814],{},"Fedora：",[63,816,818],{"className":564,"code":817,"language":566,"meta":68,"style":68},"sudo dnf install python3 python3-pip\n",[33,819,820],{"__ignoreMap":68},[72,821,822,824,827,829,831],{"class":74,"line":75},[72,823,787],{"class":573},[72,825,826],{"class":609}," dnf",[72,828,802],{"class":609},[72,830,805],{"class":609},[72,832,833],{"class":609}," python3-pip\n",[10,835,836],{},"Arch Linux：",[63,838,840],{"className":564,"code":839,"language":566,"meta":68,"style":68},"sudo pacman -S python python-pip\n",[33,841,842],{"__ignoreMap":68},[72,843,844,846,849,852,855],{"class":74,"line":75},[72,845,787],{"class":573},[72,847,848],{"class":609}," pacman",[72,850,851],{"class":576}," -S",[72,853,854],{"class":609}," python",[72,856,857],{"class":609}," python-pip\n",[10,859,860,862],{},[33,861,787],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[301,864,866],{"id":865},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,868,869],{},"安装结束后执行：",[63,871,872],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,873,874,880],{"__ignoreMap":68},[72,875,876,878],{"class":74,"line":75},[72,877,664],{"class":573},[72,879,577],{"class":576},[72,881,882,884,886,888],{"class":74,"line":81},[72,883,664],{"class":573},[72,885,606],{"class":576},[72,887,610],{"class":609},[72,889,577],{"class":576},[10,891,892],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,894,895],{"id":895},"常见问题",[301,897,899],{"id":898},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,901,902,903,906],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,904,905],{},"python --version","。如果仍然失败，按下面的顺序检查：",[133,908,909,915,918],{},[44,910,911,912,914],{},"执行 ",[33,913,621],{},"，确认 Python Launcher 是否可用。",[44,916,917],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[44,919,920],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,922,923],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[301,925,927],{"id":926},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,929,930],{},"先尝试：",[63,932,933],{"className":564,"code":657,"language":566,"meta":68,"style":68},[33,934,935],{"__ignoreMap":68},[72,936,937,939],{"class":74,"line":75},[72,938,664],{"class":573},[72,940,577],{"class":576},[10,942,943,944,946,947,949,950,335],{},"在这两个系统中，只有 ",[33,945,664],{}," 命令而没有 ",[33,948,67],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,951,664],{},[301,953,955],{"id":954},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,957,958],{},"先使用模块方式检查：",[63,960,962],{"className":564,"code":961,"language":566,"meta":68,"style":68},"python3 -m pip --version\n",[33,963,964],{"__ignoreMap":68},[72,965,966,968,970,972],{"class":74,"line":75},[72,967,664],{"class":573},[72,969,606],{"class":576},[72,971,610],{"class":609},[72,973,577],{"class":576},[10,975,976,977,979,980,982,983,985,986,989],{},"Windows 用户将命令中的 ",[33,978,664],{}," 换成 ",[33,981,67],{}," 或 ",[33,984,481],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,987,988],{},"python3-pip","；不要直接使用其他系统的安装命令。",[186,991,992],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":81,"depth":81,"links":994},[995,996,997,1002,1007,1012],{"id":221,"depth":81,"text":221},{"id":237,"depth":81,"text":237},{"id":298,"depth":81,"text":299,"children":998},[999,1000,1001],{"id":303,"depth":88,"text":304},{"id":364,"depth":88,"text":365},{"id":549,"depth":88,"text":550},{"id":646,"depth":81,"text":647,"children":1003},[1004,1005,1006],{"id":650,"depth":88,"text":651},{"id":676,"depth":88,"text":677},{"id":702,"depth":88,"text":703},{"id":736,"depth":81,"text":737,"children":1008},[1009,1010,1011],{"id":743,"depth":88,"text":744},{"id":773,"depth":88,"text":774},{"id":865,"depth":88,"text":866},{"id":895,"depth":81,"text":895,"children":1013},[1014,1015,1016],{"id":898,"depth":88,"text":899},{"id":926,"depth":88,"text":927},{"id":954,"depth":88,"text":955},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":216,"description":68},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[199,1025,1026],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1029,"title":1030,"body":1031,"category":199,"cover":1038,"description":68,"extension":201,"meta":1354,"navigation":84,"path":1355,"pinned":204,"publishedAt":1356,"seo":1357,"slug":1358,"stem":1359,"summary":1360,"tags":1361,"updatedAt":1356,"visible":84,"__hash__":1364},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1032,"toc":1339},[1033,1039,1042,1045,1049,1052,1076,1079,1085,1088,1091,1125,1135,1139,1146,1149,1174,1177,1189,1192,1196,1199,1202,1205,1208,1211,1214,1217,1241,1244,1247,1253,1256,1259,1262,1266,1272,1275,1301,1304,1308,1311,1314,1318,1321,1324,1327,1330,1333,1336],[10,1034,1035],{},[26,1036],{"alt":1037,"src":1038},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1040,1041],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1043,1044],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1046,1048],{"id":1047},"python-代码是什么样的","Python 代码是什么样的",[10,1050,1051],{},"下面是一段简单的 Python 代码：",[63,1053,1055],{"className":65,"code":1054,"language":67,"meta":68,"style":68},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1056,1057,1062,1067,1071],{"__ignoreMap":68},[72,1058,1059],{"class":74,"line":75},[72,1060,1061],{},"name = \"Python\"\n",[72,1063,1064],{"class":74,"line":81},[72,1065,1066],{},"year = 2026\n",[72,1068,1069],{"class":74,"line":88},[72,1070,85],{"emptyLinePlaceholder":84},[72,1072,1073],{"class":74,"line":94},[72,1074,1075],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1077,1078],{},"运行结果：",[63,1080,1083],{"className":1081,"code":1082,"language":123,"meta":68},[121],"正在学习 Python，当前年份是 2026\n",[33,1084,1082],{"__ignoreMap":68},[10,1086,1087],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1089,1090],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[63,1092,1094],{"className":65,"code":1093,"language":67,"meta":68,"style":68},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1095,1096,1101,1105,1110,1115,1120],{"__ignoreMap":68},[72,1097,1098],{"class":74,"line":75},[72,1099,1100],{},"score = 85\n",[72,1102,1103],{"class":74,"line":81},[72,1104,85],{"emptyLinePlaceholder":84},[72,1106,1107],{"class":74,"line":88},[72,1108,1109],{},"if score >= 60:\n",[72,1111,1112],{"class":74,"line":94},[72,1113,1114],{},"    print(\"成绩合格\")\n",[72,1116,1117],{"class":74,"line":100},[72,1118,1119],{},"else:\n",[72,1121,1122],{"class":74,"line":105},[72,1123,1124],{},"    print(\"需要继续学习\")\n",[10,1126,1127,1130,1131,1134],{},[33,1128,1129],{},"if"," 和 ",[33,1132,1133],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1136,1138],{"id":1137},"python-如何运行代码","Python 如何运行代码",[10,1140,1141,1142,1145],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1143,1144],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1147,1148],{},"交互式环境适合快速验证一个表达式：",[63,1150,1152],{"className":65,"code":1151,"language":67,"meta":68,"style":68},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1153,1154,1159,1164,1169],{"__ignoreMap":68},[72,1155,1156],{"class":74,"line":75},[72,1157,1158],{},">>> 10 + 20\n",[72,1160,1161],{"class":74,"line":81},[72,1162,1163],{},"30\n",[72,1165,1166],{"class":74,"line":88},[72,1167,1168],{},">>> \"Python\".lower()\n",[72,1170,1171],{"class":74,"line":94},[72,1172,1173],{},"'python'\n",[10,1175,1176],{},"需要保存和重复运行的程序，则可以写入文件：",[63,1178,1180],{"className":564,"code":1179,"language":566,"meta":68,"style":68},"python3 hello.py\n",[33,1181,1182],{"__ignoreMap":68},[72,1183,1184,1186],{"class":74,"line":75},[72,1185,664],{"class":573},[72,1187,1188],{"class":609}," hello.py\n",[10,1190,1191],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1193,1195],{"id":1194},"python-的特点","Python 的特点",[301,1197,1198],{"id":1198},"语法相对简洁",[10,1200,1201],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[301,1203,1204],{"id":1204},"支持多种编程方式",[10,1206,1207],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[301,1209,1210],{"id":1210},"标准库比较完整",[10,1212,1213],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1215,1216],{},"例如，获取当前时间：",[63,1218,1220],{"className":65,"code":1219,"language":67,"meta":68,"style":68},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1221,1222,1227,1231,1236],{"__ignoreMap":68},[72,1223,1224],{"class":74,"line":75},[72,1225,1226],{},"from datetime import datetime\n",[72,1228,1229],{"class":74,"line":81},[72,1230,85],{"emptyLinePlaceholder":84},[72,1232,1233],{"class":74,"line":88},[72,1234,1235],{},"now = datetime.now()\n",[72,1237,1238],{"class":74,"line":94},[72,1239,1240],{},"print(now)\n",[10,1242,1243],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[301,1245,1246],{"id":1246},"第三方工具丰富",[10,1248,1249,1250,1252],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1251,233],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1254,1255],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[301,1257,1258],{"id":1258},"支持多个操作系统",[10,1260,1261],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1263,1265],{"id":1264},"python-可以做什么","Python 可以做什么",[10,1267,1268],{},[26,1269],{"alt":1270,"src":1271},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1273,1274],{},"Python 的应用范围比较广，常见方向包括：",[41,1276,1277,1280,1283,1286,1289,1292,1295,1298],{},[44,1278,1279],{},"编写自动化脚本，批量处理文件和重复任务；",[44,1281,1282],{},"开发网站后端和 API 服务；",[44,1284,1285],{},"进行数据清洗、统计分析和图表展示；",[44,1287,1288],{},"编写网络爬虫和信息采集工具；",[44,1290,1291],{},"开发自动化测试程序；",[44,1293,1294],{},"进行机器学习和人工智能开发；",[44,1296,1297],{},"编写运维、监控和辅助开发工具；",[44,1299,1300],{},"开发部分桌面应用和插件。",[10,1302,1303],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1305,1307],{"id":1306},"python-的发展","Python 的发展",[10,1309,1310],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1312,1313],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1315,1317],{"id":1316},"python-也有局限","Python 也有局限",[10,1319,1320],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1322,1323],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1325,1326],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1328,1329],{"id":1329},"写在最后",[10,1331,1332],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1334,1335],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[186,1337,1338],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":81,"depth":81,"links":1340},[1341,1342,1343,1350,1351,1352,1353],{"id":1047,"depth":81,"text":1048},{"id":1137,"depth":81,"text":1138},{"id":1194,"depth":81,"text":1195,"children":1344},[1345,1346,1347,1348,1349],{"id":1198,"depth":88,"text":1198},{"id":1204,"depth":88,"text":1204},{"id":1210,"depth":88,"text":1210},{"id":1246,"depth":88,"text":1246},{"id":1258,"depth":88,"text":1258},{"id":1264,"depth":81,"text":1265},{"id":1306,"depth":81,"text":1307},{"id":1316,"depth":81,"text":1317},{"id":1329,"depth":81,"text":1329},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1030,"description":68},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[199,1362,1363],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1366,"title":1367,"body":1368,"category":199,"cover":200,"description":1372,"extension":201,"meta":1490,"navigation":84,"path":1491,"pinned":204,"publishedAt":205,"seo":1492,"slug":1493,"stem":1494,"summary":1495,"tags":1496,"updatedAt":205,"visible":84,"__hash__":1498},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1369,"toc":1480},[1370,1373,1375,1378,1380,1386,1391,1393,1407,1409,1411,1420,1422,1428,1430,1432,1448,1450,1461,1463,1471,1473,1475,1478],[10,1371,1372],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1374,16],{"id":16},[10,1376,1377],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1379,22],{"id":22},[10,1381,1382],{},[26,1383],{"alt":1384,"src":1385},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1387,1388,1390],{},[33,1389,1144],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1392,39],{"id":39},[41,1394,1395,1401,1404],{},[44,1396,1397,1398,1400],{},"源代码是人编写的文本，通常保存在 ",[33,1399,1144],{}," 文件中。",[44,1402,1403],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[44,1405,1406],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1408,58],{"id":58},[10,1410,61],{},[63,1412,1414],{"className":65,"code":1413,"language":67,"meta":68,"style":68},"print(\"你好，Python\")\n",[33,1415,1416],{"__ignoreMap":68},[72,1417,1418],{"class":74,"line":75},[72,1419,1413],{},[10,1421,117],{},[63,1423,1426],{"className":1424,"code":1425,"language":123,"meta":68},[121],"你好，Python\n",[33,1427,1425],{"__ignoreMap":68},[10,1429,128],{},[14,1431,131],{"id":131},[133,1433,1434,1441],{},[44,1435,1436,1437,1440],{},"终端启动解释器后，解释器读取 ",[33,1438,1439],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[44,1442,1443,1444,1447],{},"字符串对象先准备好，再交给 ",[33,1445,1446],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1449,152],{"id":152},[41,1451,1452,1455],{},[44,1453,1454],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[44,1456,1457,1458,1460],{},"认为 ",[33,1459,1144],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1462,163],{"id":163},[133,1464,1465,1468],{},[44,1466,1467],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[44,1469,1470],{},"把示例文字改成自己的学习目标并重新运行。",[10,1472,178],{},[14,1474,181],{"id":181},[10,1476,1477],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1479,188],{},{"title":68,"searchDepth":81,"depth":81,"links":1481},[1482,1483,1484,1485,1486,1487,1488,1489],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1367,"description":1372},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[199,1362,1497],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1500,"title":1501,"body":1502,"category":199,"cover":200,"description":1506,"extension":201,"meta":1642,"navigation":84,"path":1643,"pinned":204,"publishedAt":205,"seo":1644,"slug":1645,"stem":1646,"summary":1647,"tags":1648,"updatedAt":205,"visible":84,"__hash__":1650},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1503,"toc":1632},[1504,1507,1509,1512,1514,1520,1526,1528,1543,1545,1548,1568,1570,1576,1578,1580,1593,1595,1609,1611,1622,1624,1626,1629],[10,1505,1506],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1508,16],{"id":16},[10,1510,1511],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1513,22],{"id":22},[10,1515,1516],{},[26,1517],{"alt":1518,"src":1519},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1521,1522,1523,1525],{},"终端收到 ",[33,1524,664],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1527,39],{"id":39},[41,1529,1530,1533,1536],{},[44,1531,1532],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[44,1534,1535],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[44,1537,1538,1539,1542],{},"检查 pip 时使用 ",[33,1540,1541],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1544,58],{"id":58},[10,1546,1547],{},"在 macOS 终端执行：",[63,1549,1550],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,1551,1552,1558],{"__ignoreMap":68},[72,1553,1554,1556],{"class":74,"line":75},[72,1555,664],{"class":573},[72,1557,577],{"class":576},[72,1559,1560,1562,1564,1566],{"class":74,"line":81},[72,1561,664],{"class":573},[72,1563,606],{"class":576},[72,1565,610],{"class":609},[72,1567,577],{"class":576},[10,1569,117],{},[63,1571,1574],{"className":1572,"code":1573,"language":123,"meta":68},[121],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1575,1573],{"__ignoreMap":68},[10,1577,128],{},[14,1579,131],{"id":131},[133,1581,1582,1588],{},[44,1583,1584,1587],{},[33,1585,1586],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[44,1589,1590,1592],{},[33,1591,672],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1594,152],{"id":152},[41,1596,1597,1603],{},[44,1598,1599,1600,1602],{},"看到系统已有 ",[33,1601,664],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[44,1604,1605,1606,1608],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1607,664],{},"，不修改系统自带工具。",[14,1610,163],{"id":163},[133,1612,1613,1619],{},[44,1614,911,1615,1618],{},[33,1616,1617],{},"which python3","，记录当前解释器路径。",[44,1620,1621],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1623,178],{},[14,1625,181],{"id":181},[10,1627,1628],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1630,1631],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":1633},[1634,1635,1636,1637,1638,1639,1640,1641],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1501,"description":1506},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[199,1649,1025],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1652,"title":1653,"body":1654,"category":199,"cover":200,"description":1819,"extension":201,"meta":1820,"navigation":84,"path":1821,"pinned":204,"publishedAt":205,"seo":1822,"slug":1823,"stem":1824,"summary":1825,"tags":1826,"updatedAt":205,"visible":84,"__hash__":1829},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1655,"toc":1809},[1656,1662,1664,1667,1669,1675,1678,1680,1704,1706,1708,1735,1737,1743,1745,1747,1765,1767,1781,1783,1797,1799,1801,1807],[10,1657,1658,1659,1661],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1660,1144],{}," 脚本。",[14,1663,16],{"id":16},[10,1665,1666],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1668,22],{"id":22},[10,1670,1671],{},[26,1672],{"alt":1673,"src":1674},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1676,1677],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1679,39],{"id":39},[41,1681,1682,1691,1698],{},[44,1683,1684,1685,1687,1688,335],{},"在终端输入 ",[33,1686,664],{}," 进入 REPL，提示符通常是 ",[33,1689,1690],{},">>>",[44,1692,1693,1694,1697],{},"输入 ",[33,1695,1696],{},"exit()"," 或按 Control-D 退出 REPL。",[44,1699,1700,1701,1703],{},"需要保存、复查或多次运行的代码应写入 ",[33,1702,1144],{}," 文件。",[14,1705,58],{"id":58},[10,1707,61],{},[63,1709,1713],{"className":1710,"code":1711,"language":1712,"meta":68,"style":68},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1714,1715,1720,1725,1730],{"__ignoreMap":68},[72,1716,1717],{"class":74,"line":75},[72,1718,1719],{},">>> 2 + 3\n",[72,1721,1722],{"class":74,"line":81},[72,1723,1724],{},"5\n",[72,1726,1727],{"class":74,"line":88},[72,1728,1729],{},">>> \"python\".upper()\n",[72,1731,1732],{"class":74,"line":94},[72,1733,1734],{},"'PYTHON'\n",[10,1736,117],{},[63,1738,1741],{"className":1739,"code":1740,"language":123,"meta":68},[121],"REPL 会直接显示表达式结果\n",[33,1742,1740],{"__ignoreMap":68},[10,1744,128],{},[14,1746,131],{"id":131},[133,1748,1749,1759],{},[44,1750,1751,1752,1755,1756,335],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1753,1754],{},"2 + 3"," 能直接看到 ",[33,1757,1758],{},"5",[44,1760,1761,1762,1764],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1763,1446],{}," 才会写到标准输出。",[14,1766,152],{"id":152},[41,1768,1769,1778],{},[44,1770,1771,1772,1774,1775,1777],{},"把提示符 ",[33,1773,1690],{}," 复制进 ",[33,1776,1144],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[44,1779,1780],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1782,163],{"id":163},[133,1784,1785,1791],{},[44,1786,1787,1788,335],{},"在 REPL 计算 ",[33,1789,1790],{},"12 * 8",[44,1792,1793,1794,1796],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1795,1446],{}," 时是否显示结果。",[10,1798,178],{},[14,1800,181],{"id":181},[10,1802,1803,1804,1806],{},"本篇目标是根据任务选择 REPL 或 ",[33,1805,1144],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1808,188],{},{"title":68,"searchDepth":81,"depth":81,"links":1810},[1811,1812,1813,1814,1815,1816,1817,1818],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1653,"description":1819},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[199,1827,1828],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1831,"title":1832,"body":1833,"category":199,"cover":200,"description":1837,"extension":201,"meta":2008,"navigation":84,"path":2009,"pinned":204,"publishedAt":205,"seo":2010,"slug":2011,"stem":2012,"summary":2013,"tags":2014,"updatedAt":205,"visible":84,"__hash__":2017},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1834,"toc":1998},[1835,1838,1840,1843,1845,1851,1857,1859,1877,1879,1881,1926,1928,1934,1936,1938,1960,1962,1974,1976,1988,1990,1992,1995],[10,1836,1837],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1839,16],{"id":16},[10,1841,1842],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1844,22],{"id":22},[10,1846,1847],{},[26,1848],{"alt":1849,"src":1850},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1852,1853,1856],{},[33,1854,1855],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1858,39],{"id":39},[41,1860,1861,1864,1874],{},[44,1862,1863],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[44,1865,1866,1869,1870,1873],{},[33,1867,1868],{},"pwd"," 显示当前目录，",[33,1871,1872],{},"ls"," 显示目录里的文件。",[44,1875,1876],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1878,58],{"id":58},[10,1880,1547],{},[63,1882,1884],{"className":564,"code":1883,"language":566,"meta":68,"style":68},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1885,1886,1894,1901,1906,1920],{"__ignoreMap":68},[72,1887,1888,1891],{"class":74,"line":75},[72,1889,1890],{"class":573},"mkdir",[72,1892,1893],{"class":609}," python-study\n",[72,1895,1896,1899],{"class":74,"line":81},[72,1897,1898],{"class":576},"cd",[72,1900,1893],{"class":609},[72,1902,1903],{"class":74,"line":88},[72,1904,1905],{"class":576},"pwd\n",[72,1907,1908,1911,1914,1918],{"class":74,"line":94},[72,1909,1910],{"class":576},"printf",[72,1912,1913],{"class":609}," 'print(\"项目已经运行\")\\n'",[72,1915,1917],{"class":1916},"snl16"," >",[72,1919,1188],{"class":609},[72,1921,1922,1924],{"class":74,"line":100},[72,1923,664],{"class":573},[72,1925,1188],{"class":609},[10,1927,117],{},[63,1929,1932],{"className":1930,"code":1931,"language":123,"meta":68},[121],"项目已经运行\n",[33,1933,1931],{"__ignoreMap":68},[10,1935,128],{},[14,1937,131],{"id":131},[133,1939,1940,1951],{},[44,1941,1942,1944,1945,1947,1948,1950],{},[33,1943,1890],{}," 创建目录，",[33,1946,1898],{}," 改变终端当前目录，",[33,1949,1868],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[44,1952,1953,1955,1956,1959],{},[33,1954,1855],{}," 会在当前目录寻找 ",[33,1957,1958],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1961,152],{"id":152},[41,1963,1964,1971],{},[44,1965,1966,1967,1130,1969,335],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,1968,1868],{},[33,1970,1872],{},[44,1972,1973],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1975,163],{"id":163},[133,1977,1978,1985],{},[44,1979,1980,1981,1984],{},"新建 ",[33,1982,1983],{},"lesson01.py"," 并输出课程编号。",[44,1986,1987],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1989,178],{},[14,1991,181],{"id":181},[10,1993,1994],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,1996,1997],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":1999},[2000,2001,2002,2003,2004,2005,2006,2007],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1832,"description":1837},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[199,2015,2016],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2019,"title":2020,"body":2021,"category":199,"cover":200,"description":2025,"extension":201,"meta":2173,"navigation":84,"path":2174,"pinned":204,"publishedAt":205,"seo":2175,"slug":2176,"stem":2177,"summary":2178,"tags":2179,"updatedAt":205,"visible":84,"__hash__":2182},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2022,"toc":2163},[2023,2026,2028,2031,2033,2039,2050,2052,2072,2074,2076,2096,2098,2104,2106,2108,2127,2129,2137,2139,2154,2156,2158,2161],[10,2024,2025],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2027,16],{"id":16},[10,2029,2030],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2032,22],{"id":22},[10,2034,2035],{},[26,2036],{"alt":2037,"src":2038},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2040,2041,2042,335,2044,2047,2048,335],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2043,1446],{},[33,2045,2046],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2049,1754],{},[14,2051,39],{"id":39},[41,2053,2054,2060,2069],{},[44,2055,2056,2059],{},[33,2057,2058],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[44,2061,2062,2065,2066,335],{},[33,2063,2064],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2067,2068],{},"12",[44,2070,2071],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2073,58],{"id":58},[10,2075,61],{},[63,2077,2079],{"className":65,"code":2078,"language":67,"meta":68,"style":68},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2080,2081,2086,2091],{"__ignoreMap":68},[72,2082,2083],{"class":74,"line":75},[72,2084,2085],{},"print(42)\n",[72,2087,2088],{"class":74,"line":81},[72,2089,2090],{},"print(7 + 5)\n",[72,2092,2093],{"class":74,"line":88},[72,2094,2095],{},"print(\"Python 基础课\")\n",[10,2097,117],{},[63,2099,2102],{"className":2100,"code":2101,"language":123,"meta":68},[121],"42\n12\nPython 基础课\n",[33,2103,2101],{"__ignoreMap":68},[10,2105,128],{},[14,2107,131],{"id":131},[133,2109,2110,2118],{},[44,2111,2112,2115,2116,335],{},[33,2113,2114],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2117,2068],{},[44,2119,2120,2122,2123,2126],{},[33,2121,1446],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2124,2125],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2128,152],{"id":152},[41,2130,2131,2134],{},[44,2132,2133],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[44,2135,2136],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2138,163],{"id":163},[133,2140,2141,2144],{},[44,2142,2143],{},"分别输出一个整数、一个小数和一段文本。",[44,2145,2146,2147,2149,2150,2153],{},"比较 ",[33,2148,2046],{}," 与 ",[33,2151,2152],{},"print(\"2 + 3\")"," 的结果。",[10,2155,178],{},[14,2157,181],{"id":181},[10,2159,2160],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2162,188],{},{"title":68,"searchDepth":81,"depth":81,"links":2164},[2165,2166,2167,2168,2169,2170,2171,2172],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2020,"description":2025},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[199,2180,2181],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2184,"title":2185,"body":2186,"category":199,"cover":200,"description":2190,"extension":201,"meta":2356,"navigation":84,"path":2357,"pinned":204,"publishedAt":205,"seo":2358,"slug":2359,"stem":2360,"summary":2361,"tags":2362,"updatedAt":205,"visible":84,"__hash__":2365},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2187,"toc":2346},[2188,2191,2193,2196,2198,2204,2207,2209,2235,2237,2239,2267,2269,2275,2277,2279,2303,2305,2320,2322,2337,2339,2341,2344],[10,2189,2190],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2192,16],{"id":16},[10,2194,2195],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2197,22],{"id":22},[10,2199,2200],{},[26,2201],{"alt":2202,"src":2203},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2205,2206],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2208,39],{"id":39},[41,2210,2211,2214,2224],{},[44,2212,2213],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[44,2215,2216,2217,2149,2220,2223],{},"变量名区分大小写，",[33,2218,2219],{},"score",[33,2221,2222],{},"Score"," 是两个名字。",[44,2225,2226,2227,2230,2231,2234],{},"使用能表达含义的名称；不要用 ",[33,2228,2229],{},"list","、",[33,2232,2233],{},"str"," 等内置名称作为普通变量名。",[14,2236,58],{"id":58},[10,2238,61],{},[63,2240,2242],{"className":65,"code":2241,"language":67,"meta":68,"style":68},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2243,2244,2249,2254,2258,2263],{"__ignoreMap":68},[72,2245,2246],{"class":74,"line":75},[72,2247,2248],{},"score = 90\n",[72,2250,2251],{"class":74,"line":81},[72,2252,2253],{},"print(score)\n",[72,2255,2256],{"class":74,"line":88},[72,2257,85],{"emptyLinePlaceholder":84},[72,2259,2260],{"class":74,"line":94},[72,2261,2262],{},"score = 95\n",[72,2264,2265],{"class":74,"line":100},[72,2266,2253],{},[10,2268,117],{},[63,2270,2273],{"className":2271,"code":2272,"language":123,"meta":68},[121],"90\n95\n",[33,2274,2272],{"__ignoreMap":68},[10,2276,128],{},[14,2278,131],{"id":131},[133,2280,2281,2290],{},[44,2282,911,2283,2286,2287,2289],{},[33,2284,2285],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2288,2219],{}," 再绑定到它。",[44,2291,911,2292,2295,2296,2299,2300,335],{},[33,2293,2294],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2297,2298],{},"90"," 没有被改造成 ",[33,2301,2302],{},"95",[14,2304,152],{"id":152},[41,2306,2307,2310],{},[44,2308,2309],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[44,2311,171,2312,2230,2314,2230,2316,2319],{},[33,2313,2229],{},[33,2315,2233],{},[33,2317,2318],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2321,163],{"id":163},[133,2323,2324,2334],{},[44,2325,2326,2327,1130,2330,2333],{},"创建 ",[33,2328,2329],{},"course_name",[33,2331,2332],{},"lesson_count"," 两个变量并输出。",[44,2335,2336],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2338,178],{},[14,2340,181],{"id":181},[10,2342,2343],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2345,188],{},{"title":68,"searchDepth":81,"depth":81,"links":2347},[2348,2349,2350,2351,2352,2353,2354,2355],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2185,"description":2190},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[199,2363,2364],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2367,"title":2368,"body":2369,"category":199,"cover":200,"description":2373,"extension":201,"meta":2538,"navigation":84,"path":2539,"pinned":204,"publishedAt":205,"seo":2540,"slug":2541,"stem":2542,"summary":2543,"tags":2544,"updatedAt":205,"visible":84,"__hash__":2547},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2370,"toc":2528},[2371,2374,2376,2379,2381,2387,2390,2392,2421,2423,2425,2470,2472,2478,2480,2482,2496,2498,2509,2511,2519,2521,2523,2526],[10,2372,2373],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2375,16],{"id":16},[10,2377,2378],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2380,22],{"id":22},[10,2382,2383],{},[26,2384],{"alt":2385,"src":2386},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2388,2389],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2391,39],{"id":39},[41,2393,2394,2404,2418],{},[44,2395,2396,2399,2400,2403],{},[33,2397,2398],{},"int"," 表示整数，",[33,2401,2402],{},"float"," 表示浮点数。",[44,2405,2406,2409,2410,2413,2414,2417],{},[33,2407,2408],{},"\u002F"," 总是进行真除法；",[33,2411,2412],{},"\u002F\u002F"," 是向下取整除法，",[33,2415,2416],{},"%"," 得到余数。",[44,2419,2420],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2422,58],{"id":58},[10,2424,61],{},[63,2426,2428],{"className":65,"code":2427,"language":67,"meta":68,"style":68},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2429,2430,2435,2440,2445,2449,2454,2459,2464],{"__ignoreMap":68},[72,2431,2432],{"class":74,"line":75},[72,2433,2434],{},"price = 25\n",[72,2436,2437],{"class":74,"line":81},[72,2438,2439],{},"count = 4\n",[72,2441,2442],{"class":74,"line":88},[72,2443,2444],{},"discount = 0.9\n",[72,2446,2447],{"class":74,"line":94},[72,2448,85],{"emptyLinePlaceholder":84},[72,2450,2451],{"class":74,"line":100},[72,2452,2453],{},"total = price * count * discount\n",[72,2455,2456],{"class":74,"line":105},[72,2457,2458],{},"average = total \u002F count\n",[72,2460,2461],{"class":74,"line":111},[72,2462,2463],{},"print(total)\n",[72,2465,2467],{"class":74,"line":2466},8,[72,2468,2469],{},"print(average)\n",[10,2471,117],{},[63,2473,2476],{"className":2474,"code":2475,"language":123,"meta":68},[121],"90.0\n22.5\n",[33,2477,2475],{"__ignoreMap":68},[10,2479,128],{},[14,2481,131],{"id":131},[133,2483,2484,2490],{},[44,2485,2486,2489],{},[33,2487,2488],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[44,2491,2492,2495],{},[33,2493,2494],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2497,152],{"id":152},[41,2499,2500,2506],{},[44,2501,2502,2503,335],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2504,2505],{},"decimal.Decimal",[44,2507,2508],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2510,163],{"id":163},[133,2512,2513,2516],{},[44,2514,2515],{},"计算 137 除以 10 的商和余数。",[44,2517,2518],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2520,178],{},[14,2522,181],{"id":181},[10,2524,2525],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2527,188],{},{"title":68,"searchDepth":81,"depth":81,"links":2529},[2530,2531,2532,2533,2534,2535,2536,2537],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2368,"description":2373},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[199,2545,2546],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2549,"title":2550,"body":2551,"category":199,"cover":200,"description":2555,"extension":201,"meta":2731,"navigation":84,"path":2732,"pinned":204,"publishedAt":205,"seo":2733,"slug":2734,"stem":2735,"summary":2736,"tags":2737,"updatedAt":205,"visible":84,"__hash__":2740},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2552,"toc":2719},[2553,2556,2558,2561,2563,2569,2579,2581,2592,2594,2596,2626,2628,2634,2636,2638,2668,2671,2674,2680,2683,2685,2693,2695,2710,2712,2714,2717],[10,2554,2555],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2557,16],{"id":16},[10,2559,2560],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2562,22],{"id":22},[10,2564,2565],{},[26,2566],{"alt":2567,"src":2568},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2570,2571,2572,2575,2576,335],{},"切片 ",[33,2573,2574],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2577,2578],{},"stop - start",[14,2580,39],{"id":39},[41,2582,2583,2586,2589],{},[44,2584,2585],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[44,2587,2588],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[44,2590,2591],{},"切片会创建新的字符串，不会修改原字符串。",[14,2593,58],{"id":58},[10,2595,61],{},[63,2597,2599],{"className":65,"code":2598,"language":67,"meta":68,"style":68},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2600,2601,2606,2611,2616,2621],{"__ignoreMap":68},[72,2602,2603],{"class":74,"line":75},[72,2604,2605],{},"language = \"Python\"\n",[72,2607,2608],{"class":74,"line":81},[72,2609,2610],{},"print(language[0])\n",[72,2612,2613],{"class":74,"line":88},[72,2614,2615],{},"print(language[-1])\n",[72,2617,2618],{"class":74,"line":94},[72,2619,2620],{},"print(language[0:3])\n",[72,2622,2623],{"class":74,"line":100},[72,2624,2625],{},"print(language + \" 3.14\")\n",[10,2627,117],{},[63,2629,2632],{"className":2630,"code":2631,"language":123,"meta":68},[121],"P\nn\nPyt\nPython 3.14\n",[33,2633,2631],{"__ignoreMap":68},[10,2635,128],{},[14,2637,131],{"id":131},[133,2639,2640,2654],{},[44,2641,2642,2643,2645,2646,2649,2650,2653],{},"字符串 ",[33,2644,199],{}," 的正索引从 ",[33,2647,2648],{},"P"," 的 0 开始，负索引从末尾 ",[33,2651,2652],{},"n"," 的 -1 开始。",[44,2655,2656,2659,2660,2663,2664,2667],{},[33,2657,2658],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2661,2662],{},"Pyt","；索引 3 的 ",[33,2665,2666],{},"h"," 不在结果中。",[301,2669,2670],{"id":2670},"再看一个具体细节",[10,2672,2673],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2675,2676],{},[26,2677],{"alt":2678,"src":2679},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2681,2682],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2684,152],{"id":152},[41,2686,2687,2690],{},[44,2688,2689],{},"把第一个字符写成索引 1，造成整体偏移一位。",[44,2691,2692],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2694,163],{"id":163},[133,2696,2697,2707],{},[44,2698,2699,2700,2703,2704,335],{},"从 ",[33,2701,2702],{},"\"programming\""," 中切出 ",[33,2705,2706],{},"\"gram\"",[44,2708,2709],{},"使用负索引取得字符串倒数第二个字符。",[10,2711,178],{},[14,2713,181],{"id":181},[10,2715,2716],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2718,188],{},{"title":68,"searchDepth":81,"depth":81,"links":2720},[2721,2722,2723,2724,2725,2728,2729,2730],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":2726},[2727],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2550,"description":2555},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[199,2738,2739],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2742,"title":2743,"body":2744,"category":199,"cover":200,"description":2748,"extension":201,"meta":2962,"navigation":84,"path":2963,"pinned":204,"publishedAt":205,"seo":2964,"slug":2965,"stem":2966,"summary":2967,"tags":2968,"updatedAt":205,"visible":84,"__hash__":2971},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2745,"toc":2950},[2746,2749,2751,2754,2756,2762,2772,2774,2807,2809,2811,2855,2857,2863,2865,2867,2888,2890,2893,2899,2907,2909,2923,2925,2941,2943,2945,2948],[10,2747,2748],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2750,16],{"id":16},[10,2752,2753],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2755,22],{"id":22},[10,2757,2758],{},[26,2759],{"alt":2760,"src":2761},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2763,2764,2765,982,2768,2771],{},"比较表达式先产生 ",[33,2766,2767],{},"True",[33,2769,2770],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2773,39],{"id":39},[41,2775,2776,2790,2804],{},[44,2777,2778,2781,2782,2785,2786,2789],{},[33,2779,2780],{},"=="," 判断是否相等，",[33,2783,2784],{},"!="," 判断是否不等；单个 ",[33,2787,2788],{},"="," 是赋值。",[44,2791,2792,2795,2796,2799,2800,2803],{},[33,2793,2794],{},"and"," 要求两侧都为真，",[33,2797,2798],{},"or"," 只需一侧为真，",[33,2801,2802],{},"not"," 取反。",[44,2805,2806],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2808,58],{"id":58},[10,2810,61],{},[63,2812,2814],{"className":65,"code":2813,"language":67,"meta":68,"style":68},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[33,2815,2816,2821,2826,2830,2835,2840,2845,2850],{"__ignoreMap":68},[72,2817,2818],{"class":74,"line":75},[72,2819,2820],{},"age = 20\n",[72,2822,2823],{"class":74,"line":81},[72,2824,2825],{},"has_ticket = True\n",[72,2827,2828],{"class":74,"line":88},[72,2829,85],{"emptyLinePlaceholder":84},[72,2831,2832],{"class":74,"line":94},[72,2833,2834],{},"is_adult = age >= 18\n",[72,2836,2837],{"class":74,"line":100},[72,2838,2839],{},"can_enter = is_adult and has_ticket\n",[72,2841,2842],{"class":74,"line":105},[72,2843,2844],{},"print(is_adult)\n",[72,2846,2847],{"class":74,"line":111},[72,2848,2849],{},"print(can_enter)\n",[72,2851,2852],{"class":74,"line":2466},[72,2853,2854],{},"print(not has_ticket)\n",[10,2856,117],{},[63,2858,2861],{"className":2859,"code":2860,"language":123,"meta":68},[121],"True\nTrue\nFalse\n",[33,2862,2860],{"__ignoreMap":68},[10,2864,128],{},[14,2866,131],{"id":131},[133,2868,2869,2879],{},[44,2870,2871,2874,2875,2878],{},[33,2872,2873],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2876,2877],{},"is_adult","，这一步没有任何分支跳转。",[44,2880,2881,2884,2885,2887],{},[33,2882,2883],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2886,2802],{}," 只对紧随其后的值取反。",[301,2889,2670],{"id":2670},[10,2891,2892],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2894,2895],{},[26,2896],{"alt":2897,"src":2898},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2900,2901,2903,2904,2906],{},[33,2902,2794],{}," 只有“真、真”得到真；",[33,2905,2798],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2908,152],{"id":152},[41,2910,2911,2920],{},[44,2912,2913,2914,2916,2917,2919],{},"用单个等号判断相等。",[33,2915,2788],{}," 是赋值，",[33,2918,2780],{}," 才是相等比较。",[44,2921,2922],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2924,163],{"id":163},[133,2926,2927,2934],{},[44,2928,2929,2930,2933],{},"判断数字 ",[33,2931,2932],{},"15"," 是否同时大于 10 且小于 20。",[44,2935,2936,2937,2940],{},"分别修改年龄和票据状态，记录 ",[33,2938,2939],{},"can_enter"," 的四种组合结果。",[10,2942,178],{},[14,2944,181],{"id":181},[10,2946,2947],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,2949,188],{},{"title":68,"searchDepth":81,"depth":81,"links":2951},[2952,2953,2954,2955,2956,2959,2960,2961],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":2957},[2958],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2743,"description":2748},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[199,2969,2970],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2973,"title":2974,"body":2975,"category":199,"cover":200,"description":2979,"extension":201,"meta":3147,"navigation":84,"path":3148,"pinned":204,"publishedAt":205,"seo":3149,"slug":3150,"stem":3151,"summary":3152,"tags":3153,"updatedAt":205,"visible":84,"__hash__":3155},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2976,"toc":3137},[2977,2980,2982,2985,2987,2993,3011,3013,3026,3028,3030,3064,3066,3072,3074,3076,3098,3100,3112,3114,3128,3130,3132,3135],[10,2978,2979],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2981,16],{"id":16},[10,2983,2984],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2986,22],{"id":22},[10,2988,2989],{},[26,2990],{"alt":2991,"src":2992},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2994,2995,2998,2999,3002,3003,3006,3007,3010],{},[33,2996,2997],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3000,3001],{},"18","，程序首先得到的也是 ",[33,3004,3005],{},"\"18\"","，需要 ",[33,3008,3009],{},"int()"," 后才能按整数参与计算。",[14,3012,39],{"id":39},[41,3014,3015,3018,3023],{},[44,3016,3017],{},"提示文字应告诉用户需要输入什么。",[44,3019,3020,3022],{},[33,3021,3009],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[44,3024,3025],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3027,58],{"id":58},[10,3029,61],{},[63,3031,3033],{"className":65,"code":3032,"language":67,"meta":68,"style":68},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3034,3035,3040,3045,3050,3054,3059],{"__ignoreMap":68},[72,3036,3037],{"class":74,"line":75},[72,3038,3039],{},"name = input(\"请输入姓名：\")\n",[72,3041,3042],{"class":74,"line":81},[72,3043,3044],{},"age_text = input(\"请输入年龄：\")\n",[72,3046,3047],{"class":74,"line":88},[72,3048,3049],{},"age = int(age_text)\n",[72,3051,3052],{"class":74,"line":94},[72,3053,85],{"emptyLinePlaceholder":84},[72,3055,3056],{"class":74,"line":100},[72,3057,3058],{},"print(\"你好，\" + name)\n",[72,3060,3061],{"class":74,"line":105},[72,3062,3063],{},"print(age + 1)\n",[10,3065,117],{},[63,3067,3070],{"className":3068,"code":3069,"language":123,"meta":68},[121],"根据输入显示姓名，并输出下一年的年龄\n",[33,3071,3069],{"__ignoreMap":68},[10,3073,128],{},[14,3075,131],{"id":131},[133,3077,3078,3088],{},[44,3079,3080,3081,3083,3084,3087],{},"两次 ",[33,3082,2997],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3085,3086],{},"age_text"," 用来提醒这仍是文本。",[44,3089,3090,3093,3094,3097],{},[33,3091,3092],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3095,3096],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3099,152],{"id":152},[41,3101,3102,3109],{},[44,3103,3104,3105,3108],{},"直接计算 ",[33,3106,3107],{},"input(...) + 1","，忽略输入结果是字符串。",[44,3110,3111],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3113,163],{"id":163},[133,3115,3116,3119],{},[44,3117,3118],{},"接收两个整数并输出它们的和。",[44,3120,1693,3121,3124,3125,3127],{},[33,3122,3123],{},"18.5"," 给 ",[33,3126,3009],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3129,178],{},[14,3131,181],{"id":181},[10,3133,3134],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3136,188],{},{"title":68,"searchDepth":81,"depth":81,"links":3138},[3139,3140,3141,3142,3143,3144,3145,3146],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2974,"description":2979},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[199,2318,3154],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3157,"title":3158,"body":3159,"category":199,"cover":200,"description":3163,"extension":201,"meta":3323,"navigation":84,"path":3324,"pinned":204,"publishedAt":205,"seo":3325,"slug":3326,"stem":3327,"summary":3328,"tags":3329,"updatedAt":205,"visible":84,"__hash__":3332},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3160,"toc":3313},[3161,3164,3166,3169,3171,3177,3184,3186,3200,3202,3204,3243,3245,3251,3253,3255,3274,3276,3291,3293,3304,3306,3308,3311],[10,3162,3163],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3165,16],{"id":16},[10,3167,3168],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3170,22],{"id":22},[10,3172,3173],{},[26,3174],{"alt":3175,"src":3176},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3178,3179,3180,3183],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3181,3182],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3185,39],{"id":39},[41,3187,3188,3191,3194],{},[44,3189,3190],{},"列表使用方括号，元素之间用逗号分隔。",[44,3192,3193],{},"列表可变，可以替换、追加和删除元素。",[44,3195,3196,3197,335],{},"访问不存在的索引会产生 ",[33,3198,3199],{},"IndexError",[14,3201,58],{"id":58},[10,3203,61],{},[63,3205,3207],{"className":65,"code":3206,"language":67,"meta":68,"style":68},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3208,3209,3214,3219,3223,3228,3233,3238],{"__ignoreMap":68},[72,3210,3211],{"class":74,"line":75},[72,3212,3213],{},"scores = [82, 90, 76]\n",[72,3215,3216],{"class":74,"line":81},[72,3217,3218],{},"print(scores[0])\n",[72,3220,3221],{"class":74,"line":88},[72,3222,85],{"emptyLinePlaceholder":84},[72,3224,3225],{"class":74,"line":94},[72,3226,3227],{},"scores[1] = 95\n",[72,3229,3230],{"class":74,"line":100},[72,3231,3232],{},"scores.append(88)\n",[72,3234,3235],{"class":74,"line":105},[72,3236,3237],{},"print(scores)\n",[72,3239,3240],{"class":74,"line":111},[72,3241,3242],{},"print(len(scores))\n",[10,3244,117],{},[63,3246,3249],{"className":3247,"code":3248,"language":123,"meta":68},[121],"82\n[82, 95, 76, 88]\n4\n",[33,3250,3248],{"__ignoreMap":68},[10,3252,128],{},[14,3254,131],{"id":131},[133,3256,3257,3260],{},[44,3258,3259],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[44,3261,3262,3265,3266,3269,3270,3273],{},[33,3263,3264],{},"scores[1] = 95"," 替换第二个位置，",[33,3267,3268],{},"append(88)"," 在末尾增加新位置，",[33,3271,3272],{},"len()"," 因而从 3 变为 4。",[14,3275,152],{"id":152},[41,3277,3278,3288],{},[44,3279,3280,3281,3284,3285,335],{},"访问 ",[33,3282,3283],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3286,3287],{},"len(scores) - 1",[44,3289,3290],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3292,163],{"id":163},[133,3294,3295,3298],{},[44,3296,3297],{},"建立三项学习任务列表，再追加第四项。",[44,3299,3300,3301,3303],{},"修改第二项，并用 ",[33,3302,3272],{}," 检查元素数量。",[10,3305,178],{},[14,3307,181],{"id":181},[10,3309,3310],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3312,188],{},{"title":68,"searchDepth":81,"depth":81,"links":3314},[3315,3316,3317,3318,3319,3320,3321,3322],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3158,"description":3163},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[199,3330,3331],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3334,"title":3335,"body":3336,"category":199,"cover":200,"description":3340,"extension":201,"meta":3481,"navigation":84,"path":3482,"pinned":204,"publishedAt":205,"seo":3483,"slug":3484,"stem":3485,"summary":3486,"tags":3487,"updatedAt":205,"visible":84,"__hash__":3489},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3337,"toc":3471},[3338,3341,3343,3346,3348,3354,3357,3359,3370,3372,3374,3408,3410,3416,3418,3420,3434,3436,3448,3450,3462,3464,3466,3469],[10,3339,3340],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3342,16],{"id":16},[10,3344,3345],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3347,22],{"id":22},[10,3349,3350],{},[26,3351],{"alt":3352,"src":3353},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3355,3356],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3358,39],{"id":39},[41,3360,3361,3364,3367],{},[44,3362,3363],{},"元组常用来表达固定数量、固定含义的一组值。",[44,3365,3366],{},"只有一个元素的元组必须保留尾随逗号。",[44,3368,3369],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3371,58],{"id":58},[10,3373,61],{},[63,3375,3377],{"className":65,"code":3376,"language":67,"meta":68,"style":68},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3378,3379,3384,3389,3394,3398,3403],{"__ignoreMap":68},[72,3380,3381],{"class":74,"line":75},[72,3382,3383],{},"point = (120, 80)\n",[72,3385,3386],{"class":74,"line":81},[72,3387,3388],{},"print(point[0])\n",[72,3390,3391],{"class":74,"line":88},[72,3392,3393],{},"print(point[1])\n",[72,3395,3396],{"class":74,"line":94},[72,3397,85],{"emptyLinePlaceholder":84},[72,3399,3400],{"class":74,"line":100},[72,3401,3402],{},"single = (5,)\n",[72,3404,3405],{"class":74,"line":105},[72,3406,3407],{},"print(single)\n",[10,3409,117],{},[63,3411,3414],{"className":3412,"code":3413,"language":123,"meta":68},[121],"120\n80\n(5,)\n",[33,3415,3413],{"__ignoreMap":68},[10,3417,128],{},[14,3419,131],{"id":131},[133,3421,3422,3428],{},[44,3423,3424,3427],{},[33,3425,3426],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[44,3429,3430,3433],{},[33,3431,3432],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3435,152],{"id":152},[41,3437,3438,3445],{},[44,3439,3440,3441,3444],{},"把 ",[33,3442,3443],{},"(5)"," 当作元组，实际它仍是整数。",[44,3446,3447],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3449,163],{"id":163},[133,3451,3452,3455],{},[44,3453,3454],{},"用元组表示宽度和高度。",[44,3456,2146,3457,2149,3459,3461],{},[33,3458,3443],{},[33,3460,3432],{}," 的类型。",[10,3463,178],{},[14,3465,181],{"id":181},[10,3467,3468],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3470,188],{},{"title":68,"searchDepth":81,"depth":81,"links":3472},[3473,3474,3475,3476,3477,3478,3479,3480],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3335,"description":3340},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[199,3488,3331],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3491,"title":3492,"body":3493,"category":199,"cover":200,"description":3497,"extension":201,"meta":3652,"navigation":84,"path":3653,"pinned":204,"publishedAt":205,"seo":3654,"slug":3655,"stem":3656,"summary":3657,"tags":3658,"updatedAt":205,"visible":84,"__hash__":3660},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3494,"toc":3642},[3495,3498,3500,3503,3505,3511,3521,3523,3537,3539,3541,3575,3577,3583,3585,3587,3602,3604,3623,3625,3633,3635,3637,3640],[10,3496,3497],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3499,16],{"id":16},[10,3501,3502],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3504,22],{"id":22},[10,3506,3507],{},[26,3508],{"alt":3509,"src":3510},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3512,3513,3514,3517,3518,3520],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3515,3516],{},"student[\"score\"]"," 读取的是键 ",[33,3519,2219],{}," 对应的值，而不是“第几个元素”。",[14,3522,39],{"id":39},[41,3524,3525,3528,3534],{},[44,3526,3527],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[44,3529,171,3530,3533],{},[33,3531,3532],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[44,3535,3536],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3538,58],{"id":58},[10,3540,61],{},[63,3542,3544],{"className":65,"code":3543,"language":67,"meta":68,"style":68},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3545,3546,3551,3556,3560,3565,3570],{"__ignoreMap":68},[72,3547,3548],{"class":74,"line":75},[72,3549,3550],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[72,3552,3553],{"class":74,"line":81},[72,3554,3555],{},"print(student[\"name\"])\n",[72,3557,3558],{"class":74,"line":88},[72,3559,85],{"emptyLinePlaceholder":84},[72,3561,3562],{"class":74,"line":94},[72,3563,3564],{},"student[\"score\"] = 95\n",[72,3566,3567],{"class":74,"line":100},[72,3568,3569],{},"student[\"city\"] = \"郑州\"\n",[72,3571,3572],{"class":74,"line":105},[72,3573,3574],{},"print(student)\n",[10,3576,117],{},[63,3578,3581],{"className":3579,"code":3580,"language":123,"meta":68},[121],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3582,3580],{"__ignoreMap":68},[10,3584,128],{},[14,3586,131],{"id":131},[133,3588,3589,3592],{},[44,3590,3591],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[44,3593,3594,3595,3597,3598,3601],{},"给已有键 ",[33,3596,2219],{}," 赋值会更新映射，给新键 ",[33,3599,3600],{},"city"," 赋值会增加映射。",[14,3603,152],{"id":152},[41,3605,3606,3613],{},[44,3607,3608,3609,3612],{},"按位置理解字典并尝试 ",[33,3610,3611],{},"student[0]","，而实际键是字符串。",[44,3614,3615,3616,3619,3620,335],{},"直接读取不确定存在的键并忽略 ",[33,3617,3618],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3621,3622],{},"get()",[14,3624,163],{"id":163},[133,3626,3627,3630],{},[44,3628,3629],{},"建立一本书的标题、作者和页数字典。",[44,3631,3632],{},"添加分类键，再修改页数。",[10,3634,178],{},[14,3636,181],{"id":181},[10,3638,3639],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3641,188],{},{"title":68,"searchDepth":81,"depth":81,"links":3643},[3644,3645,3646,3647,3648,3649,3650,3651],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3492,"description":3497},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[199,3659,3331],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3662,"title":3663,"body":3664,"category":199,"cover":200,"description":3668,"extension":201,"meta":3817,"navigation":84,"path":3818,"pinned":204,"publishedAt":205,"seo":3819,"slug":3820,"stem":3821,"summary":3822,"tags":3823,"updatedAt":205,"visible":84,"__hash__":3825},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3665,"toc":3807},[3666,3669,3671,3674,3676,3682,3685,3687,3706,3708,3710,3744,3746,3752,3754,3756,3771,3773,3785,3787,3798,3800,3802,3805],[10,3667,3668],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3670,16],{"id":16},[10,3672,3673],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3675,22],{"id":22},[10,3677,3678],{},[26,3679],{"alt":3680,"src":3681},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3683,3684],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3686,39],{"id":39},[41,3688,3689,3692,3695],{},[44,3690,3691],{},"集合中的元素不重复。",[44,3693,3694],{},"集合是无序容器，不要依赖打印顺序或索引。",[44,3696,3697,3698,3701,3702,3705],{},"创建空集合必须写 ",[33,3699,3700],{},"set()","；",[33,3703,3704],{},"{}"," 创建的是空字典。",[14,3707,58],{"id":58},[10,3709,61],{},[63,3711,3713],{"className":65,"code":3712,"language":67,"meta":68,"style":68},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3714,3715,3720,3725,3729,3734,3739],{"__ignoreMap":68},[72,3716,3717],{"class":74,"line":75},[72,3718,3719],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[72,3721,3722],{"class":74,"line":81},[72,3723,3724],{},"right = {\"Python\", \"Docker\"}\n",[72,3726,3727],{"class":74,"line":88},[72,3728,85],{"emptyLinePlaceholder":84},[72,3730,3731],{"class":74,"line":94},[72,3732,3733],{},"print(left & right)\n",[72,3735,3736],{"class":74,"line":100},[72,3737,3738],{},"print(left | right)\n",[72,3740,3741],{"class":74,"line":105},[72,3742,3743],{},"print(\"Git\" in left)\n",[10,3745,117],{},[63,3747,3750],{"className":3748,"code":3749,"language":123,"meta":68},[121],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3751,3749],{"__ignoreMap":68},[10,3753,128],{},[14,3755,131],{"id":131},[133,3757,3758,3761],{},[44,3759,3760],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[44,3762,3763,3766,3767,3770],{},[33,3764,3765],{},"&"," 计算交集，",[33,3768,3769],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3772,152],{"id":152},[41,3774,3775,3782],{},[44,3776,171,3777,3779,3780,335],{},[33,3778,3704],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3781,3700],{},[44,3783,3784],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3786,163],{"id":163},[133,3788,3789,3795],{},[44,3790,3791,3792,3794],{},"把包含重复标签的列表交给 ",[33,3793,3700],{}," 去重。",[44,3796,3797],{},"计算两组课程标签的交集和差集。",[10,3799,178],{},[14,3801,181],{"id":181},[10,3803,3804],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,3806,188],{},{"title":68,"searchDepth":81,"depth":81,"links":3808},[3809,3810,3811,3812,3813,3814,3815,3816],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3663,"description":3668},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[199,3824,3331],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3827,"title":3828,"body":3829,"category":199,"cover":200,"description":3833,"extension":201,"meta":4031,"navigation":84,"path":4032,"pinned":204,"publishedAt":205,"seo":4033,"slug":4034,"stem":4035,"summary":4036,"tags":4037,"updatedAt":205,"visible":84,"__hash__":4040},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3830,"toc":4019},[3831,3834,3836,3839,3841,3847,3857,3859,3876,3878,3880,3930,3932,3938,3940,3942,3964,3966,3969,3975,3978,3980,3993,3995,4010,4012,4014,4017],[10,3832,3833],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3835,16],{"id":16},[10,3837,3838],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3840,22],{"id":22},[10,3842,3843],{},[26,3844],{"alt":3845,"src":3846},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3848,3849,3852,3853,3856],{},[33,3850,3851],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3854,3855],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3858,39],{"id":39},[41,3860,3861,3870,3873],{},[44,3862,3863,3865,3866,3869],{},[33,3864,2780],{}," 比较内容是否相等，",[33,3867,3868],{},"is"," 比较是否为同一个对象。",[44,3871,3872],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[44,3874,3875],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3877,58],{"id":58},[10,3879,61],{},[63,3881,3883],{"className":65,"code":3882,"language":67,"meta":68,"style":68},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3884,3885,3890,3895,3900,3904,3909,3914,3919,3924],{"__ignoreMap":68},[72,3886,3887],{"class":74,"line":75},[72,3888,3889],{},"tasks = [\"变量\", \"字符串\"]\n",[72,3891,3892],{"class":74,"line":81},[72,3893,3894],{},"shared = tasks\n",[72,3896,3897],{"class":74,"line":88},[72,3898,3899],{},"backup = tasks.copy()\n",[72,3901,3902],{"class":74,"line":94},[72,3903,85],{"emptyLinePlaceholder":84},[72,3905,3906],{"class":74,"line":100},[72,3907,3908],{},"tasks.append(\"列表\")\n",[72,3910,3911],{"class":74,"line":105},[72,3912,3913],{},"print(shared)\n",[72,3915,3916],{"class":74,"line":111},[72,3917,3918],{},"print(backup)\n",[72,3920,3921],{"class":74,"line":2466},[72,3922,3923],{},"print(tasks is shared)\n",[72,3925,3927],{"class":74,"line":3926},9,[72,3928,3929],{},"print(tasks is backup)\n",[10,3931,117],{},[63,3933,3936],{"className":3934,"code":3935,"language":123,"meta":68},[121],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3937,3935],{"__ignoreMap":68},[10,3939,128],{},[14,3941,131],{"id":131},[133,3943,3944,3950],{},[44,3945,3946,3949],{},[33,3947,3948],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[44,3951,3952,3955,3956,3959,3960,3963],{},[33,3953,3954],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3957,3958],{},"shared"," 能观察到变化，",[33,3961,3962],{},"backup"," 不会。",[301,3965,2670],{"id":2670},[10,3967,3968],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3970,3971],{},[26,3972],{"alt":3973,"src":3974},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3976,3977],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3979,152],{"id":152},[41,3981,3982,3990],{},[44,3983,3984,3985,3987,3988,335],{},"用 ",[33,3986,2780],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,3989,3868],{},[44,3991,3992],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3994,163],{"id":163},[133,3996,3997,4000],{},[44,3998,3999],{},"让两个变量引用同一个字典并修改其中一个。",[44,4001,171,4002,4005,4006,1130,4008,335],{},[33,4003,4004],{},"copy()"," 创建外层副本，再比较 ",[33,4007,3868],{},[33,4009,2780],{},[10,4011,178],{},[14,4013,181],{"id":181},[10,4015,4016],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4018,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4020},[4021,4022,4023,4024,4025,4028,4029,4030],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":4026},[4027],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3828,"description":3833},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[199,4038,4039],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4042,"title":4043,"body":4044,"category":199,"cover":200,"description":4048,"extension":201,"meta":4261,"navigation":84,"path":4262,"pinned":204,"publishedAt":205,"seo":4263,"slug":4264,"stem":4265,"summary":4266,"tags":4267,"updatedAt":205,"visible":84,"__hash__":4269},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4045,"toc":4248},[4046,4049,4051,4054,4056,4062,4072,4074,4085,4087,4089,4142,4144,4150,4152,4154,4172,4174,4177,4183,4191,4194,4197,4203,4209,4211,4229,4231,4239,4241,4243,4246],[10,4047,4048],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4050,16],{"id":16},[10,4052,4053],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4055,22],{"id":22},[10,4057,4058],{},[26,4059],{"alt":4060,"src":4061},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4063,4064,2230,4066,2230,4069,4071],{},[33,4065,1129],{},[33,4067,4068],{},"elif",[33,4070,1133],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4073,39],{"id":39},[41,4075,4076,4079,4082],{},[44,4077,4078],{},"冒号表示接下来开始一个代码块。",[44,4080,4081],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[44,4083,4084],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4086,58],{"id":58},[10,4088,61],{},[63,4090,4092],{"className":65,"code":4091,"language":67,"meta":68,"style":68},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4093,4094,4099,4103,4108,4113,4118,4123,4127,4132,4136],{"__ignoreMap":68},[72,4095,4096],{"class":74,"line":75},[72,4097,4098],{},"score = int(input(\"请输入分数：\"))\n",[72,4100,4101],{"class":74,"line":81},[72,4102,85],{"emptyLinePlaceholder":84},[72,4104,4105],{"class":74,"line":88},[72,4106,4107],{},"if score >= 90:\n",[72,4109,4110],{"class":74,"line":94},[72,4111,4112],{},"    level = \"优秀\"\n",[72,4114,4115],{"class":74,"line":100},[72,4116,4117],{},"elif score >= 60:\n",[72,4119,4120],{"class":74,"line":105},[72,4121,4122],{},"    level = \"合格\"\n",[72,4124,4125],{"class":74,"line":111},[72,4126,1119],{},[72,4128,4129],{"class":74,"line":2466},[72,4130,4131],{},"    level = \"需要继续学习\"\n",[72,4133,4134],{"class":74,"line":3926},[72,4135,85],{"emptyLinePlaceholder":84},[72,4137,4139],{"class":74,"line":4138},10,[72,4140,4141],{},"print(level)\n",[10,4143,117],{},[63,4145,4148],{"className":4146,"code":4147,"language":123,"meta":68},[121],"输入 85 时输出：合格\n",[33,4149,4147],{"__ignoreMap":68},[10,4151,128],{},[14,4153,131],{"id":131},[133,4155,4156,4163],{},[44,4157,4158,4159,4162],{},"输入先转换为整数，程序从 ",[33,4160,4161],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[44,4164,4165,4168,4169,4171],{},[33,4166,4167],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4170,1133],{}," 被跳过；最终三个分支只会选择一个。",[301,4173,2670],{"id":2670},[10,4175,4176],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4178,4179],{},[26,4180],{"alt":4181,"src":4182},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4184,4185,4187,4188,4190],{},[33,4186,4161],{}," 必须放在 ",[33,4189,4167],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[301,4192,2670],{"id":4193},"再看一个具体细节-1",[10,4195,4196],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4198,4199],{},[26,4200],{"alt":4201,"src":4202},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4204,4205,4206,4208],{},"同一缩进层级属于同一个代码块；回到 ",[33,4207,1129],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4210,152],{"id":152},[41,4212,4213,4219],{},[44,4214,4215,4216,4218],{},"先写 ",[33,4217,4167],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[44,4220,4221,4222,4224,4225,4228],{},"混用多个独立 ",[33,4223,1129],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4226,4227],{},"if\u002Felif\u002Felse"," 链。",[14,4230,163],{"id":163},[133,4232,4233,4236],{},[44,4234,4235],{},"根据温度输出“冷、适中、热”三个等级。",[44,4237,4238],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4240,178],{},[14,4242,181],{"id":181},[10,4244,4245],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4247,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4249},[4250,4251,4252,4253,4254,4258,4259,4260],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":4255},[4256,4257],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4043,"description":4048},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[199,1129,4268],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4271,"title":4272,"body":4273,"category":199,"cover":200,"description":4277,"extension":201,"meta":4442,"navigation":84,"path":4443,"pinned":204,"publishedAt":205,"seo":4444,"slug":4445,"stem":4446,"summary":4447,"tags":4448,"updatedAt":205,"visible":84,"__hash__":4450},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4274,"toc":4430},[4275,4278,4280,4283,4285,4291,4297,4299,4313,4315,4317,4355,4357,4363,4365,4367,4382,4384,4387,4393,4399,4401,4409,4411,4421,4423,4425,4428],[10,4276,4277],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4279,16],{"id":16},[10,4281,4282],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4284,22],{"id":22},[10,4286,4287],{},[26,4288],{"alt":4289,"src":4290},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4292,4293,4296],{},[33,4294,4295],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4298,39],{"id":39},[41,4300,4301,4304,4307],{},[44,4302,4303],{},"进入循环前先准备参与条件判断的状态。",[44,4305,4306],{},"循环体中必须有机会让条件变为假。",[44,4308,4309,4310,4312],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4311,35],{}," 通常更直接。",[14,4314,58],{"id":58},[10,4316,61],{},[63,4318,4320],{"className":65,"code":4319,"language":67,"meta":68,"style":68},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4321,4322,4327,4331,4336,4341,4346,4350],{"__ignoreMap":68},[72,4323,4324],{"class":74,"line":75},[72,4325,4326],{},"count = 1\n",[72,4328,4329],{"class":74,"line":81},[72,4330,85],{"emptyLinePlaceholder":84},[72,4332,4333],{"class":74,"line":88},[72,4334,4335],{},"while count \u003C= 3:\n",[72,4337,4338],{"class":74,"line":94},[72,4339,4340],{},"    print(\"第\", count, \"次练习\")\n",[72,4342,4343],{"class":74,"line":100},[72,4344,4345],{},"    count = count + 1\n",[72,4347,4348],{"class":74,"line":105},[72,4349,85],{"emptyLinePlaceholder":84},[72,4351,4352],{"class":74,"line":111},[72,4353,4354],{},"print(\"练习结束\")\n",[10,4356,117],{},[63,4358,4361],{"className":4359,"code":4360,"language":123,"meta":68},[121],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4362,4360],{"__ignoreMap":68},[10,4364,128],{},[14,4366,131],{"id":131},[133,4368,4369,4376],{},[44,4370,4371,4372,4375],{},"进入循环前 ",[33,4373,4374],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[44,4377,4378,4379,4381],{},"循环体末尾把 ",[33,4380,4374],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[301,4383,2670],{"id":2670},[10,4385,4386],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4388,4389],{},[26,4390],{"alt":4391,"src":4392},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4394,4395,4396,4398],{},"第4次检查时 ",[33,4397,4374],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4400,152],{"id":152},[41,4402,4403,4406],{},[44,4404,4405],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[44,4407,4408],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4410,163],{"id":163},[133,4412,4413,4418],{},[44,4414,171,4415,4417],{},[33,4416,4295],{}," 输出 1 到 5。",[44,4419,4420],{},"计算 1 到 10 的累加和。",[10,4422,178],{},[14,4424,181],{"id":181},[10,4426,4427],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4429,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4431},[4432,4433,4434,4435,4436,4439,4440,4441],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":4437},[4438],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4272,"description":4277},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[199,4295,4449],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4,"title":5,"body":4452,"category":199,"cover":200,"description":12,"extension":201,"meta":4577,"navigation":84,"path":203,"pinned":204,"publishedAt":205,"seo":4578,"slug":207,"stem":208,"summary":209,"tags":4579,"updatedAt":205,"visible":84,"__hash__":212},{"type":7,"value":4453,"toc":4567},[4454,4456,4458,4460,4462,4466,4470,4472,4482,4484,4486,4518,4520,4525,4527,4529,4541,4543,4549,4551,4559,4561,4563,4565],[10,4455,12],{},[14,4457,16],{"id":16},[10,4459,19],{},[14,4461,22],{"id":22},[10,4463,4464],{},[26,4465],{"alt":28,"src":29},[10,4467,4468,36],{},[33,4469,35],{},[14,4471,39],{"id":39},[41,4473,4474,4478,4480],{},[44,4475,4476,49],{},[33,4477,48],{},[44,4479,52],{},[44,4481,55],{},[14,4483,58],{"id":58},[10,4485,61],{},[63,4487,4488],{"className":65,"code":66,"language":67,"meta":68,"style":68},[33,4489,4490,4494,4498,4502,4506,4510,4514],{"__ignoreMap":68},[72,4491,4492],{"class":74,"line":75},[72,4493,78],{},[72,4495,4496],{"class":74,"line":81},[72,4497,85],{"emptyLinePlaceholder":84},[72,4499,4500],{"class":74,"line":88},[72,4501,91],{},[72,4503,4504],{"class":74,"line":94},[72,4505,97],{},[72,4507,4508],{"class":74,"line":100},[72,4509,85],{"emptyLinePlaceholder":84},[72,4511,4512],{"class":74,"line":105},[72,4513,108],{},[72,4515,4516],{"class":74,"line":111},[72,4517,114],{},[10,4519,117],{},[63,4521,4523],{"className":4522,"code":122,"language":123,"meta":68},[121],[33,4524,122],{"__ignoreMap":68},[10,4526,128],{},[14,4528,131],{"id":131},[133,4530,4531,4537],{},[44,4532,137,4533,140,4535,144],{},[33,4534,35],{},[33,4536,143],{},[44,4538,4539,149],{},[33,4540,48],{},[14,4542,152],{"id":152},[41,4544,4545,4547],{},[44,4546,157],{},[44,4548,160],{},[14,4550,163],{"id":163},[133,4552,4553,4555],{},[44,4554,168],{},[44,4556,171,4557,175],{},[33,4558,174],{},[10,4560,178],{},[14,4562,181],{"id":181},[10,4564,184],{},[186,4566,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4568},[4569,4570,4571,4572,4573,4574,4575,4576],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5,"description":12},[199,35,211],{"id":4581,"title":4582,"body":4583,"category":199,"cover":200,"description":4587,"extension":201,"meta":4761,"navigation":84,"path":4762,"pinned":204,"publishedAt":205,"seo":4763,"slug":4764,"stem":4765,"summary":4766,"tags":4767,"updatedAt":205,"visible":84,"__hash__":4768},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4584,"toc":4751},[4585,4588,4590,4593,4595,4601,4611,4613,4632,4634,4636,4688,4690,4696,4698,4700,4714,4716,4732,4734,4742,4744,4746,4749],[10,4586,4587],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4589,16],{"id":16},[10,4591,4592],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4594,22],{"id":22},[10,4596,4597],{},[26,4598],{"alt":4599,"src":4600},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4602,4603,4606,4607,4610],{},[33,4604,4605],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4608,4609],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4612,39],{"id":39},[41,4614,4615,4618,4626],{},[44,4616,4617],{},"先写普通循环，再在确有需要时加入流程控制语句。",[44,4619,4620,4622,4623,4625],{},[33,4621,4605],{}," 前要确认不会跳过 ",[33,4624,4295],{}," 循环中的状态更新。",[44,4627,4628,4629,4631],{},"多层嵌套中 ",[33,4630,4609],{}," 只结束它所在的最内层循环。",[14,4633,58],{"id":58},[10,4635,61],{},[63,4637,4639],{"className":65,"code":4638,"language":67,"meta":68,"style":68},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[33,4640,4641,4646,4650,4655,4660,4665,4670,4675,4679,4683],{"__ignoreMap":68},[72,4642,4643],{"class":74,"line":75},[72,4644,4645],{},"numbers = [3, -1, 0, 8, 12]\n",[72,4647,4648],{"class":74,"line":81},[72,4649,85],{"emptyLinePlaceholder":84},[72,4651,4652],{"class":74,"line":88},[72,4653,4654],{},"for number in numbers:\n",[72,4656,4657],{"class":74,"line":94},[72,4658,4659],{},"    if number \u003C 0:\n",[72,4661,4662],{"class":74,"line":100},[72,4663,4664],{},"        continue\n",[72,4666,4667],{"class":74,"line":105},[72,4668,4669],{},"    if number == 0:\n",[72,4671,4672],{"class":74,"line":111},[72,4673,4674],{},"        break\n",[72,4676,4677],{"class":74,"line":2466},[72,4678,114],{},[72,4680,4681],{"class":74,"line":3926},[72,4682,85],{"emptyLinePlaceholder":84},[72,4684,4685],{"class":74,"line":4138},[72,4686,4687],{},"print(\"循环结束\")\n",[10,4689,117],{},[63,4691,4694],{"className":4692,"code":4693,"language":123,"meta":68},[121],"3\n循环结束\n",[33,4695,4693],{"__ignoreMap":68},[10,4697,128],{},[14,4699,131],{"id":131},[133,4701,4702,4708],{},[44,4703,4704,4705,4707],{},"遇到 -1 时 ",[33,4706,4605],{}," 立即结束本轮，后面的判断和输出都不执行。",[44,4709,4710,4711,4713],{},"遇到 0 时 ",[33,4712,4609],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4715,152],{"id":152},[41,4717,4718,4723],{},[44,4719,3440,4720,4722],{},[33,4721,4605],{}," 当作结束循环，实际它只跳到下一轮。",[44,4724,4725,4726,4728,4729,4731],{},"在 ",[33,4727,4295],{}," 中把状态更新放在可能被 ",[33,4730,4605],{}," 跳过的位置，造成无限循环。",[14,4733,163],{"id":163},[133,4735,4736,4739],{},[44,4737,4738],{},"跳过列表中的空字符串并输出其他内容。",[44,4740,4741],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4743,178],{},[14,4745,181],{"id":181},[10,4747,4748],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4750,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4752},[4753,4754,4755,4756,4757,4758,4759,4760],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4582,"description":4587},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[199,4609,4605],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4770,"title":4771,"body":4772,"category":199,"cover":200,"description":4776,"extension":201,"meta":4947,"navigation":84,"path":4948,"pinned":204,"publishedAt":205,"seo":4949,"slug":4950,"stem":4951,"summary":4952,"tags":4953,"updatedAt":205,"visible":84,"__hash__":4956},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4773,"toc":4935},[4774,4777,4779,4782,4784,4790,4793,4795,4819,4821,4823,4857,4859,4865,4867,4869,4886,4888,4891,4897,4900,4902,4916,4918,4926,4928,4930,4933],[10,4775,4776],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4778,16],{"id":16},[10,4780,4781],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4783,22],{"id":22},[10,4785,4786],{},[26,4787],{"alt":4788,"src":4789},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4791,4792],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4794,39],{"id":39},[41,4796,4797,4800,4803],{},[44,4798,4799],{},"每增加一层嵌套，阅读成本都会上升。",[44,4801,4802],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[44,4804,4805,4806,2230,4809,4812,4813,2230,4816,335],{},"变量名使用 ",[33,4807,4808],{},"row",[33,4810,4811],{},"cell"," 等层级含义，避免全部写成 ",[33,4814,4815],{},"i",[33,4817,4818],{},"j",[14,4820,58],{"id":58},[10,4822,61],{},[63,4824,4826],{"className":65,"code":4825,"language":67,"meta":68,"style":68},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4827,4828,4833,4837,4842,4847,4852],{"__ignoreMap":68},[72,4829,4830],{"class":74,"line":75},[72,4831,4832],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[72,4834,4835],{"class":74,"line":81},[72,4836,85],{"emptyLinePlaceholder":84},[72,4838,4839],{"class":74,"line":88},[72,4840,4841],{},"for row in table:\n",[72,4843,4844],{"class":74,"line":94},[72,4845,4846],{},"    for cell in row:\n",[72,4848,4849],{"class":74,"line":100},[72,4850,4851],{},"        print(cell)\n",[72,4853,4854],{"class":74,"line":105},[72,4855,4856],{},"    print(\"一行结束\")\n",[10,4858,117],{},[63,4860,4863],{"className":4861,"code":4862,"language":123,"meta":68},[121],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4864,4862],{"__ignoreMap":68},[10,4866,128],{},[14,4868,131],{"id":131},[133,4870,4871,4883],{},[44,4872,4873,4874,4876,4877,1130,4880,335],{},"外层变量 ",[33,4875,4808],{}," 先引用第一行列表，内层才依次处理 ",[33,4878,4879],{},"A1",[33,4881,4882],{},"A2",[44,4884,4885],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[301,4887,2670],{"id":2670},[10,4889,4890],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4892,4893],{},[26,4894],{"alt":4895,"src":4896},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4898,4899],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4901,152],{"id":152},[41,4903,4904,4913],{},[44,4905,4906,4907,982,4910,4912],{},"把两层循环变量都叫 ",[33,4908,4909],{},"item",[33,4911,4815],{},"，难以确认当前层级。",[44,4914,4915],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4917,163],{"id":163},[133,4919,4920,4923],{},[44,4921,4922],{},"打印一个 2×3 数字表。",[44,4924,4925],{},"在内层增加条件，只输出大于 3 的元素。",[10,4927,178],{},[14,4929,181],{"id":181},[10,4931,4932],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,4934,188],{},{"title":68,"searchDepth":81,"depth":81,"links":4936},[4937,4938,4939,4940,4941,4944,4945,4946],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":4942},[4943],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4771,"description":4776},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[199,4954,4955],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4958,"title":4959,"body":4960,"category":199,"cover":200,"description":4964,"extension":201,"meta":5102,"navigation":84,"path":5103,"pinned":204,"publishedAt":205,"seo":5104,"slug":5105,"stem":5106,"summary":5107,"tags":5108,"updatedAt":205,"visible":84,"__hash__":5111},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4961,"toc":5092},[4962,4965,4967,4970,4972,4978,4981,4983,4994,4996,4998,5036,5038,5044,5046,5048,5060,5062,5073,5075,5083,5085,5087,5090],[10,4963,4964],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4966,16],{"id":16},[10,4968,4969],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4971,22],{"id":22},[10,4973,4974],{},[26,4975],{"alt":4976,"src":4977},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4979,4980],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4982,39],{"id":39},[41,4984,4985,4988,4991],{},[44,4986,4987],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[44,4989,4990],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[44,4992,4993],{},"推导式创建新列表，不修改输入列表。",[14,4995,58],{"id":58},[10,4997,61],{},[63,4999,5001],{"className":65,"code":5000,"language":67,"meta":68,"style":68},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[33,5002,5003,5008,5012,5017,5022,5026,5031],{"__ignoreMap":68},[72,5004,5005],{"class":74,"line":75},[72,5006,5007],{},"numbers = [1, 2, 3, 4, 5]\n",[72,5009,5010],{"class":74,"line":81},[72,5011,85],{"emptyLinePlaceholder":84},[72,5013,5014],{"class":74,"line":88},[72,5015,5016],{},"squares = [number * number for number in numbers]\n",[72,5018,5019],{"class":74,"line":94},[72,5020,5021],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[72,5023,5024],{"class":74,"line":100},[72,5025,85],{"emptyLinePlaceholder":84},[72,5027,5028],{"class":74,"line":105},[72,5029,5030],{},"print(squares)\n",[72,5032,5033],{"class":74,"line":111},[72,5034,5035],{},"print(even_squares)\n",[10,5037,117],{},[63,5039,5042],{"className":5040,"code":5041,"language":123,"meta":68},[121],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5043,5041],{"__ignoreMap":68},[10,5045,128],{},[14,5047,131],{"id":131},[133,5049,5050,5053],{},[44,5051,5052],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[44,5054,5055,5056,5059],{},"第二条先用 ",[33,5057,5058],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5061,152],{"id":152},[41,5063,5064,5070],{},[44,5065,5066,5067,5069],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5068,35],{}," 开始找输入。",[44,5071,5072],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5074,163],{"id":163},[133,5076,5077,5080],{},[44,5078,5079],{},"把字符串列表转换为长度列表。",[44,5081,5082],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5084,178],{},[14,5086,181],{"id":181},[10,5088,5089],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5091,188],{},{"title":68,"searchDepth":81,"depth":81,"links":5093},[5094,5095,5096,5097,5098,5099,5100,5101],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4959,"description":4964},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[199,5109,5110],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5113,"title":5114,"body":5115,"category":199,"cover":200,"description":5119,"extension":201,"meta":5262,"navigation":84,"path":5263,"pinned":204,"publishedAt":205,"seo":5264,"slug":5265,"stem":5266,"summary":5267,"tags":5268,"updatedAt":205,"visible":84,"__hash__":5271},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5116,"toc":5252},[5117,5120,5122,5125,5127,5133,5136,5138,5149,5151,5153,5192,5194,5200,5202,5204,5219,5221,5229,5231,5243,5245,5247,5250],[10,5118,5119],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5121,16],{"id":16},[10,5123,5124],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5126,22],{"id":22},[10,5128,5129],{},[26,5130],{"alt":5131,"src":5132},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5134,5135],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5137,39],{"id":39},[41,5139,5140,5143,5146],{},[44,5141,5142],{},"函数名描述动作，使用小写字母和下划线。",[44,5144,5145],{},"函数定义要先执行，之后才能调用。",[44,5147,5148],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5150,58],{"id":58},[10,5152,61],{},[63,5154,5156],{"className":65,"code":5155,"language":67,"meta":68,"style":68},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5157,5158,5163,5168,5173,5177,5182,5187],{"__ignoreMap":68},[72,5159,5160],{"class":74,"line":75},[72,5161,5162],{},"def show_progress():\n",[72,5164,5165],{"class":74,"line":81},[72,5166,5167],{},"    print(\"正在学习函数\")\n",[72,5169,5170],{"class":74,"line":88},[72,5171,5172],{},"    print(\"本节完成 50%\")\n",[72,5174,5175],{"class":74,"line":94},[72,5176,85],{"emptyLinePlaceholder":84},[72,5178,5179],{"class":74,"line":100},[72,5180,5181],{},"print(\"调用前\")\n",[72,5183,5184],{"class":74,"line":105},[72,5185,5186],{},"show_progress()\n",[72,5188,5189],{"class":74,"line":111},[72,5190,5191],{},"print(\"调用后\")\n",[10,5193,117],{},[63,5195,5198],{"className":5196,"code":5197,"language":123,"meta":68},[121],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5199,5197],{"__ignoreMap":68},[10,5201,128],{},[14,5203,131],{"id":131},[133,5205,5206,5212],{},[44,5207,911,5208,5211],{},[33,5209,5210],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[44,5213,5214,5215,5218],{},"运行到 ",[33,5216,5217],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5220,152],{"id":152},[41,5222,5223,5226],{},[44,5224,5225],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[44,5227,5228],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5230,163],{"id":163},[133,5232,5233,5240],{},[44,5234,5235,5236,5239],{},"定义 ",[33,5237,5238],{},"show_plan()"," 输出两行学习计划。",[44,5241,5242],{},"连续调用同一个函数两次，观察执行顺序。",[10,5244,178],{},[14,5246,181],{"id":181},[10,5248,5249],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5251,188],{},{"title":68,"searchDepth":81,"depth":81,"links":5253},[5254,5255,5256,5257,5258,5259,5260,5261],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5114,"description":5119},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[199,5269,5270],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5273,"title":5274,"body":5275,"category":199,"cover":200,"description":5279,"extension":201,"meta":5459,"navigation":84,"path":5460,"pinned":204,"publishedAt":205,"seo":5461,"slug":5462,"stem":5463,"summary":5464,"tags":5465,"updatedAt":205,"visible":84,"__hash__":5468},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5276,"toc":5447},[5277,5280,5282,5285,5287,5293,5300,5302,5319,5321,5323,5357,5359,5365,5367,5369,5390,5392,5395,5401,5411,5413,5428,5430,5438,5440,5442,5445],[10,5278,5279],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5281,16],{"id":16},[10,5283,5284],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5286,22],{"id":22},[10,5288,5289],{},[26,5290],{"alt":5291,"src":5292},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5294,5295,5296,5299],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5297,5298],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5301,39],{"id":39},[41,5303,5304,5307,5310],{},[44,5305,5306],{},"形参出现在函数定义中，实参出现在函数调用中。",[44,5308,5309],{},"局部变量默认只在函数内部可见。",[44,5311,5312,5313,5315,5316,335],{},"没有显式 ",[33,5314,5298],{}," 的函数会返回 ",[33,5317,5318],{},"None",[14,5320,58],{"id":58},[10,5322,61],{},[63,5324,5326],{"className":65,"code":5325,"language":67,"meta":68,"style":68},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5327,5328,5333,5338,5343,5347,5352],{"__ignoreMap":68},[72,5329,5330],{"class":74,"line":75},[72,5331,5332],{},"def calculate_total(price, count):\n",[72,5334,5335],{"class":74,"line":81},[72,5336,5337],{},"    total = price * count\n",[72,5339,5340],{"class":74,"line":88},[72,5341,5342],{},"    return total\n",[72,5344,5345],{"class":74,"line":94},[72,5346,85],{"emptyLinePlaceholder":84},[72,5348,5349],{"class":74,"line":100},[72,5350,5351],{},"result = calculate_total(25, 4)\n",[72,5353,5354],{"class":74,"line":105},[72,5355,5356],{},"print(result)\n",[10,5358,117],{},[63,5360,5363],{"className":5361,"code":5362,"language":123,"meta":68},[121],"100\n",[33,5364,5362],{"__ignoreMap":68},[10,5366,128],{},[14,5368,131],{"id":131},[133,5370,5371,5380],{},[44,5372,5373,5374,2230,5377,5379],{},"调用时 25 和 4 分别绑定到 ",[33,5375,5376],{},"price",[33,5378,4374],{},"，它们只在本次函数调用的局部范围中使用。",[44,5381,5382,5385,5386,5389],{},[33,5383,5384],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5387,5388],{},"result"," 并输出。",[301,5391,2670],{"id":2670},[10,5393,5394],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5396,5397],{},[26,5398],{"alt":5399,"src":5400},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5402,5403,2230,5405,1130,5407,5410],{},[33,5404,5376],{},[33,5406,4374],{},[33,5408,5409],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5412,152],{"id":152},[41,5414,5415,5422],{},[44,5416,5417,5418,5421],{},"在函数内部只 ",[33,5419,5420],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[44,5423,5424,5425,5427],{},"试图在函数外直接访问局部变量 ",[33,5426,5409],{},"，它的名字只在调用期间的局部作用域存在。",[14,5429,163],{"id":163},[133,5431,5432,5435],{},[44,5433,5434],{},"编写计算长方形面积的函数。",[44,5436,5437],{},"让函数返回结果后在调用方加上单位再输出。",[10,5439,178],{},[14,5441,181],{"id":181},[10,5443,5444],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5446,188],{},{"title":68,"searchDepth":81,"depth":81,"links":5448},[5449,5450,5451,5452,5453,5456,5457,5458],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":5454},[5455],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5274,"description":5279},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[199,5466,5467],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5470,"title":5471,"body":5472,"category":199,"cover":200,"description":5476,"extension":201,"meta":5656,"navigation":84,"path":5657,"pinned":204,"publishedAt":205,"seo":5658,"slug":5659,"stem":5660,"summary":5661,"tags":5662,"updatedAt":205,"visible":84,"__hash__":5665},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5473,"toc":5644},[5474,5477,5479,5482,5484,5490,5493,5495,5512,5514,5516,5568,5570,5576,5578,5580,5598,5600,5603,5609,5612,5614,5625,5627,5635,5637,5639,5642],[10,5475,5476],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5478,16],{"id":16},[10,5480,5481],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5483,22],{"id":22},[10,5485,5486],{},[26,5487],{"alt":5488,"src":5489},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5491,5492],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5494,39],{"id":39},[41,5496,5497,5500,5506],{},[44,5498,5499],{},"必需参数应放在有默认值的参数之前。",[44,5501,5502,5505],{},[33,5503,5504],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[44,5507,5508,5511],{},[33,5509,5510],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5513,58],{"id":58},[10,5515,61],{},[63,5517,5519],{"className":65,"code":5518,"language":67,"meta":68,"style":68},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[33,5520,5521,5526,5531,5535,5540,5545,5549,5554,5559,5563],{"__ignoreMap":68},[72,5522,5523],{"class":74,"line":75},[72,5524,5525],{},"def build_title(name, level=\"基础\"):\n",[72,5527,5528],{"class":74,"line":81},[72,5529,5530],{},"    return name + \"｜\" + level\n",[72,5532,5533],{"class":74,"line":88},[72,5534,85],{"emptyLinePlaceholder":84},[72,5536,5537],{"class":74,"line":94},[72,5538,5539],{},"print(build_title(\"Python\"))\n",[72,5541,5542],{"class":74,"line":100},[72,5543,5544],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[72,5546,5547],{"class":74,"line":105},[72,5548,85],{"emptyLinePlaceholder":84},[72,5550,5551],{"class":74,"line":111},[72,5552,5553],{},"def total(*numbers):\n",[72,5555,5556],{"class":74,"line":2466},[72,5557,5558],{},"    return sum(numbers)\n",[72,5560,5561],{"class":74,"line":3926},[72,5562,85],{"emptyLinePlaceholder":84},[72,5564,5565],{"class":74,"line":4138},[72,5566,5567],{},"print(total(10, 20, 30))\n",[10,5569,117],{},[63,5571,5574],{"className":5572,"code":5573,"language":123,"meta":68},[121],"Python｜基础\n异常处理｜进阶\n60\n",[33,5575,5573],{"__ignoreMap":68},[10,5577,128],{},[14,5579,131],{"id":131},[133,5581,5582,5589],{},[44,5583,5584,5585,5588],{},"第一次调用只提供必需参数，",[33,5586,5587],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[44,5590,5591,5594,5595,335],{},[33,5592,5593],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5596,5597],{},"sum()",[301,5599,2670],{"id":2670},[10,5601,5602],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5604,5605],{},[26,5606],{"alt":5607,"src":5608},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5610,5611],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5613,152],{"id":152},[41,5615,5616,5622],{},[44,5617,5618,5619,5621],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5620,5318],{}," 再在函数内创建。",[44,5623,5624],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5626,163],{"id":163},[133,5628,5629,5632],{},[44,5630,5631],{},"给问候函数增加默认称呼。",[44,5633,5634],{},"编写接收任意数量分数并返回总分的函数。",[10,5636,178],{},[14,5638,181],{"id":181},[10,5640,5641],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5643,188],{},{"title":68,"searchDepth":81,"depth":81,"links":5645},[5646,5647,5648,5649,5650,5653,5654,5655],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":5651},[5652],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5471,"description":5476},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[199,5663,5664],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5667,"title":5668,"body":5669,"category":199,"cover":200,"description":5673,"extension":201,"meta":5870,"navigation":84,"path":5871,"pinned":204,"publishedAt":205,"seo":5872,"slug":5873,"stem":5874,"summary":5875,"tags":5876,"updatedAt":205,"visible":84,"__hash__":5879},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5670,"toc":5858},[5671,5674,5676,5679,5681,5687,5690,5692,5709,5711,5713,5776,5778,5784,5786,5788,5815,5817,5820,5826,5829,5831,5839,5841,5849,5851,5853,5856],[10,5672,5673],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5675,16],{"id":16},[10,5677,5678],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5680,22],{"id":22},[10,5682,5683],{},[26,5684],{"alt":5685,"src":5686},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5688,5689],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5691,39],{"id":39},[41,5693,5694,5697,5700],{},[44,5695,5696],{},"函数内部赋值默认创建局部变量。",[44,5698,5699],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[44,5701,5702,2149,5705,5708],{},[33,5703,5704],{},"global",[33,5706,5707],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5710,58],{"id":58},[10,5712,61],{},[63,5714,5716],{"className":65,"code":5715,"language":67,"meta":68,"style":68},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[33,5717,5718,5723,5727,5732,5737,5741,5746,5751,5756,5760,5765,5770],{"__ignoreMap":68},[72,5719,5720],{"class":74,"line":75},[72,5721,5722],{},"course = \"Python\"\n",[72,5724,5725],{"class":74,"line":81},[72,5726,85],{"emptyLinePlaceholder":84},[72,5728,5729],{"class":74,"line":88},[72,5730,5731],{},"def outer():\n",[72,5733,5734],{"class":74,"line":94},[72,5735,5736],{},"    level = \"基础\"\n",[72,5738,5739],{"class":74,"line":100},[72,5740,85],{"emptyLinePlaceholder":84},[72,5742,5743],{"class":74,"line":105},[72,5744,5745],{},"    def show():\n",[72,5747,5748],{"class":74,"line":111},[72,5749,5750],{},"        lesson = \"作用域\"\n",[72,5752,5753],{"class":74,"line":2466},[72,5754,5755],{},"        print(course, level, lesson)\n",[72,5757,5758],{"class":74,"line":3926},[72,5759,85],{"emptyLinePlaceholder":84},[72,5761,5762],{"class":74,"line":4138},[72,5763,5764],{},"    show()\n",[72,5766,5768],{"class":74,"line":5767},11,[72,5769,85],{"emptyLinePlaceholder":84},[72,5771,5773],{"class":74,"line":5772},12,[72,5774,5775],{},"outer()\n",[10,5777,117],{},[63,5779,5782],{"className":5780,"code":5781,"language":123,"meta":68},[121],"Python 基础 作用域\n",[33,5783,5781],{"__ignoreMap":68},[10,5785,128],{},[14,5787,131],{"id":131},[133,5789,5790,5807],{},[44,5791,5792,5795,5796,5799,5800,5802,5803,5806],{},[33,5793,5794],{},"show()"," 中查找 ",[33,5797,5798],{},"lesson"," 时先在局部找到，查找 ",[33,5801,5587],{}," 时到外层 ",[33,5804,5805],{},"outer()"," 找到。",[44,5808,5809,5811,5812,5814],{},[33,5810,143],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5813,2181],{}," 最后在内置作用域找到。",[301,5816,2670],{"id":2670},[10,5818,5819],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5821,5822],{},[26,5823],{"alt":5824,"src":5825},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5827,5828],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5830,152],{"id":152},[41,5832,5833,5836],{},[44,5834,5835],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[44,5837,5838],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5840,163],{"id":163},[133,5842,5843,5846],{},[44,5844,5845],{},"在内外层定义同名变量，观察最近作用域优先。",[44,5847,5848],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5850,178],{},[14,5852,181],{"id":181},[10,5854,5855],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,5857,188],{},{"title":68,"searchDepth":81,"depth":81,"links":5859},[5860,5861,5862,5863,5864,5867,5868,5869],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":5865},[5866],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5668,"description":5673},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[199,5877,5878],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5881,"title":5882,"body":5883,"category":199,"cover":200,"description":5887,"extension":201,"meta":6037,"navigation":84,"path":6038,"pinned":204,"publishedAt":205,"seo":6039,"slug":6040,"stem":6041,"summary":6042,"tags":6043,"updatedAt":205,"visible":84,"__hash__":6046},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5884,"toc":6027},[5885,5888,5890,5893,5895,5901,5904,5906,5925,5927,5929,5963,5965,5971,5973,5975,5990,5992,6004,6006,6018,6020,6022,6025],[10,5886,5887],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5889,16],{"id":16},[10,5891,5892],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5894,22],{"id":22},[10,5896,5897],{},[26,5898],{"alt":5899,"src":5900},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5902,5903],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5905,39],{"id":39},[41,5907,5908,5911,5914],{},[44,5909,5910],{},"文档字符串紧跟在函数定义后的第一条语句。",[44,5912,5913],{},"注解表达接口意图，不代替输入校验和测试。",[44,5915,5916,5917,2230,5919,2230,5921,5924],{},"基础注解优先使用 ",[33,5918,2233],{},[33,5920,2398],{},[33,5922,5923],{},"list[str]"," 等直接写法。",[14,5926,58],{"id":58},[10,5928,61],{},[63,5930,5932],{"className":65,"code":5931,"language":67,"meta":68,"style":68},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[33,5933,5934,5939,5944,5949,5953,5958],{"__ignoreMap":68},[72,5935,5936],{"class":74,"line":75},[72,5937,5938],{},"def format_score(name: str, score: int) -> str:\n",[72,5940,5941],{"class":74,"line":81},[72,5942,5943],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[72,5945,5946],{"class":74,"line":88},[72,5947,5948],{},"    return name + \"：\" + str(score)\n",[72,5950,5951],{"class":74,"line":94},[72,5952,85],{"emptyLinePlaceholder":84},[72,5954,5955],{"class":74,"line":100},[72,5956,5957],{},"print(format_score(\"小郑\", 95))\n",[72,5959,5960],{"class":74,"line":105},[72,5961,5962],{},"print(format_score.__doc__)\n",[10,5964,117],{},[63,5966,5969],{"className":5967,"code":5968,"language":123,"meta":68},[121],"小郑：95\n返回带姓名的分数文本。\n",[33,5970,5968],{"__ignoreMap":68},[10,5972,128],{},[14,5974,131],{"id":131},[133,5976,5977,5987],{},[44,5978,5979,5980,5983,5984,5986],{},"函数签名说明 ",[33,5981,5982],{},"name"," 预期为字符串、",[33,5985,2219],{}," 预期为整数，返回值预期为字符串。",[44,5988,5989],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5991,152],{"id":152},[41,5993,5994,6001],{},[44,5995,5996,5997,6000],{},"认为加了 ",[33,5998,5999],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[44,6002,6003],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6005,163],{"id":163},[133,6007,6008,6011],{},[44,6009,6010],{},"为面积函数补充参数和返回值注解。",[44,6012,6013,6014,6017],{},"通过 ",[33,6015,6016],{},"函数名.__doc__"," 查看文档字符串。",[10,6019,178],{},[14,6021,181],{"id":181},[10,6023,6024],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6026,188],{},{"title":68,"searchDepth":81,"depth":81,"links":6028},[6029,6030,6031,6032,6033,6034,6035,6036],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5882,"description":5887},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[199,6044,6045],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6048,"title":6049,"body":6050,"category":199,"cover":200,"description":6054,"extension":201,"meta":6281,"navigation":84,"path":6282,"pinned":204,"publishedAt":205,"seo":6283,"slug":6284,"stem":6285,"summary":6286,"tags":6287,"updatedAt":205,"visible":84,"__hash__":6290},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6051,"toc":6269},[6052,6055,6057,6063,6065,6071,6082,6084,6102,6104,6111,6140,6147,6166,6175,6177,6183,6185,6187,6210,6212,6215,6221,6227,6229,6245,6247,6260,6262,6264,6267],[10,6053,6054],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6056,16],{"id":16},[10,6058,6059,6060,6062],{},"本篇只处理“模块、import 与 ",[267,6061,5982],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6064,22],{"id":22},[10,6066,6067],{},[26,6068],{"alt":6069,"src":6070},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6072,6073,6074,6077,6078,6081],{},"同一个文件直接运行时 ",[33,6075,6076],{},"__name__"," 等于 ",[33,6079,6080],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6083,39],{"id":39},[41,6085,6086,6092,6095],{},[44,6087,6088,6089,6091],{},"一个 ",[33,6090,1144],{}," 文件就是一个模块。",[44,6093,6094],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[44,6096,6097,6098,6101],{},"避免使用 ",[33,6099,6100],{},"from module import *","，它会让名字来源不清楚。",[14,6103,58],{"id":58},[10,6105,6106,6107,6110],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6108,6109],{},"calculator.py","：",[63,6112,6114],{"className":65,"code":6113,"language":67,"meta":68,"style":68},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6115,6116,6121,6126,6130,6135],{"__ignoreMap":68},[72,6117,6118],{"class":74,"line":75},[72,6119,6120],{},"def add(left, right):\n",[72,6122,6123],{"class":74,"line":81},[72,6124,6125],{},"    return left + right\n",[72,6127,6128],{"class":74,"line":88},[72,6129,85],{"emptyLinePlaceholder":84},[72,6131,6132],{"class":74,"line":94},[72,6133,6134],{},"if __name__ == \"__main__\":\n",[72,6136,6137],{"class":74,"line":100},[72,6138,6139],{},"    print(add(2, 3))\n",[10,6141,6142,6143,6146],{},"再创建 ",[33,6144,6145],{},"app.py","，从模块中导入函数：",[63,6148,6150],{"className":65,"code":6149,"language":67,"meta":68,"style":68},"from calculator import add\n\nprint(add(10, 20))\n",[33,6151,6152,6157,6161],{"__ignoreMap":68},[72,6153,6154],{"class":74,"line":75},[72,6155,6156],{},"from calculator import add\n",[72,6158,6159],{"class":74,"line":81},[72,6160,85],{"emptyLinePlaceholder":84},[72,6162,6163],{"class":74,"line":88},[72,6164,6165],{},"print(add(10, 20))\n",[10,6167,6168,6169,1130,6172,335],{},"分别执行 ",[33,6170,6171],{},"python3 calculator.py",[33,6173,6174],{},"python3 app.py",[10,6176,117],{},[63,6178,6181],{"className":6179,"code":6180,"language":123,"meta":68},[121],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6182,6180],{"__ignoreMap":68},[10,6184,128],{},[14,6186,131],{"id":131},[133,6188,6189,6199],{},[44,6190,6191,6192,6194,6195,6198],{},"直接运行 ",[33,6193,6109],{}," 时，模块名是 ",[33,6196,6197],{},"__main__","，入口代码输出 5。",[44,6200,6201,6203,6204,6206,6207,6209],{},[33,6202,6145],{}," 导入模块时，",[33,6205,6109],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6208,6145],{}," 调用函数输出 30。",[301,6211,2670],{"id":2670},[10,6213,6214],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6216,6217],{},[26,6218],{"alt":6219,"src":6220},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6222,6223,6224,6226],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6225,6197],{}," 保护下的演示代码。",[14,6228,152],{"id":152},[41,6230,6231,6238],{},[44,6232,6233,6234,1130,6236,335],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6235,6109],{},[33,6237,6145],{},[44,6239,6240,6241,6244],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6242,6243],{},"json.py","，导致导入目标被遮蔽。",[14,6246,163],{"id":163},[133,6248,6249,6255],{},[44,6250,2326,6251,6254],{},[33,6252,6253],{},"text_tools.py"," 并导出一个格式化函数。",[44,6256,6257,6258,335],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6259,6076],{},[10,6261,178],{},[14,6263,181],{"id":181},[10,6265,6266],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6268,188],{},{"title":68,"searchDepth":81,"depth":81,"links":6270},[6271,6272,6273,6274,6275,6278,6279,6280],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":6276},[6277],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6049,"description":6054},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[199,6288,6289],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6292,"title":6293,"body":6294,"category":199,"cover":200,"description":6298,"extension":201,"meta":6463,"navigation":84,"path":6464,"pinned":204,"publishedAt":205,"seo":6465,"slug":6466,"stem":6467,"summary":6468,"tags":6469,"updatedAt":205,"visible":84,"__hash__":6471},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6295,"toc":6453},[6296,6299,6301,6304,6306,6312,6315,6317,6331,6333,6335,6381,6383,6389,6391,6393,6419,6421,6431,6433,6444,6446,6448,6451],[10,6297,6298],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6300,16],{"id":16},[10,6302,6303],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6305,22],{"id":22},[10,6307,6308],{},[26,6309],{"alt":6310,"src":6311},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6313,6314],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6316,39],{"id":39},[41,6318,6319,6325,6328],{},[44,6320,6321,6324],{},[33,6322,6323],{},".venv"," 是常见目录名，不应提交到 Git。",[44,6326,6327],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[44,6329,6330],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6332,58],{"id":58},[10,6334,1547],{},[63,6336,6338],{"className":564,"code":6337,"language":566,"meta":68,"style":68},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6339,6340,6352,6360,6366,6376],{"__ignoreMap":68},[72,6341,6342,6344,6346,6349],{"class":74,"line":75},[72,6343,664],{"class":573},[72,6345,606],{"class":576},[72,6347,6348],{"class":609}," venv",[72,6350,6351],{"class":609}," .venv\n",[72,6353,6354,6357],{"class":74,"line":81},[72,6355,6356],{"class":576},"source",[72,6358,6359],{"class":609}," .venv\u002Fbin\u002Factivate\n",[72,6361,6362,6364],{"class":74,"line":88},[72,6363,67],{"class":573},[72,6365,577],{"class":576},[72,6367,6368,6370,6372,6374],{"class":74,"line":94},[72,6369,67],{"class":573},[72,6371,606],{"class":576},[72,6373,610],{"class":609},[72,6375,577],{"class":576},[72,6377,6378],{"class":74,"line":100},[72,6379,6380],{"class":573},"deactivate\n",[10,6382,117],{},[63,6384,6387],{"className":6385,"code":6386,"language":123,"meta":68},[121],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6388,6386],{"__ignoreMap":68},[10,6390,128],{},[14,6392,131],{"id":131},[133,6394,6395,6404],{},[44,6396,6397,6400,6401,6403],{},[33,6398,6399],{},"venv"," 根据当前 ",[33,6402,664],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[44,6405,6406,6407,2149,6409,6412,6413,3701,6415,6418],{},"激活后 ",[33,6408,67],{},[33,6410,6411],{},"python -m pip"," 优先指向 ",[33,6414,6323],{},[33,6416,6417],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6420,152],{"id":152},[41,6422,6423,6426],{},[44,6424,6425],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[44,6427,3440,6428,6430],{},[33,6429,6323],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6432,163],{"id":163},[133,6434,6435,6441],{},[44,6436,6437,6438,335],{},"创建虚拟环境并记录激活前后的 ",[33,6439,6440],{},"which python",[44,6442,6443],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6445,178],{},[14,6447,181],{"id":181},[10,6449,6450],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6452,1631],{},{"title":68,"searchDepth":81,"depth":81,"links":6454},[6455,6456,6457,6458,6459,6460,6461,6462],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6293,"description":6298},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[199,6470,233],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6473,"title":6474,"body":6475,"category":199,"cover":200,"description":6479,"extension":201,"meta":6667,"navigation":84,"path":6668,"pinned":204,"publishedAt":205,"seo":6669,"slug":6670,"stem":6671,"summary":6672,"tags":6673,"updatedAt":205,"visible":84,"__hash__":6676},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6476,"toc":6657},[6477,6480,6482,6485,6487,6493,6502,6504,6528,6530,6532,6585,6587,6593,6595,6597,6613,6615,6634,6636,6648,6650,6652,6655],[10,6478,6479],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6481,16],{"id":16},[10,6483,6484],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6486,22],{"id":22},[10,6488,6489],{},[26,6490],{"alt":6491,"src":6492},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6494,6495,6498,6499,6501],{},[33,6496,6497],{},"Path"," 使用 ",[33,6500,2408],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6503,39],{"id":39},[41,6505,6506,6509,6521],{},[44,6507,6508],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[44,6510,6511,2230,6514,2230,6517,6520],{},[33,6512,6513],{},"exists()",[33,6515,6516],{},"is_file()",[33,6518,6519],{},"is_dir()"," 检查真实文件系统状态。",[44,6522,6523,6524,6527],{},"创建目录前明确目标；",[33,6525,6526],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6529,58],{"id":58},[10,6531,61],{},[63,6533,6535],{"className":65,"code":6534,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[33,6536,6537,6542,6546,6551,6556,6561,6565,6570,6575,6580],{"__ignoreMap":68},[72,6538,6539],{"class":74,"line":75},[72,6540,6541],{},"from pathlib import Path\n",[72,6543,6544],{"class":74,"line":81},[72,6545,85],{"emptyLinePlaceholder":84},[72,6547,6548],{"class":74,"line":88},[72,6549,6550],{},"project = Path.cwd()\n",[72,6552,6553],{"class":74,"line":94},[72,6554,6555],{},"data_dir = project \u002F \"data\"\n",[72,6557,6558],{"class":74,"line":100},[72,6559,6560],{},"file_path = data_dir \u002F \"records.json\"\n",[72,6562,6563],{"class":74,"line":105},[72,6564,85],{"emptyLinePlaceholder":84},[72,6566,6567],{"class":74,"line":111},[72,6568,6569],{},"print(project)\n",[72,6571,6572],{"class":74,"line":2466},[72,6573,6574],{},"print(file_path.name)\n",[72,6576,6577],{"class":74,"line":3926},[72,6578,6579],{},"print(file_path.suffix)\n",[72,6581,6582],{"class":74,"line":4138},[72,6583,6584],{},"print(file_path.exists())\n",[10,6586,117],{},[63,6588,6591],{"className":6589,"code":6590,"language":123,"meta":68},[121],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6592,6590],{"__ignoreMap":68},[10,6594,128],{},[14,6596,131],{"id":131},[133,6598,6599,6605],{},[44,6600,6601,6604],{},[33,6602,6603],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[44,6606,171,6607,6609,6610,6612],{},[33,6608,2408],{}," 组合路径片段只创建新的 ",[33,6611,6497],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6614,152],{"id":152},[41,6616,6617,6625],{},[44,6618,3440,6619,6621,6622,6624],{},[33,6620,6497],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6623,6513],{}," 等方法确认。",[44,6626,6627,6628,982,6630,6633],{},"手工拼接 ",[33,6629,2408],{},[33,6631,6632],{},"\\"," 分隔符，降低跨平台可读性。",[14,6635,163],{"id":163},[133,6637,6638,6645],{},[44,6639,6640,6641,6644],{},"组合 ",[33,6642,6643],{},"output\u002Freport.txt"," 路径但先不创建文件。",[44,6646,6647],{},"输出路径的父目录、文件名和扩展名。",[10,6649,178],{},[14,6651,181],{"id":181},[10,6653,6654],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6656,188],{},{"title":68,"searchDepth":81,"depth":81,"links":6658},[6659,6660,6661,6662,6663,6664,6665,6666],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6474,"description":6479},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[199,6674,6675],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6678,"title":6679,"body":6680,"category":199,"cover":200,"description":6684,"extension":201,"meta":6862,"navigation":84,"path":6863,"pinned":204,"publishedAt":205,"seo":6864,"slug":6865,"stem":6866,"summary":6867,"tags":6868,"updatedAt":205,"visible":84,"__hash__":6871},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6681,"toc":6852},[6682,6685,6687,6690,6692,6698,6701,6703,6731,6733,6735,6792,6794,6800,6802,6804,6815,6817,6830,6832,6843,6845,6847,6850],[10,6683,6684],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6686,16],{"id":16},[10,6688,6689],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6691,22],{"id":22},[10,6693,6694],{},[26,6695],{"alt":6696,"src":6697},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6699,6700],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6702,39],{"id":39},[41,6704,6705,6711,6720],{},[44,6706,6707,6710],{},[33,6708,6709],{},"w"," 模式会截断原文件，写入前必须确认目标。",[44,6712,6713,6716,6717,335],{},[33,6714,6715],{},"r"," 模式读取不存在文件会产生 ",[33,6718,6719],{},"FileNotFoundError",[44,6721,6722,6723,6726,6727,6730],{},"本篇显式调用 ",[33,6724,6725],{},"close()","；第 34 篇会用 ",[33,6728,6729],{},"with"," 更可靠地管理关闭动作。",[14,6732,58],{"id":58},[10,6734,61],{},[63,6736,6738],{"className":65,"code":6737,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[33,6739,6740,6744,6748,6753,6758,6763,6768,6772,6777,6782,6787],{"__ignoreMap":68},[72,6741,6742],{"class":74,"line":75},[72,6743,6541],{},[72,6745,6746],{"class":74,"line":81},[72,6747,85],{"emptyLinePlaceholder":84},[72,6749,6750],{"class":74,"line":88},[72,6751,6752],{},"file_path = Path(\"notes.txt\")\n",[72,6754,6755],{"class":74,"line":94},[72,6756,6757],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[72,6759,6760],{"class":74,"line":100},[72,6761,6762],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[72,6764,6765],{"class":74,"line":105},[72,6766,6767],{},"writer.close()\n",[72,6769,6770],{"class":74,"line":111},[72,6771,85],{"emptyLinePlaceholder":84},[72,6773,6774],{"class":74,"line":2466},[72,6775,6776],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[72,6778,6779],{"class":74,"line":3926},[72,6780,6781],{},"content = reader.read()\n",[72,6783,6784],{"class":74,"line":4138},[72,6785,6786],{},"reader.close()\n",[72,6788,6789],{"class":74,"line":5767},[72,6790,6791],{},"print(content)\n",[10,6793,117],{},[63,6795,6798],{"className":6796,"code":6797,"language":123,"meta":68},[121],"变量\n循环\n函数\n",[33,6799,6797],{"__ignoreMap":68},[10,6801,128],{},[14,6803,131],{"id":131},[133,6805,6806,6812],{},[44,6807,6808,6809,6811],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6810,6725],{}," 确保缓冲内容交给文件系统。",[44,6813,6814],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6816,152],{"id":152},[41,6818,6819,6824],{},[44,6820,171,6821,6823],{},[33,6822,6709],{}," 模式打开重要文件却未确认覆盖风险。",[44,6825,6826,6827,335],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6828,6829],{},"encoding=\"utf-8\"",[14,6831,163],{"id":163},[133,6833,6834,6837],{},[44,6835,6836],{},"写入三行学习记录并读取。",[44,6838,6839,6840,6842],{},"改用 ",[33,6841,309],{}," 模式追加一行，确认原内容仍保留。",[10,6844,178],{},[14,6846,181],{"id":181},[10,6848,6849],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,6851,188],{},{"title":68,"searchDepth":81,"depth":81,"links":6853},[6854,6855,6856,6857,6858,6859,6860,6861],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6679,"description":6684},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[199,6869,6870],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6873,"title":6874,"body":6875,"category":199,"cover":200,"description":6879,"extension":201,"meta":7046,"navigation":84,"path":7047,"pinned":204,"publishedAt":205,"seo":7048,"slug":7049,"stem":7050,"summary":7051,"tags":7052,"updatedAt":205,"visible":84,"__hash__":7055},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6876,"toc":7036},[6877,6880,6882,6885,6887,6893,6903,6905,6919,6921,6923,6983,6985,6991,6993,6995,7007,7009,7017,7019,7027,7029,7031,7034],[10,6878,6879],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6881,16],{"id":16},[10,6883,6884],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6886,22],{"id":22},[10,6888,6889],{},[26,6890],{"alt":6891,"src":6892},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6894,6895,6898,6899,6902],{},[33,6896,6897],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6900,6901],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6904,39],{"id":39},[41,6906,6907,6910,6916],{},[44,6908,6909],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[44,6911,6912,6915],{},[33,6913,6914],{},"ensure_ascii=False"," 让中文以可读字符写入。",[44,6917,6918],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6920,58],{"id":58},[10,6922,61],{},[63,6924,6926],{"className":65,"code":6925,"language":67,"meta":68,"style":68},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[33,6927,6928,6933,6937,6942,6946,6951,6956,6960,6964,6969,6974,6978],{"__ignoreMap":68},[72,6929,6930],{"class":74,"line":75},[72,6931,6932],{},"import json\n",[72,6934,6935],{"class":74,"line":81},[72,6936,85],{"emptyLinePlaceholder":84},[72,6938,6939],{"class":74,"line":88},[72,6940,6941],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[72,6943,6944],{"class":74,"line":94},[72,6945,85],{"emptyLinePlaceholder":84},[72,6947,6948],{"class":74,"line":100},[72,6949,6950],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[72,6952,6953],{"class":74,"line":105},[72,6954,6955],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[72,6957,6958],{"class":74,"line":111},[72,6959,6767],{},[72,6961,6962],{"class":74,"line":2466},[72,6963,85],{"emptyLinePlaceholder":84},[72,6965,6966],{"class":74,"line":3926},[72,6967,6968],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[72,6970,6971],{"class":74,"line":4138},[72,6972,6973],{},"loaded = json.load(reader)\n",[72,6975,6976],{"class":74,"line":5767},[72,6977,6786],{},[72,6979,6980],{"class":74,"line":5772},[72,6981,6982],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6984,117],{},[63,6986,6989],{"className":6987,"code":6988,"language":123,"meta":68},[121],"Python 60\n",[33,6990,6988],{"__ignoreMap":68},[10,6992,128],{},[14,6994,131],{"id":131},[133,6996,6997,7002],{},[44,6998,6999,7001],{},[33,7000,6897],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[44,7003,7004,7006],{},[33,7005,6901],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7008,152],{"id":152},[41,7010,7011,7014],{},[44,7012,7013],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[44,7015,7016],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7018,163],{"id":163},[133,7020,7021,7024],{},[44,7022,7023],{},"保存包含两条学习记录的列表。",[44,7025,7026],{},"读取后修改进度，再重新写回文件。",[10,7028,178],{},[14,7030,181],{"id":181},[10,7032,7033],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7035,188],{},{"title":68,"searchDepth":81,"depth":81,"links":7037},[7038,7039,7040,7041,7042,7043,7044,7045],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6874,"description":6879},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[199,7053,7054],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7057,"title":7058,"body":7059,"category":199,"cover":200,"description":7063,"extension":201,"meta":7247,"navigation":84,"path":7248,"pinned":204,"publishedAt":205,"seo":7249,"slug":7250,"stem":7251,"summary":7252,"tags":7253,"updatedAt":205,"visible":84,"__hash__":7256},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7060,"toc":7237},[7061,7064,7066,7069,7071,7077,7083,7085,7107,7109,7111,7174,7176,7182,7184,7186,7202,7204,7218,7220,7228,7230,7232,7235],[10,7062,7063],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7065,16],{"id":16},[10,7067,7068],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7070,22],{"id":22},[10,7072,7073],{},[26,7074],{"alt":7075,"src":7076},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7078,7079,7082],{},[33,7080,7081],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7084,39],{"id":39},[41,7086,7087,7097,7104],{},[44,7088,171,7089,7092,7093,7096],{},[33,7090,7091],{},"newline=\"\""," 让 ",[33,7094,7095],{},"csv"," 模块正确处理换行。",[44,7098,7099,7100,7103],{},"字段顺序由 ",[33,7101,7102],{},"fieldnames"," 决定，字典键需要与字段名一致。",[44,7105,7106],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7108,58],{"id":58},[10,7110,61],{},[63,7112,7114],{"className":65,"code":7113,"language":67,"meta":68,"style":68},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[33,7115,7116,7121,7125,7130,7135,7140,7145,7150,7154,7159,7164,7169],{"__ignoreMap":68},[72,7117,7118],{"class":74,"line":75},[72,7119,7120],{},"import csv\n",[72,7122,7123],{"class":74,"line":81},[72,7124,85],{"emptyLinePlaceholder":84},[72,7126,7127],{"class":74,"line":88},[72,7128,7129],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[72,7131,7132],{"class":74,"line":94},[72,7133,7134],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[72,7136,7137],{"class":74,"line":100},[72,7138,7139],{},"writer.writeheader()\n",[72,7141,7142],{"class":74,"line":105},[72,7143,7144],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[72,7146,7147],{"class":74,"line":111},[72,7148,7149],{},"writer_file.close()\n",[72,7151,7152],{"class":74,"line":2466},[72,7153,85],{"emptyLinePlaceholder":84},[72,7155,7156],{"class":74,"line":3926},[72,7157,7158],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[72,7160,7161],{"class":74,"line":4138},[72,7162,7163],{},"for row in csv.DictReader(reader_file):\n",[72,7165,7166],{"class":74,"line":5767},[72,7167,7168],{},"    print(row[\"name\"], row[\"score\"])\n",[72,7170,7171],{"class":74,"line":5772},[72,7172,7173],{},"reader_file.close()\n",[10,7175,117],{},[63,7177,7180],{"className":7178,"code":7179,"language":123,"meta":68},[121],"小郑 95\n",[33,7181,7179],{"__ignoreMap":68},[10,7183,128],{},[14,7185,131],{"id":131},[133,7187,7188,7197],{},[44,7189,7190,7193,7194,7196],{},[33,7191,7192],{},"DictWriter"," 按 ",[33,7195,7102],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[44,7198,7199,7201],{},[33,7200,7081],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7203,152],{"id":152},[41,7205,7206,7209],{},[44,7207,7208],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[44,7210,7211,7212,7214,7215,7217],{},"在 macOS 以外环境忽略 ",[33,7213,7091],{}," 可能出现额外空行；统一交给 ",[33,7216,7095],{}," 模块管理换行。",[14,7219,163],{"id":163},[133,7221,7222,7225],{},[44,7223,7224],{},"写入三名学习者的课程和分数。",[44,7226,7227],{},"读取 CSV 后把分数字符串转换为整数。",[10,7229,178],{},[14,7231,181],{"id":181},[10,7233,7234],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7236,188],{},{"title":68,"searchDepth":81,"depth":81,"links":7238},[7239,7240,7241,7242,7243,7244,7245,7246],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7058,"description":7063},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[199,7254,7255],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7258,"title":7259,"body":7260,"category":199,"cover":200,"description":7264,"extension":201,"meta":7537,"navigation":84,"path":7538,"pinned":204,"publishedAt":205,"seo":7539,"slug":7540,"stem":7541,"summary":7542,"tags":7543,"updatedAt":205,"visible":84,"__hash__":7546},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7261,"toc":7524},[7262,7265,7267,7270,7272,7278,7289,7291,7308,7310,7312,7387,7389,7395,7397,7399,7424,7426,7435,7441,7452,7454,7460,7466,7475,7477,7492,7494,7515,7517,7519,7522],[10,7263,7264],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7266,16],{"id":16},[10,7268,7269],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7271,22],{"id":22},[10,7273,7274],{},[26,7275],{"alt":7276,"src":7277},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7279,7280,7281,7284,7285,7288],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7282,7283],{},"except","；无论是否异常，",[33,7286,7287],{},"finally"," 都会在离开结构前执行。",[14,7290,39],{"id":39},[41,7292,7293,7299,7305],{},[44,7294,7295,7296,7298],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7297,7283],{}," 吞掉全部错误。",[44,7300,7301,7304],{},[33,7302,7303],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[44,7306,7307],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7309,58],{"id":58},[10,7311,61],{},[63,7313,7315],{"className":65,"code":7314,"language":67,"meta":68,"style":68},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[33,7316,7317,7322,7327,7332,7337,7342,7346,7351,7356,7361,7366,7370,7375,7381],{"__ignoreMap":68},[72,7318,7319],{"class":74,"line":75},[72,7320,7321],{},"def parse_age(text):\n",[72,7323,7324],{"class":74,"line":81},[72,7325,7326],{},"    age = int(text)\n",[72,7328,7329],{"class":74,"line":88},[72,7330,7331],{},"    if age \u003C 0:\n",[72,7333,7334],{"class":74,"line":94},[72,7335,7336],{},"        raise ValueError(\"年龄不能为负数\")\n",[72,7338,7339],{"class":74,"line":100},[72,7340,7341],{},"    return age\n",[72,7343,7344],{"class":74,"line":105},[72,7345,85],{"emptyLinePlaceholder":84},[72,7347,7348],{"class":74,"line":111},[72,7349,7350],{},"try:\n",[72,7352,7353],{"class":74,"line":2466},[72,7354,7355],{},"    age = parse_age(\"18\")\n",[72,7357,7358],{"class":74,"line":3926},[72,7359,7360],{},"except ValueError as error:\n",[72,7362,7363],{"class":74,"line":4138},[72,7364,7365],{},"    print(\"输入错误：\", error)\n",[72,7367,7368],{"class":74,"line":5767},[72,7369,1119],{},[72,7371,7372],{"class":74,"line":5772},[72,7373,7374],{},"    print(\"年龄：\", age)\n",[72,7376,7378],{"class":74,"line":7377},13,[72,7379,7380],{},"finally:\n",[72,7382,7384],{"class":74,"line":7383},14,[72,7385,7386],{},"    print(\"处理结束\")\n",[10,7388,117],{},[63,7390,7393],{"className":7391,"code":7392,"language":123,"meta":68},[121],"年龄： 18\n处理结束\n",[33,7394,7392],{"__ignoreMap":68},[10,7396,128],{},[14,7398,131],{"id":131},[133,7400,7401,7413],{},[44,7402,7403,7405,7406,7408,7409,7412],{},[33,7404,3009],{}," 或主动 ",[33,7407,7303],{}," 都可能产生 ",[33,7410,7411],{},"ValueError","，控制流立即离开当前正常路径。",[44,7414,7415,7416,7418,7419,7421,7422,335],{},"有异常时进入匹配的 ",[33,7417,7283],{},"；没有异常时执行 ",[33,7420,1133],{},"；两种情况最后都会执行 ",[33,7423,7287],{},[301,7425,2670],{"id":2670},[10,7427,7428,2230,7430,1130,7432,7434],{},[33,7429,7283],{},[33,7431,1133],{},[33,7433,7287],{}," 的职责不同，不能只看它们出现的顺序。",[10,7436,7437],{},[26,7438],{"alt":7439,"src":7440},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7442,7443,7445,7446,7448,7449,7451],{},[33,7444,7283],{}," 处理匹配异常，",[33,7447,1133],{}," 只在无异常时运行，",[33,7450,7287],{}," 负责两条路径都需要的清理动作。",[301,7453,2670],{"id":4193},[10,7455,7456,7459],{},[33,7457,7458],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7461,7462],{},[26,7463],{"alt":7464,"src":7465},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7467,7468,7469,7471,7472,7474],{},"只把可能产生预期异常的操作放进 ",[33,7470,7458],{},"，后续正常业务放进 ",[33,7473,1133],{},"，错误边界会更清楚。",[14,7476,152],{"id":152},[41,7478,7479,7486],{},[44,7480,7481,7482,7485],{},"使用裸 ",[33,7483,7484],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[44,7487,7488,7489,7491],{},"把整个程序包在一个巨大 ",[33,7490,7458],{}," 中，无法判断究竟哪一步允许失败。",[14,7493,163],{"id":163},[133,7495,7496,7509],{},[44,7497,7498,7499,7502,7503,1130,7506,335],{},"让 ",[33,7500,7501],{},"parse_age"," 分别处理 ",[33,7504,7505],{},"\"abc\"",[33,7507,7508],{},"\"-1\"",[44,7510,7511,7512,7514],{},"为文件读取捕获 ",[33,7513,6719],{}," 并给出清晰提示。",[10,7516,178],{},[14,7518,181],{"id":181},[10,7520,7521],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7523,188],{},{"title":68,"searchDepth":81,"depth":81,"links":7525},[7526,7527,7528,7529,7530,7534,7535,7536],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":7531},[7532,7533],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7259,"description":7264},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[199,7544,7545],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7548,"title":7549,"body":7550,"category":199,"cover":200,"description":7554,"extension":201,"meta":7730,"navigation":84,"path":7731,"pinned":204,"publishedAt":205,"seo":7732,"slug":7733,"stem":7734,"summary":7735,"tags":7736,"updatedAt":205,"visible":84,"__hash__":7738},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7551,"toc":7720},[7552,7555,7557,7560,7562,7568,7574,7576,7592,7594,7596,7650,7652,7658,7660,7662,7675,7677,7690,7692,7711,7713,7715,7718],[10,7553,7554],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7556,16],{"id":16},[10,7558,7559],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7561,22],{"id":22},[10,7563,7564],{},[26,7565],{"alt":7566,"src":7567},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7569,7570,7571,7573],{},"进入 ",[33,7572,6729],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7575,39],{"id":39},[41,7577,7578,7583,7589],{},[44,7579,7580,7582],{},[33,7581,6729],{}," 把资源获取和释放配成一个清晰边界。",[44,7584,7585,7588],{},[33,7586,7587],{},"as file"," 得到的是上下文返回的资源对象。",[44,7590,7591],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7593,58],{"id":58},[10,7595,61],{},[63,7597,7599],{"className":65,"code":7598,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[33,7600,7601,7605,7609,7613,7617,7622,7627,7631,7636,7641,7645],{"__ignoreMap":68},[72,7602,7603],{"class":74,"line":75},[72,7604,6541],{},[72,7606,7607],{"class":74,"line":81},[72,7608,85],{"emptyLinePlaceholder":84},[72,7610,7611],{"class":74,"line":88},[72,7612,6752],{},[72,7614,7615],{"class":74,"line":94},[72,7616,85],{"emptyLinePlaceholder":84},[72,7618,7619],{"class":74,"line":100},[72,7620,7621],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,7623,7624],{"class":74,"line":105},[72,7625,7626],{},"    file.write(\"上下文管理器\\n\")\n",[72,7628,7629],{"class":74,"line":111},[72,7630,85],{"emptyLinePlaceholder":84},[72,7632,7633],{"class":74,"line":2466},[72,7634,7635],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[72,7637,7638],{"class":74,"line":3926},[72,7639,7640],{},"    print(file.read())\n",[72,7642,7643],{"class":74,"line":4138},[72,7644,85],{"emptyLinePlaceholder":84},[72,7646,7647],{"class":74,"line":5767},[72,7648,7649],{},"print(file.closed)\n",[10,7651,117],{},[63,7653,7656],{"className":7654,"code":7655,"language":123,"meta":68},[121],"上下文管理器\n\nTrue\n",[33,7657,7655],{"__ignoreMap":68},[10,7659,128],{},[14,7661,131],{"id":131},[133,7663,7664,7672],{},[44,7665,7570,7666,7668,7669,335],{},[33,7667,6729],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7670,7671],{},"file",[44,7673,7674],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7676,152],{"id":152},[41,7678,7679,7684],{},[44,7680,4725,7681,7683],{},[33,7682,6729],{}," 代码块外继续读写已经关闭的文件对象。",[44,7685,7686,7687,7689],{},"误以为 ",[33,7688,6729],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7691,163],{"id":163},[133,7693,7694,7703],{},[44,7695,7696,7697,7700,7701,335],{},"把第 30 篇的手动 ",[33,7698,7699],{},"open\u002Fclose"," 改写为 ",[33,7702,6729],{},[44,7704,4725,7705,7707,7708,335],{},[33,7706,6729],{}," 块后检查 ",[33,7709,7710],{},"file.closed",[10,7712,178],{},[14,7714,181],{"id":181},[10,7716,7717],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7719,188],{},{"title":68,"searchDepth":81,"depth":81,"links":7721},[7722,7723,7724,7725,7726,7727,7728,7729],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7549,"description":7554},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[199,6729,7737],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7740,"title":7741,"body":7742,"category":199,"cover":200,"description":7746,"extension":201,"meta":7958,"navigation":84,"path":7959,"pinned":204,"publishedAt":205,"seo":7960,"slug":7961,"stem":7962,"summary":7963,"tags":7964,"updatedAt":205,"visible":84,"__hash__":7967},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7743,"toc":7946},[7744,7747,7749,7752,7754,7760,7763,7765,7782,7784,7786,7854,7856,7862,7864,7866,7891,7893,7896,7902,7911,7913,7924,7926,7937,7939,7941,7944],[10,7745,7746],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7748,16],{"id":16},[10,7750,7751],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7753,22],{"id":22},[10,7755,7756],{},[26,7757],{"alt":7758,"src":7759},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7761,7762],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7764,39],{"id":39},[41,7766,7767,7773,7779],{},[44,7768,7769,7772],{},[33,7770,7771],{},"self"," 表示当前实例，由方法调用自动传入。",[44,7774,7775,7778],{},[33,7776,7777],{},"__init__"," 在实例创建过程中初始化属性。",[44,7780,7781],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7783,58],{"id":58},[10,7785,61],{},[63,7787,7789],{"className":65,"code":7788,"language":67,"meta":68,"style":68},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[33,7790,7791,7796,7801,7806,7811,7815,7820,7825,7830,7835,7839,7844,7849],{"__ignoreMap":68},[72,7792,7793],{"class":74,"line":75},[72,7794,7795],{},"class LearningRecord:\n",[72,7797,7798],{"class":74,"line":81},[72,7799,7800],{},"    def __init__(self, course, progress=0):\n",[72,7802,7803],{"class":74,"line":88},[72,7804,7805],{},"        self.course = course\n",[72,7807,7808],{"class":74,"line":94},[72,7809,7810],{},"        self.progress = progress\n",[72,7812,7813],{"class":74,"line":100},[72,7814,85],{"emptyLinePlaceholder":84},[72,7816,7817],{"class":74,"line":105},[72,7818,7819],{},"    def advance(self, amount):\n",[72,7821,7822],{"class":74,"line":111},[72,7823,7824],{},"        self.progress = self.progress + amount\n",[72,7826,7827],{"class":74,"line":2466},[72,7828,7829],{},"        if self.progress > 100:\n",[72,7831,7832],{"class":74,"line":3926},[72,7833,7834],{},"            self.progress = 100\n",[72,7836,7837],{"class":74,"line":4138},[72,7838,85],{"emptyLinePlaceholder":84},[72,7840,7841],{"class":74,"line":5767},[72,7842,7843],{},"record = LearningRecord(\"Python\", 40)\n",[72,7845,7846],{"class":74,"line":5772},[72,7847,7848],{},"record.advance(15)\n",[72,7850,7851],{"class":74,"line":7377},[72,7852,7853],{},"print(record.course, record.progress)\n",[10,7855,117],{},[63,7857,7860],{"className":7858,"code":7859,"language":123,"meta":68},[121],"Python 55\n",[33,7861,7859],{"__ignoreMap":68},[10,7863,128],{},[14,7865,131],{"id":131},[133,7867,7868,7878],{},[44,7869,7870,7871,7874,7875,7877],{},"调用 ",[33,7872,7873],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7876,7777],{}," 把课程和进度保存在该实例属性中。",[44,7879,7880,7883,7884,7887,7888,7890],{},[33,7881,7882],{},"record.advance(15)"," 自动把 ",[33,7885,7886],{},"record"," 作为 ",[33,7889,7771],{},"，方法更新同一实例的进度并限制上限。",[301,7892,2670],{"id":2670},[10,7894,7895],{},"类是共同定义，实例则各自保存状态。",[10,7897,7898],{},[26,7899],{"alt":7900,"src":7901},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7903,7904,7905,1130,7907,7910],{},"两个实例共享同一套方法定义，但 ",[33,7906,143],{},[33,7908,7909],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7912,152],{"id":152},[41,7914,7915,7921],{},[44,7916,7917,7918,7920],{},"调用实例方法时手工再传一次 ",[33,7919,7771],{},"。通过实例调用时 Python 会自动绑定。",[44,7922,7923],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7925,163],{"id":163},[133,7927,7928,7934],{},[44,7929,5235,7930,7933],{},[33,7931,7932],{},"Book"," 类，保存标题和阅读页数。",[44,7935,7936],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7938,178],{},[14,7940,181],{"id":181},[10,7942,7943],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,7945,188],{},{"title":68,"searchDepth":81,"depth":81,"links":7947},[7948,7949,7950,7951,7952,7955,7956,7957],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":7953},[7954],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7741,"description":7746},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[199,7965,7966],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7969,"title":7970,"body":7971,"category":199,"cover":200,"description":7975,"extension":201,"meta":8153,"navigation":84,"path":8154,"pinned":204,"publishedAt":205,"seo":8155,"slug":8156,"stem":8157,"summary":8158,"tags":8159,"updatedAt":205,"visible":84,"__hash__":8162},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7972,"toc":8143},[7973,7976,7978,7981,7983,7989,7992,7994,8005,8007,8009,8076,8078,8084,8086,8088,8107,8109,8117,8119,8134,8136,8138,8141],[10,7974,7975],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7977,16],{"id":16},[10,7979,7980],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7982,22],{"id":22},[10,7984,7985],{},[26,7986],{"alt":7987,"src":7988},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7990,7991],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7993,39],{"id":39},[41,7995,7996,7999,8002],{},[44,7997,7998],{},"封装让对象通过方法维护自己的有效状态。",[44,8000,8001],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[44,8003,8004],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8006,58],{"id":58},[10,8008,61],{},[63,8010,8012],{"className":65,"code":8011,"language":67,"meta":68,"style":68},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[33,8013,8014,8019,8024,8029,8033,8038,8043,8048,8052,8057,8062,8066,8071],{"__ignoreMap":68},[72,8015,8016],{"class":74,"line":75},[72,8017,8018],{},"class Storage:\n",[72,8020,8021],{"class":74,"line":81},[72,8022,8023],{},"    def save(self, text):\n",[72,8025,8026],{"class":74,"line":88},[72,8027,8028],{},"        print(\"保存：\", text)\n",[72,8030,8031],{"class":74,"line":94},[72,8032,85],{"emptyLinePlaceholder":84},[72,8034,8035],{"class":74,"line":100},[72,8036,8037],{},"class LearningService:\n",[72,8039,8040],{"class":74,"line":105},[72,8041,8042],{},"    def __init__(self, storage):\n",[72,8044,8045],{"class":74,"line":111},[72,8046,8047],{},"        self.storage = storage\n",[72,8049,8050],{"class":74,"line":2466},[72,8051,85],{"emptyLinePlaceholder":84},[72,8053,8054],{"class":74,"line":3926},[72,8055,8056],{},"    def finish_lesson(self, title):\n",[72,8058,8059],{"class":74,"line":4138},[72,8060,8061],{},"        self.storage.save(title)\n",[72,8063,8064],{"class":74,"line":5767},[72,8065,85],{"emptyLinePlaceholder":84},[72,8067,8068],{"class":74,"line":5772},[72,8069,8070],{},"service = LearningService(Storage())\n",[72,8072,8073],{"class":74,"line":7377},[72,8074,8075],{},"service.finish_lesson(\"异常处理\")\n",[10,8077,117],{},[63,8079,8082],{"className":8080,"code":8081,"language":123,"meta":68},[121],"保存： 异常处理\n",[33,8083,8081],{"__ignoreMap":68},[10,8085,128],{},[14,8087,131],{"id":131},[133,8089,8090,8100],{},[44,8091,8092,8095,8096,8099],{},[33,8093,8094],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8097,8098],{},"save()"," 的协作对象。",[44,8101,8102,8103,8106],{},"调用业务方法时，服务把保存动作委托给 ",[33,8104,8105],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8108,152],{"id":152},[41,8110,8111,8114],{},[44,8112,8113],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[44,8115,8116],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8118,163],{"id":163},[133,8120,8121,8131],{},[44,8122,8123,8124,8127,8128,335],{},"用组合让 ",[33,8125,8126],{},"OrderService"," 使用一个 ",[33,8129,8130],{},"Notifier",[44,8132,8133],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8135,178],{},[14,8137,181],{"id":181},[10,8139,8140],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8142,188],{},{"title":68,"searchDepth":81,"depth":81,"links":8144},[8145,8146,8147,8148,8149,8150,8151,8152],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7970,"description":7975},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[199,8160,8161],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8164,"title":8165,"body":8166,"category":199,"cover":200,"description":8170,"extension":201,"meta":8373,"navigation":84,"path":8374,"pinned":204,"publishedAt":205,"seo":8375,"slug":8376,"stem":8377,"summary":8378,"tags":8379,"updatedAt":205,"visible":84,"__hash__":8382},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8167,"toc":8361},[8168,8171,8173,8176,8178,8184,8191,8193,8218,8220,8222,8274,8276,8282,8284,8286,8307,8309,8315,8321,8327,8329,8337,8339,8352,8354,8356,8359],[10,8169,8170],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8172,16],{"id":16},[10,8174,8175],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8177,22],{"id":22},[10,8179,8180],{},[26,8181],{"alt":8182,"src":8183},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8185,8186,8187,8190],{},"生成器运行到 ",[33,8188,8189],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8192,39],{"id":39},[41,8194,8195,8205,8215],{},[44,8196,8197,8200,8201,8204],{},[33,8198,8199],{},"iter()"," 从可迭代对象取得迭代器，",[33,8202,8203],{},"next()"," 请求下一个值。",[44,8206,8207,8208,8211,8212,8214],{},"没有更多值时迭代器抛出 ",[33,8209,8210],{},"StopIteration","，",[33,8213,35],{}," 会自动处理。",[44,8216,8217],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8219,58],{"id":58},[10,8221,61],{},[63,8223,8225],{"className":65,"code":8224,"language":67,"meta":68,"style":68},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[33,8226,8227,8232,8237,8242,8247,8252,8256,8261,8266,8270],{"__ignoreMap":68},[72,8228,8229],{"class":74,"line":75},[72,8230,8231],{},"def countdown(start):\n",[72,8233,8234],{"class":74,"line":81},[72,8235,8236],{},"    current = start\n",[72,8238,8239],{"class":74,"line":88},[72,8240,8241],{},"    while current > 0:\n",[72,8243,8244],{"class":74,"line":94},[72,8245,8246],{},"        yield current\n",[72,8248,8249],{"class":74,"line":100},[72,8250,8251],{},"        current = current - 1\n",[72,8253,8254],{"class":74,"line":105},[72,8255,85],{"emptyLinePlaceholder":84},[72,8257,8258],{"class":74,"line":111},[72,8259,8260],{},"iterator = countdown(3)\n",[72,8262,8263],{"class":74,"line":2466},[72,8264,8265],{},"print(next(iterator))\n",[72,8267,8268],{"class":74,"line":3926},[72,8269,8265],{},[72,8271,8272],{"class":74,"line":4138},[72,8273,8265],{},[10,8275,117],{},[63,8277,8280],{"className":8278,"code":8279,"language":123,"meta":68},[121],"3\n2\n1\n",[33,8281,8279],{"__ignoreMap":68},[10,8283,128],{},[14,8285,131],{"id":131},[133,8287,8288,8294],{},[44,8289,7870,8290,8293],{},[33,8291,8292],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[44,8295,8296,8297,8299,8300,8302,8303,8306],{},"每次 ",[33,8298,8203],{}," 运行到下一个 ",[33,8301,8189],{}," 并暂停，局部变量 ",[33,8304,8305],{},"current"," 和执行位置被保留。",[301,8308,2670],{"id":2670},[10,8310,8311,8312,8314],{},"生成器的暂停位置可以展开成多次 ",[33,8313,8203],{}," 的时间线。",[10,8316,8317],{},[26,8318],{"alt":8319,"src":8320},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8322,8323,8324,8326],{},"每次请求只推进到下一个 ",[33,8325,8189],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8328,152],{"id":152},[41,8330,8331,8334],{},[44,8332,8333],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[44,8335,8336],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8338,163],{"id":163},[133,8340,8341,8344],{},[44,8342,8343],{},"编写产生 1 到指定上限偶数的生成器。",[44,8345,3984,8346,8348,8349,8351],{},[33,8347,35],{}," 遍历生成器，比较手动 ",[33,8350,8203],{}," 的差异。",[10,8353,178],{},[14,8355,181],{"id":181},[10,8357,8358],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8360,188],{},{"title":68,"searchDepth":81,"depth":81,"links":8362},[8363,8364,8365,8366,8367,8370,8371,8372],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":8368},[8369],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8165,"description":8170},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[199,8380,8381],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8384,"title":8385,"body":8386,"category":199,"cover":200,"description":8390,"extension":201,"meta":8614,"navigation":84,"path":8615,"pinned":204,"publishedAt":205,"seo":8616,"slug":8617,"stem":8618,"summary":8619,"tags":8620,"updatedAt":205,"visible":84,"__hash__":8622},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8387,"toc":8602},[8388,8391,8393,8396,8398,8404,8407,8409,8429,8431,8433,8515,8517,8523,8525,8527,8549,8551,8554,8560,8567,8569,8579,8581,8593,8595,8597,8600],[10,8389,8390],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8392,16],{"id":16},[10,8394,8395],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8397,22],{"id":22},[10,8399,8400],{},[26,8401],{"alt":8402,"src":8403},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8405,8406],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8408,39],{"id":39},[41,8410,8411,8420,8423],{},[44,8412,8413,8416,8417,335],{},[33,8414,8415],{},"@trace"," 等价于 ",[33,8418,8419],{},"add = trace(add)",[44,8421,8422],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[44,8424,8425,8428],{},[33,8426,8427],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8430,58],{"id":58},[10,8432,61],{},[63,8434,8436],{"className":65,"code":8435,"language":67,"meta":68,"style":68},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[33,8437,8438,8443,8447,8452,8457,8462,8467,8472,8477,8482,8487,8491,8496,8500,8504,8509],{"__ignoreMap":68},[72,8439,8440],{"class":74,"line":75},[72,8441,8442],{},"from functools import wraps\n",[72,8444,8445],{"class":74,"line":81},[72,8446,85],{"emptyLinePlaceholder":84},[72,8448,8449],{"class":74,"line":88},[72,8450,8451],{},"def trace(function):\n",[72,8453,8454],{"class":74,"line":94},[72,8455,8456],{},"    @wraps(function)\n",[72,8458,8459],{"class":74,"line":100},[72,8460,8461],{},"    def wrapper(*args, **kwargs):\n",[72,8463,8464],{"class":74,"line":105},[72,8465,8466],{},"        print(\"开始：\", function.__name__)\n",[72,8468,8469],{"class":74,"line":111},[72,8470,8471],{},"        result = function(*args, **kwargs)\n",[72,8473,8474],{"class":74,"line":2466},[72,8475,8476],{},"        print(\"结束：\", function.__name__)\n",[72,8478,8479],{"class":74,"line":3926},[72,8480,8481],{},"        return result\n",[72,8483,8484],{"class":74,"line":4138},[72,8485,8486],{},"    return wrapper\n",[72,8488,8489],{"class":74,"line":5767},[72,8490,85],{"emptyLinePlaceholder":84},[72,8492,8493],{"class":74,"line":5772},[72,8494,8495],{},"@trace\n",[72,8497,8498],{"class":74,"line":7377},[72,8499,6120],{},[72,8501,8502],{"class":74,"line":7383},[72,8503,6125],{},[72,8505,8507],{"class":74,"line":8506},15,[72,8508,85],{"emptyLinePlaceholder":84},[72,8510,8512],{"class":74,"line":8511},16,[72,8513,8514],{},"print(add(2, 3))\n",[10,8516,117],{},[63,8518,8521],{"className":8519,"code":8520,"language":123,"meta":68},[121],"开始： add\n结束： add\n5\n",[33,8522,8520],{"__ignoreMap":68},[10,8524,128],{},[14,8526,131],{"id":131},[133,8528,8529,8546],{},[44,8530,8531,8532,8535,8536,8539,8540,8543,8544,335],{},"解释器执行定义时，把原 ",[33,8533,8534],{},"add"," 函数交给 ",[33,8537,8538],{},"trace","，返回的 ",[33,8541,8542],{},"wrapper"," 重新绑定到名字 ",[33,8545,8534],{},[44,8547,8548],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[301,8550,2670],{"id":2670},[10,8552,8553],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8555,8556],{},[26,8557],{"alt":8558,"src":8559},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8561,8562,8564,8565,335],{},[33,8563,8415],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8566,8419],{},[14,8568,152],{"id":152},[41,8570,8571,8576],{},[44,8572,8573,8574,335],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8575,5318],{},[44,8577,8578],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8580,163],{"id":163},[133,8582,8583,8586],{},[44,8584,8585],{},"编写只记录调用次数的简单装饰器。",[44,8587,8588,8589,8592],{},"删除包装函数的 ",[33,8590,8591],{},"return result","，观察调用方得到什么。",[10,8594,178],{},[14,8596,181],{"id":181},[10,8598,8599],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8601,188],{},{"title":68,"searchDepth":81,"depth":81,"links":8603},[8604,8605,8606,8607,8608,8611,8612,8613],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":8609},[8610],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8385,"description":8390},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[199,8621,5269],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8624,"title":8625,"body":8626,"category":199,"cover":200,"description":8630,"extension":201,"meta":8817,"navigation":84,"path":8818,"pinned":204,"publishedAt":205,"seo":8819,"slug":8820,"stem":8821,"summary":8822,"tags":8823,"updatedAt":205,"visible":84,"__hash__":8826},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8627,"toc":8805},[8628,8631,8633,8636,8638,8644,8647,8649,8660,8662,8664,8739,8741,8747,8749,8751,8762,8764,8767,8773,8776,8778,8786,8788,8796,8798,8800,8803],[10,8629,8630],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8632,16],{"id":16},[10,8634,8635],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8637,22],{"id":22},[10,8639,8640],{},[26,8641],{"alt":8642,"src":8643},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8645,8646],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8648,39],{"id":39},[41,8650,8651,8654,8657],{},[44,8652,8653],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[44,8655,8656],{},"日志记录运行状态，测试判断结果是否符合约定。",[44,8658,8659],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8661,58],{"id":58},[10,8663,61],{},[63,8665,8667],{"className":65,"code":8666,"language":67,"meta":68,"style":68},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[33,8668,8669,8674,8679,8683,8688,8692,8697,8702,8707,8711,8716,8721,8726,8730,8734],{"__ignoreMap":68},[72,8670,8671],{"class":74,"line":75},[72,8672,8673],{},"import logging\n",[72,8675,8676],{"class":74,"line":81},[72,8677,8678],{},"import unittest\n",[72,8680,8681],{"class":74,"line":88},[72,8682,85],{"emptyLinePlaceholder":84},[72,8684,8685],{"class":74,"line":94},[72,8686,8687],{},"logging.basicConfig(level=logging.INFO)\n",[72,8689,8690],{"class":74,"line":100},[72,8691,85],{"emptyLinePlaceholder":84},[72,8693,8694],{"class":74,"line":105},[72,8695,8696],{},"def clamp_progress(value):\n",[72,8698,8699],{"class":74,"line":111},[72,8700,8701],{},"    logging.info(\"检查进度：%s\", value)\n",[72,8703,8704],{"class":74,"line":2466},[72,8705,8706],{},"    return max(0, min(100, value))\n",[72,8708,8709],{"class":74,"line":3926},[72,8710,85],{"emptyLinePlaceholder":84},[72,8712,8713],{"class":74,"line":4138},[72,8714,8715],{},"class ProgressTest(unittest.TestCase):\n",[72,8717,8718],{"class":74,"line":5767},[72,8719,8720],{},"    def test_upper_limit(self):\n",[72,8722,8723],{"class":74,"line":5772},[72,8724,8725],{},"        self.assertEqual(clamp_progress(120), 100)\n",[72,8727,8728],{"class":74,"line":7377},[72,8729,85],{"emptyLinePlaceholder":84},[72,8731,8732],{"class":74,"line":7383},[72,8733,6134],{},[72,8735,8736],{"class":74,"line":8506},[72,8737,8738],{},"    unittest.main()\n",[10,8740,117],{},[63,8742,8745],{"className":8743,"code":8744,"language":123,"meta":68},[121],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8746,8744],{"__ignoreMap":68},[10,8748,128],{},[14,8750,131],{"id":131},[133,8752,8753,8759],{},[44,8754,8755,8758],{},[33,8756,8757],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[44,8760,8761],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[301,8763,2670],{"id":2670},[10,8765,8766],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8768,8769],{},[26,8770],{"alt":8771,"src":8772},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8774,8775],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8777,152],{"id":152},[41,8779,8780,8783],{},[44,8781,8782],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[44,8784,8785],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8787,163],{"id":163},[133,8789,8790,8793],{},[44,8791,8792],{},"为负数进度增加测试。",[44,8794,8795],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8797,178],{},[14,8799,181],{"id":181},[10,8801,8802],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,8804,188],{},{"title":68,"searchDepth":81,"depth":81,"links":8806},[8807,8808,8809,8810,8811,8814,8815,8816],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":8812},[8813],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8625,"description":8630},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[199,8824,8825],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8828,"title":8829,"body":8830,"category":199,"cover":200,"description":8834,"extension":201,"meta":9134,"navigation":84,"path":9135,"pinned":204,"publishedAt":205,"seo":9136,"slug":9137,"stem":9138,"summary":9139,"tags":9140,"updatedAt":205,"visible":84,"__hash__":9143},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8831,"toc":9121},[8832,8835,8837,8840,8842,8848,8851,8853,8868,8870,8872,9019,9021,9027,9029,9031,9044,9046,9049,9055,9058,9060,9063,9069,9076,9078,9089,9091,9112,9114,9116,9119],[10,8833,8834],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8836,16],{"id":16},[10,8838,8839],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8841,22],{"id":22},[10,8843,8844],{},[26,8845],{"alt":8846,"src":8847},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8849,8850],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8852,39],{"id":39},[41,8854,8855,8858,8861],{},[44,8856,8857],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[44,8859,8860],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[44,8862,8863,8864,8867],{},"实际扩展前先为 ",[33,8865,8866],{},"add()"," 和存储边界补充测试。",[14,8869,58],{"id":58},[10,8871,61],{},[63,8873,8875],{"className":65,"code":8874,"language":67,"meta":68,"style":68},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[33,8876,8877,8881,8885,8889,8894,8899,8904,8909,8913,8918,8923,8928,8933,8938,8942,8947,8952,8958,8963,8969,8974,8979,8985,8991,8997,9002,9008,9013],{"__ignoreMap":68},[72,8878,8879],{"class":74,"line":75},[72,8880,6932],{},[72,8882,8883],{"class":74,"line":81},[72,8884,6541],{},[72,8886,8887],{"class":74,"line":88},[72,8888,85],{"emptyLinePlaceholder":84},[72,8890,8891],{"class":74,"line":94},[72,8892,8893],{},"class LearningRecords:\n",[72,8895,8896],{"class":74,"line":100},[72,8897,8898],{},"    def __init__(self, file_path):\n",[72,8900,8901],{"class":74,"line":105},[72,8902,8903],{},"        self.file_path = Path(file_path)\n",[72,8905,8906],{"class":74,"line":111},[72,8907,8908],{},"        self.items = []\n",[72,8910,8911],{"class":74,"line":2466},[72,8912,85],{"emptyLinePlaceholder":84},[72,8914,8915],{"class":74,"line":3926},[72,8916,8917],{},"    def add(self, title):\n",[72,8919,8920],{"class":74,"line":4138},[72,8921,8922],{},"        title = title.strip()\n",[72,8924,8925],{"class":74,"line":5767},[72,8926,8927],{},"        if not title:\n",[72,8929,8930],{"class":74,"line":5772},[72,8931,8932],{},"            raise ValueError(\"课程名称不能为空\")\n",[72,8934,8935],{"class":74,"line":7377},[72,8936,8937],{},"        self.items.append({\"title\": title, \"done\": False})\n",[72,8939,8940],{"class":74,"line":7383},[72,8941,85],{"emptyLinePlaceholder":84},[72,8943,8944],{"class":74,"line":8506},[72,8945,8946],{},"    def save(self):\n",[72,8948,8949],{"class":74,"line":8511},[72,8950,8951],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,8953,8955],{"class":74,"line":8954},17,[72,8956,8957],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[72,8959,8961],{"class":74,"line":8960},18,[72,8962,85],{"emptyLinePlaceholder":84},[72,8964,8966],{"class":74,"line":8965},19,[72,8967,8968],{},"records = LearningRecords(\"learning-records.json\")\n",[72,8970,8972],{"class":74,"line":8971},20,[72,8973,85],{"emptyLinePlaceholder":84},[72,8975,8977],{"class":74,"line":8976},21,[72,8978,7350],{},[72,8980,8982],{"class":74,"line":8981},22,[72,8983,8984],{},"    title = input(\"输入已学习课程：\")\n",[72,8986,8988],{"class":74,"line":8987},23,[72,8989,8990],{},"    records.add(title)\n",[72,8992,8994],{"class":74,"line":8993},24,[72,8995,8996],{},"    records.save()\n",[72,8998,9000],{"class":74,"line":8999},25,[72,9001,7360],{},[72,9003,9005],{"class":74,"line":9004},26,[72,9006,9007],{},"    print(\"无法保存：\", error)\n",[72,9009,9011],{"class":74,"line":9010},27,[72,9012,1119],{},[72,9014,9016],{"class":74,"line":9015},28,[72,9017,9018],{},"    print(\"已保存 1 条学习记录\")\n",[10,9020,117],{},[63,9022,9025],{"className":9023,"code":9024,"language":123,"meta":68},[121],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9026,9024],{"__ignoreMap":68},[10,9028,128],{},[14,9030,131],{"id":131},[133,9032,9033,9039],{},[44,9034,9035,9036,9038],{},"输入层取得课程名后，",[33,9037,8866],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[44,9040,9041,9043],{},[33,9042,8098],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[301,9045,2670],{"id":2670},[10,9047,9048],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9050,9051],{},[26,9052],{"alt":9053,"src":9054},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9056,9057],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[301,9059,2670],{"id":4193},[10,9061,9062],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9064,9065],{},[26,9066],{"alt":9067,"src":9068},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9070,9071,9072,9075],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9073,9074],{},"load()"," 把文件状态恢复到内存。",[14,9077,152],{"id":152},[41,9079,9080,9083],{},[44,9081,9082],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[44,9084,9085,9086,9088],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9087,9074],{}," 是下一项必要扩展。",[14,9090,163],{"id":163},[133,9092,9093,9099,9102],{},[44,9094,9095,9096,9098],{},"增加 ",[33,9097,9074],{},"，文件不存在时从空列表开始。",[44,9100,9101],{},"增加按序号标记完成的功能，并校验序号范围。",[44,9103,9104,9105,9108,9109,9111],{},"把输入循环放进 ",[33,9106,9107],{},"main()","，通过 ",[33,9110,6076],{}," 控制程序入口。",[10,9113,178],{},[14,9115,181],{"id":181},[10,9117,9118],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[186,9120,188],{},{"title":68,"searchDepth":81,"depth":81,"links":9122},[9123,9124,9125,9126,9127,9131,9132,9133],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":9128},[9129,9130],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8829,"description":8834},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[199,9141,9142],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9145,9248,9367,9498,9641,9766,9903,10040,10181,10350,10487,10620,10743,10872,10999,11162,11338,11479,11608,11757,11900,12021,12144,12293,12446,12611,12738,12919,13062,13219,13370,13517,13672,13890,14045,14220,14371,14538,14725,14888,15130,15370],{"id":1366,"title":1367,"body":9146,"category":199,"cover":200,"description":1372,"extension":201,"meta":9245,"navigation":84,"path":1491,"pinned":204,"publishedAt":205,"seo":9246,"slug":1493,"stem":1494,"summary":1495,"tags":9247,"updatedAt":205,"visible":84,"__hash__":1498},{"type":7,"value":9147,"toc":9235},[9148,9150,9152,9154,9156,9160,9164,9166,9176,9178,9180,9188,9190,9195,9197,9199,9209,9211,9219,9221,9227,9229,9231,9233],[10,9149,1372],{},[14,9151,16],{"id":16},[10,9153,1377],{},[14,9155,22],{"id":22},[10,9157,9158],{},[26,9159],{"alt":1384,"src":1385},[10,9161,9162,1390],{},[33,9163,1144],{},[14,9165,39],{"id":39},[41,9167,9168,9172,9174],{},[44,9169,1397,9170,1400],{},[33,9171,1144],{},[44,9173,1403],{},[44,9175,1406],{},[14,9177,58],{"id":58},[10,9179,61],{},[63,9181,9182],{"className":65,"code":1413,"language":67,"meta":68,"style":68},[33,9183,9184],{"__ignoreMap":68},[72,9185,9186],{"class":74,"line":75},[72,9187,1413],{},[10,9189,117],{},[63,9191,9193],{"className":9192,"code":1425,"language":123,"meta":68},[121],[33,9194,1425],{"__ignoreMap":68},[10,9196,128],{},[14,9198,131],{"id":131},[133,9200,9201,9205],{},[44,9202,1436,9203,1440],{},[33,9204,1439],{},[44,9206,1443,9207,1447],{},[33,9208,1446],{},[14,9210,152],{"id":152},[41,9212,9213,9215],{},[44,9214,1454],{},[44,9216,1457,9217,1460],{},[33,9218,1144],{},[14,9220,163],{"id":163},[133,9222,9223,9225],{},[44,9224,1467],{},[44,9226,1470],{},[10,9228,178],{},[14,9230,181],{"id":181},[10,9232,1477],{},[186,9234,188],{},{"title":68,"searchDepth":81,"depth":81,"links":9236},[9237,9238,9239,9240,9241,9242,9243,9244],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":1367,"description":1372},[199,1362,1497],{"id":1500,"title":1501,"body":9249,"category":199,"cover":200,"description":1506,"extension":201,"meta":9364,"navigation":84,"path":1643,"pinned":204,"publishedAt":205,"seo":9365,"slug":1645,"stem":1646,"summary":1647,"tags":9366,"updatedAt":205,"visible":84,"__hash__":1650},{"type":7,"value":9250,"toc":9354},[9251,9253,9255,9257,9259,9263,9267,9269,9279,9281,9283,9303,9305,9310,9312,9314,9324,9326,9336,9338,9346,9348,9350,9352],[10,9252,1506],{},[14,9254,16],{"id":16},[10,9256,1511],{},[14,9258,22],{"id":22},[10,9260,9261],{},[26,9262],{"alt":1518,"src":1519},[10,9264,1522,9265,1525],{},[33,9266,664],{},[14,9268,39],{"id":39},[41,9270,9271,9273,9275],{},[44,9272,1532],{},[44,9274,1535],{},[44,9276,1538,9277,1542],{},[33,9278,1541],{},[14,9280,58],{"id":58},[10,9282,1547],{},[63,9284,9285],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,9286,9287,9293],{"__ignoreMap":68},[72,9288,9289,9291],{"class":74,"line":75},[72,9290,664],{"class":573},[72,9292,577],{"class":576},[72,9294,9295,9297,9299,9301],{"class":74,"line":81},[72,9296,664],{"class":573},[72,9298,606],{"class":576},[72,9300,610],{"class":609},[72,9302,577],{"class":576},[10,9304,117],{},[63,9306,9308],{"className":9307,"code":1573,"language":123,"meta":68},[121],[33,9309,1573],{"__ignoreMap":68},[10,9311,128],{},[14,9313,131],{"id":131},[133,9315,9316,9320],{},[44,9317,9318,1587],{},[33,9319,1586],{},[44,9321,9322,1592],{},[33,9323,672],{},[14,9325,152],{"id":152},[41,9327,9328,9332],{},[44,9329,1599,9330,1602],{},[33,9331,664],{},[44,9333,1605,9334,1608],{},[33,9335,664],{},[14,9337,163],{"id":163},[133,9339,9340,9344],{},[44,9341,911,9342,1618],{},[33,9343,1617],{},[44,9345,1621],{},[10,9347,178],{},[14,9349,181],{"id":181},[10,9351,1628],{},[186,9353,1631],{},{"title":68,"searchDepth":81,"depth":81,"links":9355},[9356,9357,9358,9359,9360,9361,9362,9363],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":1501,"description":1506},[199,1649,1025],{"id":1652,"title":1653,"body":9368,"category":199,"cover":200,"description":1819,"extension":201,"meta":9495,"navigation":84,"path":1821,"pinned":204,"publishedAt":205,"seo":9496,"slug":1823,"stem":1824,"summary":1825,"tags":9497,"updatedAt":205,"visible":84,"__hash__":1829},{"type":7,"value":9369,"toc":9485},[9370,9374,9376,9378,9380,9384,9386,9388,9404,9406,9408,9428,9430,9435,9437,9439,9451,9453,9463,9465,9475,9477,9479,9483],[10,9371,1658,9372,1661],{},[33,9373,1144],{},[14,9375,16],{"id":16},[10,9377,1666],{},[14,9379,22],{"id":22},[10,9381,9382],{},[26,9383],{"alt":1673,"src":1674},[10,9385,1677],{},[14,9387,39],{"id":39},[41,9389,9390,9396,9400],{},[44,9391,1684,9392,1687,9394,335],{},[33,9393,664],{},[33,9395,1690],{},[44,9397,1693,9398,1697],{},[33,9399,1696],{},[44,9401,1700,9402,1703],{},[33,9403,1144],{},[14,9405,58],{"id":58},[10,9407,61],{},[63,9409,9410],{"className":1710,"code":1711,"language":1712,"meta":68,"style":68},[33,9411,9412,9416,9420,9424],{"__ignoreMap":68},[72,9413,9414],{"class":74,"line":75},[72,9415,1719],{},[72,9417,9418],{"class":74,"line":81},[72,9419,1724],{},[72,9421,9422],{"class":74,"line":88},[72,9423,1729],{},[72,9425,9426],{"class":74,"line":94},[72,9427,1734],{},[10,9429,117],{},[63,9431,9433],{"className":9432,"code":1740,"language":123,"meta":68},[121],[33,9434,1740],{"__ignoreMap":68},[10,9436,128],{},[14,9438,131],{"id":131},[133,9440,9441,9447],{},[44,9442,1751,9443,1755,9445,335],{},[33,9444,1754],{},[33,9446,1758],{},[44,9448,1761,9449,1764],{},[33,9450,1446],{},[14,9452,152],{"id":152},[41,9454,9455,9461],{},[44,9456,1771,9457,1774,9459,1777],{},[33,9458,1690],{},[33,9460,1144],{},[44,9462,1780],{},[14,9464,163],{"id":163},[133,9466,9467,9471],{},[44,9468,1787,9469,335],{},[33,9470,1790],{},[44,9472,1793,9473,1796],{},[33,9474,1446],{},[10,9476,178],{},[14,9478,181],{"id":181},[10,9480,1803,9481,1806],{},[33,9482,1144],{},[186,9484,188],{},{"title":68,"searchDepth":81,"depth":81,"links":9486},[9487,9488,9489,9490,9491,9492,9493,9494],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":1653,"description":1819},[199,1827,1828],{"id":1831,"title":1832,"body":9499,"category":199,"cover":200,"description":1837,"extension":201,"meta":9638,"navigation":84,"path":2009,"pinned":204,"publishedAt":205,"seo":9639,"slug":2011,"stem":2012,"summary":2013,"tags":9640,"updatedAt":205,"visible":84,"__hash__":2017},{"type":7,"value":9500,"toc":9628},[9501,9503,9505,9507,9509,9513,9517,9519,9531,9533,9535,9571,9573,9578,9580,9582,9598,9600,9610,9612,9620,9622,9624,9626],[10,9502,1837],{},[14,9504,16],{"id":16},[10,9506,1842],{},[14,9508,22],{"id":22},[10,9510,9511],{},[26,9512],{"alt":1849,"src":1850},[10,9514,9515,1856],{},[33,9516,1855],{},[14,9518,39],{"id":39},[41,9520,9521,9523,9529],{},[44,9522,1863],{},[44,9524,9525,1869,9527,1873],{},[33,9526,1868],{},[33,9528,1872],{},[44,9530,1876],{},[14,9532,58],{"id":58},[10,9534,1547],{},[63,9536,9537],{"className":564,"code":1883,"language":566,"meta":68,"style":68},[33,9538,9539,9545,9551,9555,9565],{"__ignoreMap":68},[72,9540,9541,9543],{"class":74,"line":75},[72,9542,1890],{"class":573},[72,9544,1893],{"class":609},[72,9546,9547,9549],{"class":74,"line":81},[72,9548,1898],{"class":576},[72,9550,1893],{"class":609},[72,9552,9553],{"class":74,"line":88},[72,9554,1905],{"class":576},[72,9556,9557,9559,9561,9563],{"class":74,"line":94},[72,9558,1910],{"class":576},[72,9560,1913],{"class":609},[72,9562,1917],{"class":1916},[72,9564,1188],{"class":609},[72,9566,9567,9569],{"class":74,"line":100},[72,9568,664],{"class":573},[72,9570,1188],{"class":609},[10,9572,117],{},[63,9574,9576],{"className":9575,"code":1931,"language":123,"meta":68},[121],[33,9577,1931],{"__ignoreMap":68},[10,9579,128],{},[14,9581,131],{"id":131},[133,9583,9584,9592],{},[44,9585,9586,1944,9588,1947,9590,1950],{},[33,9587,1890],{},[33,9589,1898],{},[33,9591,1868],{},[44,9593,9594,1955,9596,1959],{},[33,9595,1855],{},[33,9597,1958],{},[14,9599,152],{"id":152},[41,9601,9602,9608],{},[44,9603,1966,9604,1130,9606,335],{},[33,9605,1868],{},[33,9607,1872],{},[44,9609,1973],{},[14,9611,163],{"id":163},[133,9613,9614,9618],{},[44,9615,1980,9616,1984],{},[33,9617,1983],{},[44,9619,1987],{},[10,9621,178],{},[14,9623,181],{"id":181},[10,9625,1994],{},[186,9627,1997],{},{"title":68,"searchDepth":81,"depth":81,"links":9629},[9630,9631,9632,9633,9634,9635,9636,9637],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":1832,"description":1837},[199,2015,2016],{"id":2019,"title":2020,"body":9642,"category":199,"cover":200,"description":2025,"extension":201,"meta":9763,"navigation":84,"path":2174,"pinned":204,"publishedAt":205,"seo":9764,"slug":2176,"stem":2177,"summary":2178,"tags":9765,"updatedAt":205,"visible":84,"__hash__":2182},{"type":7,"value":9643,"toc":9753},[9644,9646,9648,9650,9652,9656,9664,9666,9680,9682,9684,9700,9702,9707,9709,9711,9725,9727,9733,9735,9745,9747,9749,9751],[10,9645,2025],{},[14,9647,16],{"id":16},[10,9649,2030],{},[14,9651,22],{"id":22},[10,9653,9654],{},[26,9655],{"alt":2037,"src":2038},[10,9657,2041,9658,335,9660,2047,9662,335],{},[33,9659,1446],{},[33,9661,2046],{},[33,9663,1754],{},[14,9665,39],{"id":39},[41,9667,9668,9672,9678],{},[44,9669,9670,2059],{},[33,9671,2058],{},[44,9673,9674,2065,9676,335],{},[33,9675,2064],{},[33,9677,2068],{},[44,9679,2071],{},[14,9681,58],{"id":58},[10,9683,61],{},[63,9685,9686],{"className":65,"code":2078,"language":67,"meta":68,"style":68},[33,9687,9688,9692,9696],{"__ignoreMap":68},[72,9689,9690],{"class":74,"line":75},[72,9691,2085],{},[72,9693,9694],{"class":74,"line":81},[72,9695,2090],{},[72,9697,9698],{"class":74,"line":88},[72,9699,2095],{},[10,9701,117],{},[63,9703,9705],{"className":9704,"code":2101,"language":123,"meta":68},[121],[33,9706,2101],{"__ignoreMap":68},[10,9708,128],{},[14,9710,131],{"id":131},[133,9712,9713,9719],{},[44,9714,9715,2115,9717,335],{},[33,9716,2114],{},[33,9718,2068],{},[44,9720,9721,2122,9723,2126],{},[33,9722,1446],{},[33,9724,2125],{},[14,9726,152],{"id":152},[41,9728,9729,9731],{},[44,9730,2133],{},[44,9732,2136],{},[14,9734,163],{"id":163},[133,9736,9737,9739],{},[44,9738,2143],{},[44,9740,2146,9741,2149,9743,2153],{},[33,9742,2046],{},[33,9744,2152],{},[10,9746,178],{},[14,9748,181],{"id":181},[10,9750,2160],{},[186,9752,188],{},{"title":68,"searchDepth":81,"depth":81,"links":9754},[9755,9756,9757,9758,9759,9760,9761,9762],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2020,"description":2025},[199,2180,2181],{"id":2184,"title":2185,"body":9767,"category":199,"cover":200,"description":2190,"extension":201,"meta":9900,"navigation":84,"path":2357,"pinned":204,"publishedAt":205,"seo":9901,"slug":2359,"stem":2360,"summary":2361,"tags":9902,"updatedAt":205,"visible":84,"__hash__":2365},{"type":7,"value":9768,"toc":9890},[9769,9771,9773,9775,9777,9781,9783,9785,9801,9803,9805,9829,9831,9836,9838,9840,9856,9858,9870,9872,9882,9884,9886,9888],[10,9770,2190],{},[14,9772,16],{"id":16},[10,9774,2195],{},[14,9776,22],{"id":22},[10,9778,9779],{},[26,9780],{"alt":2202,"src":2203},[10,9782,2206],{},[14,9784,39],{"id":39},[41,9786,9787,9789,9795],{},[44,9788,2213],{},[44,9790,2216,9791,2149,9793,2223],{},[33,9792,2219],{},[33,9794,2222],{},[44,9796,2226,9797,2230,9799,2234],{},[33,9798,2229],{},[33,9800,2233],{},[14,9802,58],{"id":58},[10,9804,61],{},[63,9806,9807],{"className":65,"code":2241,"language":67,"meta":68,"style":68},[33,9808,9809,9813,9817,9821,9825],{"__ignoreMap":68},[72,9810,9811],{"class":74,"line":75},[72,9812,2248],{},[72,9814,9815],{"class":74,"line":81},[72,9816,2253],{},[72,9818,9819],{"class":74,"line":88},[72,9820,85],{"emptyLinePlaceholder":84},[72,9822,9823],{"class":74,"line":94},[72,9824,2262],{},[72,9826,9827],{"class":74,"line":100},[72,9828,2253],{},[10,9830,117],{},[63,9832,9834],{"className":9833,"code":2272,"language":123,"meta":68},[121],[33,9835,2272],{"__ignoreMap":68},[10,9837,128],{},[14,9839,131],{"id":131},[133,9841,9842,9848],{},[44,9843,911,9844,2286,9846,2289],{},[33,9845,2285],{},[33,9847,2219],{},[44,9849,911,9850,2295,9852,2299,9854,335],{},[33,9851,2294],{},[33,9853,2298],{},[33,9855,2302],{},[14,9857,152],{"id":152},[41,9859,9860,9862],{},[44,9861,2309],{},[44,9863,171,9864,2230,9866,2230,9868,2319],{},[33,9865,2229],{},[33,9867,2233],{},[33,9869,2318],{},[14,9871,163],{"id":163},[133,9873,9874,9880],{},[44,9875,2326,9876,1130,9878,2333],{},[33,9877,2329],{},[33,9879,2332],{},[44,9881,2336],{},[10,9883,178],{},[14,9885,181],{"id":181},[10,9887,2343],{},[186,9889,188],{},{"title":68,"searchDepth":81,"depth":81,"links":9891},[9892,9893,9894,9895,9896,9897,9898,9899],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2185,"description":2190},[199,2363,2364],{"id":2367,"title":2368,"body":9904,"category":199,"cover":200,"description":2373,"extension":201,"meta":10037,"navigation":84,"path":2539,"pinned":204,"publishedAt":205,"seo":10038,"slug":2541,"stem":2542,"summary":2543,"tags":10039,"updatedAt":205,"visible":84,"__hash__":2547},{"type":7,"value":9905,"toc":10027},[9906,9908,9910,9912,9914,9918,9920,9922,9940,9942,9944,9980,9982,9987,9989,9991,10001,10003,10011,10013,10019,10021,10023,10025],[10,9907,2373],{},[14,9909,16],{"id":16},[10,9911,2378],{},[14,9913,22],{"id":22},[10,9915,9916],{},[26,9917],{"alt":2385,"src":2386},[10,9919,2389],{},[14,9921,39],{"id":39},[41,9923,9924,9930,9938],{},[44,9925,9926,2399,9928,2403],{},[33,9927,2398],{},[33,9929,2402],{},[44,9931,9932,2409,9934,2413,9936,2417],{},[33,9933,2408],{},[33,9935,2412],{},[33,9937,2416],{},[44,9939,2420],{},[14,9941,58],{"id":58},[10,9943,61],{},[63,9945,9946],{"className":65,"code":2427,"language":67,"meta":68,"style":68},[33,9947,9948,9952,9956,9960,9964,9968,9972,9976],{"__ignoreMap":68},[72,9949,9950],{"class":74,"line":75},[72,9951,2434],{},[72,9953,9954],{"class":74,"line":81},[72,9955,2439],{},[72,9957,9958],{"class":74,"line":88},[72,9959,2444],{},[72,9961,9962],{"class":74,"line":94},[72,9963,85],{"emptyLinePlaceholder":84},[72,9965,9966],{"class":74,"line":100},[72,9967,2453],{},[72,9969,9970],{"class":74,"line":105},[72,9971,2458],{},[72,9973,9974],{"class":74,"line":111},[72,9975,2463],{},[72,9977,9978],{"class":74,"line":2466},[72,9979,2469],{},[10,9981,117],{},[63,9983,9985],{"className":9984,"code":2475,"language":123,"meta":68},[121],[33,9986,2475],{"__ignoreMap":68},[10,9988,128],{},[14,9990,131],{"id":131},[133,9992,9993,9997],{},[44,9994,9995,2489],{},[33,9996,2488],{},[44,9998,9999,2495],{},[33,10000,2494],{},[14,10002,152],{"id":152},[41,10004,10005,10009],{},[44,10006,2502,10007,335],{},[33,10008,2505],{},[44,10010,2508],{},[14,10012,163],{"id":163},[133,10014,10015,10017],{},[44,10016,2515],{},[44,10018,2518],{},[10,10020,178],{},[14,10022,181],{"id":181},[10,10024,2525],{},[186,10026,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10028},[10029,10030,10031,10032,10033,10034,10035,10036],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2368,"description":2373},[199,2545,2546],{"id":2549,"title":2550,"body":10041,"category":199,"cover":200,"description":2555,"extension":201,"meta":10178,"navigation":84,"path":2732,"pinned":204,"publishedAt":205,"seo":10179,"slug":2734,"stem":2735,"summary":2736,"tags":10180,"updatedAt":205,"visible":84,"__hash__":2740},{"type":7,"value":10042,"toc":10166},[10043,10045,10047,10049,10051,10055,10061,10063,10071,10073,10075,10099,10101,10106,10108,10110,10128,10130,10132,10136,10138,10140,10146,10148,10158,10160,10162,10164],[10,10044,2555],{},[14,10046,16],{"id":16},[10,10048,2560],{},[14,10050,22],{"id":22},[10,10052,10053],{},[26,10054],{"alt":2567,"src":2568},[10,10056,2571,10057,2575,10059,335],{},[33,10058,2574],{},[33,10060,2578],{},[14,10062,39],{"id":39},[41,10064,10065,10067,10069],{},[44,10066,2585],{},[44,10068,2588],{},[44,10070,2591],{},[14,10072,58],{"id":58},[10,10074,61],{},[63,10076,10077],{"className":65,"code":2598,"language":67,"meta":68,"style":68},[33,10078,10079,10083,10087,10091,10095],{"__ignoreMap":68},[72,10080,10081],{"class":74,"line":75},[72,10082,2605],{},[72,10084,10085],{"class":74,"line":81},[72,10086,2610],{},[72,10088,10089],{"class":74,"line":88},[72,10090,2615],{},[72,10092,10093],{"class":74,"line":94},[72,10094,2620],{},[72,10096,10097],{"class":74,"line":100},[72,10098,2625],{},[10,10100,117],{},[63,10102,10104],{"className":10103,"code":2631,"language":123,"meta":68},[121],[33,10105,2631],{"__ignoreMap":68},[10,10107,128],{},[14,10109,131],{"id":131},[133,10111,10112,10120],{},[44,10113,2642,10114,2645,10116,2649,10118,2653],{},[33,10115,199],{},[33,10117,2648],{},[33,10119,2652],{},[44,10121,10122,2659,10124,2663,10126,2667],{},[33,10123,2658],{},[33,10125,2662],{},[33,10127,2666],{},[301,10129,2670],{"id":2670},[10,10131,2673],{},[10,10133,10134],{},[26,10135],{"alt":2678,"src":2679},[10,10137,2682],{},[14,10139,152],{"id":152},[41,10141,10142,10144],{},[44,10143,2689],{},[44,10145,2692],{},[14,10147,163],{"id":163},[133,10149,10150,10156],{},[44,10151,2699,10152,2703,10154,335],{},[33,10153,2702],{},[33,10155,2706],{},[44,10157,2709],{},[10,10159,178],{},[14,10161,181],{"id":181},[10,10163,2716],{},[186,10165,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10167},[10168,10169,10170,10171,10172,10175,10176,10177],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":10173},[10174],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2550,"description":2555},[199,2738,2739],{"id":2742,"title":2743,"body":10182,"category":199,"cover":200,"description":2748,"extension":201,"meta":10347,"navigation":84,"path":2963,"pinned":204,"publishedAt":205,"seo":10348,"slug":2965,"stem":2966,"summary":2967,"tags":10349,"updatedAt":205,"visible":84,"__hash__":2971},{"type":7,"value":10183,"toc":10335},[10184,10186,10188,10190,10192,10196,10202,10204,10224,10226,10228,10264,10266,10271,10273,10275,10289,10291,10293,10297,10303,10305,10315,10317,10327,10329,10331,10333],[10,10185,2748],{},[14,10187,16],{"id":16},[10,10189,2753],{},[14,10191,22],{"id":22},[10,10193,10194],{},[26,10195],{"alt":2760,"src":2761},[10,10197,2764,10198,982,10200,2771],{},[33,10199,2767],{},[33,10201,2770],{},[14,10203,39],{"id":39},[41,10205,10206,10214,10222],{},[44,10207,10208,2781,10210,2785,10212,2789],{},[33,10209,2780],{},[33,10211,2784],{},[33,10213,2788],{},[44,10215,10216,2795,10218,2799,10220,2803],{},[33,10217,2794],{},[33,10219,2798],{},[33,10221,2802],{},[44,10223,2806],{},[14,10225,58],{"id":58},[10,10227,61],{},[63,10229,10230],{"className":65,"code":2813,"language":67,"meta":68,"style":68},[33,10231,10232,10236,10240,10244,10248,10252,10256,10260],{"__ignoreMap":68},[72,10233,10234],{"class":74,"line":75},[72,10235,2820],{},[72,10237,10238],{"class":74,"line":81},[72,10239,2825],{},[72,10241,10242],{"class":74,"line":88},[72,10243,85],{"emptyLinePlaceholder":84},[72,10245,10246],{"class":74,"line":94},[72,10247,2834],{},[72,10249,10250],{"class":74,"line":100},[72,10251,2839],{},[72,10253,10254],{"class":74,"line":105},[72,10255,2844],{},[72,10257,10258],{"class":74,"line":111},[72,10259,2849],{},[72,10261,10262],{"class":74,"line":2466},[72,10263,2854],{},[10,10265,117],{},[63,10267,10269],{"className":10268,"code":2860,"language":123,"meta":68},[121],[33,10270,2860],{"__ignoreMap":68},[10,10272,128],{},[14,10274,131],{"id":131},[133,10276,10277,10283],{},[44,10278,10279,2874,10281,2878],{},[33,10280,2873],{},[33,10282,2877],{},[44,10284,10285,2884,10287,2887],{},[33,10286,2883],{},[33,10288,2802],{},[301,10290,2670],{"id":2670},[10,10292,2892],{},[10,10294,10295],{},[26,10296],{"alt":2897,"src":2898},[10,10298,10299,2903,10301,2906],{},[33,10300,2794],{},[33,10302,2798],{},[14,10304,152],{"id":152},[41,10306,10307,10313],{},[44,10308,2913,10309,2916,10311,2919],{},[33,10310,2788],{},[33,10312,2780],{},[44,10314,2922],{},[14,10316,163],{"id":163},[133,10318,10319,10323],{},[44,10320,2929,10321,2933],{},[33,10322,2932],{},[44,10324,2936,10325,2940],{},[33,10326,2939],{},[10,10328,178],{},[14,10330,181],{"id":181},[10,10332,2947],{},[186,10334,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10336},[10337,10338,10339,10340,10341,10344,10345,10346],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":10342},[10343],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2743,"description":2748},[199,2969,2970],{"id":2973,"title":2974,"body":10351,"category":199,"cover":200,"description":2979,"extension":201,"meta":10484,"navigation":84,"path":3148,"pinned":204,"publishedAt":205,"seo":10485,"slug":3150,"stem":3151,"summary":3152,"tags":10486,"updatedAt":205,"visible":84,"__hash__":3155},{"type":7,"value":10352,"toc":10474},[10353,10355,10357,10359,10361,10365,10375,10377,10387,10389,10391,10419,10421,10426,10428,10430,10444,10446,10454,10456,10466,10468,10470,10472],[10,10354,2979],{},[14,10356,16],{"id":16},[10,10358,2984],{},[14,10360,22],{"id":22},[10,10362,10363],{},[26,10364],{"alt":2991,"src":2992},[10,10366,10367,2998,10369,3002,10371,3006,10373,3010],{},[33,10368,2997],{},[33,10370,3001],{},[33,10372,3005],{},[33,10374,3009],{},[14,10376,39],{"id":39},[41,10378,10379,10381,10385],{},[44,10380,3017],{},[44,10382,10383,3022],{},[33,10384,3009],{},[44,10386,3025],{},[14,10388,58],{"id":58},[10,10390,61],{},[63,10392,10393],{"className":65,"code":3032,"language":67,"meta":68,"style":68},[33,10394,10395,10399,10403,10407,10411,10415],{"__ignoreMap":68},[72,10396,10397],{"class":74,"line":75},[72,10398,3039],{},[72,10400,10401],{"class":74,"line":81},[72,10402,3044],{},[72,10404,10405],{"class":74,"line":88},[72,10406,3049],{},[72,10408,10409],{"class":74,"line":94},[72,10410,85],{"emptyLinePlaceholder":84},[72,10412,10413],{"class":74,"line":100},[72,10414,3058],{},[72,10416,10417],{"class":74,"line":105},[72,10418,3063],{},[10,10420,117],{},[63,10422,10424],{"className":10423,"code":3069,"language":123,"meta":68},[121],[33,10425,3069],{"__ignoreMap":68},[10,10427,128],{},[14,10429,131],{"id":131},[133,10431,10432,10438],{},[44,10433,3080,10434,3083,10436,3087],{},[33,10435,2997],{},[33,10437,3086],{},[44,10439,10440,3093,10442,3097],{},[33,10441,3092],{},[33,10443,3096],{},[14,10445,152],{"id":152},[41,10447,10448,10452],{},[44,10449,3104,10450,3108],{},[33,10451,3107],{},[44,10453,3111],{},[14,10455,163],{"id":163},[133,10457,10458,10460],{},[44,10459,3118],{},[44,10461,1693,10462,3124,10464,3127],{},[33,10463,3123],{},[33,10465,3009],{},[10,10467,178],{},[14,10469,181],{"id":181},[10,10471,3134],{},[186,10473,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10475},[10476,10477,10478,10479,10480,10481,10482,10483],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":2974,"description":2979},[199,2318,3154],{"id":3157,"title":3158,"body":10488,"category":199,"cover":200,"description":3163,"extension":201,"meta":10617,"navigation":84,"path":3324,"pinned":204,"publishedAt":205,"seo":10618,"slug":3326,"stem":3327,"summary":3328,"tags":10619,"updatedAt":205,"visible":84,"__hash__":3332},{"type":7,"value":10489,"toc":10607},[10490,10492,10494,10496,10498,10502,10506,10508,10518,10520,10522,10554,10556,10561,10563,10565,10577,10579,10589,10591,10599,10601,10603,10605],[10,10491,3163],{},[14,10493,16],{"id":16},[10,10495,3168],{},[14,10497,22],{"id":22},[10,10499,10500],{},[26,10501],{"alt":3175,"src":3176},[10,10503,3179,10504,3183],{},[33,10505,3182],{},[14,10507,39],{"id":39},[41,10509,10510,10512,10514],{},[44,10511,3190],{},[44,10513,3193],{},[44,10515,3196,10516,335],{},[33,10517,3199],{},[14,10519,58],{"id":58},[10,10521,61],{},[63,10523,10524],{"className":65,"code":3206,"language":67,"meta":68,"style":68},[33,10525,10526,10530,10534,10538,10542,10546,10550],{"__ignoreMap":68},[72,10527,10528],{"class":74,"line":75},[72,10529,3213],{},[72,10531,10532],{"class":74,"line":81},[72,10533,3218],{},[72,10535,10536],{"class":74,"line":88},[72,10537,85],{"emptyLinePlaceholder":84},[72,10539,10540],{"class":74,"line":94},[72,10541,3227],{},[72,10543,10544],{"class":74,"line":100},[72,10545,3232],{},[72,10547,10548],{"class":74,"line":105},[72,10549,3237],{},[72,10551,10552],{"class":74,"line":111},[72,10553,3242],{},[10,10555,117],{},[63,10557,10559],{"className":10558,"code":3248,"language":123,"meta":68},[121],[33,10560,3248],{"__ignoreMap":68},[10,10562,128],{},[14,10564,131],{"id":131},[133,10566,10567,10569],{},[44,10568,3259],{},[44,10570,10571,3265,10573,3269,10575,3273],{},[33,10572,3264],{},[33,10574,3268],{},[33,10576,3272],{},[14,10578,152],{"id":152},[41,10580,10581,10587],{},[44,10582,3280,10583,3284,10585,335],{},[33,10584,3283],{},[33,10586,3287],{},[44,10588,3290],{},[14,10590,163],{"id":163},[133,10592,10593,10595],{},[44,10594,3297],{},[44,10596,3300,10597,3303],{},[33,10598,3272],{},[10,10600,178],{},[14,10602,181],{"id":181},[10,10604,3310],{},[186,10606,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10608},[10609,10610,10611,10612,10613,10614,10615,10616],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":3158,"description":3163},[199,3330,3331],{"id":3334,"title":3335,"body":10621,"category":199,"cover":200,"description":3340,"extension":201,"meta":10740,"navigation":84,"path":3482,"pinned":204,"publishedAt":205,"seo":10741,"slug":3484,"stem":3485,"summary":3486,"tags":10742,"updatedAt":205,"visible":84,"__hash__":3489},{"type":7,"value":10622,"toc":10730},[10623,10625,10627,10629,10631,10635,10637,10639,10647,10649,10651,10679,10681,10686,10688,10690,10700,10702,10710,10712,10722,10724,10726,10728],[10,10624,3340],{},[14,10626,16],{"id":16},[10,10628,3345],{},[14,10630,22],{"id":22},[10,10632,10633],{},[26,10634],{"alt":3352,"src":3353},[10,10636,3356],{},[14,10638,39],{"id":39},[41,10640,10641,10643,10645],{},[44,10642,3363],{},[44,10644,3366],{},[44,10646,3369],{},[14,10648,58],{"id":58},[10,10650,61],{},[63,10652,10653],{"className":65,"code":3376,"language":67,"meta":68,"style":68},[33,10654,10655,10659,10663,10667,10671,10675],{"__ignoreMap":68},[72,10656,10657],{"class":74,"line":75},[72,10658,3383],{},[72,10660,10661],{"class":74,"line":81},[72,10662,3388],{},[72,10664,10665],{"class":74,"line":88},[72,10666,3393],{},[72,10668,10669],{"class":74,"line":94},[72,10670,85],{"emptyLinePlaceholder":84},[72,10672,10673],{"class":74,"line":100},[72,10674,3402],{},[72,10676,10677],{"class":74,"line":105},[72,10678,3407],{},[10,10680,117],{},[63,10682,10684],{"className":10683,"code":3413,"language":123,"meta":68},[121],[33,10685,3413],{"__ignoreMap":68},[10,10687,128],{},[14,10689,131],{"id":131},[133,10691,10692,10696],{},[44,10693,10694,3427],{},[33,10695,3426],{},[44,10697,10698,3433],{},[33,10699,3432],{},[14,10701,152],{"id":152},[41,10703,10704,10708],{},[44,10705,3440,10706,3444],{},[33,10707,3443],{},[44,10709,3447],{},[14,10711,163],{"id":163},[133,10713,10714,10716],{},[44,10715,3454],{},[44,10717,2146,10718,2149,10720,3461],{},[33,10719,3443],{},[33,10721,3432],{},[10,10723,178],{},[14,10725,181],{"id":181},[10,10727,3468],{},[186,10729,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10731},[10732,10733,10734,10735,10736,10737,10738,10739],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":3335,"description":3340},[199,3488,3331],{"id":3491,"title":3492,"body":10744,"category":199,"cover":200,"description":3497,"extension":201,"meta":10869,"navigation":84,"path":3653,"pinned":204,"publishedAt":205,"seo":10870,"slug":3655,"stem":3656,"summary":3657,"tags":10871,"updatedAt":205,"visible":84,"__hash__":3660},{"type":7,"value":10745,"toc":10859},[10746,10748,10750,10752,10754,10758,10764,10766,10776,10778,10780,10808,10810,10815,10817,10819,10829,10831,10843,10845,10851,10853,10855,10857],[10,10747,3497],{},[14,10749,16],{"id":16},[10,10751,3502],{},[14,10753,22],{"id":22},[10,10755,10756],{},[26,10757],{"alt":3509,"src":3510},[10,10759,3513,10760,3517,10762,3520],{},[33,10761,3516],{},[33,10763,2219],{},[14,10765,39],{"id":39},[41,10767,10768,10770,10774],{},[44,10769,3527],{},[44,10771,171,10772,3533],{},[33,10773,3532],{},[44,10775,3536],{},[14,10777,58],{"id":58},[10,10779,61],{},[63,10781,10782],{"className":65,"code":3543,"language":67,"meta":68,"style":68},[33,10783,10784,10788,10792,10796,10800,10804],{"__ignoreMap":68},[72,10785,10786],{"class":74,"line":75},[72,10787,3550],{},[72,10789,10790],{"class":74,"line":81},[72,10791,3555],{},[72,10793,10794],{"class":74,"line":88},[72,10795,85],{"emptyLinePlaceholder":84},[72,10797,10798],{"class":74,"line":94},[72,10799,3564],{},[72,10801,10802],{"class":74,"line":100},[72,10803,3569],{},[72,10805,10806],{"class":74,"line":105},[72,10807,3574],{},[10,10809,117],{},[63,10811,10813],{"className":10812,"code":3580,"language":123,"meta":68},[121],[33,10814,3580],{"__ignoreMap":68},[10,10816,128],{},[14,10818,131],{"id":131},[133,10820,10821,10823],{},[44,10822,3591],{},[44,10824,3594,10825,3597,10827,3601],{},[33,10826,2219],{},[33,10828,3600],{},[14,10830,152],{"id":152},[41,10832,10833,10837],{},[44,10834,3608,10835,3612],{},[33,10836,3611],{},[44,10838,3615,10839,3619,10841,335],{},[33,10840,3618],{},[33,10842,3622],{},[14,10844,163],{"id":163},[133,10846,10847,10849],{},[44,10848,3629],{},[44,10850,3632],{},[10,10852,178],{},[14,10854,181],{"id":181},[10,10856,3639],{},[186,10858,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10860},[10861,10862,10863,10864,10865,10866,10867,10868],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":3492,"description":3497},[199,3659,3331],{"id":3662,"title":3663,"body":10873,"category":199,"cover":200,"description":3668,"extension":201,"meta":10996,"navigation":84,"path":3818,"pinned":204,"publishedAt":205,"seo":10997,"slug":3820,"stem":3821,"summary":3822,"tags":10998,"updatedAt":205,"visible":84,"__hash__":3825},{"type":7,"value":10874,"toc":10986},[10875,10877,10879,10881,10883,10887,10889,10891,10903,10905,10907,10935,10937,10942,10944,10946,10956,10958,10968,10970,10978,10980,10982,10984],[10,10876,3668],{},[14,10878,16],{"id":16},[10,10880,3673],{},[14,10882,22],{"id":22},[10,10884,10885],{},[26,10886],{"alt":3680,"src":3681},[10,10888,3684],{},[14,10890,39],{"id":39},[41,10892,10893,10895,10897],{},[44,10894,3691],{},[44,10896,3694],{},[44,10898,3697,10899,3701,10901,3705],{},[33,10900,3700],{},[33,10902,3704],{},[14,10904,58],{"id":58},[10,10906,61],{},[63,10908,10909],{"className":65,"code":3712,"language":67,"meta":68,"style":68},[33,10910,10911,10915,10919,10923,10927,10931],{"__ignoreMap":68},[72,10912,10913],{"class":74,"line":75},[72,10914,3719],{},[72,10916,10917],{"class":74,"line":81},[72,10918,3724],{},[72,10920,10921],{"class":74,"line":88},[72,10922,85],{"emptyLinePlaceholder":84},[72,10924,10925],{"class":74,"line":94},[72,10926,3733],{},[72,10928,10929],{"class":74,"line":100},[72,10930,3738],{},[72,10932,10933],{"class":74,"line":105},[72,10934,3743],{},[10,10936,117],{},[63,10938,10940],{"className":10939,"code":3749,"language":123,"meta":68},[121],[33,10941,3749],{"__ignoreMap":68},[10,10943,128],{},[14,10945,131],{"id":131},[133,10947,10948,10950],{},[44,10949,3760],{},[44,10951,10952,3766,10954,3770],{},[33,10953,3765],{},[33,10955,3769],{},[14,10957,152],{"id":152},[41,10959,10960,10966],{},[44,10961,171,10962,3779,10964,335],{},[33,10963,3704],{},[33,10965,3700],{},[44,10967,3784],{},[14,10969,163],{"id":163},[133,10971,10972,10976],{},[44,10973,3791,10974,3794],{},[33,10975,3700],{},[44,10977,3797],{},[10,10979,178],{},[14,10981,181],{"id":181},[10,10983,3804],{},[186,10985,188],{},{"title":68,"searchDepth":81,"depth":81,"links":10987},[10988,10989,10990,10991,10992,10993,10994,10995],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":3663,"description":3668},[199,3824,3331],{"id":3827,"title":3828,"body":11000,"category":199,"cover":200,"description":3833,"extension":201,"meta":11159,"navigation":84,"path":4032,"pinned":204,"publishedAt":205,"seo":11160,"slug":4034,"stem":4035,"summary":4036,"tags":11161,"updatedAt":205,"visible":84,"__hash__":4040},{"type":7,"value":11001,"toc":11147},[11002,11004,11006,11008,11010,11014,11020,11022,11034,11036,11038,11078,11080,11085,11087,11089,11103,11105,11107,11111,11113,11115,11125,11127,11139,11141,11143,11145],[10,11003,3833],{},[14,11005,16],{"id":16},[10,11007,3838],{},[14,11009,22],{"id":22},[10,11011,11012],{},[26,11013],{"alt":3845,"src":3846},[10,11015,11016,3852,11018,3856],{},[33,11017,3851],{},[33,11019,3855],{},[14,11021,39],{"id":39},[41,11023,11024,11030,11032],{},[44,11025,11026,3865,11028,3869],{},[33,11027,2780],{},[33,11029,3868],{},[44,11031,3872],{},[44,11033,3875],{},[14,11035,58],{"id":58},[10,11037,61],{},[63,11039,11040],{"className":65,"code":3882,"language":67,"meta":68,"style":68},[33,11041,11042,11046,11050,11054,11058,11062,11066,11070,11074],{"__ignoreMap":68},[72,11043,11044],{"class":74,"line":75},[72,11045,3889],{},[72,11047,11048],{"class":74,"line":81},[72,11049,3894],{},[72,11051,11052],{"class":74,"line":88},[72,11053,3899],{},[72,11055,11056],{"class":74,"line":94},[72,11057,85],{"emptyLinePlaceholder":84},[72,11059,11060],{"class":74,"line":100},[72,11061,3908],{},[72,11063,11064],{"class":74,"line":105},[72,11065,3913],{},[72,11067,11068],{"class":74,"line":111},[72,11069,3918],{},[72,11071,11072],{"class":74,"line":2466},[72,11073,3923],{},[72,11075,11076],{"class":74,"line":3926},[72,11077,3929],{},[10,11079,117],{},[63,11081,11083],{"className":11082,"code":3935,"language":123,"meta":68},[121],[33,11084,3935],{"__ignoreMap":68},[10,11086,128],{},[14,11088,131],{"id":131},[133,11090,11091,11095],{},[44,11092,11093,3949],{},[33,11094,3948],{},[44,11096,11097,3955,11099,3959,11101,3963],{},[33,11098,3954],{},[33,11100,3958],{},[33,11102,3962],{},[301,11104,2670],{"id":2670},[10,11106,3968],{},[10,11108,11109],{},[26,11110],{"alt":3973,"src":3974},[10,11112,3977],{},[14,11114,152],{"id":152},[41,11116,11117,11123],{},[44,11118,3984,11119,3987,11121,335],{},[33,11120,2780],{},[33,11122,3868],{},[44,11124,3992],{},[14,11126,163],{"id":163},[133,11128,11129,11131],{},[44,11130,3999],{},[44,11132,171,11133,4005,11135,1130,11137,335],{},[33,11134,4004],{},[33,11136,3868],{},[33,11138,2780],{},[10,11140,178],{},[14,11142,181],{"id":181},[10,11144,4016],{},[186,11146,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11148},[11149,11150,11151,11152,11153,11156,11157,11158],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":11154},[11155],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":3828,"description":3833},[199,4038,4039],{"id":4042,"title":4043,"body":11163,"category":199,"cover":200,"description":4048,"extension":201,"meta":11335,"navigation":84,"path":4262,"pinned":204,"publishedAt":205,"seo":11336,"slug":4264,"stem":4265,"summary":4266,"tags":11337,"updatedAt":205,"visible":84,"__hash__":4269},{"type":7,"value":11164,"toc":11322},[11165,11167,11169,11171,11173,11177,11185,11187,11195,11197,11199,11243,11245,11250,11252,11254,11266,11268,11270,11274,11280,11282,11284,11288,11292,11294,11306,11308,11314,11316,11318,11320],[10,11166,4048],{},[14,11168,16],{"id":16},[10,11170,4053],{},[14,11172,22],{"id":22},[10,11174,11175],{},[26,11176],{"alt":4060,"src":4061},[10,11178,11179,2230,11181,2230,11183,4071],{},[33,11180,1129],{},[33,11182,4068],{},[33,11184,1133],{},[14,11186,39],{"id":39},[41,11188,11189,11191,11193],{},[44,11190,4078],{},[44,11192,4081],{},[44,11194,4084],{},[14,11196,58],{"id":58},[10,11198,61],{},[63,11200,11201],{"className":65,"code":4091,"language":67,"meta":68,"style":68},[33,11202,11203,11207,11211,11215,11219,11223,11227,11231,11235,11239],{"__ignoreMap":68},[72,11204,11205],{"class":74,"line":75},[72,11206,4098],{},[72,11208,11209],{"class":74,"line":81},[72,11210,85],{"emptyLinePlaceholder":84},[72,11212,11213],{"class":74,"line":88},[72,11214,4107],{},[72,11216,11217],{"class":74,"line":94},[72,11218,4112],{},[72,11220,11221],{"class":74,"line":100},[72,11222,4117],{},[72,11224,11225],{"class":74,"line":105},[72,11226,4122],{},[72,11228,11229],{"class":74,"line":111},[72,11230,1119],{},[72,11232,11233],{"class":74,"line":2466},[72,11234,4131],{},[72,11236,11237],{"class":74,"line":3926},[72,11238,85],{"emptyLinePlaceholder":84},[72,11240,11241],{"class":74,"line":4138},[72,11242,4141],{},[10,11244,117],{},[63,11246,11248],{"className":11247,"code":4147,"language":123,"meta":68},[121],[33,11249,4147],{"__ignoreMap":68},[10,11251,128],{},[14,11253,131],{"id":131},[133,11255,11256,11260],{},[44,11257,4158,11258,4162],{},[33,11259,4161],{},[44,11261,11262,4168,11264,4171],{},[33,11263,4167],{},[33,11265,1133],{},[301,11267,2670],{"id":2670},[10,11269,4176],{},[10,11271,11272],{},[26,11273],{"alt":4181,"src":4182},[10,11275,11276,4187,11278,4190],{},[33,11277,4161],{},[33,11279,4167],{},[301,11281,2670],{"id":4193},[10,11283,4196],{},[10,11285,11286],{},[26,11287],{"alt":4201,"src":4202},[10,11289,4205,11290,4208],{},[33,11291,1129],{},[14,11293,152],{"id":152},[41,11295,11296,11300],{},[44,11297,4215,11298,4218],{},[33,11299,4167],{},[44,11301,4221,11302,4224,11304,4228],{},[33,11303,1129],{},[33,11305,4227],{},[14,11307,163],{"id":163},[133,11309,11310,11312],{},[44,11311,4235],{},[44,11313,4238],{},[10,11315,178],{},[14,11317,181],{"id":181},[10,11319,4245],{},[186,11321,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11323},[11324,11325,11326,11327,11328,11332,11333,11334],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":11329},[11330,11331],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":4043,"description":4048},[199,1129,4268],{"id":4271,"title":4272,"body":11339,"category":199,"cover":200,"description":4277,"extension":201,"meta":11476,"navigation":84,"path":4443,"pinned":204,"publishedAt":205,"seo":11477,"slug":4445,"stem":4446,"summary":4447,"tags":11478,"updatedAt":205,"visible":84,"__hash__":4450},{"type":7,"value":11340,"toc":11464},[11341,11343,11345,11347,11349,11353,11357,11359,11369,11371,11373,11405,11407,11412,11414,11416,11426,11428,11430,11434,11438,11440,11446,11448,11456,11458,11460,11462],[10,11342,4277],{},[14,11344,16],{"id":16},[10,11346,4282],{},[14,11348,22],{"id":22},[10,11350,11351],{},[26,11352],{"alt":4289,"src":4290},[10,11354,11355,4296],{},[33,11356,4295],{},[14,11358,39],{"id":39},[41,11360,11361,11363,11365],{},[44,11362,4303],{},[44,11364,4306],{},[44,11366,4309,11367,4312],{},[33,11368,35],{},[14,11370,58],{"id":58},[10,11372,61],{},[63,11374,11375],{"className":65,"code":4319,"language":67,"meta":68,"style":68},[33,11376,11377,11381,11385,11389,11393,11397,11401],{"__ignoreMap":68},[72,11378,11379],{"class":74,"line":75},[72,11380,4326],{},[72,11382,11383],{"class":74,"line":81},[72,11384,85],{"emptyLinePlaceholder":84},[72,11386,11387],{"class":74,"line":88},[72,11388,4335],{},[72,11390,11391],{"class":74,"line":94},[72,11392,4340],{},[72,11394,11395],{"class":74,"line":100},[72,11396,4345],{},[72,11398,11399],{"class":74,"line":105},[72,11400,85],{"emptyLinePlaceholder":84},[72,11402,11403],{"class":74,"line":111},[72,11404,4354],{},[10,11406,117],{},[63,11408,11410],{"className":11409,"code":4360,"language":123,"meta":68},[121],[33,11411,4360],{"__ignoreMap":68},[10,11413,128],{},[14,11415,131],{"id":131},[133,11417,11418,11422],{},[44,11419,4371,11420,4375],{},[33,11421,4374],{},[44,11423,4378,11424,4381],{},[33,11425,4374],{},[301,11427,2670],{"id":2670},[10,11429,4386],{},[10,11431,11432],{},[26,11433],{"alt":4391,"src":4392},[10,11435,4395,11436,4398],{},[33,11437,4374],{},[14,11439,152],{"id":152},[41,11441,11442,11444],{},[44,11443,4405],{},[44,11445,4408],{},[14,11447,163],{"id":163},[133,11449,11450,11454],{},[44,11451,171,11452,4417],{},[33,11453,4295],{},[44,11455,4420],{},[10,11457,178],{},[14,11459,181],{"id":181},[10,11461,4427],{},[186,11463,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11465},[11466,11467,11468,11469,11470,11473,11474,11475],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":11471},[11472],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":4272,"description":4277},[199,4295,4449],{"id":4,"title":5,"body":11480,"category":199,"cover":200,"description":12,"extension":201,"meta":11605,"navigation":84,"path":203,"pinned":204,"publishedAt":205,"seo":11606,"slug":207,"stem":208,"summary":209,"tags":11607,"updatedAt":205,"visible":84,"__hash__":212},{"type":7,"value":11481,"toc":11595},[11482,11484,11486,11488,11490,11494,11498,11500,11510,11512,11514,11546,11548,11553,11555,11557,11569,11571,11577,11579,11587,11589,11591,11593],[10,11483,12],{},[14,11485,16],{"id":16},[10,11487,19],{},[14,11489,22],{"id":22},[10,11491,11492],{},[26,11493],{"alt":28,"src":29},[10,11495,11496,36],{},[33,11497,35],{},[14,11499,39],{"id":39},[41,11501,11502,11506,11508],{},[44,11503,11504,49],{},[33,11505,48],{},[44,11507,52],{},[44,11509,55],{},[14,11511,58],{"id":58},[10,11513,61],{},[63,11515,11516],{"className":65,"code":66,"language":67,"meta":68,"style":68},[33,11517,11518,11522,11526,11530,11534,11538,11542],{"__ignoreMap":68},[72,11519,11520],{"class":74,"line":75},[72,11521,78],{},[72,11523,11524],{"class":74,"line":81},[72,11525,85],{"emptyLinePlaceholder":84},[72,11527,11528],{"class":74,"line":88},[72,11529,91],{},[72,11531,11532],{"class":74,"line":94},[72,11533,97],{},[72,11535,11536],{"class":74,"line":100},[72,11537,85],{"emptyLinePlaceholder":84},[72,11539,11540],{"class":74,"line":105},[72,11541,108],{},[72,11543,11544],{"class":74,"line":111},[72,11545,114],{},[10,11547,117],{},[63,11549,11551],{"className":11550,"code":122,"language":123,"meta":68},[121],[33,11552,122],{"__ignoreMap":68},[10,11554,128],{},[14,11556,131],{"id":131},[133,11558,11559,11565],{},[44,11560,137,11561,140,11563,144],{},[33,11562,35],{},[33,11564,143],{},[44,11566,11567,149],{},[33,11568,48],{},[14,11570,152],{"id":152},[41,11572,11573,11575],{},[44,11574,157],{},[44,11576,160],{},[14,11578,163],{"id":163},[133,11580,11581,11583],{},[44,11582,168],{},[44,11584,171,11585,175],{},[33,11586,174],{},[10,11588,178],{},[14,11590,181],{"id":181},[10,11592,184],{},[186,11594,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11596},[11597,11598,11599,11600,11601,11602,11603,11604],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5,"description":12},[199,35,211],{"id":4581,"title":4582,"body":11609,"category":199,"cover":200,"description":4587,"extension":201,"meta":11754,"navigation":84,"path":4762,"pinned":204,"publishedAt":205,"seo":11755,"slug":4764,"stem":4765,"summary":4766,"tags":11756,"updatedAt":205,"visible":84,"__hash__":4768},{"type":7,"value":11610,"toc":11744},[11611,11613,11615,11617,11619,11623,11629,11631,11645,11647,11649,11693,11695,11700,11702,11704,11714,11716,11728,11730,11736,11738,11740,11742],[10,11612,4587],{},[14,11614,16],{"id":16},[10,11616,4592],{},[14,11618,22],{"id":22},[10,11620,11621],{},[26,11622],{"alt":4599,"src":4600},[10,11624,11625,4606,11627,4610],{},[33,11626,4605],{},[33,11628,4609],{},[14,11630,39],{"id":39},[41,11632,11633,11635,11641],{},[44,11634,4617],{},[44,11636,11637,4622,11639,4625],{},[33,11638,4605],{},[33,11640,4295],{},[44,11642,4628,11643,4631],{},[33,11644,4609],{},[14,11646,58],{"id":58},[10,11648,61],{},[63,11650,11651],{"className":65,"code":4638,"language":67,"meta":68,"style":68},[33,11652,11653,11657,11661,11665,11669,11673,11677,11681,11685,11689],{"__ignoreMap":68},[72,11654,11655],{"class":74,"line":75},[72,11656,4645],{},[72,11658,11659],{"class":74,"line":81},[72,11660,85],{"emptyLinePlaceholder":84},[72,11662,11663],{"class":74,"line":88},[72,11664,4654],{},[72,11666,11667],{"class":74,"line":94},[72,11668,4659],{},[72,11670,11671],{"class":74,"line":100},[72,11672,4664],{},[72,11674,11675],{"class":74,"line":105},[72,11676,4669],{},[72,11678,11679],{"class":74,"line":111},[72,11680,4674],{},[72,11682,11683],{"class":74,"line":2466},[72,11684,114],{},[72,11686,11687],{"class":74,"line":3926},[72,11688,85],{"emptyLinePlaceholder":84},[72,11690,11691],{"class":74,"line":4138},[72,11692,4687],{},[10,11694,117],{},[63,11696,11698],{"className":11697,"code":4693,"language":123,"meta":68},[121],[33,11699,4693],{"__ignoreMap":68},[10,11701,128],{},[14,11703,131],{"id":131},[133,11705,11706,11710],{},[44,11707,4704,11708,4707],{},[33,11709,4605],{},[44,11711,4710,11712,4713],{},[33,11713,4609],{},[14,11715,152],{"id":152},[41,11717,11718,11722],{},[44,11719,3440,11720,4722],{},[33,11721,4605],{},[44,11723,4725,11724,4728,11726,4731],{},[33,11725,4295],{},[33,11727,4605],{},[14,11729,163],{"id":163},[133,11731,11732,11734],{},[44,11733,4738],{},[44,11735,4741],{},[10,11737,178],{},[14,11739,181],{"id":181},[10,11741,4748],{},[186,11743,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11745},[11746,11747,11748,11749,11750,11751,11752,11753],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":4582,"description":4587},[199,4609,4605],{"id":4770,"title":4771,"body":11758,"category":199,"cover":200,"description":4776,"extension":201,"meta":11897,"navigation":84,"path":4948,"pinned":204,"publishedAt":205,"seo":11898,"slug":4950,"stem":4951,"summary":4952,"tags":11899,"updatedAt":205,"visible":84,"__hash__":4956},{"type":7,"value":11759,"toc":11885},[11760,11762,11764,11766,11768,11772,11774,11776,11792,11794,11796,11824,11826,11831,11833,11835,11847,11849,11851,11855,11857,11859,11869,11871,11877,11879,11881,11883],[10,11761,4776],{},[14,11763,16],{"id":16},[10,11765,4781],{},[14,11767,22],{"id":22},[10,11769,11770],{},[26,11771],{"alt":4788,"src":4789},[10,11773,4792],{},[14,11775,39],{"id":39},[41,11777,11778,11780,11782],{},[44,11779,4799],{},[44,11781,4802],{},[44,11783,4805,11784,2230,11786,4812,11788,2230,11790,335],{},[33,11785,4808],{},[33,11787,4811],{},[33,11789,4815],{},[33,11791,4818],{},[14,11793,58],{"id":58},[10,11795,61],{},[63,11797,11798],{"className":65,"code":4825,"language":67,"meta":68,"style":68},[33,11799,11800,11804,11808,11812,11816,11820],{"__ignoreMap":68},[72,11801,11802],{"class":74,"line":75},[72,11803,4832],{},[72,11805,11806],{"class":74,"line":81},[72,11807,85],{"emptyLinePlaceholder":84},[72,11809,11810],{"class":74,"line":88},[72,11811,4841],{},[72,11813,11814],{"class":74,"line":94},[72,11815,4846],{},[72,11817,11818],{"class":74,"line":100},[72,11819,4851],{},[72,11821,11822],{"class":74,"line":105},[72,11823,4856],{},[10,11825,117],{},[63,11827,11829],{"className":11828,"code":4862,"language":123,"meta":68},[121],[33,11830,4862],{"__ignoreMap":68},[10,11832,128],{},[14,11834,131],{"id":131},[133,11836,11837,11845],{},[44,11838,4873,11839,4876,11841,1130,11843,335],{},[33,11840,4808],{},[33,11842,4879],{},[33,11844,4882],{},[44,11846,4885],{},[301,11848,2670],{"id":2670},[10,11850,4890],{},[10,11852,11853],{},[26,11854],{"alt":4895,"src":4896},[10,11856,4899],{},[14,11858,152],{"id":152},[41,11860,11861,11867],{},[44,11862,4906,11863,982,11865,4912],{},[33,11864,4909],{},[33,11866,4815],{},[44,11868,4915],{},[14,11870,163],{"id":163},[133,11872,11873,11875],{},[44,11874,4922],{},[44,11876,4925],{},[10,11878,178],{},[14,11880,181],{"id":181},[10,11882,4932],{},[186,11884,188],{},{"title":68,"searchDepth":81,"depth":81,"links":11886},[11887,11888,11889,11890,11891,11894,11895,11896],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":11892},[11893],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":4771,"description":4776},[199,4954,4955],{"id":4958,"title":4959,"body":11901,"category":199,"cover":200,"description":4964,"extension":201,"meta":12018,"navigation":84,"path":5103,"pinned":204,"publishedAt":205,"seo":12019,"slug":5105,"stem":5106,"summary":5107,"tags":12020,"updatedAt":205,"visible":84,"__hash__":5111},{"type":7,"value":11902,"toc":12008},[11903,11905,11907,11909,11911,11915,11917,11919,11927,11929,11931,11963,11965,11970,11972,11974,11982,11984,11992,11994,12000,12002,12004,12006],[10,11904,4964],{},[14,11906,16],{"id":16},[10,11908,4969],{},[14,11910,22],{"id":22},[10,11912,11913],{},[26,11914],{"alt":4976,"src":4977},[10,11916,4980],{},[14,11918,39],{"id":39},[41,11920,11921,11923,11925],{},[44,11922,4987],{},[44,11924,4990],{},[44,11926,4993],{},[14,11928,58],{"id":58},[10,11930,61],{},[63,11932,11933],{"className":65,"code":5000,"language":67,"meta":68,"style":68},[33,11934,11935,11939,11943,11947,11951,11955,11959],{"__ignoreMap":68},[72,11936,11937],{"class":74,"line":75},[72,11938,5007],{},[72,11940,11941],{"class":74,"line":81},[72,11942,85],{"emptyLinePlaceholder":84},[72,11944,11945],{"class":74,"line":88},[72,11946,5016],{},[72,11948,11949],{"class":74,"line":94},[72,11950,5021],{},[72,11952,11953],{"class":74,"line":100},[72,11954,85],{"emptyLinePlaceholder":84},[72,11956,11957],{"class":74,"line":105},[72,11958,5030],{},[72,11960,11961],{"class":74,"line":111},[72,11962,5035],{},[10,11964,117],{},[63,11966,11968],{"className":11967,"code":5041,"language":123,"meta":68},[121],[33,11969,5041],{"__ignoreMap":68},[10,11971,128],{},[14,11973,131],{"id":131},[133,11975,11976,11978],{},[44,11977,5052],{},[44,11979,5055,11980,5059],{},[33,11981,5058],{},[14,11983,152],{"id":152},[41,11985,11986,11990],{},[44,11987,5066,11988,5069],{},[33,11989,35],{},[44,11991,5072],{},[14,11993,163],{"id":163},[133,11995,11996,11998],{},[44,11997,5079],{},[44,11999,5082],{},[10,12001,178],{},[14,12003,181],{"id":181},[10,12005,5089],{},[186,12007,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12009},[12010,12011,12012,12013,12014,12015,12016,12017],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":4959,"description":4964},[199,5109,5110],{"id":5113,"title":5114,"body":12022,"category":199,"cover":200,"description":5119,"extension":201,"meta":12141,"navigation":84,"path":5263,"pinned":204,"publishedAt":205,"seo":12142,"slug":5265,"stem":5266,"summary":5267,"tags":12143,"updatedAt":205,"visible":84,"__hash__":5271},{"type":7,"value":12023,"toc":12131},[12024,12026,12028,12030,12032,12036,12038,12040,12048,12050,12052,12084,12086,12091,12093,12095,12105,12107,12113,12115,12123,12125,12127,12129],[10,12025,5119],{},[14,12027,16],{"id":16},[10,12029,5124],{},[14,12031,22],{"id":22},[10,12033,12034],{},[26,12035],{"alt":5131,"src":5132},[10,12037,5135],{},[14,12039,39],{"id":39},[41,12041,12042,12044,12046],{},[44,12043,5142],{},[44,12045,5145],{},[44,12047,5148],{},[14,12049,58],{"id":58},[10,12051,61],{},[63,12053,12054],{"className":65,"code":5155,"language":67,"meta":68,"style":68},[33,12055,12056,12060,12064,12068,12072,12076,12080],{"__ignoreMap":68},[72,12057,12058],{"class":74,"line":75},[72,12059,5162],{},[72,12061,12062],{"class":74,"line":81},[72,12063,5167],{},[72,12065,12066],{"class":74,"line":88},[72,12067,5172],{},[72,12069,12070],{"class":74,"line":94},[72,12071,85],{"emptyLinePlaceholder":84},[72,12073,12074],{"class":74,"line":100},[72,12075,5181],{},[72,12077,12078],{"class":74,"line":105},[72,12079,5186],{},[72,12081,12082],{"class":74,"line":111},[72,12083,5191],{},[10,12085,117],{},[63,12087,12089],{"className":12088,"code":5197,"language":123,"meta":68},[121],[33,12090,5197],{"__ignoreMap":68},[10,12092,128],{},[14,12094,131],{"id":131},[133,12096,12097,12101],{},[44,12098,911,12099,5211],{},[33,12100,5210],{},[44,12102,5214,12103,5218],{},[33,12104,5217],{},[14,12106,152],{"id":152},[41,12108,12109,12111],{},[44,12110,5225],{},[44,12112,5228],{},[14,12114,163],{"id":163},[133,12116,12117,12121],{},[44,12118,5235,12119,5239],{},[33,12120,5238],{},[44,12122,5242],{},[10,12124,178],{},[14,12126,181],{"id":181},[10,12128,5249],{},[186,12130,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12132},[12133,12134,12135,12136,12137,12138,12139,12140],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5114,"description":5119},[199,5269,5270],{"id":5273,"title":5274,"body":12145,"category":199,"cover":200,"description":5279,"extension":201,"meta":12290,"navigation":84,"path":5460,"pinned":204,"publishedAt":205,"seo":12291,"slug":5462,"stem":5463,"summary":5464,"tags":12292,"updatedAt":205,"visible":84,"__hash__":5468},{"type":7,"value":12146,"toc":12278},[12147,12149,12151,12153,12155,12159,12163,12165,12177,12179,12181,12209,12211,12216,12218,12220,12234,12236,12238,12242,12250,12252,12262,12264,12270,12272,12274,12276],[10,12148,5279],{},[14,12150,16],{"id":16},[10,12152,5284],{},[14,12154,22],{"id":22},[10,12156,12157],{},[26,12158],{"alt":5291,"src":5292},[10,12160,5295,12161,5299],{},[33,12162,5298],{},[14,12164,39],{"id":39},[41,12166,12167,12169,12171],{},[44,12168,5306],{},[44,12170,5309],{},[44,12172,5312,12173,5315,12175,335],{},[33,12174,5298],{},[33,12176,5318],{},[14,12178,58],{"id":58},[10,12180,61],{},[63,12182,12183],{"className":65,"code":5325,"language":67,"meta":68,"style":68},[33,12184,12185,12189,12193,12197,12201,12205],{"__ignoreMap":68},[72,12186,12187],{"class":74,"line":75},[72,12188,5332],{},[72,12190,12191],{"class":74,"line":81},[72,12192,5337],{},[72,12194,12195],{"class":74,"line":88},[72,12196,5342],{},[72,12198,12199],{"class":74,"line":94},[72,12200,85],{"emptyLinePlaceholder":84},[72,12202,12203],{"class":74,"line":100},[72,12204,5351],{},[72,12206,12207],{"class":74,"line":105},[72,12208,5356],{},[10,12210,117],{},[63,12212,12214],{"className":12213,"code":5362,"language":123,"meta":68},[121],[33,12215,5362],{"__ignoreMap":68},[10,12217,128],{},[14,12219,131],{"id":131},[133,12221,12222,12228],{},[44,12223,5373,12224,2230,12226,5379],{},[33,12225,5376],{},[33,12227,4374],{},[44,12229,12230,5385,12232,5389],{},[33,12231,5384],{},[33,12233,5388],{},[301,12235,2670],{"id":2670},[10,12237,5394],{},[10,12239,12240],{},[26,12241],{"alt":5399,"src":5400},[10,12243,12244,2230,12246,1130,12248,5410],{},[33,12245,5376],{},[33,12247,4374],{},[33,12249,5409],{},[14,12251,152],{"id":152},[41,12253,12254,12258],{},[44,12255,5417,12256,5421],{},[33,12257,5420],{},[44,12259,5424,12260,5427],{},[33,12261,5409],{},[14,12263,163],{"id":163},[133,12265,12266,12268],{},[44,12267,5434],{},[44,12269,5437],{},[10,12271,178],{},[14,12273,181],{"id":181},[10,12275,5444],{},[186,12277,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12279},[12280,12281,12282,12283,12284,12287,12288,12289],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":12285},[12286],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5274,"description":5279},[199,5466,5467],{"id":5470,"title":5471,"body":12294,"category":199,"cover":200,"description":5476,"extension":201,"meta":12443,"navigation":84,"path":5657,"pinned":204,"publishedAt":205,"seo":12444,"slug":5659,"stem":5660,"summary":5661,"tags":12445,"updatedAt":205,"visible":84,"__hash__":5665},{"type":7,"value":12295,"toc":12431},[12296,12298,12300,12302,12304,12308,12310,12312,12324,12326,12328,12372,12374,12379,12381,12383,12395,12397,12399,12403,12405,12407,12415,12417,12423,12425,12427,12429],[10,12297,5476],{},[14,12299,16],{"id":16},[10,12301,5481],{},[14,12303,22],{"id":22},[10,12305,12306],{},[26,12307],{"alt":5488,"src":5489},[10,12309,5492],{},[14,12311,39],{"id":39},[41,12313,12314,12316,12320],{},[44,12315,5499],{},[44,12317,12318,5505],{},[33,12319,5504],{},[44,12321,12322,5511],{},[33,12323,5510],{},[14,12325,58],{"id":58},[10,12327,61],{},[63,12329,12330],{"className":65,"code":5518,"language":67,"meta":68,"style":68},[33,12331,12332,12336,12340,12344,12348,12352,12356,12360,12364,12368],{"__ignoreMap":68},[72,12333,12334],{"class":74,"line":75},[72,12335,5525],{},[72,12337,12338],{"class":74,"line":81},[72,12339,5530],{},[72,12341,12342],{"class":74,"line":88},[72,12343,85],{"emptyLinePlaceholder":84},[72,12345,12346],{"class":74,"line":94},[72,12347,5539],{},[72,12349,12350],{"class":74,"line":100},[72,12351,5544],{},[72,12353,12354],{"class":74,"line":105},[72,12355,85],{"emptyLinePlaceholder":84},[72,12357,12358],{"class":74,"line":111},[72,12359,5553],{},[72,12361,12362],{"class":74,"line":2466},[72,12363,5558],{},[72,12365,12366],{"class":74,"line":3926},[72,12367,85],{"emptyLinePlaceholder":84},[72,12369,12370],{"class":74,"line":4138},[72,12371,5567],{},[10,12373,117],{},[63,12375,12377],{"className":12376,"code":5573,"language":123,"meta":68},[121],[33,12378,5573],{"__ignoreMap":68},[10,12380,128],{},[14,12382,131],{"id":131},[133,12384,12385,12389],{},[44,12386,5584,12387,5588],{},[33,12388,5587],{},[44,12390,12391,5594,12393,335],{},[33,12392,5593],{},[33,12394,5597],{},[301,12396,2670],{"id":2670},[10,12398,5602],{},[10,12400,12401],{},[26,12402],{"alt":5607,"src":5608},[10,12404,5611],{},[14,12406,152],{"id":152},[41,12408,12409,12413],{},[44,12410,5618,12411,5621],{},[33,12412,5318],{},[44,12414,5624],{},[14,12416,163],{"id":163},[133,12418,12419,12421],{},[44,12420,5631],{},[44,12422,5634],{},[10,12424,178],{},[14,12426,181],{"id":181},[10,12428,5641],{},[186,12430,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12432},[12433,12434,12435,12436,12437,12440,12441,12442],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":12438},[12439],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5471,"description":5476},[199,5663,5664],{"id":5667,"title":5668,"body":12447,"category":199,"cover":200,"description":5673,"extension":201,"meta":12608,"navigation":84,"path":5871,"pinned":204,"publishedAt":205,"seo":12609,"slug":5873,"stem":5874,"summary":5875,"tags":12610,"updatedAt":205,"visible":84,"__hash__":5879},{"type":7,"value":12448,"toc":12596},[12449,12451,12453,12455,12457,12461,12463,12465,12477,12479,12481,12533,12535,12540,12542,12544,12562,12564,12566,12570,12572,12574,12580,12582,12588,12590,12592,12594],[10,12450,5673],{},[14,12452,16],{"id":16},[10,12454,5678],{},[14,12456,22],{"id":22},[10,12458,12459],{},[26,12460],{"alt":5685,"src":5686},[10,12462,5689],{},[14,12464,39],{"id":39},[41,12466,12467,12469,12471],{},[44,12468,5696],{},[44,12470,5699],{},[44,12472,12473,2149,12475,5708],{},[33,12474,5704],{},[33,12476,5707],{},[14,12478,58],{"id":58},[10,12480,61],{},[63,12482,12483],{"className":65,"code":5715,"language":67,"meta":68,"style":68},[33,12484,12485,12489,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529],{"__ignoreMap":68},[72,12486,12487],{"class":74,"line":75},[72,12488,5722],{},[72,12490,12491],{"class":74,"line":81},[72,12492,85],{"emptyLinePlaceholder":84},[72,12494,12495],{"class":74,"line":88},[72,12496,5731],{},[72,12498,12499],{"class":74,"line":94},[72,12500,5736],{},[72,12502,12503],{"class":74,"line":100},[72,12504,85],{"emptyLinePlaceholder":84},[72,12506,12507],{"class":74,"line":105},[72,12508,5745],{},[72,12510,12511],{"class":74,"line":111},[72,12512,5750],{},[72,12514,12515],{"class":74,"line":2466},[72,12516,5755],{},[72,12518,12519],{"class":74,"line":3926},[72,12520,85],{"emptyLinePlaceholder":84},[72,12522,12523],{"class":74,"line":4138},[72,12524,5764],{},[72,12526,12527],{"class":74,"line":5767},[72,12528,85],{"emptyLinePlaceholder":84},[72,12530,12531],{"class":74,"line":5772},[72,12532,5775],{},[10,12534,117],{},[63,12536,12538],{"className":12537,"code":5781,"language":123,"meta":68},[121],[33,12539,5781],{"__ignoreMap":68},[10,12541,128],{},[14,12543,131],{"id":131},[133,12545,12546,12556],{},[44,12547,12548,5795,12550,5799,12552,5802,12554,5806],{},[33,12549,5794],{},[33,12551,5798],{},[33,12553,5587],{},[33,12555,5805],{},[44,12557,12558,5811,12560,5814],{},[33,12559,143],{},[33,12561,2181],{},[301,12563,2670],{"id":2670},[10,12565,5819],{},[10,12567,12568],{},[26,12569],{"alt":5824,"src":5825},[10,12571,5828],{},[14,12573,152],{"id":152},[41,12575,12576,12578],{},[44,12577,5835],{},[44,12579,5838],{},[14,12581,163],{"id":163},[133,12583,12584,12586],{},[44,12585,5845],{},[44,12587,5848],{},[10,12589,178],{},[14,12591,181],{"id":181},[10,12593,5855],{},[186,12595,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12597},[12598,12599,12600,12601,12602,12605,12606,12607],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":12603},[12604],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5668,"description":5673},[199,5877,5878],{"id":5881,"title":5882,"body":12612,"category":199,"cover":200,"description":5887,"extension":201,"meta":12735,"navigation":84,"path":6038,"pinned":204,"publishedAt":205,"seo":12736,"slug":6040,"stem":6041,"summary":6042,"tags":12737,"updatedAt":205,"visible":84,"__hash__":6046},{"type":7,"value":12613,"toc":12725},[12614,12616,12618,12620,12622,12626,12628,12630,12644,12646,12648,12676,12678,12683,12685,12687,12697,12699,12707,12709,12717,12719,12721,12723],[10,12615,5887],{},[14,12617,16],{"id":16},[10,12619,5892],{},[14,12621,22],{"id":22},[10,12623,12624],{},[26,12625],{"alt":5899,"src":5900},[10,12627,5903],{},[14,12629,39],{"id":39},[41,12631,12632,12634,12636],{},[44,12633,5910],{},[44,12635,5913],{},[44,12637,5916,12638,2230,12640,2230,12642,5924],{},[33,12639,2233],{},[33,12641,2398],{},[33,12643,5923],{},[14,12645,58],{"id":58},[10,12647,61],{},[63,12649,12650],{"className":65,"code":5931,"language":67,"meta":68,"style":68},[33,12651,12652,12656,12660,12664,12668,12672],{"__ignoreMap":68},[72,12653,12654],{"class":74,"line":75},[72,12655,5938],{},[72,12657,12658],{"class":74,"line":81},[72,12659,5943],{},[72,12661,12662],{"class":74,"line":88},[72,12663,5948],{},[72,12665,12666],{"class":74,"line":94},[72,12667,85],{"emptyLinePlaceholder":84},[72,12669,12670],{"class":74,"line":100},[72,12671,5957],{},[72,12673,12674],{"class":74,"line":105},[72,12675,5962],{},[10,12677,117],{},[63,12679,12681],{"className":12680,"code":5968,"language":123,"meta":68},[121],[33,12682,5968],{"__ignoreMap":68},[10,12684,128],{},[14,12686,131],{"id":131},[133,12688,12689,12695],{},[44,12690,5979,12691,5983,12693,5986],{},[33,12692,5982],{},[33,12694,2219],{},[44,12696,5989],{},[14,12698,152],{"id":152},[41,12700,12701,12705],{},[44,12702,5996,12703,6000],{},[33,12704,5999],{},[44,12706,6003],{},[14,12708,163],{"id":163},[133,12710,12711,12713],{},[44,12712,6010],{},[44,12714,6013,12715,6017],{},[33,12716,6016],{},[10,12718,178],{},[14,12720,181],{"id":181},[10,12722,6024],{},[186,12724,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12726},[12727,12728,12729,12730,12731,12732,12733,12734],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":5882,"description":5887},[199,6044,6045],{"id":6048,"title":6049,"body":12739,"category":199,"cover":200,"description":6054,"extension":201,"meta":12916,"navigation":84,"path":6282,"pinned":204,"publishedAt":205,"seo":12917,"slug":6284,"stem":6285,"summary":6286,"tags":12918,"updatedAt":205,"visible":84,"__hash__":6290},{"type":7,"value":12740,"toc":12904},[12741,12743,12745,12749,12751,12755,12761,12763,12775,12777,12781,12805,12809,12825,12831,12833,12838,12840,12842,12858,12860,12862,12866,12870,12872,12884,12886,12896,12898,12900,12902],[10,12742,6054],{},[14,12744,16],{"id":16},[10,12746,6059,12747,6062],{},[267,12748,5982],{},[14,12750,22],{"id":22},[10,12752,12753],{},[26,12754],{"alt":6069,"src":6070},[10,12756,6073,12757,6077,12759,6081],{},[33,12758,6076],{},[33,12760,6080],{},[14,12762,39],{"id":39},[41,12764,12765,12769,12771],{},[44,12766,6088,12767,6091],{},[33,12768,1144],{},[44,12770,6094],{},[44,12772,6097,12773,6101],{},[33,12774,6100],{},[14,12776,58],{"id":58},[10,12778,6106,12779,6110],{},[33,12780,6109],{},[63,12782,12783],{"className":65,"code":6113,"language":67,"meta":68,"style":68},[33,12784,12785,12789,12793,12797,12801],{"__ignoreMap":68},[72,12786,12787],{"class":74,"line":75},[72,12788,6120],{},[72,12790,12791],{"class":74,"line":81},[72,12792,6125],{},[72,12794,12795],{"class":74,"line":88},[72,12796,85],{"emptyLinePlaceholder":84},[72,12798,12799],{"class":74,"line":94},[72,12800,6134],{},[72,12802,12803],{"class":74,"line":100},[72,12804,6139],{},[10,12806,6142,12807,6146],{},[33,12808,6145],{},[63,12810,12811],{"className":65,"code":6149,"language":67,"meta":68,"style":68},[33,12812,12813,12817,12821],{"__ignoreMap":68},[72,12814,12815],{"class":74,"line":75},[72,12816,6156],{},[72,12818,12819],{"class":74,"line":81},[72,12820,85],{"emptyLinePlaceholder":84},[72,12822,12823],{"class":74,"line":88},[72,12824,6165],{},[10,12826,6168,12827,1130,12829,335],{},[33,12828,6171],{},[33,12830,6174],{},[10,12832,117],{},[63,12834,12836],{"className":12835,"code":6180,"language":123,"meta":68},[121],[33,12837,6180],{"__ignoreMap":68},[10,12839,128],{},[14,12841,131],{"id":131},[133,12843,12844,12850],{},[44,12845,6191,12846,6194,12848,6198],{},[33,12847,6109],{},[33,12849,6197],{},[44,12851,12852,6203,12854,6206,12856,6209],{},[33,12853,6145],{},[33,12855,6109],{},[33,12857,6145],{},[301,12859,2670],{"id":2670},[10,12861,6214],{},[10,12863,12864],{},[26,12865],{"alt":6219,"src":6220},[10,12867,6223,12868,6226],{},[33,12869,6197],{},[14,12871,152],{"id":152},[41,12873,12874,12880],{},[44,12875,6233,12876,1130,12878,335],{},[33,12877,6109],{},[33,12879,6145],{},[44,12881,6240,12882,6244],{},[33,12883,6243],{},[14,12885,163],{"id":163},[133,12887,12888,12892],{},[44,12889,2326,12890,6254],{},[33,12891,6253],{},[44,12893,6257,12894,335],{},[33,12895,6076],{},[10,12897,178],{},[14,12899,181],{"id":181},[10,12901,6266],{},[186,12903,188],{},{"title":68,"searchDepth":81,"depth":81,"links":12905},[12906,12907,12908,12909,12910,12913,12914,12915],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":12911},[12912],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":6049,"description":6054},[199,6288,6289],{"id":6292,"title":6293,"body":12920,"category":199,"cover":200,"description":6298,"extension":201,"meta":13059,"navigation":84,"path":6464,"pinned":204,"publishedAt":205,"seo":13060,"slug":6466,"stem":6467,"summary":6468,"tags":13061,"updatedAt":205,"visible":84,"__hash__":6471},{"type":7,"value":12921,"toc":13049},[12922,12924,12926,12928,12930,12934,12936,12938,12948,12950,12952,12992,12994,12999,13001,13003,13021,13023,13031,13033,13041,13043,13045,13047],[10,12923,6298],{},[14,12925,16],{"id":16},[10,12927,6303],{},[14,12929,22],{"id":22},[10,12931,12932],{},[26,12933],{"alt":6310,"src":6311},[10,12935,6314],{},[14,12937,39],{"id":39},[41,12939,12940,12944,12946],{},[44,12941,12942,6324],{},[33,12943,6323],{},[44,12945,6327],{},[44,12947,6330],{},[14,12949,58],{"id":58},[10,12951,1547],{},[63,12953,12954],{"className":564,"code":6337,"language":566,"meta":68,"style":68},[33,12955,12956,12966,12972,12978,12988],{"__ignoreMap":68},[72,12957,12958,12960,12962,12964],{"class":74,"line":75},[72,12959,664],{"class":573},[72,12961,606],{"class":576},[72,12963,6348],{"class":609},[72,12965,6351],{"class":609},[72,12967,12968,12970],{"class":74,"line":81},[72,12969,6356],{"class":576},[72,12971,6359],{"class":609},[72,12973,12974,12976],{"class":74,"line":88},[72,12975,67],{"class":573},[72,12977,577],{"class":576},[72,12979,12980,12982,12984,12986],{"class":74,"line":94},[72,12981,67],{"class":573},[72,12983,606],{"class":576},[72,12985,610],{"class":609},[72,12987,577],{"class":576},[72,12989,12990],{"class":74,"line":100},[72,12991,6380],{"class":573},[10,12993,117],{},[63,12995,12997],{"className":12996,"code":6386,"language":123,"meta":68},[121],[33,12998,6386],{"__ignoreMap":68},[10,13000,128],{},[14,13002,131],{"id":131},[133,13004,13005,13011],{},[44,13006,13007,6400,13009,6403],{},[33,13008,6399],{},[33,13010,664],{},[44,13012,6406,13013,2149,13015,6412,13017,3701,13019,6418],{},[33,13014,67],{},[33,13016,6411],{},[33,13018,6323],{},[33,13020,6417],{},[14,13022,152],{"id":152},[41,13024,13025,13027],{},[44,13026,6425],{},[44,13028,3440,13029,6430],{},[33,13030,6323],{},[14,13032,163],{"id":163},[133,13034,13035,13039],{},[44,13036,6437,13037,335],{},[33,13038,6440],{},[44,13040,6443],{},[10,13042,178],{},[14,13044,181],{"id":181},[10,13046,6450],{},[186,13048,1631],{},{"title":68,"searchDepth":81,"depth":81,"links":13050},[13051,13052,13053,13054,13055,13056,13057,13058],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":6293,"description":6298},[199,6470,233],{"id":6473,"title":6474,"body":13063,"category":199,"cover":200,"description":6479,"extension":201,"meta":13216,"navigation":84,"path":6668,"pinned":204,"publishedAt":205,"seo":13217,"slug":6670,"stem":6671,"summary":6672,"tags":13218,"updatedAt":205,"visible":84,"__hash__":6676},{"type":7,"value":13064,"toc":13206},[13065,13067,13069,13071,13073,13077,13083,13085,13101,13103,13105,13149,13151,13156,13158,13160,13172,13174,13188,13190,13198,13200,13202,13204],[10,13066,6479],{},[14,13068,16],{"id":16},[10,13070,6484],{},[14,13072,22],{"id":22},[10,13074,13075],{},[26,13076],{"alt":6491,"src":6492},[10,13078,13079,6498,13081,6501],{},[33,13080,6497],{},[33,13082,2408],{},[14,13084,39],{"id":39},[41,13086,13087,13089,13097],{},[44,13088,6508],{},[44,13090,13091,2230,13093,2230,13095,6520],{},[33,13092,6513],{},[33,13094,6516],{},[33,13096,6519],{},[44,13098,6523,13099,6527],{},[33,13100,6526],{},[14,13102,58],{"id":58},[10,13104,61],{},[63,13106,13107],{"className":65,"code":6534,"language":67,"meta":68,"style":68},[33,13108,13109,13113,13117,13121,13125,13129,13133,13137,13141,13145],{"__ignoreMap":68},[72,13110,13111],{"class":74,"line":75},[72,13112,6541],{},[72,13114,13115],{"class":74,"line":81},[72,13116,85],{"emptyLinePlaceholder":84},[72,13118,13119],{"class":74,"line":88},[72,13120,6550],{},[72,13122,13123],{"class":74,"line":94},[72,13124,6555],{},[72,13126,13127],{"class":74,"line":100},[72,13128,6560],{},[72,13130,13131],{"class":74,"line":105},[72,13132,85],{"emptyLinePlaceholder":84},[72,13134,13135],{"class":74,"line":111},[72,13136,6569],{},[72,13138,13139],{"class":74,"line":2466},[72,13140,6574],{},[72,13142,13143],{"class":74,"line":3926},[72,13144,6579],{},[72,13146,13147],{"class":74,"line":4138},[72,13148,6584],{},[10,13150,117],{},[63,13152,13154],{"className":13153,"code":6590,"language":123,"meta":68},[121],[33,13155,6590],{"__ignoreMap":68},[10,13157,128],{},[14,13159,131],{"id":131},[133,13161,13162,13166],{},[44,13163,13164,6604],{},[33,13165,6603],{},[44,13167,171,13168,6609,13170,6612],{},[33,13169,2408],{},[33,13171,6497],{},[14,13173,152],{"id":152},[41,13175,13176,13182],{},[44,13177,3440,13178,6621,13180,6624],{},[33,13179,6497],{},[33,13181,6513],{},[44,13183,6627,13184,982,13186,6633],{},[33,13185,2408],{},[33,13187,6632],{},[14,13189,163],{"id":163},[133,13191,13192,13196],{},[44,13193,6640,13194,6644],{},[33,13195,6643],{},[44,13197,6647],{},[10,13199,178],{},[14,13201,181],{"id":181},[10,13203,6654],{},[186,13205,188],{},{"title":68,"searchDepth":81,"depth":81,"links":13207},[13208,13209,13210,13211,13212,13213,13214,13215],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":6474,"description":6479},[199,6674,6675],{"id":6678,"title":6679,"body":13220,"category":199,"cover":200,"description":6684,"extension":201,"meta":13367,"navigation":84,"path":6863,"pinned":204,"publishedAt":205,"seo":13368,"slug":6865,"stem":6866,"summary":6867,"tags":13369,"updatedAt":205,"visible":84,"__hash__":6871},{"type":7,"value":13221,"toc":13357},[13222,13224,13226,13228,13230,13234,13236,13238,13256,13258,13260,13308,13310,13315,13317,13319,13327,13329,13339,13341,13349,13351,13353,13355],[10,13223,6684],{},[14,13225,16],{"id":16},[10,13227,6689],{},[14,13229,22],{"id":22},[10,13231,13232],{},[26,13233],{"alt":6696,"src":6697},[10,13235,6700],{},[14,13237,39],{"id":39},[41,13239,13240,13244,13250],{},[44,13241,13242,6710],{},[33,13243,6709],{},[44,13245,13246,6716,13248,335],{},[33,13247,6715],{},[33,13249,6719],{},[44,13251,6722,13252,6726,13254,6730],{},[33,13253,6725],{},[33,13255,6729],{},[14,13257,58],{"id":58},[10,13259,61],{},[63,13261,13262],{"className":65,"code":6737,"language":67,"meta":68,"style":68},[33,13263,13264,13268,13272,13276,13280,13284,13288,13292,13296,13300,13304],{"__ignoreMap":68},[72,13265,13266],{"class":74,"line":75},[72,13267,6541],{},[72,13269,13270],{"class":74,"line":81},[72,13271,85],{"emptyLinePlaceholder":84},[72,13273,13274],{"class":74,"line":88},[72,13275,6752],{},[72,13277,13278],{"class":74,"line":94},[72,13279,6757],{},[72,13281,13282],{"class":74,"line":100},[72,13283,6762],{},[72,13285,13286],{"class":74,"line":105},[72,13287,6767],{},[72,13289,13290],{"class":74,"line":111},[72,13291,85],{"emptyLinePlaceholder":84},[72,13293,13294],{"class":74,"line":2466},[72,13295,6776],{},[72,13297,13298],{"class":74,"line":3926},[72,13299,6781],{},[72,13301,13302],{"class":74,"line":4138},[72,13303,6786],{},[72,13305,13306],{"class":74,"line":5767},[72,13307,6791],{},[10,13309,117],{},[63,13311,13313],{"className":13312,"code":6797,"language":123,"meta":68},[121],[33,13314,6797],{"__ignoreMap":68},[10,13316,128],{},[14,13318,131],{"id":131},[133,13320,13321,13325],{},[44,13322,6808,13323,6811],{},[33,13324,6725],{},[44,13326,6814],{},[14,13328,152],{"id":152},[41,13330,13331,13335],{},[44,13332,171,13333,6823],{},[33,13334,6709],{},[44,13336,6826,13337,335],{},[33,13338,6829],{},[14,13340,163],{"id":163},[133,13342,13343,13345],{},[44,13344,6836],{},[44,13346,6839,13347,6842],{},[33,13348,309],{},[10,13350,178],{},[14,13352,181],{"id":181},[10,13354,6849],{},[186,13356,188],{},{"title":68,"searchDepth":81,"depth":81,"links":13358},[13359,13360,13361,13362,13363,13364,13365,13366],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":6679,"description":6684},[199,6869,6870],{"id":6873,"title":6874,"body":13371,"category":199,"cover":200,"description":6879,"extension":201,"meta":13514,"navigation":84,"path":7047,"pinned":204,"publishedAt":205,"seo":13515,"slug":7049,"stem":7050,"summary":7051,"tags":13516,"updatedAt":205,"visible":84,"__hash__":7055},{"type":7,"value":13372,"toc":13504},[13373,13375,13377,13379,13381,13385,13391,13393,13403,13405,13407,13459,13461,13466,13468,13470,13480,13482,13488,13490,13496,13498,13500,13502],[10,13374,6879],{},[14,13376,16],{"id":16},[10,13378,6884],{},[14,13380,22],{"id":22},[10,13382,13383],{},[26,13384],{"alt":6891,"src":6892},[10,13386,13387,6898,13389,6902],{},[33,13388,6897],{},[33,13390,6901],{},[14,13392,39],{"id":39},[41,13394,13395,13397,13401],{},[44,13396,6909],{},[44,13398,13399,6915],{},[33,13400,6914],{},[44,13402,6918],{},[14,13404,58],{"id":58},[10,13406,61],{},[63,13408,13409],{"className":65,"code":6925,"language":67,"meta":68,"style":68},[33,13410,13411,13415,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455],{"__ignoreMap":68},[72,13412,13413],{"class":74,"line":75},[72,13414,6932],{},[72,13416,13417],{"class":74,"line":81},[72,13418,85],{"emptyLinePlaceholder":84},[72,13420,13421],{"class":74,"line":88},[72,13422,6941],{},[72,13424,13425],{"class":74,"line":94},[72,13426,85],{"emptyLinePlaceholder":84},[72,13428,13429],{"class":74,"line":100},[72,13430,6950],{},[72,13432,13433],{"class":74,"line":105},[72,13434,6955],{},[72,13436,13437],{"class":74,"line":111},[72,13438,6767],{},[72,13440,13441],{"class":74,"line":2466},[72,13442,85],{"emptyLinePlaceholder":84},[72,13444,13445],{"class":74,"line":3926},[72,13446,6968],{},[72,13448,13449],{"class":74,"line":4138},[72,13450,6973],{},[72,13452,13453],{"class":74,"line":5767},[72,13454,6786],{},[72,13456,13457],{"class":74,"line":5772},[72,13458,6982],{},[10,13460,117],{},[63,13462,13464],{"className":13463,"code":6988,"language":123,"meta":68},[121],[33,13465,6988],{"__ignoreMap":68},[10,13467,128],{},[14,13469,131],{"id":131},[133,13471,13472,13476],{},[44,13473,13474,7001],{},[33,13475,6897],{},[44,13477,13478,7006],{},[33,13479,6901],{},[14,13481,152],{"id":152},[41,13483,13484,13486],{},[44,13485,7013],{},[44,13487,7016],{},[14,13489,163],{"id":163},[133,13491,13492,13494],{},[44,13493,7023],{},[44,13495,7026],{},[10,13497,178],{},[14,13499,181],{"id":181},[10,13501,7033],{},[186,13503,188],{},{"title":68,"searchDepth":81,"depth":81,"links":13505},[13506,13507,13508,13509,13510,13511,13512,13513],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":6874,"description":6879},[199,7053,7054],{"id":7057,"title":7058,"body":13518,"category":199,"cover":200,"description":7063,"extension":201,"meta":13669,"navigation":84,"path":7248,"pinned":204,"publishedAt":205,"seo":13670,"slug":7250,"stem":7251,"summary":7252,"tags":13671,"updatedAt":205,"visible":84,"__hash__":7256},{"type":7,"value":13519,"toc":13659},[13520,13522,13524,13526,13528,13532,13536,13538,13552,13554,13556,13608,13610,13615,13617,13619,13631,13633,13643,13645,13651,13653,13655,13657],[10,13521,7063],{},[14,13523,16],{"id":16},[10,13525,7068],{},[14,13527,22],{"id":22},[10,13529,13530],{},[26,13531],{"alt":7075,"src":7076},[10,13533,13534,7082],{},[33,13535,7081],{},[14,13537,39],{"id":39},[41,13539,13540,13546,13550],{},[44,13541,171,13542,7092,13544,7096],{},[33,13543,7091],{},[33,13545,7095],{},[44,13547,7099,13548,7103],{},[33,13549,7102],{},[44,13551,7106],{},[14,13553,58],{"id":58},[10,13555,61],{},[63,13557,13558],{"className":65,"code":7113,"language":67,"meta":68,"style":68},[33,13559,13560,13564,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604],{"__ignoreMap":68},[72,13561,13562],{"class":74,"line":75},[72,13563,7120],{},[72,13565,13566],{"class":74,"line":81},[72,13567,85],{"emptyLinePlaceholder":84},[72,13569,13570],{"class":74,"line":88},[72,13571,7129],{},[72,13573,13574],{"class":74,"line":94},[72,13575,7134],{},[72,13577,13578],{"class":74,"line":100},[72,13579,7139],{},[72,13581,13582],{"class":74,"line":105},[72,13583,7144],{},[72,13585,13586],{"class":74,"line":111},[72,13587,7149],{},[72,13589,13590],{"class":74,"line":2466},[72,13591,85],{"emptyLinePlaceholder":84},[72,13593,13594],{"class":74,"line":3926},[72,13595,7158],{},[72,13597,13598],{"class":74,"line":4138},[72,13599,7163],{},[72,13601,13602],{"class":74,"line":5767},[72,13603,7168],{},[72,13605,13606],{"class":74,"line":5772},[72,13607,7173],{},[10,13609,117],{},[63,13611,13613],{"className":13612,"code":7179,"language":123,"meta":68},[121],[33,13614,7179],{"__ignoreMap":68},[10,13616,128],{},[14,13618,131],{"id":131},[133,13620,13621,13627],{},[44,13622,13623,7193,13625,7196],{},[33,13624,7192],{},[33,13626,7102],{},[44,13628,13629,7201],{},[33,13630,7081],{},[14,13632,152],{"id":152},[41,13634,13635,13637],{},[44,13636,7208],{},[44,13638,7211,13639,7214,13641,7217],{},[33,13640,7091],{},[33,13642,7095],{},[14,13644,163],{"id":163},[133,13646,13647,13649],{},[44,13648,7224],{},[44,13650,7227],{},[10,13652,178],{},[14,13654,181],{"id":181},[10,13656,7234],{},[186,13658,188],{},{"title":68,"searchDepth":81,"depth":81,"links":13660},[13661,13662,13663,13664,13665,13666,13667,13668],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":7058,"description":7063},[199,7254,7255],{"id":7258,"title":7259,"body":13673,"category":199,"cover":200,"description":7264,"extension":201,"meta":13887,"navigation":84,"path":7538,"pinned":204,"publishedAt":205,"seo":13888,"slug":7540,"stem":7541,"summary":7542,"tags":13889,"updatedAt":205,"visible":84,"__hash__":7546},{"type":7,"value":13674,"toc":13874},[13675,13677,13679,13681,13683,13687,13693,13695,13707,13709,13711,13771,13773,13778,13780,13782,13800,13802,13810,13814,13822,13824,13828,13832,13838,13840,13850,13852,13866,13868,13870,13872],[10,13676,7264],{},[14,13678,16],{"id":16},[10,13680,7269],{},[14,13682,22],{"id":22},[10,13684,13685],{},[26,13686],{"alt":7276,"src":7277},[10,13688,7280,13689,7284,13691,7288],{},[33,13690,7283],{},[33,13692,7287],{},[14,13694,39],{"id":39},[41,13696,13697,13701,13705],{},[44,13698,7295,13699,7298],{},[33,13700,7283],{},[44,13702,13703,7304],{},[33,13704,7303],{},[44,13706,7307],{},[14,13708,58],{"id":58},[10,13710,61],{},[63,13712,13713],{"className":65,"code":7314,"language":67,"meta":68,"style":68},[33,13714,13715,13719,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767],{"__ignoreMap":68},[72,13716,13717],{"class":74,"line":75},[72,13718,7321],{},[72,13720,13721],{"class":74,"line":81},[72,13722,7326],{},[72,13724,13725],{"class":74,"line":88},[72,13726,7331],{},[72,13728,13729],{"class":74,"line":94},[72,13730,7336],{},[72,13732,13733],{"class":74,"line":100},[72,13734,7341],{},[72,13736,13737],{"class":74,"line":105},[72,13738,85],{"emptyLinePlaceholder":84},[72,13740,13741],{"class":74,"line":111},[72,13742,7350],{},[72,13744,13745],{"class":74,"line":2466},[72,13746,7355],{},[72,13748,13749],{"class":74,"line":3926},[72,13750,7360],{},[72,13752,13753],{"class":74,"line":4138},[72,13754,7365],{},[72,13756,13757],{"class":74,"line":5767},[72,13758,1119],{},[72,13760,13761],{"class":74,"line":5772},[72,13762,7374],{},[72,13764,13765],{"class":74,"line":7377},[72,13766,7380],{},[72,13768,13769],{"class":74,"line":7383},[72,13770,7386],{},[10,13772,117],{},[63,13774,13776],{"className":13775,"code":7392,"language":123,"meta":68},[121],[33,13777,7392],{"__ignoreMap":68},[10,13779,128],{},[14,13781,131],{"id":131},[133,13783,13784,13792],{},[44,13785,13786,7405,13788,7408,13790,7412],{},[33,13787,3009],{},[33,13789,7303],{},[33,13791,7411],{},[44,13793,7415,13794,7418,13796,7421,13798,335],{},[33,13795,7283],{},[33,13797,1133],{},[33,13799,7287],{},[301,13801,2670],{"id":2670},[10,13803,13804,2230,13806,1130,13808,7434],{},[33,13805,7283],{},[33,13807,1133],{},[33,13809,7287],{},[10,13811,13812],{},[26,13813],{"alt":7439,"src":7440},[10,13815,13816,7445,13818,7448,13820,7451],{},[33,13817,7283],{},[33,13819,1133],{},[33,13821,7287],{},[301,13823,2670],{"id":4193},[10,13825,13826,7459],{},[33,13827,7458],{},[10,13829,13830],{},[26,13831],{"alt":7464,"src":7465},[10,13833,7468,13834,7471,13836,7474],{},[33,13835,7458],{},[33,13837,1133],{},[14,13839,152],{"id":152},[41,13841,13842,13846],{},[44,13843,7481,13844,7485],{},[33,13845,7484],{},[44,13847,7488,13848,7491],{},[33,13849,7458],{},[14,13851,163],{"id":163},[133,13853,13854,13862],{},[44,13855,7498,13856,7502,13858,1130,13860,335],{},[33,13857,7501],{},[33,13859,7505],{},[33,13861,7508],{},[44,13863,7511,13864,7514],{},[33,13865,6719],{},[10,13867,178],{},[14,13869,181],{"id":181},[10,13871,7521],{},[186,13873,188],{},{"title":68,"searchDepth":81,"depth":81,"links":13875},[13876,13877,13878,13879,13880,13884,13885,13886],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":13881},[13882,13883],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":7259,"description":7264},[199,7544,7545],{"id":7548,"title":7549,"body":13891,"category":199,"cover":200,"description":7554,"extension":201,"meta":14042,"navigation":84,"path":7731,"pinned":204,"publishedAt":205,"seo":14043,"slug":7733,"stem":7734,"summary":7735,"tags":14044,"updatedAt":205,"visible":84,"__hash__":7738},{"type":7,"value":13892,"toc":14032},[13893,13895,13897,13899,13901,13905,13909,13911,13923,13925,13927,13975,13977,13982,13984,13986,13996,13998,14008,14010,14024,14026,14028,14030],[10,13894,7554],{},[14,13896,16],{"id":16},[10,13898,7559],{},[14,13900,22],{"id":22},[10,13902,13903],{},[26,13904],{"alt":7566,"src":7567},[10,13906,7570,13907,7573],{},[33,13908,6729],{},[14,13910,39],{"id":39},[41,13912,13913,13917,13921],{},[44,13914,13915,7582],{},[33,13916,6729],{},[44,13918,13919,7588],{},[33,13920,7587],{},[44,13922,7591],{},[14,13924,58],{"id":58},[10,13926,61],{},[63,13928,13929],{"className":65,"code":7598,"language":67,"meta":68,"style":68},[33,13930,13931,13935,13939,13943,13947,13951,13955,13959,13963,13967,13971],{"__ignoreMap":68},[72,13932,13933],{"class":74,"line":75},[72,13934,6541],{},[72,13936,13937],{"class":74,"line":81},[72,13938,85],{"emptyLinePlaceholder":84},[72,13940,13941],{"class":74,"line":88},[72,13942,6752],{},[72,13944,13945],{"class":74,"line":94},[72,13946,85],{"emptyLinePlaceholder":84},[72,13948,13949],{"class":74,"line":100},[72,13950,7621],{},[72,13952,13953],{"class":74,"line":105},[72,13954,7626],{},[72,13956,13957],{"class":74,"line":111},[72,13958,85],{"emptyLinePlaceholder":84},[72,13960,13961],{"class":74,"line":2466},[72,13962,7635],{},[72,13964,13965],{"class":74,"line":3926},[72,13966,7640],{},[72,13968,13969],{"class":74,"line":4138},[72,13970,85],{"emptyLinePlaceholder":84},[72,13972,13973],{"class":74,"line":5767},[72,13974,7649],{},[10,13976,117],{},[63,13978,13980],{"className":13979,"code":7655,"language":123,"meta":68},[121],[33,13981,7655],{"__ignoreMap":68},[10,13983,128],{},[14,13985,131],{"id":131},[133,13987,13988,13994],{},[44,13989,7570,13990,7668,13992,335],{},[33,13991,6729],{},[33,13993,7671],{},[44,13995,7674],{},[14,13997,152],{"id":152},[41,13999,14000,14004],{},[44,14001,4725,14002,7683],{},[33,14003,6729],{},[44,14005,7686,14006,7689],{},[33,14007,6729],{},[14,14009,163],{"id":163},[133,14011,14012,14018],{},[44,14013,7696,14014,7700,14016,335],{},[33,14015,7699],{},[33,14017,6729],{},[44,14019,4725,14020,7707,14022,335],{},[33,14021,6729],{},[33,14023,7710],{},[10,14025,178],{},[14,14027,181],{"id":181},[10,14029,7717],{},[186,14031,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14033},[14034,14035,14036,14037,14038,14039,14040,14041],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":7549,"description":7554},[199,6729,7737],{"id":7740,"title":7741,"body":14046,"category":199,"cover":200,"description":7746,"extension":201,"meta":14217,"navigation":84,"path":7959,"pinned":204,"publishedAt":205,"seo":14218,"slug":7961,"stem":7962,"summary":7963,"tags":14219,"updatedAt":205,"visible":84,"__hash__":7967},{"type":7,"value":14047,"toc":14205},[14048,14050,14052,14054,14056,14060,14062,14064,14076,14078,14080,14136,14138,14143,14145,14147,14163,14165,14167,14171,14177,14179,14187,14189,14197,14199,14201,14203],[10,14049,7746],{},[14,14051,16],{"id":16},[10,14053,7751],{},[14,14055,22],{"id":22},[10,14057,14058],{},[26,14059],{"alt":7758,"src":7759},[10,14061,7762],{},[14,14063,39],{"id":39},[41,14065,14066,14070,14074],{},[44,14067,14068,7772],{},[33,14069,7771],{},[44,14071,14072,7778],{},[33,14073,7777],{},[44,14075,7781],{},[14,14077,58],{"id":58},[10,14079,61],{},[63,14081,14082],{"className":65,"code":7788,"language":67,"meta":68,"style":68},[33,14083,14084,14088,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132],{"__ignoreMap":68},[72,14085,14086],{"class":74,"line":75},[72,14087,7795],{},[72,14089,14090],{"class":74,"line":81},[72,14091,7800],{},[72,14093,14094],{"class":74,"line":88},[72,14095,7805],{},[72,14097,14098],{"class":74,"line":94},[72,14099,7810],{},[72,14101,14102],{"class":74,"line":100},[72,14103,85],{"emptyLinePlaceholder":84},[72,14105,14106],{"class":74,"line":105},[72,14107,7819],{},[72,14109,14110],{"class":74,"line":111},[72,14111,7824],{},[72,14113,14114],{"class":74,"line":2466},[72,14115,7829],{},[72,14117,14118],{"class":74,"line":3926},[72,14119,7834],{},[72,14121,14122],{"class":74,"line":4138},[72,14123,85],{"emptyLinePlaceholder":84},[72,14125,14126],{"class":74,"line":5767},[72,14127,7843],{},[72,14129,14130],{"class":74,"line":5772},[72,14131,7848],{},[72,14133,14134],{"class":74,"line":7377},[72,14135,7853],{},[10,14137,117],{},[63,14139,14141],{"className":14140,"code":7859,"language":123,"meta":68},[121],[33,14142,7859],{"__ignoreMap":68},[10,14144,128],{},[14,14146,131],{"id":131},[133,14148,14149,14155],{},[44,14150,7870,14151,7874,14153,7877],{},[33,14152,7873],{},[33,14154,7777],{},[44,14156,14157,7883,14159,7887,14161,7890],{},[33,14158,7882],{},[33,14160,7886],{},[33,14162,7771],{},[301,14164,2670],{"id":2670},[10,14166,7895],{},[10,14168,14169],{},[26,14170],{"alt":7900,"src":7901},[10,14172,7904,14173,1130,14175,7910],{},[33,14174,143],{},[33,14176,7909],{},[14,14178,152],{"id":152},[41,14180,14181,14185],{},[44,14182,7917,14183,7920],{},[33,14184,7771],{},[44,14186,7923],{},[14,14188,163],{"id":163},[133,14190,14191,14195],{},[44,14192,5235,14193,7933],{},[33,14194,7932],{},[44,14196,7936],{},[10,14198,178],{},[14,14200,181],{"id":181},[10,14202,7943],{},[186,14204,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14206},[14207,14208,14209,14210,14211,14214,14215,14216],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":14212},[14213],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":7741,"description":7746},[199,7965,7966],{"id":7969,"title":7970,"body":14221,"category":199,"cover":200,"description":7975,"extension":201,"meta":14368,"navigation":84,"path":8154,"pinned":204,"publishedAt":205,"seo":14369,"slug":8156,"stem":8157,"summary":8158,"tags":14370,"updatedAt":205,"visible":84,"__hash__":8162},{"type":7,"value":14222,"toc":14358},[14223,14225,14227,14229,14231,14235,14237,14239,14247,14249,14251,14307,14309,14314,14316,14318,14330,14332,14338,14340,14350,14352,14354,14356],[10,14224,7975],{},[14,14226,16],{"id":16},[10,14228,7980],{},[14,14230,22],{"id":22},[10,14232,14233],{},[26,14234],{"alt":7987,"src":7988},[10,14236,7991],{},[14,14238,39],{"id":39},[41,14240,14241,14243,14245],{},[44,14242,7998],{},[44,14244,8001],{},[44,14246,8004],{},[14,14248,58],{"id":58},[10,14250,61],{},[63,14252,14253],{"className":65,"code":8011,"language":67,"meta":68,"style":68},[33,14254,14255,14259,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303],{"__ignoreMap":68},[72,14256,14257],{"class":74,"line":75},[72,14258,8018],{},[72,14260,14261],{"class":74,"line":81},[72,14262,8023],{},[72,14264,14265],{"class":74,"line":88},[72,14266,8028],{},[72,14268,14269],{"class":74,"line":94},[72,14270,85],{"emptyLinePlaceholder":84},[72,14272,14273],{"class":74,"line":100},[72,14274,8037],{},[72,14276,14277],{"class":74,"line":105},[72,14278,8042],{},[72,14280,14281],{"class":74,"line":111},[72,14282,8047],{},[72,14284,14285],{"class":74,"line":2466},[72,14286,85],{"emptyLinePlaceholder":84},[72,14288,14289],{"class":74,"line":3926},[72,14290,8056],{},[72,14292,14293],{"class":74,"line":4138},[72,14294,8061],{},[72,14296,14297],{"class":74,"line":5767},[72,14298,85],{"emptyLinePlaceholder":84},[72,14300,14301],{"class":74,"line":5772},[72,14302,8070],{},[72,14304,14305],{"class":74,"line":7377},[72,14306,8075],{},[10,14308,117],{},[63,14310,14312],{"className":14311,"code":8081,"language":123,"meta":68},[121],[33,14313,8081],{"__ignoreMap":68},[10,14315,128],{},[14,14317,131],{"id":131},[133,14319,14320,14326],{},[44,14321,14322,8095,14324,8099],{},[33,14323,8094],{},[33,14325,8098],{},[44,14327,8102,14328,8106],{},[33,14329,8105],{},[14,14331,152],{"id":152},[41,14333,14334,14336],{},[44,14335,8113],{},[44,14337,8116],{},[14,14339,163],{"id":163},[133,14341,14342,14348],{},[44,14343,8123,14344,8127,14346,335],{},[33,14345,8126],{},[33,14347,8130],{},[44,14349,8133],{},[10,14351,178],{},[14,14353,181],{"id":181},[10,14355,8140],{},[186,14357,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14359},[14360,14361,14362,14363,14364,14365,14366,14367],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":7970,"description":7975},[199,8160,8161],{"id":8164,"title":8165,"body":14372,"category":199,"cover":200,"description":8170,"extension":201,"meta":14535,"navigation":84,"path":8374,"pinned":204,"publishedAt":205,"seo":14536,"slug":8376,"stem":8377,"summary":8378,"tags":14537,"updatedAt":205,"visible":84,"__hash__":8382},{"type":7,"value":14373,"toc":14523},[14374,14376,14378,14380,14382,14386,14390,14392,14408,14410,14412,14456,14458,14463,14465,14467,14481,14483,14487,14491,14495,14497,14503,14505,14515,14517,14519,14521],[10,14375,8170],{},[14,14377,16],{"id":16},[10,14379,8175],{},[14,14381,22],{"id":22},[10,14383,14384],{},[26,14385],{"alt":8182,"src":8183},[10,14387,8186,14388,8190],{},[33,14389,8189],{},[14,14391,39],{"id":39},[41,14393,14394,14400,14406],{},[44,14395,14396,8200,14398,8204],{},[33,14397,8199],{},[33,14399,8203],{},[44,14401,8207,14402,8211,14404,8214],{},[33,14403,8210],{},[33,14405,35],{},[44,14407,8217],{},[14,14409,58],{"id":58},[10,14411,61],{},[63,14413,14414],{"className":65,"code":8224,"language":67,"meta":68,"style":68},[33,14415,14416,14420,14424,14428,14432,14436,14440,14444,14448,14452],{"__ignoreMap":68},[72,14417,14418],{"class":74,"line":75},[72,14419,8231],{},[72,14421,14422],{"class":74,"line":81},[72,14423,8236],{},[72,14425,14426],{"class":74,"line":88},[72,14427,8241],{},[72,14429,14430],{"class":74,"line":94},[72,14431,8246],{},[72,14433,14434],{"class":74,"line":100},[72,14435,8251],{},[72,14437,14438],{"class":74,"line":105},[72,14439,85],{"emptyLinePlaceholder":84},[72,14441,14442],{"class":74,"line":111},[72,14443,8260],{},[72,14445,14446],{"class":74,"line":2466},[72,14447,8265],{},[72,14449,14450],{"class":74,"line":3926},[72,14451,8265],{},[72,14453,14454],{"class":74,"line":4138},[72,14455,8265],{},[10,14457,117],{},[63,14459,14461],{"className":14460,"code":8279,"language":123,"meta":68},[121],[33,14462,8279],{"__ignoreMap":68},[10,14464,128],{},[14,14466,131],{"id":131},[133,14468,14469,14473],{},[44,14470,7870,14471,8293],{},[33,14472,8292],{},[44,14474,8296,14475,8299,14477,8302,14479,8306],{},[33,14476,8203],{},[33,14478,8189],{},[33,14480,8305],{},[301,14482,2670],{"id":2670},[10,14484,8311,14485,8314],{},[33,14486,8203],{},[10,14488,14489],{},[26,14490],{"alt":8319,"src":8320},[10,14492,8323,14493,8326],{},[33,14494,8189],{},[14,14496,152],{"id":152},[41,14498,14499,14501],{},[44,14500,8333],{},[44,14502,8336],{},[14,14504,163],{"id":163},[133,14506,14507,14509],{},[44,14508,8343],{},[44,14510,3984,14511,8348,14513,8351],{},[33,14512,35],{},[33,14514,8203],{},[10,14516,178],{},[14,14518,181],{"id":181},[10,14520,8358],{},[186,14522,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14524},[14525,14526,14527,14528,14529,14532,14533,14534],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":14530},[14531],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":8165,"description":8170},[199,8380,8381],{"id":8384,"title":8385,"body":14539,"category":199,"cover":200,"description":8390,"extension":201,"meta":14722,"navigation":84,"path":8615,"pinned":204,"publishedAt":205,"seo":14723,"slug":8617,"stem":8618,"summary":8619,"tags":14724,"updatedAt":205,"visible":84,"__hash__":8622},{"type":7,"value":14540,"toc":14710},[14541,14543,14545,14547,14549,14553,14555,14557,14571,14573,14575,14643,14645,14650,14652,14654,14668,14670,14672,14676,14682,14684,14692,14694,14702,14704,14706,14708],[10,14542,8390],{},[14,14544,16],{"id":16},[10,14546,8395],{},[14,14548,22],{"id":22},[10,14550,14551],{},[26,14552],{"alt":8402,"src":8403},[10,14554,8406],{},[14,14556,39],{"id":39},[41,14558,14559,14565,14567],{},[44,14560,14561,8416,14563,335],{},[33,14562,8415],{},[33,14564,8419],{},[44,14566,8422],{},[44,14568,14569,8428],{},[33,14570,8427],{},[14,14572,58],{"id":58},[10,14574,61],{},[63,14576,14577],{"className":65,"code":8435,"language":67,"meta":68,"style":68},[33,14578,14579,14583,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639],{"__ignoreMap":68},[72,14580,14581],{"class":74,"line":75},[72,14582,8442],{},[72,14584,14585],{"class":74,"line":81},[72,14586,85],{"emptyLinePlaceholder":84},[72,14588,14589],{"class":74,"line":88},[72,14590,8451],{},[72,14592,14593],{"class":74,"line":94},[72,14594,8456],{},[72,14596,14597],{"class":74,"line":100},[72,14598,8461],{},[72,14600,14601],{"class":74,"line":105},[72,14602,8466],{},[72,14604,14605],{"class":74,"line":111},[72,14606,8471],{},[72,14608,14609],{"class":74,"line":2466},[72,14610,8476],{},[72,14612,14613],{"class":74,"line":3926},[72,14614,8481],{},[72,14616,14617],{"class":74,"line":4138},[72,14618,8486],{},[72,14620,14621],{"class":74,"line":5767},[72,14622,85],{"emptyLinePlaceholder":84},[72,14624,14625],{"class":74,"line":5772},[72,14626,8495],{},[72,14628,14629],{"class":74,"line":7377},[72,14630,6120],{},[72,14632,14633],{"class":74,"line":7383},[72,14634,6125],{},[72,14636,14637],{"class":74,"line":8506},[72,14638,85],{"emptyLinePlaceholder":84},[72,14640,14641],{"class":74,"line":8511},[72,14642,8514],{},[10,14644,117],{},[63,14646,14648],{"className":14647,"code":8520,"language":123,"meta":68},[121],[33,14649,8520],{"__ignoreMap":68},[10,14651,128],{},[14,14653,131],{"id":131},[133,14655,14656,14666],{},[44,14657,8531,14658,8535,14660,8539,14662,8543,14664,335],{},[33,14659,8534],{},[33,14661,8538],{},[33,14663,8542],{},[33,14665,8534],{},[44,14667,8548],{},[301,14669,2670],{"id":2670},[10,14671,8553],{},[10,14673,14674],{},[26,14675],{"alt":8558,"src":8559},[10,14677,14678,8564,14680,335],{},[33,14679,8415],{},[33,14681,8419],{},[14,14683,152],{"id":152},[41,14685,14686,14690],{},[44,14687,8573,14688,335],{},[33,14689,5318],{},[44,14691,8578],{},[14,14693,163],{"id":163},[133,14695,14696,14698],{},[44,14697,8585],{},[44,14699,8588,14700,8592],{},[33,14701,8591],{},[10,14703,178],{},[14,14705,181],{"id":181},[10,14707,8599],{},[186,14709,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14711},[14712,14713,14714,14715,14716,14719,14720,14721],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":14717},[14718],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":8385,"description":8390},[199,8621,5269],{"id":8624,"title":8625,"body":14726,"category":199,"cover":200,"description":8630,"extension":201,"meta":14885,"navigation":84,"path":8818,"pinned":204,"publishedAt":205,"seo":14886,"slug":8820,"stem":8821,"summary":8822,"tags":14887,"updatedAt":205,"visible":84,"__hash__":8826},{"type":7,"value":14727,"toc":14873},[14728,14730,14732,14734,14736,14740,14742,14744,14752,14754,14756,14820,14822,14827,14829,14831,14839,14841,14843,14847,14849,14851,14857,14859,14865,14867,14869,14871],[10,14729,8630],{},[14,14731,16],{"id":16},[10,14733,8635],{},[14,14735,22],{"id":22},[10,14737,14738],{},[26,14739],{"alt":8642,"src":8643},[10,14741,8646],{},[14,14743,39],{"id":39},[41,14745,14746,14748,14750],{},[44,14747,8653],{},[44,14749,8656],{},[44,14751,8659],{},[14,14753,58],{"id":58},[10,14755,61],{},[63,14757,14758],{"className":65,"code":8666,"language":67,"meta":68,"style":68},[33,14759,14760,14764,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816],{"__ignoreMap":68},[72,14761,14762],{"class":74,"line":75},[72,14763,8673],{},[72,14765,14766],{"class":74,"line":81},[72,14767,8678],{},[72,14769,14770],{"class":74,"line":88},[72,14771,85],{"emptyLinePlaceholder":84},[72,14773,14774],{"class":74,"line":94},[72,14775,8687],{},[72,14777,14778],{"class":74,"line":100},[72,14779,85],{"emptyLinePlaceholder":84},[72,14781,14782],{"class":74,"line":105},[72,14783,8696],{},[72,14785,14786],{"class":74,"line":111},[72,14787,8701],{},[72,14789,14790],{"class":74,"line":2466},[72,14791,8706],{},[72,14793,14794],{"class":74,"line":3926},[72,14795,85],{"emptyLinePlaceholder":84},[72,14797,14798],{"class":74,"line":4138},[72,14799,8715],{},[72,14801,14802],{"class":74,"line":5767},[72,14803,8720],{},[72,14805,14806],{"class":74,"line":5772},[72,14807,8725],{},[72,14809,14810],{"class":74,"line":7377},[72,14811,85],{"emptyLinePlaceholder":84},[72,14813,14814],{"class":74,"line":7383},[72,14815,6134],{},[72,14817,14818],{"class":74,"line":8506},[72,14819,8738],{},[10,14821,117],{},[63,14823,14825],{"className":14824,"code":8744,"language":123,"meta":68},[121],[33,14826,8744],{"__ignoreMap":68},[10,14828,128],{},[14,14830,131],{"id":131},[133,14832,14833,14837],{},[44,14834,14835,8758],{},[33,14836,8757],{},[44,14838,8761],{},[301,14840,2670],{"id":2670},[10,14842,8766],{},[10,14844,14845],{},[26,14846],{"alt":8771,"src":8772},[10,14848,8775],{},[14,14850,152],{"id":152},[41,14852,14853,14855],{},[44,14854,8782],{},[44,14856,8785],{},[14,14858,163],{"id":163},[133,14860,14861,14863],{},[44,14862,8792],{},[44,14864,8795],{},[10,14866,178],{},[14,14868,181],{"id":181},[10,14870,8802],{},[186,14872,188],{},{"title":68,"searchDepth":81,"depth":81,"links":14874},[14875,14876,14877,14878,14879,14882,14883,14884],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":14880},[14881],{"id":2670,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":8625,"description":8630},[199,8824,8825],{"id":8828,"title":8829,"body":14889,"category":199,"cover":200,"description":8834,"extension":201,"meta":15127,"navigation":84,"path":9135,"pinned":204,"publishedAt":205,"seo":15128,"slug":9137,"stem":9138,"summary":9139,"tags":15129,"updatedAt":205,"visible":84,"__hash__":9143},{"type":7,"value":14890,"toc":15114},[14891,14893,14895,14897,14899,14903,14905,14907,14917,14919,14921,15037,15039,15044,15046,15048,15058,15060,15062,15066,15068,15070,15072,15076,15080,15082,15090,15092,15106,15108,15110,15112],[10,14892,8834],{},[14,14894,16],{"id":16},[10,14896,8839],{},[14,14898,22],{"id":22},[10,14900,14901],{},[26,14902],{"alt":8846,"src":8847},[10,14904,8850],{},[14,14906,39],{"id":39},[41,14908,14909,14911,14913],{},[44,14910,8857],{},[44,14912,8860],{},[44,14914,8863,14915,8867],{},[33,14916,8866],{},[14,14918,58],{"id":58},[10,14920,61],{},[63,14922,14923],{"className":65,"code":8874,"language":67,"meta":68,"style":68},[33,14924,14925,14929,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033],{"__ignoreMap":68},[72,14926,14927],{"class":74,"line":75},[72,14928,6932],{},[72,14930,14931],{"class":74,"line":81},[72,14932,6541],{},[72,14934,14935],{"class":74,"line":88},[72,14936,85],{"emptyLinePlaceholder":84},[72,14938,14939],{"class":74,"line":94},[72,14940,8893],{},[72,14942,14943],{"class":74,"line":100},[72,14944,8898],{},[72,14946,14947],{"class":74,"line":105},[72,14948,8903],{},[72,14950,14951],{"class":74,"line":111},[72,14952,8908],{},[72,14954,14955],{"class":74,"line":2466},[72,14956,85],{"emptyLinePlaceholder":84},[72,14958,14959],{"class":74,"line":3926},[72,14960,8917],{},[72,14962,14963],{"class":74,"line":4138},[72,14964,8922],{},[72,14966,14967],{"class":74,"line":5767},[72,14968,8927],{},[72,14970,14971],{"class":74,"line":5772},[72,14972,8932],{},[72,14974,14975],{"class":74,"line":7377},[72,14976,8937],{},[72,14978,14979],{"class":74,"line":7383},[72,14980,85],{"emptyLinePlaceholder":84},[72,14982,14983],{"class":74,"line":8506},[72,14984,8946],{},[72,14986,14987],{"class":74,"line":8511},[72,14988,8951],{},[72,14990,14991],{"class":74,"line":8954},[72,14992,8957],{},[72,14994,14995],{"class":74,"line":8960},[72,14996,85],{"emptyLinePlaceholder":84},[72,14998,14999],{"class":74,"line":8965},[72,15000,8968],{},[72,15002,15003],{"class":74,"line":8971},[72,15004,85],{"emptyLinePlaceholder":84},[72,15006,15007],{"class":74,"line":8976},[72,15008,7350],{},[72,15010,15011],{"class":74,"line":8981},[72,15012,8984],{},[72,15014,15015],{"class":74,"line":8987},[72,15016,8990],{},[72,15018,15019],{"class":74,"line":8993},[72,15020,8996],{},[72,15022,15023],{"class":74,"line":8999},[72,15024,7360],{},[72,15026,15027],{"class":74,"line":9004},[72,15028,9007],{},[72,15030,15031],{"class":74,"line":9010},[72,15032,1119],{},[72,15034,15035],{"class":74,"line":9015},[72,15036,9018],{},[10,15038,117],{},[63,15040,15042],{"className":15041,"code":9024,"language":123,"meta":68},[121],[33,15043,9024],{"__ignoreMap":68},[10,15045,128],{},[14,15047,131],{"id":131},[133,15049,15050,15054],{},[44,15051,9035,15052,9038],{},[33,15053,8866],{},[44,15055,15056,9043],{},[33,15057,8098],{},[301,15059,2670],{"id":2670},[10,15061,9048],{},[10,15063,15064],{},[26,15065],{"alt":9053,"src":9054},[10,15067,9057],{},[301,15069,2670],{"id":4193},[10,15071,9062],{},[10,15073,15074],{},[26,15075],{"alt":9067,"src":9068},[10,15077,9071,15078,9075],{},[33,15079,9074],{},[14,15081,152],{"id":152},[41,15083,15084,15086],{},[44,15085,9082],{},[44,15087,9085,15088,9088],{},[33,15089,9074],{},[14,15091,163],{"id":163},[133,15093,15094,15098,15100],{},[44,15095,9095,15096,9098],{},[33,15097,9074],{},[44,15099,9101],{},[44,15101,9104,15102,9108,15104,9111],{},[33,15103,9107],{},[33,15105,6076],{},[10,15107,178],{},[14,15109,181],{"id":181},[10,15111,9118],{},[186,15113,188],{},{"title":68,"searchDepth":81,"depth":81,"links":15115},[15116,15117,15118,15119,15120,15124,15125,15126],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":39,"depth":81,"text":39},{"id":58,"depth":81,"text":58},{"id":131,"depth":81,"text":131,"children":15121},[15122,15123],{"id":2670,"depth":88,"text":2670},{"id":4193,"depth":88,"text":2670},{"id":152,"depth":81,"text":152},{"id":163,"depth":81,"text":163},{"id":181,"depth":81,"text":181},{},{"title":8829,"description":8834},[199,9141,9142],{"id":1029,"title":1030,"body":15131,"category":199,"cover":1038,"description":68,"extension":201,"meta":15367,"navigation":84,"path":1355,"pinned":204,"publishedAt":1356,"seo":15368,"slug":1358,"stem":1359,"summary":1360,"tags":15369,"updatedAt":1356,"visible":84,"__hash__":1364},{"type":7,"value":15132,"toc":15352},[15133,15137,15139,15141,15143,15145,15165,15167,15172,15174,15176,15204,15210,15212,15216,15218,15238,15240,15250,15252,15254,15256,15258,15260,15262,15264,15266,15268,15288,15290,15292,15296,15298,15300,15302,15304,15308,15310,15328,15330,15332,15334,15336,15338,15340,15342,15344,15346,15348,15350],[10,15134,15135],{},[26,15136],{"alt":1037,"src":1038},[10,15138,1041],{},[10,15140,1044],{},[14,15142,1048],{"id":1047},[10,15144,1051],{},[63,15146,15147],{"className":65,"code":1054,"language":67,"meta":68,"style":68},[33,15148,15149,15153,15157,15161],{"__ignoreMap":68},[72,15150,15151],{"class":74,"line":75},[72,15152,1061],{},[72,15154,15155],{"class":74,"line":81},[72,15156,1066],{},[72,15158,15159],{"class":74,"line":88},[72,15160,85],{"emptyLinePlaceholder":84},[72,15162,15163],{"class":74,"line":94},[72,15164,1075],{},[10,15166,1078],{},[63,15168,15170],{"className":15169,"code":1082,"language":123,"meta":68},[121],[33,15171,1082],{"__ignoreMap":68},[10,15173,1087],{},[10,15175,1090],{},[63,15177,15178],{"className":65,"code":1093,"language":67,"meta":68,"style":68},[33,15179,15180,15184,15188,15192,15196,15200],{"__ignoreMap":68},[72,15181,15182],{"class":74,"line":75},[72,15183,1100],{},[72,15185,15186],{"class":74,"line":81},[72,15187,85],{"emptyLinePlaceholder":84},[72,15189,15190],{"class":74,"line":88},[72,15191,1109],{},[72,15193,15194],{"class":74,"line":94},[72,15195,1114],{},[72,15197,15198],{"class":74,"line":100},[72,15199,1119],{},[72,15201,15202],{"class":74,"line":105},[72,15203,1124],{},[10,15205,15206,1130,15208,1134],{},[33,15207,1129],{},[33,15209,1133],{},[14,15211,1138],{"id":1137},[10,15213,1141,15214,1145],{},[33,15215,1144],{},[10,15217,1148],{},[63,15219,15220],{"className":65,"code":1151,"language":67,"meta":68,"style":68},[33,15221,15222,15226,15230,15234],{"__ignoreMap":68},[72,15223,15224],{"class":74,"line":75},[72,15225,1158],{},[72,15227,15228],{"class":74,"line":81},[72,15229,1163],{},[72,15231,15232],{"class":74,"line":88},[72,15233,1168],{},[72,15235,15236],{"class":74,"line":94},[72,15237,1173],{},[10,15239,1176],{},[63,15241,15242],{"className":564,"code":1179,"language":566,"meta":68,"style":68},[33,15243,15244],{"__ignoreMap":68},[72,15245,15246,15248],{"class":74,"line":75},[72,15247,664],{"class":573},[72,15249,1188],{"class":609},[10,15251,1191],{},[14,15253,1195],{"id":1194},[301,15255,1198],{"id":1198},[10,15257,1201],{},[301,15259,1204],{"id":1204},[10,15261,1207],{},[301,15263,1210],{"id":1210},[10,15265,1213],{},[10,15267,1216],{},[63,15269,15270],{"className":65,"code":1219,"language":67,"meta":68,"style":68},[33,15271,15272,15276,15280,15284],{"__ignoreMap":68},[72,15273,15274],{"class":74,"line":75},[72,15275,1226],{},[72,15277,15278],{"class":74,"line":81},[72,15279,85],{"emptyLinePlaceholder":84},[72,15281,15282],{"class":74,"line":88},[72,15283,1235],{},[72,15285,15286],{"class":74,"line":94},[72,15287,1240],{},[10,15289,1243],{},[301,15291,1246],{"id":1246},[10,15293,1249,15294,1252],{},[33,15295,233],{},[10,15297,1255],{},[301,15299,1258],{"id":1258},[10,15301,1261],{},[14,15303,1265],{"id":1264},[10,15305,15306],{},[26,15307],{"alt":1270,"src":1271},[10,15309,1274],{},[41,15311,15312,15314,15316,15318,15320,15322,15324,15326],{},[44,15313,1279],{},[44,15315,1282],{},[44,15317,1285],{},[44,15319,1288],{},[44,15321,1291],{},[44,15323,1294],{},[44,15325,1297],{},[44,15327,1300],{},[10,15329,1303],{},[14,15331,1307],{"id":1306},[10,15333,1310],{},[10,15335,1313],{},[14,15337,1317],{"id":1316},[10,15339,1320],{},[10,15341,1323],{},[10,15343,1326],{},[14,15345,1329],{"id":1329},[10,15347,1332],{},[10,15349,1335],{},[186,15351,1338],{},{"title":68,"searchDepth":81,"depth":81,"links":15353},[15354,15355,15356,15363,15364,15365,15366],{"id":1047,"depth":81,"text":1048},{"id":1137,"depth":81,"text":1138},{"id":1194,"depth":81,"text":1195,"children":15357},[15358,15359,15360,15361,15362],{"id":1198,"depth":88,"text":1198},{"id":1204,"depth":88,"text":1204},{"id":1210,"depth":88,"text":1210},{"id":1246,"depth":88,"text":1246},{"id":1258,"depth":88,"text":1258},{"id":1264,"depth":81,"text":1265},{"id":1306,"depth":81,"text":1307},{"id":1316,"depth":81,"text":1317},{"id":1329,"depth":81,"text":1329},{},{"title":1030,"description":68},[199,1362,1363],{"id":215,"title":216,"body":15371,"category":199,"cover":200,"description":68,"extension":201,"meta":15950,"navigation":84,"path":1018,"pinned":204,"publishedAt":1019,"seo":15951,"slug":1021,"stem":1022,"summary":1023,"tags":15952,"updatedAt":1019,"visible":84,"__hash__":1027},{"type":7,"value":15372,"toc":15926},[15373,15375,15377,15379,15383,15385,15387,15411,15423,15425,15427,15432,15436,15440,15452,15456,15460,15464,15466,15500,15502,15506,15510,15512,15534,15564,15576,15586,15594,15596,15602,15612,15614,15619,15623,15625,15639,15645,15665,15667,15669,15671,15681,15685,15687,15696,15700,15702,15704,15724,15728,15730,15732,15734,15736,15756,15758,15760,15762,15788,15790,15806,15808,15824,15828,15830,15832,15852,15854,15856,15858,15862,15872,15874,15876,15878,15888,15896,15898,15900,15914,15924],[14,15374,221],{"id":221},[10,15376,224],{},[10,15378,227],{},[10,15380,230,15381,234],{},[33,15382,233],{},[14,15384,237],{"id":237},[10,15386,240],{},[242,15388,15389,15391],{},[10,15390,246],{},[242,15392,15393,15399,15401,15405,15407],{},[10,15394,251,15395,255,15397,259],{},[33,15396,254],{},[33,15398,258],{},[10,15400,262],{},[10,15402,265,15403,270],{},[267,15404,269],{},[10,15406,273],{},[10,15408,15409],{},[26,15410],{"alt":278,"src":279},[242,15412,15413,15415],{},[10,15414,284],{},[242,15416,15417,15419],{},[10,15418,289],{},[10,15420,15421],{},[26,15422],{"alt":294,"src":295},[14,15424,299],{"id":298},[301,15426,304],{"id":303},[10,15428,307,15429,315],{},[309,15430,314],{"href":311,"rel":15431},[313],[242,15433,15434],{},[10,15435,320],{},[10,15437,15438],{},[26,15439],{"alt":325,"src":326},[41,15441,15442,15446,15450],{},[44,15443,331,15444,335],{},[267,15445,334],{},[44,15447,338,15448,335],{},[267,15449,341],{},[44,15451,344],{},[10,15453,15454],{},[26,15455],{"alt":349,"src":350},[242,15457,15458],{},[10,15459,355],{},[10,15461,15462],{},[26,15463],{"alt":360,"src":361},[301,15465,365],{"id":364},[242,15467,15468,15472,15476,15496],{},[242,15469,15470],{},[10,15471,372],{},[10,15473,375,15474,379],{},[267,15475,378],{},[63,15477,15478],{"className":65,"code":382,"language":67,"meta":68,"style":68},[33,15479,15480,15484,15488,15492],{"__ignoreMap":68},[72,15481,15482],{"class":74,"line":75},[72,15483,389],{},[72,15485,15486],{"class":74,"line":81},[72,15487,394],{},[72,15489,15490],{"class":74,"line":88},[72,15491,399],{},[72,15493,15494],{"class":74,"line":94},[72,15495,404],{},[10,15497,407,15498,411],{},[267,15499,410],{},[10,15501,414],{},[10,15503,417,15504,420],{},[33,15505,67],{},[10,15507,15508],{},[26,15509],{"alt":425,"src":426},[10,15511,429],{},[242,15513,15514,15516,15520],{},[10,15515,434],{},[10,15517,15518],{},[267,15519,439],{},[242,15521,15522,15526,15530],{},[10,15523,444,15524,447],{},[33,15525,67],{},[10,15527,450,15528,453],{},[33,15529,67],{},[10,15531,456,15532,460],{},[267,15533,459],{},[242,15535,15536,15538,15542],{},[10,15537,465],{},[10,15539,15540],{},[267,15541,470],{},[242,15543,15544,15550,15558,15560],{},[10,15545,15546,478,15548,482],{},[33,15547,477],{},[33,15549,481],{},[10,15551,485,15552,488,15554,492,15556,496],{},[33,15553,477],{},[267,15555,491],{},[267,15557,495],{},[10,15559,499],{},[10,15561,15562,505],{},[267,15563,504],{},[242,15565,15566,15568],{},[10,15567,510],{},[242,15569,15570,15574],{},[10,15571,515,15572,519],{},[267,15573,518],{},[10,15575,522],{},[242,15577,15578,15582],{},[10,15579,527,15580],{},[267,15581,530],{},[10,15583,15584],{},[26,15585],{"alt":535,"src":536},[242,15587,15588,15590],{},[10,15589,541],{},[10,15591,15592],{},[26,15593],{"alt":535,"src":546},[301,15595,550],{"id":549},[10,15597,553,15598,557,15600,561],{},[33,15599,556],{},[33,15601,560],{},[63,15603,15604],{"className":564,"code":565,"language":566,"meta":68,"style":68},[33,15605,15606],{"__ignoreMap":68},[72,15607,15608,15610],{"class":74,"line":75},[72,15609,67],{"class":573},[72,15611,577],{"class":576},[10,15613,580],{},[63,15615,15617],{"className":15616,"code":584,"language":123,"meta":68},[121],[33,15618,584],{"__ignoreMap":68},[10,15620,15621],{},[26,15622],{"alt":535,"src":591},[10,15624,594],{},[63,15626,15627],{"className":564,"code":597,"language":566,"meta":68,"style":68},[33,15628,15629],{"__ignoreMap":68},[72,15630,15631,15633,15635,15637],{"class":74,"line":75},[72,15632,67],{"class":573},[72,15634,606],{"class":576},[72,15636,610],{"class":609},[72,15638,577],{"class":576},[10,15640,615,15641,618,15643,622],{},[33,15642,67],{},[33,15644,621],{},[63,15646,15647],{"className":564,"code":625,"language":566,"meta":68,"style":68},[33,15648,15649,15655],{"__ignoreMap":68},[72,15650,15651,15653],{"class":74,"line":75},[72,15652,481],{"class":573},[72,15654,577],{"class":576},[72,15656,15657,15659,15661,15663],{"class":74,"line":81},[72,15658,481],{"class":573},[72,15660,606],{"class":576},[72,15662,610],{"class":609},[72,15664,577],{"class":576},[14,15666,647],{"id":646},[301,15668,651],{"id":650},[10,15670,654],{},[63,15672,15673],{"className":564,"code":657,"language":566,"meta":68,"style":68},[33,15674,15675],{"__ignoreMap":68},[72,15676,15677,15679],{"class":74,"line":75},[72,15678,664],{"class":573},[72,15680,577],{"class":576},[10,15682,669,15683,673],{},[33,15684,672],{},[301,15686,677],{"id":676},[10,15688,307,15689,685,15692,335,15694,692],{},[309,15690,684],{"href":682,"rel":15691},[313],[267,15693,688],{},[33,15695,691],{},[10,15697,695,15698,699],{},[33,15699,698],{},[301,15701,703],{"id":702},[10,15703,706],{},[63,15705,15706],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,15707,15708,15714],{"__ignoreMap":68},[72,15709,15710,15712],{"class":74,"line":75},[72,15711,664],{"class":573},[72,15713,577],{"class":576},[72,15715,15716,15718,15720,15722],{"class":74,"line":81},[72,15717,664],{"class":573},[72,15719,606],{"class":576},[72,15721,610],{"class":609},[72,15723,577],{"class":576},[10,15725,730,15726,733],{},[33,15727,664],{},[14,15729,737],{"id":736},[10,15731,740],{},[301,15733,744],{"id":743},[10,15735,747],{},[63,15737,15738],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,15739,15740,15746],{"__ignoreMap":68},[72,15741,15742,15744],{"class":74,"line":75},[72,15743,664],{"class":573},[72,15745,577],{"class":576},[72,15747,15748,15750,15752,15754],{"class":74,"line":81},[72,15749,664],{"class":573},[72,15751,606],{"class":576},[72,15753,610],{"class":609},[72,15755,577],{"class":576},[10,15757,770],{},[301,15759,774],{"id":773},[10,15761,777],{},[63,15763,15764],{"className":564,"code":780,"language":566,"meta":68,"style":68},[33,15765,15766,15774],{"__ignoreMap":68},[72,15767,15768,15770,15772],{"class":74,"line":75},[72,15769,787],{"class":573},[72,15771,790],{"class":609},[72,15773,793],{"class":609},[72,15775,15776,15778,15780,15782,15784,15786],{"class":74,"line":81},[72,15777,787],{"class":573},[72,15779,790],{"class":609},[72,15781,802],{"class":609},[72,15783,805],{"class":609},[72,15785,808],{"class":609},[72,15787,811],{"class":609},[10,15789,814],{},[63,15791,15792],{"className":564,"code":817,"language":566,"meta":68,"style":68},[33,15793,15794],{"__ignoreMap":68},[72,15795,15796,15798,15800,15802,15804],{"class":74,"line":75},[72,15797,787],{"class":573},[72,15799,826],{"class":609},[72,15801,802],{"class":609},[72,15803,805],{"class":609},[72,15805,833],{"class":609},[10,15807,836],{},[63,15809,15810],{"className":564,"code":839,"language":566,"meta":68,"style":68},[33,15811,15812],{"__ignoreMap":68},[72,15813,15814,15816,15818,15820,15822],{"class":74,"line":75},[72,15815,787],{"class":573},[72,15817,848],{"class":609},[72,15819,851],{"class":576},[72,15821,854],{"class":609},[72,15823,857],{"class":609},[10,15825,15826,862],{},[33,15827,787],{},[301,15829,866],{"id":865},[10,15831,869],{},[63,15833,15834],{"className":564,"code":709,"language":566,"meta":68,"style":68},[33,15835,15836,15842],{"__ignoreMap":68},[72,15837,15838,15840],{"class":74,"line":75},[72,15839,664],{"class":573},[72,15841,577],{"class":576},[72,15843,15844,15846,15848,15850],{"class":74,"line":81},[72,15845,664],{"class":573},[72,15847,606],{"class":576},[72,15849,610],{"class":609},[72,15851,577],{"class":576},[10,15853,892],{},[14,15855,895],{"id":895},[301,15857,899],{"id":898},[10,15859,902,15860,906],{},[33,15861,905],{},[133,15863,15864,15868,15870],{},[44,15865,911,15866,914],{},[33,15867,621],{},[44,15869,917],{},[44,15871,920],{},[10,15873,923],{},[301,15875,927],{"id":926},[10,15877,930],{},[63,15879,15880],{"className":564,"code":657,"language":566,"meta":68,"style":68},[33,15881,15882],{"__ignoreMap":68},[72,15883,15884,15886],{"class":74,"line":75},[72,15885,664],{"class":573},[72,15887,577],{"class":576},[10,15889,943,15890,946,15892,949,15894,335],{},[33,15891,664],{},[33,15893,67],{},[33,15895,664],{},[301,15897,955],{"id":954},[10,15899,958],{},[63,15901,15902],{"className":564,"code":961,"language":566,"meta":68,"style":68},[33,15903,15904],{"__ignoreMap":68},[72,15905,15906,15908,15910,15912],{"class":74,"line":75},[72,15907,664],{"class":573},[72,15909,606],{"class":576},[72,15911,610],{"class":609},[72,15913,577],{"class":576},[10,15915,976,15916,979,15918,982,15920,985,15922,989],{},[33,15917,664],{},[33,15919,67],{},[33,15921,481],{},[33,15923,988],{},[186,15925,992],{},{"title":68,"searchDepth":81,"depth":81,"links":15927},[15928,15929,15930,15935,15940,15945],{"id":221,"depth":81,"text":221},{"id":237,"depth":81,"text":237},{"id":298,"depth":81,"text":299,"children":15931},[15932,15933,15934],{"id":303,"depth":88,"text":304},{"id":364,"depth":88,"text":365},{"id":549,"depth":88,"text":550},{"id":646,"depth":81,"text":647,"children":15936},[15937,15938,15939],{"id":650,"depth":88,"text":651},{"id":676,"depth":88,"text":677},{"id":702,"depth":88,"text":703},{"id":736,"depth":81,"text":737,"children":15941},[15942,15943,15944],{"id":743,"depth":88,"text":744},{"id":773,"depth":88,"text":774},{"id":865,"depth":88,"text":866},{"id":895,"depth":81,"text":895,"children":15946},[15947,15948,15949],{"id":898,"depth":88,"text":899},{"id":926,"depth":88,"text":927},{"id":954,"depth":88,"text":955},{},{"title":216,"description":68},[199,1025,1026],1786973365292]