[{"data":1,"prerenderedAt":15979},["ShallowReactive",2],{"post-python-with-context-manager":3,"sidebar-posts":248,"post-related-source":9170},{"id":4,"title":5,"body":6,"category":234,"cover":235,"description":12,"extension":236,"meta":237,"navigation":87,"path":238,"pinned":239,"publishedAt":240,"seo":241,"slug":242,"stem":243,"summary":244,"tags":245,"updatedAt":240,"visible":87,"__hash__":247},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":8,"toc":224},"minimark",[9,13,17,20,23,30,38,41,59,62,65,140,143,151,154,157,172,175,189,192,211,214,217,220],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,31,32,33,37],{},"进入 ",[34,35,36],"code",{},"with"," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,39,40],{"id":40},"核心概念",[42,43,44,50,56],"ul",{},[45,46,47,49],"li",{},[34,48,36],{}," 把资源获取和释放配成一个清晰边界。",[45,51,52,55],{},[34,53,54],{},"as file"," 得到的是上下文返回的资源对象。",[45,57,58],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,60,61],{"id":61},"跟着示例运行",[10,63,64],{},"把下面代码保存到本课脚本并运行：",[66,67,72],"pre",{"className":68,"code":69,"language":70,"meta":71,"style":71},"language-python shiki shiki-themes github-dark","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","python","",[34,73,74,82,89,95,100,106,112,117,123,129,134],{"__ignoreMap":71},[75,76,79],"span",{"class":77,"line":78},"line",1,[75,80,81],{},"from pathlib import Path\n",[75,83,85],{"class":77,"line":84},2,[75,86,88],{"emptyLinePlaceholder":87},true,"\n",[75,90,92],{"class":77,"line":91},3,[75,93,94],{},"file_path = Path(\"notes.txt\")\n",[75,96,98],{"class":77,"line":97},4,[75,99,88],{"emptyLinePlaceholder":87},[75,101,103],{"class":77,"line":102},5,[75,104,105],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[75,107,109],{"class":77,"line":108},6,[75,110,111],{},"    file.write(\"上下文管理器\\n\")\n",[75,113,115],{"class":77,"line":114},7,[75,116,88],{"emptyLinePlaceholder":87},[75,118,120],{"class":77,"line":119},8,[75,121,122],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[75,124,126],{"class":77,"line":125},9,[75,127,128],{},"    print(file.read())\n",[75,130,132],{"class":77,"line":131},10,[75,133,88],{"emptyLinePlaceholder":87},[75,135,137],{"class":77,"line":136},11,[75,138,139],{},"print(file.closed)\n",[10,141,142],{},"预期结果：",[66,144,149],{"className":145,"code":147,"language":148,"meta":71},[146],"language-text","上下文管理器\n\nTrue\n","text",[34,150,147],{"__ignoreMap":71},[10,152,153],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,155,156],{"id":156},"按执行顺序拆开看",[158,159,160,169],"ol",{},[45,161,32,162,164,165,168],{},[34,163,36],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,166,167],{},"file","。",[45,170,171],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,173,174],{"id":174},"初学者容易混淆的地方",[42,176,177,183],{},[45,178,179,180,182],{},"在 ",[34,181,36],{}," 代码块外继续读写已经关闭的文件对象。",[45,184,185,186,188],{},"误以为 ",[34,187,36],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,190,191],{"id":191},"练习",[158,193,194,203],{},[45,195,196,197,200,201,168],{},"把第 30 篇的手动 ",[34,198,199],{},"open\u002Fclose"," 改写为 ",[34,202,36],{},[45,204,179,205,207,208,168],{},[34,206,36],{}," 块后检查 ",[34,209,210],{},"file.closed",[10,212,213],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,215,216],{"id":216},"本篇边界",[10,218,219],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,222,223],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":71,"searchDepth":84,"depth":84,"links":225},[226,227,228,229,230,231,232,233],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",false,"2026-08-17",{"title":5,"description":12},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[234,36,246],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",[249,1062,1399,1533,1685,1864,2052,2217,2401,2582,2775,3006,3190,3367,3524,3695,3860,4074,4302,4484,4648,4836,5024,5179,5339,5536,5733,5946,6113,6357,6538,6742,6935,7119,7320,7610,7765,7994,8189,8409,8649,8853],{"id":250,"title":251,"body":252,"category":234,"cover":235,"description":71,"extension":236,"meta":1051,"navigation":87,"path":1052,"pinned":239,"publishedAt":1053,"seo":1054,"slug":1055,"stem":1056,"summary":1057,"tags":1058,"updatedAt":1053,"visible":87,"__hash__":1061},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":253,"toc":1027},[254,257,260,263,270,273,276,315,331,335,340,351,356,362,379,385,390,396,400,446,449,455,461,464,495,540,557,571,581,585,596,612,615,621,626,629,647,657,678,682,686,689,701,708,712,727,734,738,741,762,768,772,775,779,782,802,805,809,812,846,849,868,871,892,897,901,904,924,927,930,934,941,955,958,962,965,975,986,990,993,1008,1024],[14,255,256],{"id":256},"引言",[10,258,259],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,261,262],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,264,265,266,269],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,267,268],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,271,272],{"id":272},"扫盲",[10,274,275],{},"那么这里有几个概念：",[277,278,279,282],"blockquote",{},[10,280,281],{},"为什么需要安装python解释器？",[277,283,284,295,298,306,309],{},[10,285,286,287,290,291,294],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,288,289],{},"0","和",[34,292,293],{},"1","组成的机器指令。",[10,296,297],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,299,300,301,305],{},"这样，我们就能用",[302,303,304],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,307,308],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,310,311],{},[26,312],{"alt":313,"src":314},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[277,316,317,320],{},[10,318,319],{},"pip又是什么？",[277,321,322,325],{},[10,323,324],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,326,327],{},[26,328],{"alt":329,"src":330},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,332,334],{"id":333},"windows-安装","Windows 安装",[336,337,339],"h3",{"id":338},"_1-下载官方安装程序","1. 下载官方安装程序",[10,341,342,343,350],{},"打开 ",[344,345,349],"a",{"href":346,"rel":347},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[348],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[277,352,353],{},[10,354,355],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,357,358],{},[26,359],{"alt":360,"src":361},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,363,364,370,376],{},[45,365,366,367,168],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[302,368,369],{},"Windows installer (64-bit)",[45,371,372,373,168],{},"搭载 ARM 处理器的 Windows 设备选择 ",[302,374,375],{},"Windows installer (ARM64)",[45,377,378],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,380,381],{},[26,382],{"alt":383,"src":384},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[277,386,387],{},[10,388,389],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,391,392],{},[26,393],{"alt":394,"src":395},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[336,397,399],{"id":398},"_2-安装并加入-path","2. 安装并加入 PATH",[277,401,402,407,414,439],{},[277,403,404],{},[10,405,406],{},"PATH 环境变量",[10,408,409,410,413],{},"Windows 有一个特殊的变量叫 ",[302,411,412],{},"PATH","，它里面存了一串文件夹路径，比如：",[66,415,417],{"className":68,"code":416,"language":70,"meta":71,"style":71},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,418,419,424,429,434],{"__ignoreMap":71},[75,420,421],{"class":77,"line":78},[75,422,423],{},"D:\\Python313\\\n",[75,425,426],{"class":77,"line":84},[75,427,428],{},"D:\\Python313\\Scripts\\\n",[75,430,431],{"class":77,"line":91},[75,432,433],{},"C:\\Windows\\System32\\\n",[75,435,436],{"class":77,"line":97},[75,437,438],{},"...\n",[10,440,441,442,445],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[302,443,444],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,447,448],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,450,451,452,454],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,453,70],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,456,457],{},[26,458],{"alt":459,"src":460},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,462,463],{},"对安装界面最底部的两个勾选项分别解释 :",[277,465,466,469,474],{},[10,467,468],{},"Add python.exe to PATH",[10,470,471],{},[302,472,473],{},"把 Python 添加到系统环境变量",[277,475,476,482,488],{},[10,477,478,479,481],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,480,70],{}," 就能运行",[10,483,484,485,487],{},"不勾选的话，命令行输入 ",[34,486,70],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,489,490,491,494],{},"必须",[302,492,493],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[277,496,497,500,505],{},[10,498,499],{},"Use admin privileges when installing py.exe",[10,501,502],{},[302,503,504],{},"使用管理员权限安装 py.exe（Python 启动器）",[277,506,507,517,531,534],{},[10,508,509,512,513,516],{},[34,510,511],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,514,515],{},"py"," 来启动 Python。",[10,518,519,520,522,523,526,527,530],{},"勾选后，",[34,521,511],{}," 会安装到",[302,524,525],{},"系统级目录","，电脑上",[302,528,529],{},"所有用户账户","都能用",[10,532,533],{},"不勾选，只有当前用户能用",[10,535,536,539],{},[302,537,538],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[277,541,542,545],{},[10,543,544],{},"操作建议",[277,546,547,554],{},[10,548,549,550,553],{},"两个都勾上之后，再点 ",[302,551,552],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,555,556],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[277,558,559,565],{},[10,560,561,562],{},"Python 安装的",[302,563,564],{},"可选功能页",[10,566,567],{},[26,568],{"alt":569,"src":570},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[277,572,573,576],{},[10,574,575],{},"高级选项页",[10,577,578],{},[26,579],{"alt":569,"src":580},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[336,582,584],{"id":583},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,586,587,588,591,592,595],{},"按 ",[34,589,590],{},"Win + R","，输入 ",[34,593,594],{},"cmd"," 并回车，然后执行：",[66,597,601],{"className":598,"code":599,"language":600,"meta":71,"style":71},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,602,603],{"__ignoreMap":71},[75,604,605,608],{"class":77,"line":78},[75,606,70],{"class":607},"svObZ",[75,609,611],{"class":610},"sDLfK"," --version\n",[10,613,614],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[66,616,619],{"className":617,"code":618,"language":148,"meta":71},[146],"Python 3.x.x\n",[34,620,618],{"__ignoreMap":71},[10,622,623],{},[26,624],{"alt":569,"src":625},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,627,628],{},"继续检查 pip：",[66,630,632],{"className":598,"code":631,"language":600,"meta":71,"style":71},"python -m pip --version\n",[34,633,634],{"__ignoreMap":71},[75,635,636,638,641,645],{"class":77,"line":78},[75,637,70],{"class":607},[75,639,640],{"class":610}," -m",[75,642,644],{"class":643},"sU2Wk"," pip",[75,646,611],{"class":610},[10,648,649,650,652,653,656],{},"如果 ",[34,651,70],{}," 无法识别，但 ",[34,654,655],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[66,658,660],{"className":598,"code":659,"language":600,"meta":71,"style":71},"py --version\npy -m pip --version\n",[34,661,662,668],{"__ignoreMap":71},[75,663,664,666],{"class":77,"line":78},[75,665,515],{"class":607},[75,667,611],{"class":610},[75,669,670,672,674,676],{"class":77,"line":84},[75,671,515],{"class":607},[75,673,640],{"class":610},[75,675,644],{"class":643},[75,677,611],{"class":610},[14,679,681],{"id":680},"macos-安装","macOS 安装",[336,683,685],{"id":684},"_1-先检查现有环境","1. 先检查现有环境",[10,687,688],{},"打开“终端”应用，执行：",[66,690,692],{"className":598,"code":691,"language":600,"meta":71,"style":71},"python3 --version\n",[34,693,694],{"__ignoreMap":71},[75,695,696,699],{"class":77,"line":78},[75,697,698],{"class":607},"python3",[75,700,611],{"class":610},[10,702,703,704,707],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,705,706],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[336,709,711],{"id":710},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,713,342,714,719,720,168,723,726],{},[344,715,718],{"href":716,"rel":717},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[348],"Python macOS 下载页","，下载当前稳定版的 ",[302,721,722],{},"macOS 64-bit universal2 installer",[34,724,725],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,728,729,730,733],{},"下载完成后打开 ",[34,731,732],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[336,735,737],{"id":736},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,739,740],{},"安装完成后重新打开终端，执行：",[66,742,744],{"className":598,"code":743,"language":600,"meta":71,"style":71},"python3 --version\npython3 -m pip --version\n",[34,745,746,752],{"__ignoreMap":71},[75,747,748,750],{"class":77,"line":78},[75,749,698],{"class":607},[75,751,611],{"class":610},[75,753,754,756,758,760],{"class":77,"line":84},[75,755,698],{"class":607},[75,757,640],{"class":610},[75,759,644],{"class":643},[75,761,611],{"class":610},[10,763,764,765,767],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,766,698],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,769,771],{"id":770},"linux-安装","Linux 安装",[10,773,774],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[336,776,778],{"id":777},"_1-检查是否已经安装","1. 检查是否已经安装",[10,780,781],{},"打开终端，执行：",[66,783,784],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,785,786,792],{"__ignoreMap":71},[75,787,788,790],{"class":77,"line":78},[75,789,698],{"class":607},[75,791,611],{"class":610},[75,793,794,796,798,800],{"class":77,"line":84},[75,795,698],{"class":607},[75,797,640],{"class":610},[75,799,644],{"class":643},[75,801,611],{"class":610},[10,803,804],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[336,806,808],{"id":807},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,810,811],{},"Ubuntu 或 Debian：",[66,813,815],{"className":598,"code":814,"language":600,"meta":71,"style":71},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,816,817,828],{"__ignoreMap":71},[75,818,819,822,825],{"class":77,"line":78},[75,820,821],{"class":607},"sudo",[75,823,824],{"class":643}," apt",[75,826,827],{"class":643}," update\n",[75,829,830,832,834,837,840,843],{"class":77,"line":84},[75,831,821],{"class":607},[75,833,824],{"class":643},[75,835,836],{"class":643}," install",[75,838,839],{"class":643}," python3",[75,841,842],{"class":643}," python3-pip",[75,844,845],{"class":643}," python3-venv\n",[10,847,848],{},"Fedora：",[66,850,852],{"className":598,"code":851,"language":600,"meta":71,"style":71},"sudo dnf install python3 python3-pip\n",[34,853,854],{"__ignoreMap":71},[75,855,856,858,861,863,865],{"class":77,"line":78},[75,857,821],{"class":607},[75,859,860],{"class":643}," dnf",[75,862,836],{"class":643},[75,864,839],{"class":643},[75,866,867],{"class":643}," python3-pip\n",[10,869,870],{},"Arch Linux：",[66,872,874],{"className":598,"code":873,"language":600,"meta":71,"style":71},"sudo pacman -S python python-pip\n",[34,875,876],{"__ignoreMap":71},[75,877,878,880,883,886,889],{"class":77,"line":78},[75,879,821],{"class":607},[75,881,882],{"class":643}," pacman",[75,884,885],{"class":610}," -S",[75,887,888],{"class":643}," python",[75,890,891],{"class":643}," python-pip\n",[10,893,894,896],{},[34,895,821],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[336,898,900],{"id":899},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,902,903],{},"安装结束后执行：",[66,905,906],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,907,908,914],{"__ignoreMap":71},[75,909,910,912],{"class":77,"line":78},[75,911,698],{"class":607},[75,913,611],{"class":610},[75,915,916,918,920,922],{"class":77,"line":84},[75,917,698],{"class":607},[75,919,640],{"class":610},[75,921,644],{"class":643},[75,923,611],{"class":610},[10,925,926],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,928,929],{"id":929},"常见问题",[336,931,933],{"id":932},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,935,936,937,940],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,938,939],{},"python --version","。如果仍然失败，按下面的顺序检查：",[158,942,943,949,952],{},[45,944,945,946,948],{},"执行 ",[34,947,655],{},"，确认 Python Launcher 是否可用。",[45,950,951],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,953,954],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,956,957],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[336,959,961],{"id":960},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,963,964],{},"先尝试：",[66,966,967],{"className":598,"code":691,"language":600,"meta":71,"style":71},[34,968,969],{"__ignoreMap":71},[75,970,971,973],{"class":77,"line":78},[75,972,698],{"class":607},[75,974,611],{"class":610},[10,976,977,978,980,981,983,984,168],{},"在这两个系统中，只有 ",[34,979,698],{}," 命令而没有 ",[34,982,70],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,985,698],{},[336,987,989],{"id":988},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,991,992],{},"先使用模块方式检查：",[66,994,996],{"className":598,"code":995,"language":600,"meta":71,"style":71},"python3 -m pip --version\n",[34,997,998],{"__ignoreMap":71},[75,999,1000,1002,1004,1006],{"class":77,"line":78},[75,1001,698],{"class":607},[75,1003,640],{"class":610},[75,1005,644],{"class":643},[75,1007,611],{"class":610},[10,1009,1010,1011,1013,1014,1016,1017,1019,1020,1023],{},"Windows 用户将命令中的 ",[34,1012,698],{}," 换成 ",[34,1015,70],{}," 或 ",[34,1018,515],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,1021,1022],{},"python3-pip","；不要直接使用其他系统的安装命令。",[221,1025,1026],{},"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":71,"searchDepth":84,"depth":84,"links":1028},[1029,1030,1031,1036,1041,1046],{"id":256,"depth":84,"text":256},{"id":272,"depth":84,"text":272},{"id":333,"depth":84,"text":334,"children":1032},[1033,1034,1035],{"id":338,"depth":91,"text":339},{"id":398,"depth":91,"text":399},{"id":583,"depth":91,"text":584},{"id":680,"depth":84,"text":681,"children":1037},[1038,1039,1040],{"id":684,"depth":91,"text":685},{"id":710,"depth":91,"text":711},{"id":736,"depth":91,"text":737},{"id":770,"depth":84,"text":771,"children":1042},[1043,1044,1045],{"id":777,"depth":91,"text":778},{"id":807,"depth":91,"text":808},{"id":899,"depth":91,"text":900},{"id":929,"depth":84,"text":929,"children":1047},[1048,1049,1050],{"id":932,"depth":91,"text":933},{"id":960,"depth":91,"text":961},{"id":988,"depth":91,"text":989},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":251,"description":71},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[234,1059,1060],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1063,"title":1064,"body":1065,"category":234,"cover":1072,"description":71,"extension":236,"meta":1388,"navigation":87,"path":1389,"pinned":239,"publishedAt":1390,"seo":1391,"slug":1392,"stem":1393,"summary":1394,"tags":1395,"updatedAt":1390,"visible":87,"__hash__":1398},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1066,"toc":1373},[1067,1073,1076,1079,1083,1086,1110,1113,1119,1122,1125,1159,1169,1173,1180,1183,1208,1211,1223,1226,1230,1233,1236,1239,1242,1245,1248,1251,1275,1278,1281,1287,1290,1293,1296,1300,1306,1309,1335,1338,1342,1345,1348,1352,1355,1358,1361,1364,1367,1370],[10,1068,1069],{},[26,1070],{"alt":1071,"src":1072},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1074,1075],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1077,1078],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1080,1082],{"id":1081},"python-代码是什么样的","Python 代码是什么样的",[10,1084,1085],{},"下面是一段简单的 Python 代码：",[66,1087,1089],{"className":68,"code":1088,"language":70,"meta":71,"style":71},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1090,1091,1096,1101,1105],{"__ignoreMap":71},[75,1092,1093],{"class":77,"line":78},[75,1094,1095],{},"name = \"Python\"\n",[75,1097,1098],{"class":77,"line":84},[75,1099,1100],{},"year = 2026\n",[75,1102,1103],{"class":77,"line":91},[75,1104,88],{"emptyLinePlaceholder":87},[75,1106,1107],{"class":77,"line":97},[75,1108,1109],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1111,1112],{},"运行结果：",[66,1114,1117],{"className":1115,"code":1116,"language":148,"meta":71},[146],"正在学习 Python，当前年份是 2026\n",[34,1118,1116],{"__ignoreMap":71},[10,1120,1121],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1123,1124],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[66,1126,1128],{"className":68,"code":1127,"language":70,"meta":71,"style":71},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1129,1130,1135,1139,1144,1149,1154],{"__ignoreMap":71},[75,1131,1132],{"class":77,"line":78},[75,1133,1134],{},"score = 85\n",[75,1136,1137],{"class":77,"line":84},[75,1138,88],{"emptyLinePlaceholder":87},[75,1140,1141],{"class":77,"line":91},[75,1142,1143],{},"if score >= 60:\n",[75,1145,1146],{"class":77,"line":97},[75,1147,1148],{},"    print(\"成绩合格\")\n",[75,1150,1151],{"class":77,"line":102},[75,1152,1153],{},"else:\n",[75,1155,1156],{"class":77,"line":108},[75,1157,1158],{},"    print(\"需要继续学习\")\n",[10,1160,1161,1164,1165,1168],{},[34,1162,1163],{},"if"," 和 ",[34,1166,1167],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1170,1172],{"id":1171},"python-如何运行代码","Python 如何运行代码",[10,1174,1175,1176,1179],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1177,1178],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1181,1182],{},"交互式环境适合快速验证一个表达式：",[66,1184,1186],{"className":68,"code":1185,"language":70,"meta":71,"style":71},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1187,1188,1193,1198,1203],{"__ignoreMap":71},[75,1189,1190],{"class":77,"line":78},[75,1191,1192],{},">>> 10 + 20\n",[75,1194,1195],{"class":77,"line":84},[75,1196,1197],{},"30\n",[75,1199,1200],{"class":77,"line":91},[75,1201,1202],{},">>> \"Python\".lower()\n",[75,1204,1205],{"class":77,"line":97},[75,1206,1207],{},"'python'\n",[10,1209,1210],{},"需要保存和重复运行的程序，则可以写入文件：",[66,1212,1214],{"className":598,"code":1213,"language":600,"meta":71,"style":71},"python3 hello.py\n",[34,1215,1216],{"__ignoreMap":71},[75,1217,1218,1220],{"class":77,"line":78},[75,1219,698],{"class":607},[75,1221,1222],{"class":643}," hello.py\n",[10,1224,1225],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1227,1229],{"id":1228},"python-的特点","Python 的特点",[336,1231,1232],{"id":1232},"语法相对简洁",[10,1234,1235],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[336,1237,1238],{"id":1238},"支持多种编程方式",[10,1240,1241],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[336,1243,1244],{"id":1244},"标准库比较完整",[10,1246,1247],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1249,1250],{},"例如，获取当前时间：",[66,1252,1254],{"className":68,"code":1253,"language":70,"meta":71,"style":71},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1255,1256,1261,1265,1270],{"__ignoreMap":71},[75,1257,1258],{"class":77,"line":78},[75,1259,1260],{},"from datetime import datetime\n",[75,1262,1263],{"class":77,"line":84},[75,1264,88],{"emptyLinePlaceholder":87},[75,1266,1267],{"class":77,"line":91},[75,1268,1269],{},"now = datetime.now()\n",[75,1271,1272],{"class":77,"line":97},[75,1273,1274],{},"print(now)\n",[10,1276,1277],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[336,1279,1280],{"id":1280},"第三方工具丰富",[10,1282,1283,1284,1286],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1285,268],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1288,1289],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[336,1291,1292],{"id":1292},"支持多个操作系统",[10,1294,1295],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1297,1299],{"id":1298},"python-可以做什么","Python 可以做什么",[10,1301,1302],{},[26,1303],{"alt":1304,"src":1305},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1307,1308],{},"Python 的应用范围比较广，常见方向包括：",[42,1310,1311,1314,1317,1320,1323,1326,1329,1332],{},[45,1312,1313],{},"编写自动化脚本，批量处理文件和重复任务；",[45,1315,1316],{},"开发网站后端和 API 服务；",[45,1318,1319],{},"进行数据清洗、统计分析和图表展示；",[45,1321,1322],{},"编写网络爬虫和信息采集工具；",[45,1324,1325],{},"开发自动化测试程序；",[45,1327,1328],{},"进行机器学习和人工智能开发；",[45,1330,1331],{},"编写运维、监控和辅助开发工具；",[45,1333,1334],{},"开发部分桌面应用和插件。",[10,1336,1337],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1339,1341],{"id":1340},"python-的发展","Python 的发展",[10,1343,1344],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1346,1347],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1349,1351],{"id":1350},"python-也有局限","Python 也有局限",[10,1353,1354],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1356,1357],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1359,1360],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1362,1363],{"id":1363},"写在最后",[10,1365,1366],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1368,1369],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[221,1371,1372],{},"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":71,"searchDepth":84,"depth":84,"links":1374},[1375,1376,1377,1384,1385,1386,1387],{"id":1081,"depth":84,"text":1082},{"id":1171,"depth":84,"text":1172},{"id":1228,"depth":84,"text":1229,"children":1378},[1379,1380,1381,1382,1383],{"id":1232,"depth":91,"text":1232},{"id":1238,"depth":91,"text":1238},{"id":1244,"depth":91,"text":1244},{"id":1280,"depth":91,"text":1280},{"id":1292,"depth":91,"text":1292},{"id":1298,"depth":84,"text":1299},{"id":1340,"depth":84,"text":1341},{"id":1350,"depth":84,"text":1351},{"id":1363,"depth":84,"text":1363},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1064,"description":71},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[234,1396,1397],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1400,"title":1401,"body":1402,"category":234,"cover":235,"description":1406,"extension":236,"meta":1524,"navigation":87,"path":1525,"pinned":239,"publishedAt":240,"seo":1526,"slug":1527,"stem":1528,"summary":1529,"tags":1530,"updatedAt":240,"visible":87,"__hash__":1532},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1403,"toc":1514},[1404,1407,1409,1412,1414,1420,1425,1427,1441,1443,1445,1454,1456,1462,1464,1466,1482,1484,1495,1497,1505,1507,1509,1512],[10,1405,1406],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1408,16],{"id":16},[10,1410,1411],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1413,22],{"id":22},[10,1415,1416],{},[26,1417],{"alt":1418,"src":1419},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1421,1422,1424],{},[34,1423,1178],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1426,40],{"id":40},[42,1428,1429,1435,1438],{},[45,1430,1431,1432,1434],{},"源代码是人编写的文本，通常保存在 ",[34,1433,1178],{}," 文件中。",[45,1436,1437],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,1439,1440],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1442,61],{"id":61},[10,1444,64],{},[66,1446,1448],{"className":68,"code":1447,"language":70,"meta":71,"style":71},"print(\"你好，Python\")\n",[34,1449,1450],{"__ignoreMap":71},[75,1451,1452],{"class":77,"line":78},[75,1453,1447],{},[10,1455,142],{},[66,1457,1460],{"className":1458,"code":1459,"language":148,"meta":71},[146],"你好，Python\n",[34,1461,1459],{"__ignoreMap":71},[10,1463,153],{},[14,1465,156],{"id":156},[158,1467,1468,1475],{},[45,1469,1470,1471,1474],{},"终端启动解释器后，解释器读取 ",[34,1472,1473],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,1476,1477,1478,1481],{},"字符串对象先准备好，再交给 ",[34,1479,1480],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1483,174],{"id":174},[42,1485,1486,1489],{},[45,1487,1488],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,1490,1491,1492,1494],{},"认为 ",[34,1493,1178],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1496,191],{"id":191},[158,1498,1499,1502],{},[45,1500,1501],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,1503,1504],{},"把示例文字改成自己的学习目标并重新运行。",[10,1506,213],{},[14,1508,216],{"id":216},[10,1510,1511],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1513,223],{},{"title":71,"searchDepth":84,"depth":84,"links":1515},[1516,1517,1518,1519,1520,1521,1522,1523],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1401,"description":1406},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[234,1396,1531],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1534,"title":1535,"body":1536,"category":234,"cover":235,"description":1540,"extension":236,"meta":1676,"navigation":87,"path":1677,"pinned":239,"publishedAt":240,"seo":1678,"slug":1679,"stem":1680,"summary":1681,"tags":1682,"updatedAt":240,"visible":87,"__hash__":1684},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1537,"toc":1666},[1538,1541,1543,1546,1548,1554,1560,1562,1577,1579,1582,1602,1604,1610,1612,1614,1627,1629,1643,1645,1656,1658,1660,1663],[10,1539,1540],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1542,16],{"id":16},[10,1544,1545],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1547,22],{"id":22},[10,1549,1550],{},[26,1551],{"alt":1552,"src":1553},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1555,1556,1557,1559],{},"终端收到 ",[34,1558,698],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1561,40],{"id":40},[42,1563,1564,1567,1570],{},[45,1565,1566],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,1568,1569],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,1571,1572,1573,1576],{},"检查 pip 时使用 ",[34,1574,1575],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1578,61],{"id":61},[10,1580,1581],{},"在 macOS 终端执行：",[66,1583,1584],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,1585,1586,1592],{"__ignoreMap":71},[75,1587,1588,1590],{"class":77,"line":78},[75,1589,698],{"class":607},[75,1591,611],{"class":610},[75,1593,1594,1596,1598,1600],{"class":77,"line":84},[75,1595,698],{"class":607},[75,1597,640],{"class":610},[75,1599,644],{"class":643},[75,1601,611],{"class":610},[10,1603,142],{},[66,1605,1608],{"className":1606,"code":1607,"language":148,"meta":71},[146],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1609,1607],{"__ignoreMap":71},[10,1611,153],{},[14,1613,156],{"id":156},[158,1615,1616,1622],{},[45,1617,1618,1621],{},[34,1619,1620],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,1623,1624,1626],{},[34,1625,706],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1628,174],{"id":174},[42,1630,1631,1637],{},[45,1632,1633,1634,1636],{},"看到系统已有 ",[34,1635,698],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,1638,1639,1640,1642],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1641,698],{},"，不修改系统自带工具。",[14,1644,191],{"id":191},[158,1646,1647,1653],{},[45,1648,945,1649,1652],{},[34,1650,1651],{},"which python3","，记录当前解释器路径。",[45,1654,1655],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1657,213],{},[14,1659,216],{"id":216},[10,1661,1662],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1664,1665],{},"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":71,"searchDepth":84,"depth":84,"links":1667},[1668,1669,1670,1671,1672,1673,1674,1675],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1535,"description":1540},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[234,1683,1059],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1686,"title":1687,"body":1688,"category":234,"cover":235,"description":1853,"extension":236,"meta":1854,"navigation":87,"path":1855,"pinned":239,"publishedAt":240,"seo":1856,"slug":1857,"stem":1858,"summary":1859,"tags":1860,"updatedAt":240,"visible":87,"__hash__":1863},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1689,"toc":1843},[1690,1696,1698,1701,1703,1709,1712,1714,1738,1740,1742,1769,1771,1777,1779,1781,1799,1801,1815,1817,1831,1833,1835,1841],[10,1691,1692,1693,1695],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1694,1178],{}," 脚本。",[14,1697,16],{"id":16},[10,1699,1700],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1702,22],{"id":22},[10,1704,1705],{},[26,1706],{"alt":1707,"src":1708},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1710,1711],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1713,40],{"id":40},[42,1715,1716,1725,1732],{},[45,1717,1718,1719,1721,1722,168],{},"在终端输入 ",[34,1720,698],{}," 进入 REPL，提示符通常是 ",[34,1723,1724],{},">>>",[45,1726,1727,1728,1731],{},"输入 ",[34,1729,1730],{},"exit()"," 或按 Control-D 退出 REPL。",[45,1733,1734,1735,1737],{},"需要保存、复查或多次运行的代码应写入 ",[34,1736,1178],{}," 文件。",[14,1739,61],{"id":61},[10,1741,64],{},[66,1743,1747],{"className":1744,"code":1745,"language":1746,"meta":71,"style":71},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1748,1749,1754,1759,1764],{"__ignoreMap":71},[75,1750,1751],{"class":77,"line":78},[75,1752,1753],{},">>> 2 + 3\n",[75,1755,1756],{"class":77,"line":84},[75,1757,1758],{},"5\n",[75,1760,1761],{"class":77,"line":91},[75,1762,1763],{},">>> \"python\".upper()\n",[75,1765,1766],{"class":77,"line":97},[75,1767,1768],{},"'PYTHON'\n",[10,1770,142],{},[66,1772,1775],{"className":1773,"code":1774,"language":148,"meta":71},[146],"REPL 会直接显示表达式结果\n",[34,1776,1774],{"__ignoreMap":71},[10,1778,153],{},[14,1780,156],{"id":156},[158,1782,1783,1793],{},[45,1784,1785,1786,1789,1790,168],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1787,1788],{},"2 + 3"," 能直接看到 ",[34,1791,1792],{},"5",[45,1794,1795,1796,1798],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1797,1480],{}," 才会写到标准输出。",[14,1800,174],{"id":174},[42,1802,1803,1812],{},[45,1804,1805,1806,1808,1809,1811],{},"把提示符 ",[34,1807,1724],{}," 复制进 ",[34,1810,1178],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,1813,1814],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1816,191],{"id":191},[158,1818,1819,1825],{},[45,1820,1821,1822,168],{},"在 REPL 计算 ",[34,1823,1824],{},"12 * 8",[45,1826,1827,1828,1830],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1829,1480],{}," 时是否显示结果。",[10,1832,213],{},[14,1834,216],{"id":216},[10,1836,1837,1838,1840],{},"本篇目标是根据任务选择 REPL 或 ",[34,1839,1178],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,1842,223],{},{"title":71,"searchDepth":84,"depth":84,"links":1844},[1845,1846,1847,1848,1849,1850,1851,1852],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1687,"description":1853},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[234,1861,1862],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1865,"title":1866,"body":1867,"category":234,"cover":235,"description":1871,"extension":236,"meta":2042,"navigation":87,"path":2043,"pinned":239,"publishedAt":240,"seo":2044,"slug":2045,"stem":2046,"summary":2047,"tags":2048,"updatedAt":240,"visible":87,"__hash__":2051},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1868,"toc":2032},[1869,1872,1874,1877,1879,1885,1891,1893,1911,1913,1915,1960,1962,1968,1970,1972,1994,1996,2008,2010,2022,2024,2026,2029],[10,1870,1871],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1873,16],{"id":16},[10,1875,1876],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1878,22],{"id":22},[10,1880,1881],{},[26,1882],{"alt":1883,"src":1884},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1886,1887,1890],{},[34,1888,1889],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1892,40],{"id":40},[42,1894,1895,1898,1908],{},[45,1896,1897],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,1899,1900,1903,1904,1907],{},[34,1901,1902],{},"pwd"," 显示当前目录，",[34,1905,1906],{},"ls"," 显示目录里的文件。",[45,1909,1910],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1912,61],{"id":61},[10,1914,1581],{},[66,1916,1918],{"className":598,"code":1917,"language":600,"meta":71,"style":71},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1919,1920,1928,1935,1940,1954],{"__ignoreMap":71},[75,1921,1922,1925],{"class":77,"line":78},[75,1923,1924],{"class":607},"mkdir",[75,1926,1927],{"class":643}," python-study\n",[75,1929,1930,1933],{"class":77,"line":84},[75,1931,1932],{"class":610},"cd",[75,1934,1927],{"class":643},[75,1936,1937],{"class":77,"line":91},[75,1938,1939],{"class":610},"pwd\n",[75,1941,1942,1945,1948,1952],{"class":77,"line":97},[75,1943,1944],{"class":610},"printf",[75,1946,1947],{"class":643}," 'print(\"项目已经运行\")\\n'",[75,1949,1951],{"class":1950},"snl16"," >",[75,1953,1222],{"class":643},[75,1955,1956,1958],{"class":77,"line":102},[75,1957,698],{"class":607},[75,1959,1222],{"class":643},[10,1961,142],{},[66,1963,1966],{"className":1964,"code":1965,"language":148,"meta":71},[146],"项目已经运行\n",[34,1967,1965],{"__ignoreMap":71},[10,1969,153],{},[14,1971,156],{"id":156},[158,1973,1974,1985],{},[45,1975,1976,1978,1979,1981,1982,1984],{},[34,1977,1924],{}," 创建目录，",[34,1980,1932],{}," 改变终端当前目录，",[34,1983,1902],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,1986,1987,1989,1990,1993],{},[34,1988,1889],{}," 会在当前目录寻找 ",[34,1991,1992],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1995,174],{"id":174},[42,1997,1998,2005],{},[45,1999,2000,2001,1164,2003,168],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,2002,1902],{},[34,2004,1906],{},[45,2006,2007],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2009,191],{"id":191},[158,2011,2012,2019],{},[45,2013,2014,2015,2018],{},"新建 ",[34,2016,2017],{},"lesson01.py"," 并输出课程编号。",[45,2020,2021],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2023,213],{},[14,2025,216],{"id":216},[10,2027,2028],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2030,2031],{},"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":71,"searchDepth":84,"depth":84,"links":2033},[2034,2035,2036,2037,2038,2039,2040,2041],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1866,"description":1871},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[234,2049,2050],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2053,"title":2054,"body":2055,"category":234,"cover":235,"description":2059,"extension":236,"meta":2207,"navigation":87,"path":2208,"pinned":239,"publishedAt":240,"seo":2209,"slug":2210,"stem":2211,"summary":2212,"tags":2213,"updatedAt":240,"visible":87,"__hash__":2216},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2056,"toc":2197},[2057,2060,2062,2065,2067,2073,2084,2086,2106,2108,2110,2130,2132,2138,2140,2142,2161,2163,2171,2173,2188,2190,2192,2195],[10,2058,2059],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2061,16],{"id":16},[10,2063,2064],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2066,22],{"id":22},[10,2068,2069],{},[26,2070],{"alt":2071,"src":2072},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2074,2075,2076,168,2078,2081,2082,168],{},"Python 先计算表达式，再把得到的对象交给 ",[34,2077,1480],{},[34,2079,2080],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,2083,1788],{},[14,2085,40],{"id":40},[42,2087,2088,2094,2103],{},[45,2089,2090,2093],{},[34,2091,2092],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,2095,2096,2099,2100,168],{},[34,2097,2098],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,2101,2102],{},"12",[45,2104,2105],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2107,61],{"id":61},[10,2109,64],{},[66,2111,2113],{"className":68,"code":2112,"language":70,"meta":71,"style":71},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[34,2114,2115,2120,2125],{"__ignoreMap":71},[75,2116,2117],{"class":77,"line":78},[75,2118,2119],{},"print(42)\n",[75,2121,2122],{"class":77,"line":84},[75,2123,2124],{},"print(7 + 5)\n",[75,2126,2127],{"class":77,"line":91},[75,2128,2129],{},"print(\"Python 基础课\")\n",[10,2131,142],{},[66,2133,2136],{"className":2134,"code":2135,"language":148,"meta":71},[146],"42\n12\nPython 基础课\n",[34,2137,2135],{"__ignoreMap":71},[10,2139,153],{},[14,2141,156],{"id":156},[158,2143,2144,2152],{},[45,2145,2146,2149,2150,168],{},[34,2147,2148],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,2151,2102],{},[45,2153,2154,2156,2157,2160],{},[34,2155,1480],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,2158,2159],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2162,174],{"id":174},[42,2164,2165,2168],{},[45,2166,2167],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,2169,2170],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2172,191],{"id":191},[158,2174,2175,2178],{},[45,2176,2177],{},"分别输出一个整数、一个小数和一段文本。",[45,2179,2180,2181,2183,2184,2187],{},"比较 ",[34,2182,2080],{}," 与 ",[34,2185,2186],{},"print(\"2 + 3\")"," 的结果。",[10,2189,213],{},[14,2191,216],{"id":216},[10,2193,2194],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2196,223],{},{"title":71,"searchDepth":84,"depth":84,"links":2198},[2199,2200,2201,2202,2203,2204,2205,2206],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2054,"description":2059},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[234,2214,2215],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2218,"title":2219,"body":2220,"category":234,"cover":235,"description":2224,"extension":236,"meta":2391,"navigation":87,"path":2392,"pinned":239,"publishedAt":240,"seo":2393,"slug":2394,"stem":2395,"summary":2396,"tags":2397,"updatedAt":240,"visible":87,"__hash__":2400},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2221,"toc":2381},[2222,2225,2227,2230,2232,2238,2241,2243,2269,2271,2273,2301,2303,2309,2311,2313,2337,2339,2355,2357,2372,2374,2376,2379],[10,2223,2224],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2226,16],{"id":16},[10,2228,2229],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2231,22],{"id":22},[10,2233,2234],{},[26,2235],{"alt":2236,"src":2237},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2239,2240],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2242,40],{"id":40},[42,2244,2245,2248,2258],{},[45,2246,2247],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,2249,2250,2251,2183,2254,2257],{},"变量名区分大小写，",[34,2252,2253],{},"score",[34,2255,2256],{},"Score"," 是两个名字。",[45,2259,2260,2261,2264,2265,2268],{},"使用能表达含义的名称；不要用 ",[34,2262,2263],{},"list","、",[34,2266,2267],{},"str"," 等内置名称作为普通变量名。",[14,2270,61],{"id":61},[10,2272,64],{},[66,2274,2276],{"className":68,"code":2275,"language":70,"meta":71,"style":71},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2277,2278,2283,2288,2292,2297],{"__ignoreMap":71},[75,2279,2280],{"class":77,"line":78},[75,2281,2282],{},"score = 90\n",[75,2284,2285],{"class":77,"line":84},[75,2286,2287],{},"print(score)\n",[75,2289,2290],{"class":77,"line":91},[75,2291,88],{"emptyLinePlaceholder":87},[75,2293,2294],{"class":77,"line":97},[75,2295,2296],{},"score = 95\n",[75,2298,2299],{"class":77,"line":102},[75,2300,2287],{},[10,2302,142],{},[66,2304,2307],{"className":2305,"code":2306,"language":148,"meta":71},[146],"90\n95\n",[34,2308,2306],{"__ignoreMap":71},[10,2310,153],{},[14,2312,156],{"id":156},[158,2314,2315,2324],{},[45,2316,945,2317,2320,2321,2323],{},[34,2318,2319],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2322,2253],{}," 再绑定到它。",[45,2325,945,2326,2329,2330,2333,2334,168],{},[34,2327,2328],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2331,2332],{},"90"," 没有被改造成 ",[34,2335,2336],{},"95",[14,2338,174],{"id":174},[42,2340,2341,2344],{},[45,2342,2343],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,2345,2346,2347,2264,2349,2264,2351,2354],{},"使用 ",[34,2348,2263],{},[34,2350,2267],{},[34,2352,2353],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2356,191],{"id":191},[158,2358,2359,2369],{},[45,2360,2361,2362,1164,2365,2368],{},"创建 ",[34,2363,2364],{},"course_name",[34,2366,2367],{},"lesson_count"," 两个变量并输出。",[45,2370,2371],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2373,213],{},[14,2375,216],{"id":216},[10,2377,2378],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2380,223],{},{"title":71,"searchDepth":84,"depth":84,"links":2382},[2383,2384,2385,2386,2387,2388,2389,2390],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2219,"description":2224},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[234,2398,2399],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2402,"title":2403,"body":2404,"category":234,"cover":235,"description":2408,"extension":236,"meta":2572,"navigation":87,"path":2573,"pinned":239,"publishedAt":240,"seo":2574,"slug":2575,"stem":2576,"summary":2577,"tags":2578,"updatedAt":240,"visible":87,"__hash__":2581},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2405,"toc":2562},[2406,2409,2411,2414,2416,2422,2425,2427,2456,2458,2460,2504,2506,2512,2514,2516,2530,2532,2543,2545,2553,2555,2557,2560],[10,2407,2408],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2410,16],{"id":16},[10,2412,2413],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2415,22],{"id":22},[10,2417,2418],{},[26,2419],{"alt":2420,"src":2421},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2423,2424],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2426,40],{"id":40},[42,2428,2429,2439,2453],{},[45,2430,2431,2434,2435,2438],{},[34,2432,2433],{},"int"," 表示整数，",[34,2436,2437],{},"float"," 表示浮点数。",[45,2440,2441,2444,2445,2448,2449,2452],{},[34,2442,2443],{},"\u002F"," 总是进行真除法；",[34,2446,2447],{},"\u002F\u002F"," 是向下取整除法，",[34,2450,2451],{},"%"," 得到余数。",[45,2454,2455],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2457,61],{"id":61},[10,2459,64],{},[66,2461,2463],{"className":68,"code":2462,"language":70,"meta":71,"style":71},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2464,2465,2470,2475,2480,2484,2489,2494,2499],{"__ignoreMap":71},[75,2466,2467],{"class":77,"line":78},[75,2468,2469],{},"price = 25\n",[75,2471,2472],{"class":77,"line":84},[75,2473,2474],{},"count = 4\n",[75,2476,2477],{"class":77,"line":91},[75,2478,2479],{},"discount = 0.9\n",[75,2481,2482],{"class":77,"line":97},[75,2483,88],{"emptyLinePlaceholder":87},[75,2485,2486],{"class":77,"line":102},[75,2487,2488],{},"total = price * count * discount\n",[75,2490,2491],{"class":77,"line":108},[75,2492,2493],{},"average = total \u002F count\n",[75,2495,2496],{"class":77,"line":114},[75,2497,2498],{},"print(total)\n",[75,2500,2501],{"class":77,"line":119},[75,2502,2503],{},"print(average)\n",[10,2505,142],{},[66,2507,2510],{"className":2508,"code":2509,"language":148,"meta":71},[146],"90.0\n22.5\n",[34,2511,2509],{"__ignoreMap":71},[10,2513,153],{},[14,2515,156],{"id":156},[158,2517,2518,2524],{},[45,2519,2520,2523],{},[34,2521,2522],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,2525,2526,2529],{},[34,2527,2528],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2531,174],{"id":174},[42,2533,2534,2540],{},[45,2535,2536,2537,168],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2538,2539],{},"decimal.Decimal",[45,2541,2542],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2544,191],{"id":191},[158,2546,2547,2550],{},[45,2548,2549],{},"计算 137 除以 10 的商和余数。",[45,2551,2552],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2554,213],{},[14,2556,216],{"id":216},[10,2558,2559],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2561,223],{},{"title":71,"searchDepth":84,"depth":84,"links":2563},[2564,2565,2566,2567,2568,2569,2570,2571],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2403,"description":2408},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[234,2579,2580],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2583,"title":2584,"body":2585,"category":234,"cover":235,"description":2589,"extension":236,"meta":2765,"navigation":87,"path":2766,"pinned":239,"publishedAt":240,"seo":2767,"slug":2768,"stem":2769,"summary":2770,"tags":2771,"updatedAt":240,"visible":87,"__hash__":2774},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2586,"toc":2753},[2587,2590,2592,2595,2597,2603,2613,2615,2626,2628,2630,2660,2662,2668,2670,2672,2702,2705,2708,2714,2717,2719,2727,2729,2744,2746,2748,2751],[10,2588,2589],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2591,16],{"id":16},[10,2593,2594],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2596,22],{"id":22},[10,2598,2599],{},[26,2600],{"alt":2601,"src":2602},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2604,2605,2606,2609,2610,168],{},"切片 ",[34,2607,2608],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2611,2612],{},"stop - start",[14,2614,40],{"id":40},[42,2616,2617,2620,2623],{},[45,2618,2619],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,2621,2622],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,2624,2625],{},"切片会创建新的字符串，不会修改原字符串。",[14,2627,61],{"id":61},[10,2629,64],{},[66,2631,2633],{"className":68,"code":2632,"language":70,"meta":71,"style":71},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2634,2635,2640,2645,2650,2655],{"__ignoreMap":71},[75,2636,2637],{"class":77,"line":78},[75,2638,2639],{},"language = \"Python\"\n",[75,2641,2642],{"class":77,"line":84},[75,2643,2644],{},"print(language[0])\n",[75,2646,2647],{"class":77,"line":91},[75,2648,2649],{},"print(language[-1])\n",[75,2651,2652],{"class":77,"line":97},[75,2653,2654],{},"print(language[0:3])\n",[75,2656,2657],{"class":77,"line":102},[75,2658,2659],{},"print(language + \" 3.14\")\n",[10,2661,142],{},[66,2663,2666],{"className":2664,"code":2665,"language":148,"meta":71},[146],"P\nn\nPyt\nPython 3.14\n",[34,2667,2665],{"__ignoreMap":71},[10,2669,153],{},[14,2671,156],{"id":156},[158,2673,2674,2688],{},[45,2675,2676,2677,2679,2680,2683,2684,2687],{},"字符串 ",[34,2678,234],{}," 的正索引从 ",[34,2681,2682],{},"P"," 的 0 开始，负索引从末尾 ",[34,2685,2686],{},"n"," 的 -1 开始。",[45,2689,2690,2693,2694,2697,2698,2701],{},[34,2691,2692],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2695,2696],{},"Pyt","；索引 3 的 ",[34,2699,2700],{},"h"," 不在结果中。",[336,2703,2704],{"id":2704},"再看一个具体细节",[10,2706,2707],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2709,2710],{},[26,2711],{"alt":2712,"src":2713},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2715,2716],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2718,174],{"id":174},[42,2720,2721,2724],{},[45,2722,2723],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,2725,2726],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2728,191],{"id":191},[158,2730,2731,2741],{},[45,2732,2733,2734,2737,2738,168],{},"从 ",[34,2735,2736],{},"\"programming\""," 中切出 ",[34,2739,2740],{},"\"gram\"",[45,2742,2743],{},"使用负索引取得字符串倒数第二个字符。",[10,2745,213],{},[14,2747,216],{"id":216},[10,2749,2750],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2752,223],{},{"title":71,"searchDepth":84,"depth":84,"links":2754},[2755,2756,2757,2758,2759,2762,2763,2764],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":2760},[2761],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2584,"description":2589},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[234,2772,2773],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2776,"title":2777,"body":2778,"category":234,"cover":235,"description":2782,"extension":236,"meta":2996,"navigation":87,"path":2997,"pinned":239,"publishedAt":240,"seo":2998,"slug":2999,"stem":3000,"summary":3001,"tags":3002,"updatedAt":240,"visible":87,"__hash__":3005},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2779,"toc":2984},[2780,2783,2785,2788,2790,2796,2806,2808,2841,2843,2845,2889,2891,2897,2899,2901,2922,2924,2927,2933,2941,2943,2957,2959,2975,2977,2979,2982],[10,2781,2782],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2784,16],{"id":16},[10,2786,2787],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2789,22],{"id":22},[10,2791,2792],{},[26,2793],{"alt":2794,"src":2795},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2797,2798,2799,1016,2802,2805],{},"比较表达式先产生 ",[34,2800,2801],{},"True",[34,2803,2804],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2807,40],{"id":40},[42,2809,2810,2824,2838],{},[45,2811,2812,2815,2816,2819,2820,2823],{},[34,2813,2814],{},"=="," 判断是否相等，",[34,2817,2818],{},"!="," 判断是否不等；单个 ",[34,2821,2822],{},"="," 是赋值。",[45,2825,2826,2829,2830,2833,2834,2837],{},[34,2827,2828],{},"and"," 要求两侧都为真，",[34,2831,2832],{},"or"," 只需一侧为真，",[34,2835,2836],{},"not"," 取反。",[45,2839,2840],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2842,61],{"id":61},[10,2844,64],{},[66,2846,2848],{"className":68,"code":2847,"language":70,"meta":71,"style":71},"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",[34,2849,2850,2855,2860,2864,2869,2874,2879,2884],{"__ignoreMap":71},[75,2851,2852],{"class":77,"line":78},[75,2853,2854],{},"age = 20\n",[75,2856,2857],{"class":77,"line":84},[75,2858,2859],{},"has_ticket = True\n",[75,2861,2862],{"class":77,"line":91},[75,2863,88],{"emptyLinePlaceholder":87},[75,2865,2866],{"class":77,"line":97},[75,2867,2868],{},"is_adult = age >= 18\n",[75,2870,2871],{"class":77,"line":102},[75,2872,2873],{},"can_enter = is_adult and has_ticket\n",[75,2875,2876],{"class":77,"line":108},[75,2877,2878],{},"print(is_adult)\n",[75,2880,2881],{"class":77,"line":114},[75,2882,2883],{},"print(can_enter)\n",[75,2885,2886],{"class":77,"line":119},[75,2887,2888],{},"print(not has_ticket)\n",[10,2890,142],{},[66,2892,2895],{"className":2893,"code":2894,"language":148,"meta":71},[146],"True\nTrue\nFalse\n",[34,2896,2894],{"__ignoreMap":71},[10,2898,153],{},[14,2900,156],{"id":156},[158,2902,2903,2913],{},[45,2904,2905,2908,2909,2912],{},[34,2906,2907],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2910,2911],{},"is_adult","，这一步没有任何分支跳转。",[45,2914,2915,2918,2919,2921],{},[34,2916,2917],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2920,2836],{}," 只对紧随其后的值取反。",[336,2923,2704],{"id":2704},[10,2925,2926],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2928,2929],{},[26,2930],{"alt":2931,"src":2932},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2934,2935,2937,2938,2940],{},[34,2936,2828],{}," 只有“真、真”得到真；",[34,2939,2832],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2942,174],{"id":174},[42,2944,2945,2954],{},[45,2946,2947,2948,2950,2951,2953],{},"用单个等号判断相等。",[34,2949,2822],{}," 是赋值，",[34,2952,2814],{}," 才是相等比较。",[45,2955,2956],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2958,191],{"id":191},[158,2960,2961,2968],{},[45,2962,2963,2964,2967],{},"判断数字 ",[34,2965,2966],{},"15"," 是否同时大于 10 且小于 20。",[45,2969,2970,2971,2974],{},"分别修改年龄和票据状态，记录 ",[34,2972,2973],{},"can_enter"," 的四种组合结果。",[10,2976,213],{},[14,2978,216],{"id":216},[10,2980,2981],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,2983,223],{},{"title":71,"searchDepth":84,"depth":84,"links":2985},[2986,2987,2988,2989,2990,2993,2994,2995],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":2991},[2992],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2777,"description":2782},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[234,3003,3004],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3007,"title":3008,"body":3009,"category":234,"cover":235,"description":3013,"extension":236,"meta":3181,"navigation":87,"path":3182,"pinned":239,"publishedAt":240,"seo":3183,"slug":3184,"stem":3185,"summary":3186,"tags":3187,"updatedAt":240,"visible":87,"__hash__":3189},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3010,"toc":3171},[3011,3014,3016,3019,3021,3027,3045,3047,3060,3062,3064,3098,3100,3106,3108,3110,3132,3134,3146,3148,3162,3164,3166,3169],[10,3012,3013],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3015,16],{"id":16},[10,3017,3018],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3020,22],{"id":22},[10,3022,3023],{},[26,3024],{"alt":3025,"src":3026},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3028,3029,3032,3033,3036,3037,3040,3041,3044],{},[34,3030,3031],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,3034,3035],{},"18","，程序首先得到的也是 ",[34,3038,3039],{},"\"18\"","，需要 ",[34,3042,3043],{},"int()"," 后才能按整数参与计算。",[14,3046,40],{"id":40},[42,3048,3049,3052,3057],{},[45,3050,3051],{},"提示文字应告诉用户需要输入什么。",[45,3053,3054,3056],{},[34,3055,3043],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,3058,3059],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3061,61],{"id":61},[10,3063,64],{},[66,3065,3067],{"className":68,"code":3066,"language":70,"meta":71,"style":71},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,3068,3069,3074,3079,3084,3088,3093],{"__ignoreMap":71},[75,3070,3071],{"class":77,"line":78},[75,3072,3073],{},"name = input(\"请输入姓名：\")\n",[75,3075,3076],{"class":77,"line":84},[75,3077,3078],{},"age_text = input(\"请输入年龄：\")\n",[75,3080,3081],{"class":77,"line":91},[75,3082,3083],{},"age = int(age_text)\n",[75,3085,3086],{"class":77,"line":97},[75,3087,88],{"emptyLinePlaceholder":87},[75,3089,3090],{"class":77,"line":102},[75,3091,3092],{},"print(\"你好，\" + name)\n",[75,3094,3095],{"class":77,"line":108},[75,3096,3097],{},"print(age + 1)\n",[10,3099,142],{},[66,3101,3104],{"className":3102,"code":3103,"language":148,"meta":71},[146],"根据输入显示姓名，并输出下一年的年龄\n",[34,3105,3103],{"__ignoreMap":71},[10,3107,153],{},[14,3109,156],{"id":156},[158,3111,3112,3122],{},[45,3113,3114,3115,3117,3118,3121],{},"两次 ",[34,3116,3031],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3119,3120],{},"age_text"," 用来提醒这仍是文本。",[45,3123,3124,3127,3128,3131],{},[34,3125,3126],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3129,3130],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3133,174],{"id":174},[42,3135,3136,3143],{},[45,3137,3138,3139,3142],{},"直接计算 ",[34,3140,3141],{},"input(...) + 1","，忽略输入结果是字符串。",[45,3144,3145],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3147,191],{"id":191},[158,3149,3150,3153],{},[45,3151,3152],{},"接收两个整数并输出它们的和。",[45,3154,1727,3155,3158,3159,3161],{},[34,3156,3157],{},"18.5"," 给 ",[34,3160,3043],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3163,213],{},[14,3165,216],{"id":216},[10,3167,3168],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3170,223],{},{"title":71,"searchDepth":84,"depth":84,"links":3172},[3173,3174,3175,3176,3177,3178,3179,3180],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3008,"description":3013},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[234,2353,3188],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3191,"title":3192,"body":3193,"category":234,"cover":235,"description":3197,"extension":236,"meta":3357,"navigation":87,"path":3358,"pinned":239,"publishedAt":240,"seo":3359,"slug":3360,"stem":3361,"summary":3362,"tags":3363,"updatedAt":240,"visible":87,"__hash__":3366},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3194,"toc":3347},[3195,3198,3200,3203,3205,3211,3218,3220,3234,3236,3238,3277,3279,3285,3287,3289,3308,3310,3325,3327,3338,3340,3342,3345],[10,3196,3197],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3199,16],{"id":16},[10,3201,3202],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3204,22],{"id":22},[10,3206,3207],{},[26,3208],{"alt":3209,"src":3210},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3212,3213,3214,3217],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3215,3216],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3219,40],{"id":40},[42,3221,3222,3225,3228],{},[45,3223,3224],{},"列表使用方括号，元素之间用逗号分隔。",[45,3226,3227],{},"列表可变，可以替换、追加和删除元素。",[45,3229,3230,3231,168],{},"访问不存在的索引会产生 ",[34,3232,3233],{},"IndexError",[14,3235,61],{"id":61},[10,3237,64],{},[66,3239,3241],{"className":68,"code":3240,"language":70,"meta":71,"style":71},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3242,3243,3248,3253,3257,3262,3267,3272],{"__ignoreMap":71},[75,3244,3245],{"class":77,"line":78},[75,3246,3247],{},"scores = [82, 90, 76]\n",[75,3249,3250],{"class":77,"line":84},[75,3251,3252],{},"print(scores[0])\n",[75,3254,3255],{"class":77,"line":91},[75,3256,88],{"emptyLinePlaceholder":87},[75,3258,3259],{"class":77,"line":97},[75,3260,3261],{},"scores[1] = 95\n",[75,3263,3264],{"class":77,"line":102},[75,3265,3266],{},"scores.append(88)\n",[75,3268,3269],{"class":77,"line":108},[75,3270,3271],{},"print(scores)\n",[75,3273,3274],{"class":77,"line":114},[75,3275,3276],{},"print(len(scores))\n",[10,3278,142],{},[66,3280,3283],{"className":3281,"code":3282,"language":148,"meta":71},[146],"82\n[82, 95, 76, 88]\n4\n",[34,3284,3282],{"__ignoreMap":71},[10,3286,153],{},[14,3288,156],{"id":156},[158,3290,3291,3294],{},[45,3292,3293],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,3295,3296,3299,3300,3303,3304,3307],{},[34,3297,3298],{},"scores[1] = 95"," 替换第二个位置，",[34,3301,3302],{},"append(88)"," 在末尾增加新位置，",[34,3305,3306],{},"len()"," 因而从 3 变为 4。",[14,3309,174],{"id":174},[42,3311,3312,3322],{},[45,3313,3314,3315,3318,3319,168],{},"访问 ",[34,3316,3317],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3320,3321],{},"len(scores) - 1",[45,3323,3324],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3326,191],{"id":191},[158,3328,3329,3332],{},[45,3330,3331],{},"建立三项学习任务列表，再追加第四项。",[45,3333,3334,3335,3337],{},"修改第二项，并用 ",[34,3336,3306],{}," 检查元素数量。",[10,3339,213],{},[14,3341,216],{"id":216},[10,3343,3344],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3346,223],{},{"title":71,"searchDepth":84,"depth":84,"links":3348},[3349,3350,3351,3352,3353,3354,3355,3356],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3192,"description":3197},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[234,3364,3365],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3368,"title":3369,"body":3370,"category":234,"cover":235,"description":3374,"extension":236,"meta":3515,"navigation":87,"path":3516,"pinned":239,"publishedAt":240,"seo":3517,"slug":3518,"stem":3519,"summary":3520,"tags":3521,"updatedAt":240,"visible":87,"__hash__":3523},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3371,"toc":3505},[3372,3375,3377,3380,3382,3388,3391,3393,3404,3406,3408,3442,3444,3450,3452,3454,3468,3470,3482,3484,3496,3498,3500,3503],[10,3373,3374],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3376,16],{"id":16},[10,3378,3379],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3381,22],{"id":22},[10,3383,3384],{},[26,3385],{"alt":3386,"src":3387},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3389,3390],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3392,40],{"id":40},[42,3394,3395,3398,3401],{},[45,3396,3397],{},"元组常用来表达固定数量、固定含义的一组值。",[45,3399,3400],{},"只有一个元素的元组必须保留尾随逗号。",[45,3402,3403],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3405,61],{"id":61},[10,3407,64],{},[66,3409,3411],{"className":68,"code":3410,"language":70,"meta":71,"style":71},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3412,3413,3418,3423,3428,3432,3437],{"__ignoreMap":71},[75,3414,3415],{"class":77,"line":78},[75,3416,3417],{},"point = (120, 80)\n",[75,3419,3420],{"class":77,"line":84},[75,3421,3422],{},"print(point[0])\n",[75,3424,3425],{"class":77,"line":91},[75,3426,3427],{},"print(point[1])\n",[75,3429,3430],{"class":77,"line":97},[75,3431,88],{"emptyLinePlaceholder":87},[75,3433,3434],{"class":77,"line":102},[75,3435,3436],{},"single = (5,)\n",[75,3438,3439],{"class":77,"line":108},[75,3440,3441],{},"print(single)\n",[10,3443,142],{},[66,3445,3448],{"className":3446,"code":3447,"language":148,"meta":71},[146],"120\n80\n(5,)\n",[34,3449,3447],{"__ignoreMap":71},[10,3451,153],{},[14,3453,156],{"id":156},[158,3455,3456,3462],{},[45,3457,3458,3461],{},[34,3459,3460],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,3463,3464,3467],{},[34,3465,3466],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3469,174],{"id":174},[42,3471,3472,3479],{},[45,3473,3474,3475,3478],{},"把 ",[34,3476,3477],{},"(5)"," 当作元组，实际它仍是整数。",[45,3480,3481],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3483,191],{"id":191},[158,3485,3486,3489],{},[45,3487,3488],{},"用元组表示宽度和高度。",[45,3490,2180,3491,2183,3493,3495],{},[34,3492,3477],{},[34,3494,3466],{}," 的类型。",[10,3497,213],{},[14,3499,216],{"id":216},[10,3501,3502],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3504,223],{},{"title":71,"searchDepth":84,"depth":84,"links":3506},[3507,3508,3509,3510,3511,3512,3513,3514],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3369,"description":3374},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[234,3522,3365],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3525,"title":3526,"body":3527,"category":234,"cover":235,"description":3531,"extension":236,"meta":3686,"navigation":87,"path":3687,"pinned":239,"publishedAt":240,"seo":3688,"slug":3689,"stem":3690,"summary":3691,"tags":3692,"updatedAt":240,"visible":87,"__hash__":3694},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3528,"toc":3676},[3529,3532,3534,3537,3539,3545,3555,3557,3571,3573,3575,3609,3611,3617,3619,3621,3636,3638,3657,3659,3667,3669,3671,3674],[10,3530,3531],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3533,16],{"id":16},[10,3535,3536],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3538,22],{"id":22},[10,3540,3541],{},[26,3542],{"alt":3543,"src":3544},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3546,3547,3548,3551,3552,3554],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3549,3550],{},"student[\"score\"]"," 读取的是键 ",[34,3553,2253],{}," 对应的值，而不是“第几个元素”。",[14,3556,40],{"id":40},[42,3558,3559,3562,3568],{},[45,3560,3561],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,3563,2346,3564,3567],{},[34,3565,3566],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,3569,3570],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3572,61],{"id":61},[10,3574,64],{},[66,3576,3578],{"className":68,"code":3577,"language":70,"meta":71,"style":71},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3579,3580,3585,3590,3594,3599,3604],{"__ignoreMap":71},[75,3581,3582],{"class":77,"line":78},[75,3583,3584],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[75,3586,3587],{"class":77,"line":84},[75,3588,3589],{},"print(student[\"name\"])\n",[75,3591,3592],{"class":77,"line":91},[75,3593,88],{"emptyLinePlaceholder":87},[75,3595,3596],{"class":77,"line":97},[75,3597,3598],{},"student[\"score\"] = 95\n",[75,3600,3601],{"class":77,"line":102},[75,3602,3603],{},"student[\"city\"] = \"郑州\"\n",[75,3605,3606],{"class":77,"line":108},[75,3607,3608],{},"print(student)\n",[10,3610,142],{},[66,3612,3615],{"className":3613,"code":3614,"language":148,"meta":71},[146],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3616,3614],{"__ignoreMap":71},[10,3618,153],{},[14,3620,156],{"id":156},[158,3622,3623,3626],{},[45,3624,3625],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,3627,3628,3629,3631,3632,3635],{},"给已有键 ",[34,3630,2253],{}," 赋值会更新映射，给新键 ",[34,3633,3634],{},"city"," 赋值会增加映射。",[14,3637,174],{"id":174},[42,3639,3640,3647],{},[45,3641,3642,3643,3646],{},"按位置理解字典并尝试 ",[34,3644,3645],{},"student[0]","，而实际键是字符串。",[45,3648,3649,3650,3653,3654,168],{},"直接读取不确定存在的键并忽略 ",[34,3651,3652],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3655,3656],{},"get()",[14,3658,191],{"id":191},[158,3660,3661,3664],{},[45,3662,3663],{},"建立一本书的标题、作者和页数字典。",[45,3665,3666],{},"添加分类键，再修改页数。",[10,3668,213],{},[14,3670,216],{"id":216},[10,3672,3673],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3675,223],{},{"title":71,"searchDepth":84,"depth":84,"links":3677},[3678,3679,3680,3681,3682,3683,3684,3685],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3526,"description":3531},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[234,3693,3365],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3696,"title":3697,"body":3698,"category":234,"cover":235,"description":3702,"extension":236,"meta":3851,"navigation":87,"path":3852,"pinned":239,"publishedAt":240,"seo":3853,"slug":3854,"stem":3855,"summary":3856,"tags":3857,"updatedAt":240,"visible":87,"__hash__":3859},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3699,"toc":3841},[3700,3703,3705,3708,3710,3716,3719,3721,3740,3742,3744,3778,3780,3786,3788,3790,3805,3807,3819,3821,3832,3834,3836,3839],[10,3701,3702],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3704,16],{"id":16},[10,3706,3707],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3709,22],{"id":22},[10,3711,3712],{},[26,3713],{"alt":3714,"src":3715},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3717,3718],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3720,40],{"id":40},[42,3722,3723,3726,3729],{},[45,3724,3725],{},"集合中的元素不重复。",[45,3727,3728],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,3730,3731,3732,3735,3736,3739],{},"创建空集合必须写 ",[34,3733,3734],{},"set()","；",[34,3737,3738],{},"{}"," 创建的是空字典。",[14,3741,61],{"id":61},[10,3743,64],{},[66,3745,3747],{"className":68,"code":3746,"language":70,"meta":71,"style":71},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3748,3749,3754,3759,3763,3768,3773],{"__ignoreMap":71},[75,3750,3751],{"class":77,"line":78},[75,3752,3753],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[75,3755,3756],{"class":77,"line":84},[75,3757,3758],{},"right = {\"Python\", \"Docker\"}\n",[75,3760,3761],{"class":77,"line":91},[75,3762,88],{"emptyLinePlaceholder":87},[75,3764,3765],{"class":77,"line":97},[75,3766,3767],{},"print(left & right)\n",[75,3769,3770],{"class":77,"line":102},[75,3771,3772],{},"print(left | right)\n",[75,3774,3775],{"class":77,"line":108},[75,3776,3777],{},"print(\"Git\" in left)\n",[10,3779,142],{},[66,3781,3784],{"className":3782,"code":3783,"language":148,"meta":71},[146],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3785,3783],{"__ignoreMap":71},[10,3787,153],{},[14,3789,156],{"id":156},[158,3791,3792,3795],{},[45,3793,3794],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,3796,3797,3800,3801,3804],{},[34,3798,3799],{},"&"," 计算交集，",[34,3802,3803],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3806,174],{"id":174},[42,3808,3809,3816],{},[45,3810,2346,3811,3813,3814,168],{},[34,3812,3738],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3815,3734],{},[45,3817,3818],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3820,191],{"id":191},[158,3822,3823,3829],{},[45,3824,3825,3826,3828],{},"把包含重复标签的列表交给 ",[34,3827,3734],{}," 去重。",[45,3830,3831],{},"计算两组课程标签的交集和差集。",[10,3833,213],{},[14,3835,216],{"id":216},[10,3837,3838],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,3840,223],{},{"title":71,"searchDepth":84,"depth":84,"links":3842},[3843,3844,3845,3846,3847,3848,3849,3850],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3697,"description":3702},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[234,3858,3365],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3861,"title":3862,"body":3863,"category":234,"cover":235,"description":3867,"extension":236,"meta":4064,"navigation":87,"path":4065,"pinned":239,"publishedAt":240,"seo":4066,"slug":4067,"stem":4068,"summary":4069,"tags":4070,"updatedAt":240,"visible":87,"__hash__":4073},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3864,"toc":4052},[3865,3868,3870,3873,3875,3881,3891,3893,3910,3912,3914,3963,3965,3971,3973,3975,3997,3999,4002,4008,4011,4013,4026,4028,4043,4045,4047,4050],[10,3866,3867],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3869,16],{"id":16},[10,3871,3872],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3874,22],{"id":22},[10,3876,3877],{},[26,3878],{"alt":3879,"src":3880},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3882,3883,3886,3887,3890],{},[34,3884,3885],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3888,3889],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3892,40],{"id":40},[42,3894,3895,3904,3907],{},[45,3896,3897,3899,3900,3903],{},[34,3898,2814],{}," 比较内容是否相等，",[34,3901,3902],{},"is"," 比较是否为同一个对象。",[45,3905,3906],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,3908,3909],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3911,61],{"id":61},[10,3913,64],{},[66,3915,3917],{"className":68,"code":3916,"language":70,"meta":71,"style":71},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3918,3919,3924,3929,3934,3938,3943,3948,3953,3958],{"__ignoreMap":71},[75,3920,3921],{"class":77,"line":78},[75,3922,3923],{},"tasks = [\"变量\", \"字符串\"]\n",[75,3925,3926],{"class":77,"line":84},[75,3927,3928],{},"shared = tasks\n",[75,3930,3931],{"class":77,"line":91},[75,3932,3933],{},"backup = tasks.copy()\n",[75,3935,3936],{"class":77,"line":97},[75,3937,88],{"emptyLinePlaceholder":87},[75,3939,3940],{"class":77,"line":102},[75,3941,3942],{},"tasks.append(\"列表\")\n",[75,3944,3945],{"class":77,"line":108},[75,3946,3947],{},"print(shared)\n",[75,3949,3950],{"class":77,"line":114},[75,3951,3952],{},"print(backup)\n",[75,3954,3955],{"class":77,"line":119},[75,3956,3957],{},"print(tasks is shared)\n",[75,3959,3960],{"class":77,"line":125},[75,3961,3962],{},"print(tasks is backup)\n",[10,3964,142],{},[66,3966,3969],{"className":3967,"code":3968,"language":148,"meta":71},[146],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3970,3968],{"__ignoreMap":71},[10,3972,153],{},[14,3974,156],{"id":156},[158,3976,3977,3983],{},[45,3978,3979,3982],{},[34,3980,3981],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,3984,3985,3988,3989,3992,3993,3996],{},[34,3986,3987],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3990,3991],{},"shared"," 能观察到变化，",[34,3994,3995],{},"backup"," 不会。",[336,3998,2704],{"id":2704},[10,4000,4001],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4003,4004],{},[26,4005],{"alt":4006,"src":4007},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4009,4010],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4012,174],{"id":174},[42,4014,4015,4023],{},[45,4016,4017,4018,4020,4021,168],{},"用 ",[34,4019,2814],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,4022,3902],{},[45,4024,4025],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4027,191],{"id":191},[158,4029,4030,4033],{},[45,4031,4032],{},"让两个变量引用同一个字典并修改其中一个。",[45,4034,2346,4035,4038,4039,1164,4041,168],{},[34,4036,4037],{},"copy()"," 创建外层副本，再比较 ",[34,4040,3902],{},[34,4042,2814],{},[10,4044,213],{},[14,4046,216],{"id":216},[10,4048,4049],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4051,223],{},{"title":71,"searchDepth":84,"depth":84,"links":4053},[4054,4055,4056,4057,4058,4061,4062,4063],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":4059},[4060],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3862,"description":3867},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[234,4071,4072],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4075,"title":4076,"body":4077,"category":234,"cover":235,"description":4081,"extension":236,"meta":4293,"navigation":87,"path":4294,"pinned":239,"publishedAt":240,"seo":4295,"slug":4296,"stem":4297,"summary":4298,"tags":4299,"updatedAt":240,"visible":87,"__hash__":4301},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4078,"toc":4280},[4079,4082,4084,4087,4089,4095,4105,4107,4118,4120,4122,4174,4176,4182,4184,4186,4204,4206,4209,4215,4223,4226,4229,4235,4241,4243,4261,4263,4271,4273,4275,4278],[10,4080,4081],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4083,16],{"id":16},[10,4085,4086],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4088,22],{"id":22},[10,4090,4091],{},[26,4092],{"alt":4093,"src":4094},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4096,4097,2264,4099,2264,4102,4104],{},[34,4098,1163],{},[34,4100,4101],{},"elif",[34,4103,1167],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4106,40],{"id":40},[42,4108,4109,4112,4115],{},[45,4110,4111],{},"冒号表示接下来开始一个代码块。",[45,4113,4114],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,4116,4117],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4119,61],{"id":61},[10,4121,64],{},[66,4123,4125],{"className":68,"code":4124,"language":70,"meta":71,"style":71},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4126,4127,4132,4136,4141,4146,4151,4156,4160,4165,4169],{"__ignoreMap":71},[75,4128,4129],{"class":77,"line":78},[75,4130,4131],{},"score = int(input(\"请输入分数：\"))\n",[75,4133,4134],{"class":77,"line":84},[75,4135,88],{"emptyLinePlaceholder":87},[75,4137,4138],{"class":77,"line":91},[75,4139,4140],{},"if score >= 90:\n",[75,4142,4143],{"class":77,"line":97},[75,4144,4145],{},"    level = \"优秀\"\n",[75,4147,4148],{"class":77,"line":102},[75,4149,4150],{},"elif score >= 60:\n",[75,4152,4153],{"class":77,"line":108},[75,4154,4155],{},"    level = \"合格\"\n",[75,4157,4158],{"class":77,"line":114},[75,4159,1153],{},[75,4161,4162],{"class":77,"line":119},[75,4163,4164],{},"    level = \"需要继续学习\"\n",[75,4166,4167],{"class":77,"line":125},[75,4168,88],{"emptyLinePlaceholder":87},[75,4170,4171],{"class":77,"line":131},[75,4172,4173],{},"print(level)\n",[10,4175,142],{},[66,4177,4180],{"className":4178,"code":4179,"language":148,"meta":71},[146],"输入 85 时输出：合格\n",[34,4181,4179],{"__ignoreMap":71},[10,4183,153],{},[14,4185,156],{"id":156},[158,4187,4188,4195],{},[45,4189,4190,4191,4194],{},"输入先转换为整数，程序从 ",[34,4192,4193],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,4196,4197,4200,4201,4203],{},[34,4198,4199],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4202,1167],{}," 被跳过；最终三个分支只会选择一个。",[336,4205,2704],{"id":2704},[10,4207,4208],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4210,4211],{},[26,4212],{"alt":4213,"src":4214},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4216,4217,4219,4220,4222],{},[34,4218,4193],{}," 必须放在 ",[34,4221,4199],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[336,4224,2704],{"id":4225},"再看一个具体细节-1",[10,4227,4228],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4230,4231],{},[26,4232],{"alt":4233,"src":4234},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4236,4237,4238,4240],{},"同一缩进层级属于同一个代码块；回到 ",[34,4239,1163],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4242,174],{"id":174},[42,4244,4245,4251],{},[45,4246,4247,4248,4250],{},"先写 ",[34,4249,4199],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,4252,4253,4254,4256,4257,4260],{},"混用多个独立 ",[34,4255,1163],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4258,4259],{},"if\u002Felif\u002Felse"," 链。",[14,4262,191],{"id":191},[158,4264,4265,4268],{},[45,4266,4267],{},"根据温度输出“冷、适中、热”三个等级。",[45,4269,4270],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4272,213],{},[14,4274,216],{"id":216},[10,4276,4277],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4279,223],{},{"title":71,"searchDepth":84,"depth":84,"links":4281},[4282,4283,4284,4285,4286,4290,4291,4292],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":4287},[4288,4289],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4076,"description":4081},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[234,1163,4300],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4303,"title":4304,"body":4305,"category":234,"cover":235,"description":4309,"extension":236,"meta":4475,"navigation":87,"path":4476,"pinned":239,"publishedAt":240,"seo":4477,"slug":4478,"stem":4479,"summary":4480,"tags":4481,"updatedAt":240,"visible":87,"__hash__":4483},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4306,"toc":4463},[4307,4310,4312,4315,4317,4323,4329,4331,4346,4348,4350,4388,4390,4396,4398,4400,4415,4417,4420,4426,4432,4434,4442,4444,4454,4456,4458,4461],[10,4308,4309],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4311,16],{"id":16},[10,4313,4314],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4316,22],{"id":22},[10,4318,4319],{},[26,4320],{"alt":4321,"src":4322},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4324,4325,4328],{},[34,4326,4327],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4330,40],{"id":40},[42,4332,4333,4336,4339],{},[45,4334,4335],{},"进入循环前先准备参与条件判断的状态。",[45,4337,4338],{},"循环体中必须有机会让条件变为假。",[45,4340,4341,4342,4345],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4343,4344],{},"for"," 通常更直接。",[14,4347,61],{"id":61},[10,4349,64],{},[66,4351,4353],{"className":68,"code":4352,"language":70,"meta":71,"style":71},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4354,4355,4360,4364,4369,4374,4379,4383],{"__ignoreMap":71},[75,4356,4357],{"class":77,"line":78},[75,4358,4359],{},"count = 1\n",[75,4361,4362],{"class":77,"line":84},[75,4363,88],{"emptyLinePlaceholder":87},[75,4365,4366],{"class":77,"line":91},[75,4367,4368],{},"while count \u003C= 3:\n",[75,4370,4371],{"class":77,"line":97},[75,4372,4373],{},"    print(\"第\", count, \"次练习\")\n",[75,4375,4376],{"class":77,"line":102},[75,4377,4378],{},"    count = count + 1\n",[75,4380,4381],{"class":77,"line":108},[75,4382,88],{"emptyLinePlaceholder":87},[75,4384,4385],{"class":77,"line":114},[75,4386,4387],{},"print(\"练习结束\")\n",[10,4389,142],{},[66,4391,4394],{"className":4392,"code":4393,"language":148,"meta":71},[146],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4395,4393],{"__ignoreMap":71},[10,4397,153],{},[14,4399,156],{"id":156},[158,4401,4402,4409],{},[45,4403,4404,4405,4408],{},"进入循环前 ",[34,4406,4407],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[45,4410,4411,4412,4414],{},"循环体末尾把 ",[34,4413,4407],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[336,4416,2704],{"id":2704},[10,4418,4419],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4421,4422],{},[26,4423],{"alt":4424,"src":4425},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4427,4428,4429,4431],{},"第4次检查时 ",[34,4430,4407],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4433,174],{"id":174},[42,4435,4436,4439],{},[45,4437,4438],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,4440,4441],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4443,191],{"id":191},[158,4445,4446,4451],{},[45,4447,2346,4448,4450],{},[34,4449,4327],{}," 输出 1 到 5。",[45,4452,4453],{},"计算 1 到 10 的累加和。",[10,4455,213],{},[14,4457,216],{"id":216},[10,4459,4460],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4462,223],{},{"title":71,"searchDepth":84,"depth":84,"links":4464},[4465,4466,4467,4468,4469,4472,4473,4474],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":4470},[4471],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4304,"description":4309},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[234,4327,4482],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4485,"title":4486,"body":4487,"category":234,"cover":235,"description":4491,"extension":236,"meta":4639,"navigation":87,"path":4640,"pinned":239,"publishedAt":240,"seo":4641,"slug":4642,"stem":4643,"summary":4644,"tags":4645,"updatedAt":240,"visible":87,"__hash__":4647},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4488,"toc":4629},[4489,4492,4494,4497,4499,4505,4510,4512,4526,4528,4530,4568,4570,4576,4578,4580,4597,4599,4607,4609,4620,4622,4624,4627],[10,4490,4491],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4493,16],{"id":16},[10,4495,4496],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4498,22],{"id":22},[10,4500,4501],{},[26,4502],{"alt":4503,"src":4504},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4506,4507,4509],{},[34,4508,4344],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4511,40],{"id":40},[42,4513,4514,4520,4523],{},[45,4515,4516,4519],{},[34,4517,4518],{},"range(1, 4)"," 包含 1，不包含 4。",[45,4521,4522],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,4524,4525],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4527,61],{"id":61},[10,4529,64],{},[66,4531,4533],{"className":68,"code":4532,"language":70,"meta":71,"style":71},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4534,4535,4540,4544,4549,4554,4558,4563],{"__ignoreMap":71},[75,4536,4537],{"class":77,"line":78},[75,4538,4539],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[75,4541,4542],{"class":77,"line":84},[75,4543,88],{"emptyLinePlaceholder":87},[75,4545,4546],{"class":77,"line":91},[75,4547,4548],{},"for course in courses:\n",[75,4550,4551],{"class":77,"line":97},[75,4552,4553],{},"    print(course)\n",[75,4555,4556],{"class":77,"line":102},[75,4557,88],{"emptyLinePlaceholder":87},[75,4559,4560],{"class":77,"line":108},[75,4561,4562],{},"for number in range(1, 4):\n",[75,4564,4565],{"class":77,"line":114},[75,4566,4567],{},"    print(number)\n",[10,4569,142],{},[66,4571,4574],{"className":4572,"code":4573,"language":148,"meta":71},[146],"变量\n字符串\n列表\n1\n2\n3\n",[34,4575,4573],{"__ignoreMap":71},[10,4577,153],{},[14,4579,156],{"id":156},[158,4581,4582,4592],{},[45,4583,4584,4585,4587,4588,4591],{},"第一个 ",[34,4586,4344],{}," 依次从列表取得字符串，循环变量 ",[34,4589,4590],{},"course"," 每轮重新绑定。",[45,4593,4594,4596],{},[34,4595,4518],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4598,174],{"id":174},[42,4600,4601,4604],{},[45,4602,4603],{},"只需要元素却手工维护索引，增加越界风险。",[45,4605,4606],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4608,191],{"id":191},[158,4610,4611,4614],{},[45,4612,4613],{},"逐项输出一个字符串中的字符。",[45,4615,2346,4616,4619],{},[34,4617,4618],{},"range()"," 输出 2、4、6、8。",[10,4621,213],{},[14,4623,216],{"id":216},[10,4625,4626],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4628,223],{},{"title":71,"searchDepth":84,"depth":84,"links":4630},[4631,4632,4633,4634,4635,4636,4637,4638],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4486,"description":4491},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[234,4344,4646],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4649,"title":4650,"body":4651,"category":234,"cover":235,"description":4655,"extension":236,"meta":4828,"navigation":87,"path":4829,"pinned":239,"publishedAt":240,"seo":4830,"slug":4831,"stem":4832,"summary":4833,"tags":4834,"updatedAt":240,"visible":87,"__hash__":4835},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4652,"toc":4818},[4653,4656,4658,4661,4663,4669,4679,4681,4700,4702,4704,4756,4758,4764,4766,4768,4782,4784,4799,4801,4809,4811,4813,4816],[10,4654,4655],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4657,16],{"id":16},[10,4659,4660],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4662,22],{"id":22},[10,4664,4665],{},[26,4666],{"alt":4667,"src":4668},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4670,4671,4674,4675,4678],{},[34,4672,4673],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4676,4677],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4680,40],{"id":40},[42,4682,4683,4686,4694],{},[45,4684,4685],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,4687,4688,4690,4691,4693],{},[34,4689,4673],{}," 前要确认不会跳过 ",[34,4692,4327],{}," 循环中的状态更新。",[45,4695,4696,4697,4699],{},"多层嵌套中 ",[34,4698,4677],{}," 只结束它所在的最内层循环。",[14,4701,61],{"id":61},[10,4703,64],{},[66,4705,4707],{"className":68,"code":4706,"language":70,"meta":71,"style":71},"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",[34,4708,4709,4714,4718,4723,4728,4733,4738,4743,4747,4751],{"__ignoreMap":71},[75,4710,4711],{"class":77,"line":78},[75,4712,4713],{},"numbers = [3, -1, 0, 8, 12]\n",[75,4715,4716],{"class":77,"line":84},[75,4717,88],{"emptyLinePlaceholder":87},[75,4719,4720],{"class":77,"line":91},[75,4721,4722],{},"for number in numbers:\n",[75,4724,4725],{"class":77,"line":97},[75,4726,4727],{},"    if number \u003C 0:\n",[75,4729,4730],{"class":77,"line":102},[75,4731,4732],{},"        continue\n",[75,4734,4735],{"class":77,"line":108},[75,4736,4737],{},"    if number == 0:\n",[75,4739,4740],{"class":77,"line":114},[75,4741,4742],{},"        break\n",[75,4744,4745],{"class":77,"line":119},[75,4746,4567],{},[75,4748,4749],{"class":77,"line":125},[75,4750,88],{"emptyLinePlaceholder":87},[75,4752,4753],{"class":77,"line":131},[75,4754,4755],{},"print(\"循环结束\")\n",[10,4757,142],{},[66,4759,4762],{"className":4760,"code":4761,"language":148,"meta":71},[146],"3\n循环结束\n",[34,4763,4761],{"__ignoreMap":71},[10,4765,153],{},[14,4767,156],{"id":156},[158,4769,4770,4776],{},[45,4771,4772,4773,4775],{},"遇到 -1 时 ",[34,4774,4673],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,4777,4778,4779,4781],{},"遇到 0 时 ",[34,4780,4677],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4783,174],{"id":174},[42,4785,4786,4791],{},[45,4787,3474,4788,4790],{},[34,4789,4673],{}," 当作结束循环，实际它只跳到下一轮。",[45,4792,179,4793,4795,4796,4798],{},[34,4794,4327],{}," 中把状态更新放在可能被 ",[34,4797,4673],{}," 跳过的位置，造成无限循环。",[14,4800,191],{"id":191},[158,4802,4803,4806],{},[45,4804,4805],{},"跳过列表中的空字符串并输出其他内容。",[45,4807,4808],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4810,213],{},[14,4812,216],{"id":216},[10,4814,4815],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,4817,223],{},{"title":71,"searchDepth":84,"depth":84,"links":4819},[4820,4821,4822,4823,4824,4825,4826,4827],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4650,"description":4655},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[234,4677,4673],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4837,"title":4838,"body":4839,"category":234,"cover":235,"description":4843,"extension":236,"meta":5014,"navigation":87,"path":5015,"pinned":239,"publishedAt":240,"seo":5016,"slug":5017,"stem":5018,"summary":5019,"tags":5020,"updatedAt":240,"visible":87,"__hash__":5023},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4840,"toc":5002},[4841,4844,4846,4849,4851,4857,4860,4862,4886,4888,4890,4924,4926,4932,4934,4936,4953,4955,4958,4964,4967,4969,4983,4985,4993,4995,4997,5000],[10,4842,4843],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4845,16],{"id":16},[10,4847,4848],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4850,22],{"id":22},[10,4852,4853],{},[26,4854],{"alt":4855,"src":4856},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4858,4859],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4861,40],{"id":40},[42,4863,4864,4867,4870],{},[45,4865,4866],{},"每增加一层嵌套，阅读成本都会上升。",[45,4868,4869],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,4871,4872,4873,2264,4876,4879,4880,2264,4883,168],{},"变量名使用 ",[34,4874,4875],{},"row",[34,4877,4878],{},"cell"," 等层级含义，避免全部写成 ",[34,4881,4882],{},"i",[34,4884,4885],{},"j",[14,4887,61],{"id":61},[10,4889,64],{},[66,4891,4893],{"className":68,"code":4892,"language":70,"meta":71,"style":71},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4894,4895,4900,4904,4909,4914,4919],{"__ignoreMap":71},[75,4896,4897],{"class":77,"line":78},[75,4898,4899],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[75,4901,4902],{"class":77,"line":84},[75,4903,88],{"emptyLinePlaceholder":87},[75,4905,4906],{"class":77,"line":91},[75,4907,4908],{},"for row in table:\n",[75,4910,4911],{"class":77,"line":97},[75,4912,4913],{},"    for cell in row:\n",[75,4915,4916],{"class":77,"line":102},[75,4917,4918],{},"        print(cell)\n",[75,4920,4921],{"class":77,"line":108},[75,4922,4923],{},"    print(\"一行结束\")\n",[10,4925,142],{},[66,4927,4930],{"className":4928,"code":4929,"language":148,"meta":71},[146],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4931,4929],{"__ignoreMap":71},[10,4933,153],{},[14,4935,156],{"id":156},[158,4937,4938,4950],{},[45,4939,4940,4941,4943,4944,1164,4947,168],{},"外层变量 ",[34,4942,4875],{}," 先引用第一行列表，内层才依次处理 ",[34,4945,4946],{},"A1",[34,4948,4949],{},"A2",[45,4951,4952],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[336,4954,2704],{"id":2704},[10,4956,4957],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4959,4960],{},[26,4961],{"alt":4962,"src":4963},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4965,4966],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4968,174],{"id":174},[42,4970,4971,4980],{},[45,4972,4973,4974,1016,4977,4979],{},"把两层循环变量都叫 ",[34,4975,4976],{},"item",[34,4978,4882],{},"，难以确认当前层级。",[45,4981,4982],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4984,191],{"id":191},[158,4986,4987,4990],{},[45,4988,4989],{},"打印一个 2×3 数字表。",[45,4991,4992],{},"在内层增加条件，只输出大于 3 的元素。",[10,4994,213],{},[14,4996,216],{"id":216},[10,4998,4999],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5001,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5003},[5004,5005,5006,5007,5008,5011,5012,5013],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":5009},[5010],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4838,"description":4843},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[234,5021,5022],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5025,"title":5026,"body":5027,"category":234,"cover":235,"description":5031,"extension":236,"meta":5169,"navigation":87,"path":5170,"pinned":239,"publishedAt":240,"seo":5171,"slug":5172,"stem":5173,"summary":5174,"tags":5175,"updatedAt":240,"visible":87,"__hash__":5178},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5028,"toc":5159},[5029,5032,5034,5037,5039,5045,5048,5050,5061,5063,5065,5103,5105,5111,5113,5115,5127,5129,5140,5142,5150,5152,5154,5157],[10,5030,5031],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5033,16],{"id":16},[10,5035,5036],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5038,22],{"id":22},[10,5040,5041],{},[26,5042],{"alt":5043,"src":5044},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5046,5047],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5049,40],{"id":40},[42,5051,5052,5055,5058],{},[45,5053,5054],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,5056,5057],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,5059,5060],{},"推导式创建新列表，不修改输入列表。",[14,5062,61],{"id":61},[10,5064,64],{},[66,5066,5068],{"className":68,"code":5067,"language":70,"meta":71,"style":71},"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",[34,5069,5070,5075,5079,5084,5089,5093,5098],{"__ignoreMap":71},[75,5071,5072],{"class":77,"line":78},[75,5073,5074],{},"numbers = [1, 2, 3, 4, 5]\n",[75,5076,5077],{"class":77,"line":84},[75,5078,88],{"emptyLinePlaceholder":87},[75,5080,5081],{"class":77,"line":91},[75,5082,5083],{},"squares = [number * number for number in numbers]\n",[75,5085,5086],{"class":77,"line":97},[75,5087,5088],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[75,5090,5091],{"class":77,"line":102},[75,5092,88],{"emptyLinePlaceholder":87},[75,5094,5095],{"class":77,"line":108},[75,5096,5097],{},"print(squares)\n",[75,5099,5100],{"class":77,"line":114},[75,5101,5102],{},"print(even_squares)\n",[10,5104,142],{},[66,5106,5109],{"className":5107,"code":5108,"language":148,"meta":71},[146],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5110,5108],{"__ignoreMap":71},[10,5112,153],{},[14,5114,156],{"id":156},[158,5116,5117,5120],{},[45,5118,5119],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,5121,5122,5123,5126],{},"第二条先用 ",[34,5124,5125],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5128,174],{"id":174},[42,5130,5131,5137],{},[45,5132,5133,5134,5136],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5135,4344],{}," 开始找输入。",[45,5138,5139],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5141,191],{"id":191},[158,5143,5144,5147],{},[45,5145,5146],{},"把字符串列表转换为长度列表。",[45,5148,5149],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5151,213],{},[14,5153,216],{"id":216},[10,5155,5156],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5158,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5160},[5161,5162,5163,5164,5165,5166,5167,5168],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5026,"description":5031},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[234,5176,5177],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5180,"title":5181,"body":5182,"category":234,"cover":235,"description":5186,"extension":236,"meta":5329,"navigation":87,"path":5330,"pinned":239,"publishedAt":240,"seo":5331,"slug":5332,"stem":5333,"summary":5334,"tags":5335,"updatedAt":240,"visible":87,"__hash__":5338},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5183,"toc":5319},[5184,5187,5189,5192,5194,5200,5203,5205,5216,5218,5220,5259,5261,5267,5269,5271,5286,5288,5296,5298,5310,5312,5314,5317],[10,5185,5186],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5188,16],{"id":16},[10,5190,5191],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5193,22],{"id":22},[10,5195,5196],{},[26,5197],{"alt":5198,"src":5199},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5201,5202],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5204,40],{"id":40},[42,5206,5207,5210,5213],{},[45,5208,5209],{},"函数名描述动作，使用小写字母和下划线。",[45,5211,5212],{},"函数定义要先执行，之后才能调用。",[45,5214,5215],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5217,61],{"id":61},[10,5219,64],{},[66,5221,5223],{"className":68,"code":5222,"language":70,"meta":71,"style":71},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5224,5225,5230,5235,5240,5244,5249,5254],{"__ignoreMap":71},[75,5226,5227],{"class":77,"line":78},[75,5228,5229],{},"def show_progress():\n",[75,5231,5232],{"class":77,"line":84},[75,5233,5234],{},"    print(\"正在学习函数\")\n",[75,5236,5237],{"class":77,"line":91},[75,5238,5239],{},"    print(\"本节完成 50%\")\n",[75,5241,5242],{"class":77,"line":97},[75,5243,88],{"emptyLinePlaceholder":87},[75,5245,5246],{"class":77,"line":102},[75,5247,5248],{},"print(\"调用前\")\n",[75,5250,5251],{"class":77,"line":108},[75,5252,5253],{},"show_progress()\n",[75,5255,5256],{"class":77,"line":114},[75,5257,5258],{},"print(\"调用后\")\n",[10,5260,142],{},[66,5262,5265],{"className":5263,"code":5264,"language":148,"meta":71},[146],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5266,5264],{"__ignoreMap":71},[10,5268,153],{},[14,5270,156],{"id":156},[158,5272,5273,5279],{},[45,5274,945,5275,5278],{},[34,5276,5277],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,5280,5281,5282,5285],{},"运行到 ",[34,5283,5284],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5287,174],{"id":174},[42,5289,5290,5293],{},[45,5291,5292],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,5294,5295],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5297,191],{"id":191},[158,5299,5300,5307],{},[45,5301,5302,5303,5306],{},"定义 ",[34,5304,5305],{},"show_plan()"," 输出两行学习计划。",[45,5308,5309],{},"连续调用同一个函数两次，观察执行顺序。",[10,5311,213],{},[14,5313,216],{"id":216},[10,5315,5316],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5318,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5320},[5321,5322,5323,5324,5325,5326,5327,5328],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5181,"description":5186},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[234,5336,5337],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5340,"title":5341,"body":5342,"category":234,"cover":235,"description":5346,"extension":236,"meta":5526,"navigation":87,"path":5527,"pinned":239,"publishedAt":240,"seo":5528,"slug":5529,"stem":5530,"summary":5531,"tags":5532,"updatedAt":240,"visible":87,"__hash__":5535},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5343,"toc":5514},[5344,5347,5349,5352,5354,5360,5367,5369,5386,5388,5390,5424,5426,5432,5434,5436,5457,5459,5462,5468,5478,5480,5495,5497,5505,5507,5509,5512],[10,5345,5346],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5348,16],{"id":16},[10,5350,5351],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5353,22],{"id":22},[10,5355,5356],{},[26,5357],{"alt":5358,"src":5359},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5361,5362,5363,5366],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5364,5365],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5368,40],{"id":40},[42,5370,5371,5374,5377],{},[45,5372,5373],{},"形参出现在函数定义中，实参出现在函数调用中。",[45,5375,5376],{},"局部变量默认只在函数内部可见。",[45,5378,5379,5380,5382,5383,168],{},"没有显式 ",[34,5381,5365],{}," 的函数会返回 ",[34,5384,5385],{},"None",[14,5387,61],{"id":61},[10,5389,64],{},[66,5391,5393],{"className":68,"code":5392,"language":70,"meta":71,"style":71},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5394,5395,5400,5405,5410,5414,5419],{"__ignoreMap":71},[75,5396,5397],{"class":77,"line":78},[75,5398,5399],{},"def calculate_total(price, count):\n",[75,5401,5402],{"class":77,"line":84},[75,5403,5404],{},"    total = price * count\n",[75,5406,5407],{"class":77,"line":91},[75,5408,5409],{},"    return total\n",[75,5411,5412],{"class":77,"line":97},[75,5413,88],{"emptyLinePlaceholder":87},[75,5415,5416],{"class":77,"line":102},[75,5417,5418],{},"result = calculate_total(25, 4)\n",[75,5420,5421],{"class":77,"line":108},[75,5422,5423],{},"print(result)\n",[10,5425,142],{},[66,5427,5430],{"className":5428,"code":5429,"language":148,"meta":71},[146],"100\n",[34,5431,5429],{"__ignoreMap":71},[10,5433,153],{},[14,5435,156],{"id":156},[158,5437,5438,5447],{},[45,5439,5440,5441,2264,5444,5446],{},"调用时 25 和 4 分别绑定到 ",[34,5442,5443],{},"price",[34,5445,4407],{},"，它们只在本次函数调用的局部范围中使用。",[45,5448,5449,5452,5453,5456],{},[34,5450,5451],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5454,5455],{},"result"," 并输出。",[336,5458,2704],{"id":2704},[10,5460,5461],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5463,5464],{},[26,5465],{"alt":5466,"src":5467},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5469,5470,2264,5472,1164,5474,5477],{},[34,5471,5443],{},[34,5473,4407],{},[34,5475,5476],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5479,174],{"id":174},[42,5481,5482,5489],{},[45,5483,5484,5485,5488],{},"在函数内部只 ",[34,5486,5487],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,5490,5491,5492,5494],{},"试图在函数外直接访问局部变量 ",[34,5493,5476],{},"，它的名字只在调用期间的局部作用域存在。",[14,5496,191],{"id":191},[158,5498,5499,5502],{},[45,5500,5501],{},"编写计算长方形面积的函数。",[45,5503,5504],{},"让函数返回结果后在调用方加上单位再输出。",[10,5506,213],{},[14,5508,216],{"id":216},[10,5510,5511],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5513,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5515},[5516,5517,5518,5519,5520,5523,5524,5525],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":5521},[5522],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5341,"description":5346},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[234,5533,5534],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5537,"title":5538,"body":5539,"category":234,"cover":235,"description":5543,"extension":236,"meta":5723,"navigation":87,"path":5724,"pinned":239,"publishedAt":240,"seo":5725,"slug":5726,"stem":5727,"summary":5728,"tags":5729,"updatedAt":240,"visible":87,"__hash__":5732},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5540,"toc":5711},[5541,5544,5546,5549,5551,5557,5560,5562,5579,5581,5583,5635,5637,5643,5645,5647,5665,5667,5670,5676,5679,5681,5692,5694,5702,5704,5706,5709],[10,5542,5543],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5545,16],{"id":16},[10,5547,5548],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5550,22],{"id":22},[10,5552,5553],{},[26,5554],{"alt":5555,"src":5556},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5558,5559],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5561,40],{"id":40},[42,5563,5564,5567,5573],{},[45,5565,5566],{},"必需参数应放在有默认值的参数之前。",[45,5568,5569,5572],{},[34,5570,5571],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,5574,5575,5578],{},[34,5576,5577],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5580,61],{"id":61},[10,5582,64],{},[66,5584,5586],{"className":68,"code":5585,"language":70,"meta":71,"style":71},"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",[34,5587,5588,5593,5598,5602,5607,5612,5616,5621,5626,5630],{"__ignoreMap":71},[75,5589,5590],{"class":77,"line":78},[75,5591,5592],{},"def build_title(name, level=\"基础\"):\n",[75,5594,5595],{"class":77,"line":84},[75,5596,5597],{},"    return name + \"｜\" + level\n",[75,5599,5600],{"class":77,"line":91},[75,5601,88],{"emptyLinePlaceholder":87},[75,5603,5604],{"class":77,"line":97},[75,5605,5606],{},"print(build_title(\"Python\"))\n",[75,5608,5609],{"class":77,"line":102},[75,5610,5611],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[75,5613,5614],{"class":77,"line":108},[75,5615,88],{"emptyLinePlaceholder":87},[75,5617,5618],{"class":77,"line":114},[75,5619,5620],{},"def total(*numbers):\n",[75,5622,5623],{"class":77,"line":119},[75,5624,5625],{},"    return sum(numbers)\n",[75,5627,5628],{"class":77,"line":125},[75,5629,88],{"emptyLinePlaceholder":87},[75,5631,5632],{"class":77,"line":131},[75,5633,5634],{},"print(total(10, 20, 30))\n",[10,5636,142],{},[66,5638,5641],{"className":5639,"code":5640,"language":148,"meta":71},[146],"Python｜基础\n异常处理｜进阶\n60\n",[34,5642,5640],{"__ignoreMap":71},[10,5644,153],{},[14,5646,156],{"id":156},[158,5648,5649,5656],{},[45,5650,5651,5652,5655],{},"第一次调用只提供必需参数，",[34,5653,5654],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,5657,5658,5661,5662,168],{},[34,5659,5660],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5663,5664],{},"sum()",[336,5666,2704],{"id":2704},[10,5668,5669],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5671,5672],{},[26,5673],{"alt":5674,"src":5675},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5677,5678],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5680,174],{"id":174},[42,5682,5683,5689],{},[45,5684,5685,5686,5688],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5687,5385],{}," 再在函数内创建。",[45,5690,5691],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5693,191],{"id":191},[158,5695,5696,5699],{},[45,5697,5698],{},"给问候函数增加默认称呼。",[45,5700,5701],{},"编写接收任意数量分数并返回总分的函数。",[10,5703,213],{},[14,5705,216],{"id":216},[10,5707,5708],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5710,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5712},[5713,5714,5715,5716,5717,5720,5721,5722],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":5718},[5719],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5538,"description":5543},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[234,5730,5731],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5734,"title":5735,"body":5736,"category":234,"cover":235,"description":5740,"extension":236,"meta":5936,"navigation":87,"path":5937,"pinned":239,"publishedAt":240,"seo":5938,"slug":5939,"stem":5940,"summary":5941,"tags":5942,"updatedAt":240,"visible":87,"__hash__":5945},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5737,"toc":5924},[5738,5741,5743,5746,5748,5754,5757,5759,5776,5778,5780,5842,5844,5850,5852,5854,5881,5883,5886,5892,5895,5897,5905,5907,5915,5917,5919,5922],[10,5739,5740],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5742,16],{"id":16},[10,5744,5745],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5747,22],{"id":22},[10,5749,5750],{},[26,5751],{"alt":5752,"src":5753},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5755,5756],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5758,40],{"id":40},[42,5760,5761,5764,5767],{},[45,5762,5763],{},"函数内部赋值默认创建局部变量。",[45,5765,5766],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,5768,5769,2183,5772,5775],{},[34,5770,5771],{},"global",[34,5773,5774],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5777,61],{"id":61},[10,5779,64],{},[66,5781,5783],{"className":68,"code":5782,"language":70,"meta":71,"style":71},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5784,5785,5790,5794,5799,5804,5808,5813,5818,5823,5827,5832,5836],{"__ignoreMap":71},[75,5786,5787],{"class":77,"line":78},[75,5788,5789],{},"course = \"Python\"\n",[75,5791,5792],{"class":77,"line":84},[75,5793,88],{"emptyLinePlaceholder":87},[75,5795,5796],{"class":77,"line":91},[75,5797,5798],{},"def outer():\n",[75,5800,5801],{"class":77,"line":97},[75,5802,5803],{},"    level = \"基础\"\n",[75,5805,5806],{"class":77,"line":102},[75,5807,88],{"emptyLinePlaceholder":87},[75,5809,5810],{"class":77,"line":108},[75,5811,5812],{},"    def show():\n",[75,5814,5815],{"class":77,"line":114},[75,5816,5817],{},"        lesson = \"作用域\"\n",[75,5819,5820],{"class":77,"line":119},[75,5821,5822],{},"        print(course, level, lesson)\n",[75,5824,5825],{"class":77,"line":125},[75,5826,88],{"emptyLinePlaceholder":87},[75,5828,5829],{"class":77,"line":131},[75,5830,5831],{},"    show()\n",[75,5833,5834],{"class":77,"line":136},[75,5835,88],{"emptyLinePlaceholder":87},[75,5837,5839],{"class":77,"line":5838},12,[75,5840,5841],{},"outer()\n",[10,5843,142],{},[66,5845,5848],{"className":5846,"code":5847,"language":148,"meta":71},[146],"Python 基础 作用域\n",[34,5849,5847],{"__ignoreMap":71},[10,5851,153],{},[14,5853,156],{"id":156},[158,5855,5856,5873],{},[45,5857,5858,5861,5862,5865,5866,5868,5869,5872],{},[34,5859,5860],{},"show()"," 中查找 ",[34,5863,5864],{},"lesson"," 时先在局部找到，查找 ",[34,5867,5654],{}," 时到外层 ",[34,5870,5871],{},"outer()"," 找到。",[45,5874,5875,5877,5878,5880],{},[34,5876,4590],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5879,2215],{}," 最后在内置作用域找到。",[336,5882,2704],{"id":2704},[10,5884,5885],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5887,5888],{},[26,5889],{"alt":5890,"src":5891},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5893,5894],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5896,174],{"id":174},[42,5898,5899,5902],{},[45,5900,5901],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,5903,5904],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5906,191],{"id":191},[158,5908,5909,5912],{},[45,5910,5911],{},"在内外层定义同名变量，观察最近作用域优先。",[45,5913,5914],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5916,213],{},[14,5918,216],{"id":216},[10,5920,5921],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,5923,223],{},{"title":71,"searchDepth":84,"depth":84,"links":5925},[5926,5927,5928,5929,5930,5933,5934,5935],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":5931},[5932],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5735,"description":5740},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[234,5943,5944],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5947,"title":5948,"body":5949,"category":234,"cover":235,"description":5953,"extension":236,"meta":6103,"navigation":87,"path":6104,"pinned":239,"publishedAt":240,"seo":6105,"slug":6106,"stem":6107,"summary":6108,"tags":6109,"updatedAt":240,"visible":87,"__hash__":6112},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5950,"toc":6093},[5951,5954,5956,5959,5961,5967,5970,5972,5991,5993,5995,6029,6031,6037,6039,6041,6056,6058,6070,6072,6084,6086,6088,6091],[10,5952,5953],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5955,16],{"id":16},[10,5957,5958],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5960,22],{"id":22},[10,5962,5963],{},[26,5964],{"alt":5965,"src":5966},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5968,5969],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5971,40],{"id":40},[42,5973,5974,5977,5980],{},[45,5975,5976],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,5978,5979],{},"注解表达接口意图，不代替输入校验和测试。",[45,5981,5982,5983,2264,5985,2264,5987,5990],{},"基础注解优先使用 ",[34,5984,2267],{},[34,5986,2433],{},[34,5988,5989],{},"list[str]"," 等直接写法。",[14,5992,61],{"id":61},[10,5994,64],{},[66,5996,5998],{"className":68,"code":5997,"language":70,"meta":71,"style":71},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5999,6000,6005,6010,6015,6019,6024],{"__ignoreMap":71},[75,6001,6002],{"class":77,"line":78},[75,6003,6004],{},"def format_score(name: str, score: int) -> str:\n",[75,6006,6007],{"class":77,"line":84},[75,6008,6009],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[75,6011,6012],{"class":77,"line":91},[75,6013,6014],{},"    return name + \"：\" + str(score)\n",[75,6016,6017],{"class":77,"line":97},[75,6018,88],{"emptyLinePlaceholder":87},[75,6020,6021],{"class":77,"line":102},[75,6022,6023],{},"print(format_score(\"小郑\", 95))\n",[75,6025,6026],{"class":77,"line":108},[75,6027,6028],{},"print(format_score.__doc__)\n",[10,6030,142],{},[66,6032,6035],{"className":6033,"code":6034,"language":148,"meta":71},[146],"小郑：95\n返回带姓名的分数文本。\n",[34,6036,6034],{"__ignoreMap":71},[10,6038,153],{},[14,6040,156],{"id":156},[158,6042,6043,6053],{},[45,6044,6045,6046,6049,6050,6052],{},"函数签名说明 ",[34,6047,6048],{},"name"," 预期为字符串、",[34,6051,2253],{}," 预期为整数，返回值预期为字符串。",[45,6054,6055],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6057,174],{"id":174},[42,6059,6060,6067],{},[45,6061,6062,6063,6066],{},"认为加了 ",[34,6064,6065],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,6068,6069],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6071,191],{"id":191},[158,6073,6074,6077],{},[45,6075,6076],{},"为面积函数补充参数和返回值注解。",[45,6078,6079,6080,6083],{},"通过 ",[34,6081,6082],{},"函数名.__doc__"," 查看文档字符串。",[10,6085,213],{},[14,6087,216],{"id":216},[10,6089,6090],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6092,223],{},{"title":71,"searchDepth":84,"depth":84,"links":6094},[6095,6096,6097,6098,6099,6100,6101,6102],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5948,"description":5953},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[234,6110,6111],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6114,"title":6115,"body":6116,"category":234,"cover":235,"description":6120,"extension":236,"meta":6347,"navigation":87,"path":6348,"pinned":239,"publishedAt":240,"seo":6349,"slug":6350,"stem":6351,"summary":6352,"tags":6353,"updatedAt":240,"visible":87,"__hash__":6356},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6117,"toc":6335},[6118,6121,6123,6129,6131,6137,6148,6150,6168,6170,6177,6206,6213,6232,6241,6243,6249,6251,6253,6276,6278,6281,6287,6293,6295,6311,6313,6326,6328,6330,6333],[10,6119,6120],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6122,16],{"id":16},[10,6124,6125,6126,6128],{},"本篇只处理“模块、import 与 ",[302,6127,6048],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6130,22],{"id":22},[10,6132,6133],{},[26,6134],{"alt":6135,"src":6136},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6138,6139,6140,6143,6144,6147],{},"同一个文件直接运行时 ",[34,6141,6142],{},"__name__"," 等于 ",[34,6145,6146],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6149,40],{"id":40},[42,6151,6152,6158,6161],{},[45,6153,6154,6155,6157],{},"一个 ",[34,6156,1178],{}," 文件就是一个模块。",[45,6159,6160],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,6162,6163,6164,6167],{},"避免使用 ",[34,6165,6166],{},"from module import *","，它会让名字来源不清楚。",[14,6169,61],{"id":61},[10,6171,6172,6173,6176],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6174,6175],{},"calculator.py","：",[66,6178,6180],{"className":68,"code":6179,"language":70,"meta":71,"style":71},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6181,6182,6187,6192,6196,6201],{"__ignoreMap":71},[75,6183,6184],{"class":77,"line":78},[75,6185,6186],{},"def add(left, right):\n",[75,6188,6189],{"class":77,"line":84},[75,6190,6191],{},"    return left + right\n",[75,6193,6194],{"class":77,"line":91},[75,6195,88],{"emptyLinePlaceholder":87},[75,6197,6198],{"class":77,"line":97},[75,6199,6200],{},"if __name__ == \"__main__\":\n",[75,6202,6203],{"class":77,"line":102},[75,6204,6205],{},"    print(add(2, 3))\n",[10,6207,6208,6209,6212],{},"再创建 ",[34,6210,6211],{},"app.py","，从模块中导入函数：",[66,6214,6216],{"className":68,"code":6215,"language":70,"meta":71,"style":71},"from calculator import add\n\nprint(add(10, 20))\n",[34,6217,6218,6223,6227],{"__ignoreMap":71},[75,6219,6220],{"class":77,"line":78},[75,6221,6222],{},"from calculator import add\n",[75,6224,6225],{"class":77,"line":84},[75,6226,88],{"emptyLinePlaceholder":87},[75,6228,6229],{"class":77,"line":91},[75,6230,6231],{},"print(add(10, 20))\n",[10,6233,6234,6235,1164,6238,168],{},"分别执行 ",[34,6236,6237],{},"python3 calculator.py",[34,6239,6240],{},"python3 app.py",[10,6242,142],{},[66,6244,6247],{"className":6245,"code":6246,"language":148,"meta":71},[146],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6248,6246],{"__ignoreMap":71},[10,6250,153],{},[14,6252,156],{"id":156},[158,6254,6255,6265],{},[45,6256,6257,6258,6260,6261,6264],{},"直接运行 ",[34,6259,6175],{}," 时，模块名是 ",[34,6262,6263],{},"__main__","，入口代码输出 5。",[45,6266,6267,6269,6270,6272,6273,6275],{},[34,6268,6211],{}," 导入模块时，",[34,6271,6175],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6274,6211],{}," 调用函数输出 30。",[336,6277,2704],{"id":2704},[10,6279,6280],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6282,6283],{},[26,6284],{"alt":6285,"src":6286},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6288,6289,6290,6292],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6291,6263],{}," 保护下的演示代码。",[14,6294,174],{"id":174},[42,6296,6297,6304],{},[45,6298,6299,6300,1164,6302,168],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6301,6175],{},[34,6303,6211],{},[45,6305,6306,6307,6310],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6308,6309],{},"json.py","，导致导入目标被遮蔽。",[14,6312,191],{"id":191},[158,6314,6315,6321],{},[45,6316,2361,6317,6320],{},[34,6318,6319],{},"text_tools.py"," 并导出一个格式化函数。",[45,6322,6323,6324,168],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6325,6142],{},[10,6327,213],{},[14,6329,216],{"id":216},[10,6331,6332],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6334,223],{},{"title":71,"searchDepth":84,"depth":84,"links":6336},[6337,6338,6339,6340,6341,6344,6345,6346],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":6342},[6343],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6115,"description":6120},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[234,6354,6355],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6358,"title":6359,"body":6360,"category":234,"cover":235,"description":6364,"extension":236,"meta":6529,"navigation":87,"path":6530,"pinned":239,"publishedAt":240,"seo":6531,"slug":6532,"stem":6533,"summary":6534,"tags":6535,"updatedAt":240,"visible":87,"__hash__":6537},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6361,"toc":6519},[6362,6365,6367,6370,6372,6378,6381,6383,6397,6399,6401,6447,6449,6455,6457,6459,6485,6487,6497,6499,6510,6512,6514,6517],[10,6363,6364],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6366,16],{"id":16},[10,6368,6369],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6371,22],{"id":22},[10,6373,6374],{},[26,6375],{"alt":6376,"src":6377},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6379,6380],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6382,40],{"id":40},[42,6384,6385,6391,6394],{},[45,6386,6387,6390],{},[34,6388,6389],{},".venv"," 是常见目录名，不应提交到 Git。",[45,6392,6393],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,6395,6396],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6398,61],{"id":61},[10,6400,1581],{},[66,6402,6404],{"className":598,"code":6403,"language":600,"meta":71,"style":71},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6405,6406,6418,6426,6432,6442],{"__ignoreMap":71},[75,6407,6408,6410,6412,6415],{"class":77,"line":78},[75,6409,698],{"class":607},[75,6411,640],{"class":610},[75,6413,6414],{"class":643}," venv",[75,6416,6417],{"class":643}," .venv\n",[75,6419,6420,6423],{"class":77,"line":84},[75,6421,6422],{"class":610},"source",[75,6424,6425],{"class":643}," .venv\u002Fbin\u002Factivate\n",[75,6427,6428,6430],{"class":77,"line":91},[75,6429,70],{"class":607},[75,6431,611],{"class":610},[75,6433,6434,6436,6438,6440],{"class":77,"line":97},[75,6435,70],{"class":607},[75,6437,640],{"class":610},[75,6439,644],{"class":643},[75,6441,611],{"class":610},[75,6443,6444],{"class":77,"line":102},[75,6445,6446],{"class":607},"deactivate\n",[10,6448,142],{},[66,6450,6453],{"className":6451,"code":6452,"language":148,"meta":71},[146],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6454,6452],{"__ignoreMap":71},[10,6456,153],{},[14,6458,156],{"id":156},[158,6460,6461,6470],{},[45,6462,6463,6466,6467,6469],{},[34,6464,6465],{},"venv"," 根据当前 ",[34,6468,698],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,6471,6472,6473,2183,6475,6478,6479,3735,6481,6484],{},"激活后 ",[34,6474,70],{},[34,6476,6477],{},"python -m pip"," 优先指向 ",[34,6480,6389],{},[34,6482,6483],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6486,174],{"id":174},[42,6488,6489,6492],{},[45,6490,6491],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,6493,3474,6494,6496],{},[34,6495,6389],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6498,191],{"id":191},[158,6500,6501,6507],{},[45,6502,6503,6504,168],{},"创建虚拟环境并记录激活前后的 ",[34,6505,6506],{},"which python",[45,6508,6509],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6511,213],{},[14,6513,216],{"id":216},[10,6515,6516],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6518,1665],{},{"title":71,"searchDepth":84,"depth":84,"links":6520},[6521,6522,6523,6524,6525,6526,6527,6528],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6359,"description":6364},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[234,6536,268],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6539,"title":6540,"body":6541,"category":234,"cover":235,"description":6545,"extension":236,"meta":6732,"navigation":87,"path":6733,"pinned":239,"publishedAt":240,"seo":6734,"slug":6735,"stem":6736,"summary":6737,"tags":6738,"updatedAt":240,"visible":87,"__hash__":6741},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6542,"toc":6722},[6543,6546,6548,6551,6553,6559,6568,6570,6594,6596,6598,6650,6652,6658,6660,6662,6678,6680,6699,6701,6713,6715,6717,6720],[10,6544,6545],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6547,16],{"id":16},[10,6549,6550],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6552,22],{"id":22},[10,6554,6555],{},[26,6556],{"alt":6557,"src":6558},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6560,6561,6564,6565,6567],{},[34,6562,6563],{},"Path"," 使用 ",[34,6566,2443],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6569,40],{"id":40},[42,6571,6572,6575,6587],{},[45,6573,6574],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,6576,6577,2264,6580,2264,6583,6586],{},[34,6578,6579],{},"exists()",[34,6581,6582],{},"is_file()",[34,6584,6585],{},"is_dir()"," 检查真实文件系统状态。",[45,6588,6589,6590,6593],{},"创建目录前明确目标；",[34,6591,6592],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6595,61],{"id":61},[10,6597,64],{},[66,6599,6601],{"className":68,"code":6600,"language":70,"meta":71,"style":71},"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",[34,6602,6603,6607,6611,6616,6621,6626,6630,6635,6640,6645],{"__ignoreMap":71},[75,6604,6605],{"class":77,"line":78},[75,6606,81],{},[75,6608,6609],{"class":77,"line":84},[75,6610,88],{"emptyLinePlaceholder":87},[75,6612,6613],{"class":77,"line":91},[75,6614,6615],{},"project = Path.cwd()\n",[75,6617,6618],{"class":77,"line":97},[75,6619,6620],{},"data_dir = project \u002F \"data\"\n",[75,6622,6623],{"class":77,"line":102},[75,6624,6625],{},"file_path = data_dir \u002F \"records.json\"\n",[75,6627,6628],{"class":77,"line":108},[75,6629,88],{"emptyLinePlaceholder":87},[75,6631,6632],{"class":77,"line":114},[75,6633,6634],{},"print(project)\n",[75,6636,6637],{"class":77,"line":119},[75,6638,6639],{},"print(file_path.name)\n",[75,6641,6642],{"class":77,"line":125},[75,6643,6644],{},"print(file_path.suffix)\n",[75,6646,6647],{"class":77,"line":131},[75,6648,6649],{},"print(file_path.exists())\n",[10,6651,142],{},[66,6653,6656],{"className":6654,"code":6655,"language":148,"meta":71},[146],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6657,6655],{"__ignoreMap":71},[10,6659,153],{},[14,6661,156],{"id":156},[158,6663,6664,6670],{},[45,6665,6666,6669],{},[34,6667,6668],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,6671,2346,6672,6674,6675,6677],{},[34,6673,2443],{}," 组合路径片段只创建新的 ",[34,6676,6563],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6679,174],{"id":174},[42,6681,6682,6690],{},[45,6683,3474,6684,6686,6687,6689],{},[34,6685,6563],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6688,6579],{}," 等方法确认。",[45,6691,6692,6693,1016,6695,6698],{},"手工拼接 ",[34,6694,2443],{},[34,6696,6697],{},"\\"," 分隔符，降低跨平台可读性。",[14,6700,191],{"id":191},[158,6702,6703,6710],{},[45,6704,6705,6706,6709],{},"组合 ",[34,6707,6708],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,6711,6712],{},"输出路径的父目录、文件名和扩展名。",[10,6714,213],{},[14,6716,216],{"id":216},[10,6718,6719],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6721,223],{},{"title":71,"searchDepth":84,"depth":84,"links":6723},[6724,6725,6726,6727,6728,6729,6730,6731],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6540,"description":6545},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[234,6739,6740],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6743,"title":6744,"body":6745,"category":234,"cover":235,"description":6749,"extension":236,"meta":6925,"navigation":87,"path":6926,"pinned":239,"publishedAt":240,"seo":6927,"slug":6928,"stem":6929,"summary":6930,"tags":6931,"updatedAt":240,"visible":87,"__hash__":6934},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6746,"toc":6915},[6747,6750,6752,6755,6757,6763,6766,6768,6795,6797,6799,6855,6857,6863,6865,6867,6878,6880,6893,6895,6906,6908,6910,6913],[10,6748,6749],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6751,16],{"id":16},[10,6753,6754],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6756,22],{"id":22},[10,6758,6759],{},[26,6760],{"alt":6761,"src":6762},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6764,6765],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6767,40],{"id":40},[42,6769,6770,6776,6785],{},[45,6771,6772,6775],{},[34,6773,6774],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,6777,6778,6781,6782,168],{},[34,6779,6780],{},"r"," 模式读取不存在文件会产生 ",[34,6783,6784],{},"FileNotFoundError",[45,6786,6787,6788,6791,6792,6794],{},"本篇显式调用 ",[34,6789,6790],{},"close()","；第 34 篇会用 ",[34,6793,36],{}," 更可靠地管理关闭动作。",[14,6796,61],{"id":61},[10,6798,64],{},[66,6800,6802],{"className":68,"code":6801,"language":70,"meta":71,"style":71},"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",[34,6803,6804,6808,6812,6816,6821,6826,6831,6835,6840,6845,6850],{"__ignoreMap":71},[75,6805,6806],{"class":77,"line":78},[75,6807,81],{},[75,6809,6810],{"class":77,"line":84},[75,6811,88],{"emptyLinePlaceholder":87},[75,6813,6814],{"class":77,"line":91},[75,6815,94],{},[75,6817,6818],{"class":77,"line":97},[75,6819,6820],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[75,6822,6823],{"class":77,"line":102},[75,6824,6825],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[75,6827,6828],{"class":77,"line":108},[75,6829,6830],{},"writer.close()\n",[75,6832,6833],{"class":77,"line":114},[75,6834,88],{"emptyLinePlaceholder":87},[75,6836,6837],{"class":77,"line":119},[75,6838,6839],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[75,6841,6842],{"class":77,"line":125},[75,6843,6844],{},"content = reader.read()\n",[75,6846,6847],{"class":77,"line":131},[75,6848,6849],{},"reader.close()\n",[75,6851,6852],{"class":77,"line":136},[75,6853,6854],{},"print(content)\n",[10,6856,142],{},[66,6858,6861],{"className":6859,"code":6860,"language":148,"meta":71},[146],"变量\n循环\n函数\n",[34,6862,6860],{"__ignoreMap":71},[10,6864,153],{},[14,6866,156],{"id":156},[158,6868,6869,6875],{},[45,6870,6871,6872,6874],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6873,6790],{}," 确保缓冲内容交给文件系统。",[45,6876,6877],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6879,174],{"id":174},[42,6881,6882,6887],{},[45,6883,2346,6884,6886],{},[34,6885,6774],{}," 模式打开重要文件却未确认覆盖风险。",[45,6888,6889,6890,168],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6891,6892],{},"encoding=\"utf-8\"",[14,6894,191],{"id":191},[158,6896,6897,6900],{},[45,6898,6899],{},"写入三行学习记录并读取。",[45,6901,6902,6903,6905],{},"改用 ",[34,6904,344],{}," 模式追加一行，确认原内容仍保留。",[10,6907,213],{},[14,6909,216],{"id":216},[10,6911,6912],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,6914,223],{},{"title":71,"searchDepth":84,"depth":84,"links":6916},[6917,6918,6919,6920,6921,6922,6923,6924],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6744,"description":6749},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[234,6932,6933],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6936,"title":6937,"body":6938,"category":234,"cover":235,"description":6942,"extension":236,"meta":7109,"navigation":87,"path":7110,"pinned":239,"publishedAt":240,"seo":7111,"slug":7112,"stem":7113,"summary":7114,"tags":7115,"updatedAt":240,"visible":87,"__hash__":7118},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6939,"toc":7099},[6940,6943,6945,6948,6950,6956,6966,6968,6982,6984,6986,7046,7048,7054,7056,7058,7070,7072,7080,7082,7090,7092,7094,7097],[10,6941,6942],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6944,16],{"id":16},[10,6946,6947],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6949,22],{"id":22},[10,6951,6952],{},[26,6953],{"alt":6954,"src":6955},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6957,6958,6961,6962,6965],{},[34,6959,6960],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6963,6964],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6967,40],{"id":40},[42,6969,6970,6973,6979],{},[45,6971,6972],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,6974,6975,6978],{},[34,6976,6977],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,6980,6981],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6983,61],{"id":61},[10,6985,64],{},[66,6987,6989],{"className":68,"code":6988,"language":70,"meta":71,"style":71},"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",[34,6990,6991,6996,7000,7005,7009,7014,7019,7023,7027,7032,7037,7041],{"__ignoreMap":71},[75,6992,6993],{"class":77,"line":78},[75,6994,6995],{},"import json\n",[75,6997,6998],{"class":77,"line":84},[75,6999,88],{"emptyLinePlaceholder":87},[75,7001,7002],{"class":77,"line":91},[75,7003,7004],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[75,7006,7007],{"class":77,"line":97},[75,7008,88],{"emptyLinePlaceholder":87},[75,7010,7011],{"class":77,"line":102},[75,7012,7013],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[75,7015,7016],{"class":77,"line":108},[75,7017,7018],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[75,7020,7021],{"class":77,"line":114},[75,7022,6830],{},[75,7024,7025],{"class":77,"line":119},[75,7026,88],{"emptyLinePlaceholder":87},[75,7028,7029],{"class":77,"line":125},[75,7030,7031],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[75,7033,7034],{"class":77,"line":131},[75,7035,7036],{},"loaded = json.load(reader)\n",[75,7038,7039],{"class":77,"line":136},[75,7040,6849],{},[75,7042,7043],{"class":77,"line":5838},[75,7044,7045],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7047,142],{},[66,7049,7052],{"className":7050,"code":7051,"language":148,"meta":71},[146],"Python 60\n",[34,7053,7051],{"__ignoreMap":71},[10,7055,153],{},[14,7057,156],{"id":156},[158,7059,7060,7065],{},[45,7061,7062,7064],{},[34,7063,6960],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,7066,7067,7069],{},[34,7068,6964],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7071,174],{"id":174},[42,7073,7074,7077],{},[45,7075,7076],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,7078,7079],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7081,191],{"id":191},[158,7083,7084,7087],{},[45,7085,7086],{},"保存包含两条学习记录的列表。",[45,7088,7089],{},"读取后修改进度，再重新写回文件。",[10,7091,213],{},[14,7093,216],{"id":216},[10,7095,7096],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7098,223],{},{"title":71,"searchDepth":84,"depth":84,"links":7100},[7101,7102,7103,7104,7105,7106,7107,7108],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6937,"description":6942},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[234,7116,7117],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7120,"title":7121,"body":7122,"category":234,"cover":235,"description":7126,"extension":236,"meta":7310,"navigation":87,"path":7311,"pinned":239,"publishedAt":240,"seo":7312,"slug":7313,"stem":7314,"summary":7315,"tags":7316,"updatedAt":240,"visible":87,"__hash__":7319},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7123,"toc":7300},[7124,7127,7129,7132,7134,7140,7146,7148,7170,7172,7174,7237,7239,7245,7247,7249,7265,7267,7281,7283,7291,7293,7295,7298],[10,7125,7126],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7128,16],{"id":16},[10,7130,7131],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7133,22],{"id":22},[10,7135,7136],{},[26,7137],{"alt":7138,"src":7139},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7141,7142,7145],{},[34,7143,7144],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7147,40],{"id":40},[42,7149,7150,7160,7167],{},[45,7151,2346,7152,7155,7156,7159],{},[34,7153,7154],{},"newline=\"\""," 让 ",[34,7157,7158],{},"csv"," 模块正确处理换行。",[45,7161,7162,7163,7166],{},"字段顺序由 ",[34,7164,7165],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,7168,7169],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7171,61],{"id":61},[10,7173,64],{},[66,7175,7177],{"className":68,"code":7176,"language":70,"meta":71,"style":71},"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",[34,7178,7179,7184,7188,7193,7198,7203,7208,7213,7217,7222,7227,7232],{"__ignoreMap":71},[75,7180,7181],{"class":77,"line":78},[75,7182,7183],{},"import csv\n",[75,7185,7186],{"class":77,"line":84},[75,7187,88],{"emptyLinePlaceholder":87},[75,7189,7190],{"class":77,"line":91},[75,7191,7192],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[75,7194,7195],{"class":77,"line":97},[75,7196,7197],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[75,7199,7200],{"class":77,"line":102},[75,7201,7202],{},"writer.writeheader()\n",[75,7204,7205],{"class":77,"line":108},[75,7206,7207],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[75,7209,7210],{"class":77,"line":114},[75,7211,7212],{},"writer_file.close()\n",[75,7214,7215],{"class":77,"line":119},[75,7216,88],{"emptyLinePlaceholder":87},[75,7218,7219],{"class":77,"line":125},[75,7220,7221],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[75,7223,7224],{"class":77,"line":131},[75,7225,7226],{},"for row in csv.DictReader(reader_file):\n",[75,7228,7229],{"class":77,"line":136},[75,7230,7231],{},"    print(row[\"name\"], row[\"score\"])\n",[75,7233,7234],{"class":77,"line":5838},[75,7235,7236],{},"reader_file.close()\n",[10,7238,142],{},[66,7240,7243],{"className":7241,"code":7242,"language":148,"meta":71},[146],"小郑 95\n",[34,7244,7242],{"__ignoreMap":71},[10,7246,153],{},[14,7248,156],{"id":156},[158,7250,7251,7260],{},[45,7252,7253,7256,7257,7259],{},[34,7254,7255],{},"DictWriter"," 按 ",[34,7258,7165],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,7261,7262,7264],{},[34,7263,7144],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7266,174],{"id":174},[42,7268,7269,7272],{},[45,7270,7271],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,7273,7274,7275,7277,7278,7280],{},"在 macOS 以外环境忽略 ",[34,7276,7154],{}," 可能出现额外空行；统一交给 ",[34,7279,7158],{}," 模块管理换行。",[14,7282,191],{"id":191},[158,7284,7285,7288],{},[45,7286,7287],{},"写入三名学习者的课程和分数。",[45,7289,7290],{},"读取 CSV 后把分数字符串转换为整数。",[10,7292,213],{},[14,7294,216],{"id":216},[10,7296,7297],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7299,223],{},{"title":71,"searchDepth":84,"depth":84,"links":7301},[7302,7303,7304,7305,7306,7307,7308,7309],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7121,"description":7126},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[234,7317,7318],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7321,"title":7322,"body":7323,"category":234,"cover":235,"description":7327,"extension":236,"meta":7600,"navigation":87,"path":7601,"pinned":239,"publishedAt":240,"seo":7602,"slug":7603,"stem":7604,"summary":7605,"tags":7606,"updatedAt":240,"visible":87,"__hash__":7609},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7324,"toc":7587},[7325,7328,7330,7333,7335,7341,7352,7354,7371,7373,7375,7450,7452,7458,7460,7462,7487,7489,7498,7504,7515,7517,7523,7529,7538,7540,7555,7557,7578,7580,7582,7585],[10,7326,7327],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7329,16],{"id":16},[10,7331,7332],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7334,22],{"id":22},[10,7336,7337],{},[26,7338],{"alt":7339,"src":7340},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7342,7343,7344,7347,7348,7351],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7345,7346],{},"except","；无论是否异常，",[34,7349,7350],{},"finally"," 都会在离开结构前执行。",[14,7353,40],{"id":40},[42,7355,7356,7362,7368],{},[45,7357,7358,7359,7361],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7360,7346],{}," 吞掉全部错误。",[45,7363,7364,7367],{},[34,7365,7366],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,7369,7370],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7372,61],{"id":61},[10,7374,64],{},[66,7376,7378],{"className":68,"code":7377,"language":70,"meta":71,"style":71},"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",[34,7379,7380,7385,7390,7395,7400,7405,7409,7414,7419,7424,7429,7433,7438,7444],{"__ignoreMap":71},[75,7381,7382],{"class":77,"line":78},[75,7383,7384],{},"def parse_age(text):\n",[75,7386,7387],{"class":77,"line":84},[75,7388,7389],{},"    age = int(text)\n",[75,7391,7392],{"class":77,"line":91},[75,7393,7394],{},"    if age \u003C 0:\n",[75,7396,7397],{"class":77,"line":97},[75,7398,7399],{},"        raise ValueError(\"年龄不能为负数\")\n",[75,7401,7402],{"class":77,"line":102},[75,7403,7404],{},"    return age\n",[75,7406,7407],{"class":77,"line":108},[75,7408,88],{"emptyLinePlaceholder":87},[75,7410,7411],{"class":77,"line":114},[75,7412,7413],{},"try:\n",[75,7415,7416],{"class":77,"line":119},[75,7417,7418],{},"    age = parse_age(\"18\")\n",[75,7420,7421],{"class":77,"line":125},[75,7422,7423],{},"except ValueError as error:\n",[75,7425,7426],{"class":77,"line":131},[75,7427,7428],{},"    print(\"输入错误：\", error)\n",[75,7430,7431],{"class":77,"line":136},[75,7432,1153],{},[75,7434,7435],{"class":77,"line":5838},[75,7436,7437],{},"    print(\"年龄：\", age)\n",[75,7439,7441],{"class":77,"line":7440},13,[75,7442,7443],{},"finally:\n",[75,7445,7447],{"class":77,"line":7446},14,[75,7448,7449],{},"    print(\"处理结束\")\n",[10,7451,142],{},[66,7453,7456],{"className":7454,"code":7455,"language":148,"meta":71},[146],"年龄： 18\n处理结束\n",[34,7457,7455],{"__ignoreMap":71},[10,7459,153],{},[14,7461,156],{"id":156},[158,7463,7464,7476],{},[45,7465,7466,7468,7469,7471,7472,7475],{},[34,7467,3043],{}," 或主动 ",[34,7470,7366],{}," 都可能产生 ",[34,7473,7474],{},"ValueError","，控制流立即离开当前正常路径。",[45,7477,7478,7479,7481,7482,7484,7485,168],{},"有异常时进入匹配的 ",[34,7480,7346],{},"；没有异常时执行 ",[34,7483,1167],{},"；两种情况最后都会执行 ",[34,7486,7350],{},[336,7488,2704],{"id":2704},[10,7490,7491,2264,7493,1164,7495,7497],{},[34,7492,7346],{},[34,7494,1167],{},[34,7496,7350],{}," 的职责不同，不能只看它们出现的顺序。",[10,7499,7500],{},[26,7501],{"alt":7502,"src":7503},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7505,7506,7508,7509,7511,7512,7514],{},[34,7507,7346],{}," 处理匹配异常，",[34,7510,1167],{}," 只在无异常时运行，",[34,7513,7350],{}," 负责两条路径都需要的清理动作。",[336,7516,2704],{"id":4225},[10,7518,7519,7522],{},[34,7520,7521],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7524,7525],{},[26,7526],{"alt":7527,"src":7528},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7530,7531,7532,7534,7535,7537],{},"只把可能产生预期异常的操作放进 ",[34,7533,7521],{},"，后续正常业务放进 ",[34,7536,1167],{},"，错误边界会更清楚。",[14,7539,174],{"id":174},[42,7541,7542,7549],{},[45,7543,7544,7545,7548],{},"使用裸 ",[34,7546,7547],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,7550,7551,7552,7554],{},"把整个程序包在一个巨大 ",[34,7553,7521],{}," 中，无法判断究竟哪一步允许失败。",[14,7556,191],{"id":191},[158,7558,7559,7572],{},[45,7560,7561,7562,7565,7566,1164,7569,168],{},"让 ",[34,7563,7564],{},"parse_age"," 分别处理 ",[34,7567,7568],{},"\"abc\"",[34,7570,7571],{},"\"-1\"",[45,7573,7574,7575,7577],{},"为文件读取捕获 ",[34,7576,6784],{}," 并给出清晰提示。",[10,7579,213],{},[14,7581,216],{"id":216},[10,7583,7584],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7586,223],{},{"title":71,"searchDepth":84,"depth":84,"links":7588},[7589,7590,7591,7592,7593,7597,7598,7599],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":7594},[7595,7596],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7322,"description":7327},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[234,7607,7608],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":4,"title":5,"body":7611,"category":234,"cover":235,"description":12,"extension":236,"meta":7762,"navigation":87,"path":238,"pinned":239,"publishedAt":240,"seo":7763,"slug":242,"stem":243,"summary":244,"tags":7764,"updatedAt":240,"visible":87,"__hash__":247},{"type":7,"value":7612,"toc":7752},[7613,7615,7617,7619,7621,7625,7629,7631,7643,7645,7647,7695,7697,7702,7704,7706,7716,7718,7728,7730,7744,7746,7748,7750],[10,7614,12],{},[14,7616,16],{"id":16},[10,7618,19],{},[14,7620,22],{"id":22},[10,7622,7623],{},[26,7624],{"alt":28,"src":29},[10,7626,32,7627,37],{},[34,7628,36],{},[14,7630,40],{"id":40},[42,7632,7633,7637,7641],{},[45,7634,7635,49],{},[34,7636,36],{},[45,7638,7639,55],{},[34,7640,54],{},[45,7642,58],{},[14,7644,61],{"id":61},[10,7646,64],{},[66,7648,7649],{"className":68,"code":69,"language":70,"meta":71,"style":71},[34,7650,7651,7655,7659,7663,7667,7671,7675,7679,7683,7687,7691],{"__ignoreMap":71},[75,7652,7653],{"class":77,"line":78},[75,7654,81],{},[75,7656,7657],{"class":77,"line":84},[75,7658,88],{"emptyLinePlaceholder":87},[75,7660,7661],{"class":77,"line":91},[75,7662,94],{},[75,7664,7665],{"class":77,"line":97},[75,7666,88],{"emptyLinePlaceholder":87},[75,7668,7669],{"class":77,"line":102},[75,7670,105],{},[75,7672,7673],{"class":77,"line":108},[75,7674,111],{},[75,7676,7677],{"class":77,"line":114},[75,7678,88],{"emptyLinePlaceholder":87},[75,7680,7681],{"class":77,"line":119},[75,7682,122],{},[75,7684,7685],{"class":77,"line":125},[75,7686,128],{},[75,7688,7689],{"class":77,"line":131},[75,7690,88],{"emptyLinePlaceholder":87},[75,7692,7693],{"class":77,"line":136},[75,7694,139],{},[10,7696,142],{},[66,7698,7700],{"className":7699,"code":147,"language":148,"meta":71},[146],[34,7701,147],{"__ignoreMap":71},[10,7703,153],{},[14,7705,156],{"id":156},[158,7707,7708,7714],{},[45,7709,32,7710,164,7712,168],{},[34,7711,36],{},[34,7713,167],{},[45,7715,171],{},[14,7717,174],{"id":174},[42,7719,7720,7724],{},[45,7721,179,7722,182],{},[34,7723,36],{},[45,7725,185,7726,188],{},[34,7727,36],{},[14,7729,191],{"id":191},[158,7731,7732,7738],{},[45,7733,196,7734,200,7736,168],{},[34,7735,199],{},[34,7737,36],{},[45,7739,179,7740,207,7742,168],{},[34,7741,36],{},[34,7743,210],{},[10,7745,213],{},[14,7747,216],{"id":216},[10,7749,219],{},[221,7751,223],{},{"title":71,"searchDepth":84,"depth":84,"links":7753},[7754,7755,7756,7757,7758,7759,7760,7761],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5,"description":12},[234,36,246],{"id":7766,"title":7767,"body":7768,"category":234,"cover":235,"description":7772,"extension":236,"meta":7984,"navigation":87,"path":7985,"pinned":239,"publishedAt":240,"seo":7986,"slug":7987,"stem":7988,"summary":7989,"tags":7990,"updatedAt":240,"visible":87,"__hash__":7993},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7769,"toc":7972},[7770,7773,7775,7778,7780,7786,7789,7791,7808,7810,7812,7880,7882,7888,7890,7892,7917,7919,7922,7928,7937,7939,7950,7952,7963,7965,7967,7970],[10,7771,7772],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7774,16],{"id":16},[10,7776,7777],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7779,22],{"id":22},[10,7781,7782],{},[26,7783],{"alt":7784,"src":7785},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7787,7788],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7790,40],{"id":40},[42,7792,7793,7799,7805],{},[45,7794,7795,7798],{},[34,7796,7797],{},"self"," 表示当前实例，由方法调用自动传入。",[45,7800,7801,7804],{},[34,7802,7803],{},"__init__"," 在实例创建过程中初始化属性。",[45,7806,7807],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7809,61],{"id":61},[10,7811,64],{},[66,7813,7815],{"className":68,"code":7814,"language":70,"meta":71,"style":71},"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",[34,7816,7817,7822,7827,7832,7837,7841,7846,7851,7856,7861,7865,7870,7875],{"__ignoreMap":71},[75,7818,7819],{"class":77,"line":78},[75,7820,7821],{},"class LearningRecord:\n",[75,7823,7824],{"class":77,"line":84},[75,7825,7826],{},"    def __init__(self, course, progress=0):\n",[75,7828,7829],{"class":77,"line":91},[75,7830,7831],{},"        self.course = course\n",[75,7833,7834],{"class":77,"line":97},[75,7835,7836],{},"        self.progress = progress\n",[75,7838,7839],{"class":77,"line":102},[75,7840,88],{"emptyLinePlaceholder":87},[75,7842,7843],{"class":77,"line":108},[75,7844,7845],{},"    def advance(self, amount):\n",[75,7847,7848],{"class":77,"line":114},[75,7849,7850],{},"        self.progress = self.progress + amount\n",[75,7852,7853],{"class":77,"line":119},[75,7854,7855],{},"        if self.progress > 100:\n",[75,7857,7858],{"class":77,"line":125},[75,7859,7860],{},"            self.progress = 100\n",[75,7862,7863],{"class":77,"line":131},[75,7864,88],{"emptyLinePlaceholder":87},[75,7866,7867],{"class":77,"line":136},[75,7868,7869],{},"record = LearningRecord(\"Python\", 40)\n",[75,7871,7872],{"class":77,"line":5838},[75,7873,7874],{},"record.advance(15)\n",[75,7876,7877],{"class":77,"line":7440},[75,7878,7879],{},"print(record.course, record.progress)\n",[10,7881,142],{},[66,7883,7886],{"className":7884,"code":7885,"language":148,"meta":71},[146],"Python 55\n",[34,7887,7885],{"__ignoreMap":71},[10,7889,153],{},[14,7891,156],{"id":156},[158,7893,7894,7904],{},[45,7895,7896,7897,7900,7901,7903],{},"调用 ",[34,7898,7899],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7902,7803],{}," 把课程和进度保存在该实例属性中。",[45,7905,7906,7909,7910,7913,7914,7916],{},[34,7907,7908],{},"record.advance(15)"," 自动把 ",[34,7911,7912],{},"record"," 作为 ",[34,7915,7797],{},"，方法更新同一实例的进度并限制上限。",[336,7918,2704],{"id":2704},[10,7920,7921],{},"类是共同定义，实例则各自保存状态。",[10,7923,7924],{},[26,7925],{"alt":7926,"src":7927},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7929,7930,7931,1164,7933,7936],{},"两个实例共享同一套方法定义，但 ",[34,7932,4590],{},[34,7934,7935],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7938,174],{"id":174},[42,7940,7941,7947],{},[45,7942,7943,7944,7946],{},"调用实例方法时手工再传一次 ",[34,7945,7797],{},"。通过实例调用时 Python 会自动绑定。",[45,7948,7949],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7951,191],{"id":191},[158,7953,7954,7960],{},[45,7955,5302,7956,7959],{},[34,7957,7958],{},"Book"," 类，保存标题和阅读页数。",[45,7961,7962],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7964,213],{},[14,7966,216],{"id":216},[10,7968,7969],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,7971,223],{},{"title":71,"searchDepth":84,"depth":84,"links":7973},[7974,7975,7976,7977,7978,7981,7982,7983],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":7979},[7980],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7767,"description":7772},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[234,7991,7992],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7995,"title":7996,"body":7997,"category":234,"cover":235,"description":8001,"extension":236,"meta":8179,"navigation":87,"path":8180,"pinned":239,"publishedAt":240,"seo":8181,"slug":8182,"stem":8183,"summary":8184,"tags":8185,"updatedAt":240,"visible":87,"__hash__":8188},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7998,"toc":8169},[7999,8002,8004,8007,8009,8015,8018,8020,8031,8033,8035,8102,8104,8110,8112,8114,8133,8135,8143,8145,8160,8162,8164,8167],[10,8000,8001],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8003,16],{"id":16},[10,8005,8006],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8008,22],{"id":22},[10,8010,8011],{},[26,8012],{"alt":8013,"src":8014},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8016,8017],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8019,40],{"id":40},[42,8021,8022,8025,8028],{},[45,8023,8024],{},"封装让对象通过方法维护自己的有效状态。",[45,8026,8027],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,8029,8030],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8032,61],{"id":61},[10,8034,64],{},[66,8036,8038],{"className":68,"code":8037,"language":70,"meta":71,"style":71},"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",[34,8039,8040,8045,8050,8055,8059,8064,8069,8074,8078,8083,8088,8092,8097],{"__ignoreMap":71},[75,8041,8042],{"class":77,"line":78},[75,8043,8044],{},"class Storage:\n",[75,8046,8047],{"class":77,"line":84},[75,8048,8049],{},"    def save(self, text):\n",[75,8051,8052],{"class":77,"line":91},[75,8053,8054],{},"        print(\"保存：\", text)\n",[75,8056,8057],{"class":77,"line":97},[75,8058,88],{"emptyLinePlaceholder":87},[75,8060,8061],{"class":77,"line":102},[75,8062,8063],{},"class LearningService:\n",[75,8065,8066],{"class":77,"line":108},[75,8067,8068],{},"    def __init__(self, storage):\n",[75,8070,8071],{"class":77,"line":114},[75,8072,8073],{},"        self.storage = storage\n",[75,8075,8076],{"class":77,"line":119},[75,8077,88],{"emptyLinePlaceholder":87},[75,8079,8080],{"class":77,"line":125},[75,8081,8082],{},"    def finish_lesson(self, title):\n",[75,8084,8085],{"class":77,"line":131},[75,8086,8087],{},"        self.storage.save(title)\n",[75,8089,8090],{"class":77,"line":136},[75,8091,88],{"emptyLinePlaceholder":87},[75,8093,8094],{"class":77,"line":5838},[75,8095,8096],{},"service = LearningService(Storage())\n",[75,8098,8099],{"class":77,"line":7440},[75,8100,8101],{},"service.finish_lesson(\"异常处理\")\n",[10,8103,142],{},[66,8105,8108],{"className":8106,"code":8107,"language":148,"meta":71},[146],"保存： 异常处理\n",[34,8109,8107],{"__ignoreMap":71},[10,8111,153],{},[14,8113,156],{"id":156},[158,8115,8116,8126],{},[45,8117,8118,8121,8122,8125],{},[34,8119,8120],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8123,8124],{},"save()"," 的协作对象。",[45,8127,8128,8129,8132],{},"调用业务方法时，服务把保存动作委托给 ",[34,8130,8131],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8134,174],{"id":174},[42,8136,8137,8140],{},[45,8138,8139],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,8141,8142],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8144,191],{"id":191},[158,8146,8147,8157],{},[45,8148,8149,8150,8153,8154,168],{},"用组合让 ",[34,8151,8152],{},"OrderService"," 使用一个 ",[34,8155,8156],{},"Notifier",[45,8158,8159],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8161,213],{},[14,8163,216],{"id":216},[10,8165,8166],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8168,223],{},{"title":71,"searchDepth":84,"depth":84,"links":8170},[8171,8172,8173,8174,8175,8176,8177,8178],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7996,"description":8001},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[234,8186,8187],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8190,"title":8191,"body":8192,"category":234,"cover":235,"description":8196,"extension":236,"meta":8399,"navigation":87,"path":8400,"pinned":239,"publishedAt":240,"seo":8401,"slug":8402,"stem":8403,"summary":8404,"tags":8405,"updatedAt":240,"visible":87,"__hash__":8408},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8193,"toc":8387},[8194,8197,8199,8202,8204,8210,8217,8219,8244,8246,8248,8300,8302,8308,8310,8312,8333,8335,8341,8347,8353,8355,8363,8365,8378,8380,8382,8385],[10,8195,8196],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8198,16],{"id":16},[10,8200,8201],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8203,22],{"id":22},[10,8205,8206],{},[26,8207],{"alt":8208,"src":8209},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8211,8212,8213,8216],{},"生成器运行到 ",[34,8214,8215],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8218,40],{"id":40},[42,8220,8221,8231,8241],{},[45,8222,8223,8226,8227,8230],{},[34,8224,8225],{},"iter()"," 从可迭代对象取得迭代器，",[34,8228,8229],{},"next()"," 请求下一个值。",[45,8232,8233,8234,8237,8238,8240],{},"没有更多值时迭代器抛出 ",[34,8235,8236],{},"StopIteration","，",[34,8239,4344],{}," 会自动处理。",[45,8242,8243],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8245,61],{"id":61},[10,8247,64],{},[66,8249,8251],{"className":68,"code":8250,"language":70,"meta":71,"style":71},"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",[34,8252,8253,8258,8263,8268,8273,8278,8282,8287,8292,8296],{"__ignoreMap":71},[75,8254,8255],{"class":77,"line":78},[75,8256,8257],{},"def countdown(start):\n",[75,8259,8260],{"class":77,"line":84},[75,8261,8262],{},"    current = start\n",[75,8264,8265],{"class":77,"line":91},[75,8266,8267],{},"    while current > 0:\n",[75,8269,8270],{"class":77,"line":97},[75,8271,8272],{},"        yield current\n",[75,8274,8275],{"class":77,"line":102},[75,8276,8277],{},"        current = current - 1\n",[75,8279,8280],{"class":77,"line":108},[75,8281,88],{"emptyLinePlaceholder":87},[75,8283,8284],{"class":77,"line":114},[75,8285,8286],{},"iterator = countdown(3)\n",[75,8288,8289],{"class":77,"line":119},[75,8290,8291],{},"print(next(iterator))\n",[75,8293,8294],{"class":77,"line":125},[75,8295,8291],{},[75,8297,8298],{"class":77,"line":131},[75,8299,8291],{},[10,8301,142],{},[66,8303,8306],{"className":8304,"code":8305,"language":148,"meta":71},[146],"3\n2\n1\n",[34,8307,8305],{"__ignoreMap":71},[10,8309,153],{},[14,8311,156],{"id":156},[158,8313,8314,8320],{},[45,8315,7896,8316,8319],{},[34,8317,8318],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,8321,8322,8323,8325,8326,8328,8329,8332],{},"每次 ",[34,8324,8229],{}," 运行到下一个 ",[34,8327,8215],{}," 并暂停，局部变量 ",[34,8330,8331],{},"current"," 和执行位置被保留。",[336,8334,2704],{"id":2704},[10,8336,8337,8338,8340],{},"生成器的暂停位置可以展开成多次 ",[34,8339,8229],{}," 的时间线。",[10,8342,8343],{},[26,8344],{"alt":8345,"src":8346},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8348,8349,8350,8352],{},"每次请求只推进到下一个 ",[34,8351,8215],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8354,174],{"id":174},[42,8356,8357,8360],{},[45,8358,8359],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,8361,8362],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8364,191],{"id":191},[158,8366,8367,8370],{},[45,8368,8369],{},"编写产生 1 到指定上限偶数的生成器。",[45,8371,4017,8372,8374,8375,8377],{},[34,8373,4344],{}," 遍历生成器，比较手动 ",[34,8376,8229],{}," 的差异。",[10,8379,213],{},[14,8381,216],{"id":216},[10,8383,8384],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8386,223],{},{"title":71,"searchDepth":84,"depth":84,"links":8388},[8389,8390,8391,8392,8393,8396,8397,8398],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":8394},[8395],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8191,"description":8196},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[234,8406,8407],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8410,"title":8411,"body":8412,"category":234,"cover":235,"description":8416,"extension":236,"meta":8640,"navigation":87,"path":8641,"pinned":239,"publishedAt":240,"seo":8642,"slug":8643,"stem":8644,"summary":8645,"tags":8646,"updatedAt":240,"visible":87,"__hash__":8648},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8413,"toc":8628},[8414,8417,8419,8422,8424,8430,8433,8435,8455,8457,8459,8541,8543,8549,8551,8553,8575,8577,8580,8586,8593,8595,8605,8607,8619,8621,8623,8626],[10,8415,8416],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8418,16],{"id":16},[10,8420,8421],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8423,22],{"id":22},[10,8425,8426],{},[26,8427],{"alt":8428,"src":8429},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8431,8432],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8434,40],{"id":40},[42,8436,8437,8446,8449],{},[45,8438,8439,8442,8443,168],{},[34,8440,8441],{},"@trace"," 等价于 ",[34,8444,8445],{},"add = trace(add)",[45,8447,8448],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,8450,8451,8454],{},[34,8452,8453],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8456,61],{"id":61},[10,8458,64],{},[66,8460,8462],{"className":68,"code":8461,"language":70,"meta":71,"style":71},"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",[34,8463,8464,8469,8473,8478,8483,8488,8493,8498,8503,8508,8513,8517,8522,8526,8530,8535],{"__ignoreMap":71},[75,8465,8466],{"class":77,"line":78},[75,8467,8468],{},"from functools import wraps\n",[75,8470,8471],{"class":77,"line":84},[75,8472,88],{"emptyLinePlaceholder":87},[75,8474,8475],{"class":77,"line":91},[75,8476,8477],{},"def trace(function):\n",[75,8479,8480],{"class":77,"line":97},[75,8481,8482],{},"    @wraps(function)\n",[75,8484,8485],{"class":77,"line":102},[75,8486,8487],{},"    def wrapper(*args, **kwargs):\n",[75,8489,8490],{"class":77,"line":108},[75,8491,8492],{},"        print(\"开始：\", function.__name__)\n",[75,8494,8495],{"class":77,"line":114},[75,8496,8497],{},"        result = function(*args, **kwargs)\n",[75,8499,8500],{"class":77,"line":119},[75,8501,8502],{},"        print(\"结束：\", function.__name__)\n",[75,8504,8505],{"class":77,"line":125},[75,8506,8507],{},"        return result\n",[75,8509,8510],{"class":77,"line":131},[75,8511,8512],{},"    return wrapper\n",[75,8514,8515],{"class":77,"line":136},[75,8516,88],{"emptyLinePlaceholder":87},[75,8518,8519],{"class":77,"line":5838},[75,8520,8521],{},"@trace\n",[75,8523,8524],{"class":77,"line":7440},[75,8525,6186],{},[75,8527,8528],{"class":77,"line":7446},[75,8529,6191],{},[75,8531,8533],{"class":77,"line":8532},15,[75,8534,88],{"emptyLinePlaceholder":87},[75,8536,8538],{"class":77,"line":8537},16,[75,8539,8540],{},"print(add(2, 3))\n",[10,8542,142],{},[66,8544,8547],{"className":8545,"code":8546,"language":148,"meta":71},[146],"开始： add\n结束： add\n5\n",[34,8548,8546],{"__ignoreMap":71},[10,8550,153],{},[14,8552,156],{"id":156},[158,8554,8555,8572],{},[45,8556,8557,8558,8561,8562,8565,8566,8569,8570,168],{},"解释器执行定义时，把原 ",[34,8559,8560],{},"add"," 函数交给 ",[34,8563,8564],{},"trace","，返回的 ",[34,8567,8568],{},"wrapper"," 重新绑定到名字 ",[34,8571,8560],{},[45,8573,8574],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[336,8576,2704],{"id":2704},[10,8578,8579],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8581,8582],{},[26,8583],{"alt":8584,"src":8585},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8587,8588,8590,8591,168],{},[34,8589,8441],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8592,8445],{},[14,8594,174],{"id":174},[42,8596,8597,8602],{},[45,8598,8599,8600,168],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8601,5385],{},[45,8603,8604],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8606,191],{"id":191},[158,8608,8609,8612],{},[45,8610,8611],{},"编写只记录调用次数的简单装饰器。",[45,8613,8614,8615,8618],{},"删除包装函数的 ",[34,8616,8617],{},"return result","，观察调用方得到什么。",[10,8620,213],{},[14,8622,216],{"id":216},[10,8624,8625],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8627,223],{},{"title":71,"searchDepth":84,"depth":84,"links":8629},[8630,8631,8632,8633,8634,8637,8638,8639],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":8635},[8636],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8411,"description":8416},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[234,8647,5336],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8650,"title":8651,"body":8652,"category":234,"cover":235,"description":8656,"extension":236,"meta":8843,"navigation":87,"path":8844,"pinned":239,"publishedAt":240,"seo":8845,"slug":8846,"stem":8847,"summary":8848,"tags":8849,"updatedAt":240,"visible":87,"__hash__":8852},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8653,"toc":8831},[8654,8657,8659,8662,8664,8670,8673,8675,8686,8688,8690,8765,8767,8773,8775,8777,8788,8790,8793,8799,8802,8804,8812,8814,8822,8824,8826,8829],[10,8655,8656],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8658,16],{"id":16},[10,8660,8661],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8663,22],{"id":22},[10,8665,8666],{},[26,8667],{"alt":8668,"src":8669},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8671,8672],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8674,40],{"id":40},[42,8676,8677,8680,8683],{},[45,8678,8679],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,8681,8682],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,8684,8685],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8687,61],{"id":61},[10,8689,64],{},[66,8691,8693],{"className":68,"code":8692,"language":70,"meta":71,"style":71},"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",[34,8694,8695,8700,8705,8709,8714,8718,8723,8728,8733,8737,8742,8747,8752,8756,8760],{"__ignoreMap":71},[75,8696,8697],{"class":77,"line":78},[75,8698,8699],{},"import logging\n",[75,8701,8702],{"class":77,"line":84},[75,8703,8704],{},"import unittest\n",[75,8706,8707],{"class":77,"line":91},[75,8708,88],{"emptyLinePlaceholder":87},[75,8710,8711],{"class":77,"line":97},[75,8712,8713],{},"logging.basicConfig(level=logging.INFO)\n",[75,8715,8716],{"class":77,"line":102},[75,8717,88],{"emptyLinePlaceholder":87},[75,8719,8720],{"class":77,"line":108},[75,8721,8722],{},"def clamp_progress(value):\n",[75,8724,8725],{"class":77,"line":114},[75,8726,8727],{},"    logging.info(\"检查进度：%s\", value)\n",[75,8729,8730],{"class":77,"line":119},[75,8731,8732],{},"    return max(0, min(100, value))\n",[75,8734,8735],{"class":77,"line":125},[75,8736,88],{"emptyLinePlaceholder":87},[75,8738,8739],{"class":77,"line":131},[75,8740,8741],{},"class ProgressTest(unittest.TestCase):\n",[75,8743,8744],{"class":77,"line":136},[75,8745,8746],{},"    def test_upper_limit(self):\n",[75,8748,8749],{"class":77,"line":5838},[75,8750,8751],{},"        self.assertEqual(clamp_progress(120), 100)\n",[75,8753,8754],{"class":77,"line":7440},[75,8755,88],{"emptyLinePlaceholder":87},[75,8757,8758],{"class":77,"line":7446},[75,8759,6200],{},[75,8761,8762],{"class":77,"line":8532},[75,8763,8764],{},"    unittest.main()\n",[10,8766,142],{},[66,8768,8771],{"className":8769,"code":8770,"language":148,"meta":71},[146],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8772,8770],{"__ignoreMap":71},[10,8774,153],{},[14,8776,156],{"id":156},[158,8778,8779,8785],{},[45,8780,8781,8784],{},[34,8782,8783],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,8786,8787],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[336,8789,2704],{"id":2704},[10,8791,8792],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8794,8795],{},[26,8796],{"alt":8797,"src":8798},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8800,8801],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8803,174],{"id":174},[42,8805,8806,8809],{},[45,8807,8808],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,8810,8811],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8813,191],{"id":191},[158,8815,8816,8819],{},[45,8817,8818],{},"为负数进度增加测试。",[45,8820,8821],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8823,213],{},[14,8825,216],{"id":216},[10,8827,8828],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,8830,223],{},{"title":71,"searchDepth":84,"depth":84,"links":8832},[8833,8834,8835,8836,8837,8840,8841,8842],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":8838},[8839],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8651,"description":8656},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[234,8850,8851],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8854,"title":8855,"body":8856,"category":234,"cover":235,"description":8860,"extension":236,"meta":9160,"navigation":87,"path":9161,"pinned":239,"publishedAt":240,"seo":9162,"slug":9163,"stem":9164,"summary":9165,"tags":9166,"updatedAt":240,"visible":87,"__hash__":9169},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8857,"toc":9147},[8858,8861,8863,8866,8868,8874,8877,8879,8894,8896,8898,9045,9047,9053,9055,9057,9070,9072,9075,9081,9084,9086,9089,9095,9102,9104,9115,9117,9138,9140,9142,9145],[10,8859,8860],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8862,16],{"id":16},[10,8864,8865],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8867,22],{"id":22},[10,8869,8870],{},[26,8871],{"alt":8872,"src":8873},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8875,8876],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8878,40],{"id":40},[42,8880,8881,8884,8887],{},[45,8882,8883],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,8885,8886],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,8888,8889,8890,8893],{},"实际扩展前先为 ",[34,8891,8892],{},"add()"," 和存储边界补充测试。",[14,8895,61],{"id":61},[10,8897,64],{},[66,8899,8901],{"className":68,"code":8900,"language":70,"meta":71,"style":71},"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",[34,8902,8903,8907,8911,8915,8920,8925,8930,8935,8939,8944,8949,8954,8959,8964,8968,8973,8978,8984,8989,8995,9000,9005,9011,9017,9023,9028,9034,9039],{"__ignoreMap":71},[75,8904,8905],{"class":77,"line":78},[75,8906,6995],{},[75,8908,8909],{"class":77,"line":84},[75,8910,81],{},[75,8912,8913],{"class":77,"line":91},[75,8914,88],{"emptyLinePlaceholder":87},[75,8916,8917],{"class":77,"line":97},[75,8918,8919],{},"class LearningRecords:\n",[75,8921,8922],{"class":77,"line":102},[75,8923,8924],{},"    def __init__(self, file_path):\n",[75,8926,8927],{"class":77,"line":108},[75,8928,8929],{},"        self.file_path = Path(file_path)\n",[75,8931,8932],{"class":77,"line":114},[75,8933,8934],{},"        self.items = []\n",[75,8936,8937],{"class":77,"line":119},[75,8938,88],{"emptyLinePlaceholder":87},[75,8940,8941],{"class":77,"line":125},[75,8942,8943],{},"    def add(self, title):\n",[75,8945,8946],{"class":77,"line":131},[75,8947,8948],{},"        title = title.strip()\n",[75,8950,8951],{"class":77,"line":136},[75,8952,8953],{},"        if not title:\n",[75,8955,8956],{"class":77,"line":5838},[75,8957,8958],{},"            raise ValueError(\"课程名称不能为空\")\n",[75,8960,8961],{"class":77,"line":7440},[75,8962,8963],{},"        self.items.append({\"title\": title, \"done\": False})\n",[75,8965,8966],{"class":77,"line":7446},[75,8967,88],{"emptyLinePlaceholder":87},[75,8969,8970],{"class":77,"line":8532},[75,8971,8972],{},"    def save(self):\n",[75,8974,8975],{"class":77,"line":8537},[75,8976,8977],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[75,8979,8981],{"class":77,"line":8980},17,[75,8982,8983],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[75,8985,8987],{"class":77,"line":8986},18,[75,8988,88],{"emptyLinePlaceholder":87},[75,8990,8992],{"class":77,"line":8991},19,[75,8993,8994],{},"records = LearningRecords(\"learning-records.json\")\n",[75,8996,8998],{"class":77,"line":8997},20,[75,8999,88],{"emptyLinePlaceholder":87},[75,9001,9003],{"class":77,"line":9002},21,[75,9004,7413],{},[75,9006,9008],{"class":77,"line":9007},22,[75,9009,9010],{},"    title = input(\"输入已学习课程：\")\n",[75,9012,9014],{"class":77,"line":9013},23,[75,9015,9016],{},"    records.add(title)\n",[75,9018,9020],{"class":77,"line":9019},24,[75,9021,9022],{},"    records.save()\n",[75,9024,9026],{"class":77,"line":9025},25,[75,9027,7423],{},[75,9029,9031],{"class":77,"line":9030},26,[75,9032,9033],{},"    print(\"无法保存：\", error)\n",[75,9035,9037],{"class":77,"line":9036},27,[75,9038,1153],{},[75,9040,9042],{"class":77,"line":9041},28,[75,9043,9044],{},"    print(\"已保存 1 条学习记录\")\n",[10,9046,142],{},[66,9048,9051],{"className":9049,"code":9050,"language":148,"meta":71},[146],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9052,9050],{"__ignoreMap":71},[10,9054,153],{},[14,9056,156],{"id":156},[158,9058,9059,9065],{},[45,9060,9061,9062,9064],{},"输入层取得课程名后，",[34,9063,8892],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,9066,9067,9069],{},[34,9068,8124],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[336,9071,2704],{"id":2704},[10,9073,9074],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9076,9077],{},[26,9078],{"alt":9079,"src":9080},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9082,9083],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[336,9085,2704],{"id":4225},[10,9087,9088],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9090,9091],{},[26,9092],{"alt":9093,"src":9094},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9096,9097,9098,9101],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9099,9100],{},"load()"," 把文件状态恢复到内存。",[14,9103,174],{"id":174},[42,9105,9106,9109],{},[45,9107,9108],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,9110,9111,9112,9114],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9113,9100],{}," 是下一项必要扩展。",[14,9116,191],{"id":191},[158,9118,9119,9125,9128],{},[45,9120,9121,9122,9124],{},"增加 ",[34,9123,9100],{},"，文件不存在时从空列表开始。",[45,9126,9127],{},"增加按序号标记完成的功能，并校验序号范围。",[45,9129,9130,9131,9134,9135,9137],{},"把输入循环放进 ",[34,9132,9133],{},"main()","，通过 ",[34,9136,6142],{}," 控制程序入口。",[10,9139,213],{},[14,9141,216],{"id":216},[10,9143,9144],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[221,9146,223],{},{"title":71,"searchDepth":84,"depth":84,"links":9148},[9149,9150,9151,9152,9153,9157,9158,9159],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":9154},[9155,9156],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8855,"description":8860},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[234,9167,9168],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9171,9274,9393,9524,9667,9792,9929,10066,10207,10376,10513,10646,10769,10898,11025,11188,11364,11505,11634,11783,11926,12047,12170,12319,12472,12637,12764,12945,13088,13245,13396,13543,13698,13916,14071,14246,14397,14564,14751,14914,15156,15396],{"id":1400,"title":1401,"body":9172,"category":234,"cover":235,"description":1406,"extension":236,"meta":9271,"navigation":87,"path":1525,"pinned":239,"publishedAt":240,"seo":9272,"slug":1527,"stem":1528,"summary":1529,"tags":9273,"updatedAt":240,"visible":87,"__hash__":1532},{"type":7,"value":9173,"toc":9261},[9174,9176,9178,9180,9182,9186,9190,9192,9202,9204,9206,9214,9216,9221,9223,9225,9235,9237,9245,9247,9253,9255,9257,9259],[10,9175,1406],{},[14,9177,16],{"id":16},[10,9179,1411],{},[14,9181,22],{"id":22},[10,9183,9184],{},[26,9185],{"alt":1418,"src":1419},[10,9187,9188,1424],{},[34,9189,1178],{},[14,9191,40],{"id":40},[42,9193,9194,9198,9200],{},[45,9195,1431,9196,1434],{},[34,9197,1178],{},[45,9199,1437],{},[45,9201,1440],{},[14,9203,61],{"id":61},[10,9205,64],{},[66,9207,9208],{"className":68,"code":1447,"language":70,"meta":71,"style":71},[34,9209,9210],{"__ignoreMap":71},[75,9211,9212],{"class":77,"line":78},[75,9213,1447],{},[10,9215,142],{},[66,9217,9219],{"className":9218,"code":1459,"language":148,"meta":71},[146],[34,9220,1459],{"__ignoreMap":71},[10,9222,153],{},[14,9224,156],{"id":156},[158,9226,9227,9231],{},[45,9228,1470,9229,1474],{},[34,9230,1473],{},[45,9232,1477,9233,1481],{},[34,9234,1480],{},[14,9236,174],{"id":174},[42,9238,9239,9241],{},[45,9240,1488],{},[45,9242,1491,9243,1494],{},[34,9244,1178],{},[14,9246,191],{"id":191},[158,9248,9249,9251],{},[45,9250,1501],{},[45,9252,1504],{},[10,9254,213],{},[14,9256,216],{"id":216},[10,9258,1511],{},[221,9260,223],{},{"title":71,"searchDepth":84,"depth":84,"links":9262},[9263,9264,9265,9266,9267,9268,9269,9270],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":1401,"description":1406},[234,1396,1531],{"id":1534,"title":1535,"body":9275,"category":234,"cover":235,"description":1540,"extension":236,"meta":9390,"navigation":87,"path":1677,"pinned":239,"publishedAt":240,"seo":9391,"slug":1679,"stem":1680,"summary":1681,"tags":9392,"updatedAt":240,"visible":87,"__hash__":1684},{"type":7,"value":9276,"toc":9380},[9277,9279,9281,9283,9285,9289,9293,9295,9305,9307,9309,9329,9331,9336,9338,9340,9350,9352,9362,9364,9372,9374,9376,9378],[10,9278,1540],{},[14,9280,16],{"id":16},[10,9282,1545],{},[14,9284,22],{"id":22},[10,9286,9287],{},[26,9288],{"alt":1552,"src":1553},[10,9290,1556,9291,1559],{},[34,9292,698],{},[14,9294,40],{"id":40},[42,9296,9297,9299,9301],{},[45,9298,1566],{},[45,9300,1569],{},[45,9302,1572,9303,1576],{},[34,9304,1575],{},[14,9306,61],{"id":61},[10,9308,1581],{},[66,9310,9311],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,9312,9313,9319],{"__ignoreMap":71},[75,9314,9315,9317],{"class":77,"line":78},[75,9316,698],{"class":607},[75,9318,611],{"class":610},[75,9320,9321,9323,9325,9327],{"class":77,"line":84},[75,9322,698],{"class":607},[75,9324,640],{"class":610},[75,9326,644],{"class":643},[75,9328,611],{"class":610},[10,9330,142],{},[66,9332,9334],{"className":9333,"code":1607,"language":148,"meta":71},[146],[34,9335,1607],{"__ignoreMap":71},[10,9337,153],{},[14,9339,156],{"id":156},[158,9341,9342,9346],{},[45,9343,9344,1621],{},[34,9345,1620],{},[45,9347,9348,1626],{},[34,9349,706],{},[14,9351,174],{"id":174},[42,9353,9354,9358],{},[45,9355,1633,9356,1636],{},[34,9357,698],{},[45,9359,1639,9360,1642],{},[34,9361,698],{},[14,9363,191],{"id":191},[158,9365,9366,9370],{},[45,9367,945,9368,1652],{},[34,9369,1651],{},[45,9371,1655],{},[10,9373,213],{},[14,9375,216],{"id":216},[10,9377,1662],{},[221,9379,1665],{},{"title":71,"searchDepth":84,"depth":84,"links":9381},[9382,9383,9384,9385,9386,9387,9388,9389],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":1535,"description":1540},[234,1683,1059],{"id":1686,"title":1687,"body":9394,"category":234,"cover":235,"description":1853,"extension":236,"meta":9521,"navigation":87,"path":1855,"pinned":239,"publishedAt":240,"seo":9522,"slug":1857,"stem":1858,"summary":1859,"tags":9523,"updatedAt":240,"visible":87,"__hash__":1863},{"type":7,"value":9395,"toc":9511},[9396,9400,9402,9404,9406,9410,9412,9414,9430,9432,9434,9454,9456,9461,9463,9465,9477,9479,9489,9491,9501,9503,9505,9509],[10,9397,1692,9398,1695],{},[34,9399,1178],{},[14,9401,16],{"id":16},[10,9403,1700],{},[14,9405,22],{"id":22},[10,9407,9408],{},[26,9409],{"alt":1707,"src":1708},[10,9411,1711],{},[14,9413,40],{"id":40},[42,9415,9416,9422,9426],{},[45,9417,1718,9418,1721,9420,168],{},[34,9419,698],{},[34,9421,1724],{},[45,9423,1727,9424,1731],{},[34,9425,1730],{},[45,9427,1734,9428,1737],{},[34,9429,1178],{},[14,9431,61],{"id":61},[10,9433,64],{},[66,9435,9436],{"className":1744,"code":1745,"language":1746,"meta":71,"style":71},[34,9437,9438,9442,9446,9450],{"__ignoreMap":71},[75,9439,9440],{"class":77,"line":78},[75,9441,1753],{},[75,9443,9444],{"class":77,"line":84},[75,9445,1758],{},[75,9447,9448],{"class":77,"line":91},[75,9449,1763],{},[75,9451,9452],{"class":77,"line":97},[75,9453,1768],{},[10,9455,142],{},[66,9457,9459],{"className":9458,"code":1774,"language":148,"meta":71},[146],[34,9460,1774],{"__ignoreMap":71},[10,9462,153],{},[14,9464,156],{"id":156},[158,9466,9467,9473],{},[45,9468,1785,9469,1789,9471,168],{},[34,9470,1788],{},[34,9472,1792],{},[45,9474,1795,9475,1798],{},[34,9476,1480],{},[14,9478,174],{"id":174},[42,9480,9481,9487],{},[45,9482,1805,9483,1808,9485,1811],{},[34,9484,1724],{},[34,9486,1178],{},[45,9488,1814],{},[14,9490,191],{"id":191},[158,9492,9493,9497],{},[45,9494,1821,9495,168],{},[34,9496,1824],{},[45,9498,1827,9499,1830],{},[34,9500,1480],{},[10,9502,213],{},[14,9504,216],{"id":216},[10,9506,1837,9507,1840],{},[34,9508,1178],{},[221,9510,223],{},{"title":71,"searchDepth":84,"depth":84,"links":9512},[9513,9514,9515,9516,9517,9518,9519,9520],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":1687,"description":1853},[234,1861,1862],{"id":1865,"title":1866,"body":9525,"category":234,"cover":235,"description":1871,"extension":236,"meta":9664,"navigation":87,"path":2043,"pinned":239,"publishedAt":240,"seo":9665,"slug":2045,"stem":2046,"summary":2047,"tags":9666,"updatedAt":240,"visible":87,"__hash__":2051},{"type":7,"value":9526,"toc":9654},[9527,9529,9531,9533,9535,9539,9543,9545,9557,9559,9561,9597,9599,9604,9606,9608,9624,9626,9636,9638,9646,9648,9650,9652],[10,9528,1871],{},[14,9530,16],{"id":16},[10,9532,1876],{},[14,9534,22],{"id":22},[10,9536,9537],{},[26,9538],{"alt":1883,"src":1884},[10,9540,9541,1890],{},[34,9542,1889],{},[14,9544,40],{"id":40},[42,9546,9547,9549,9555],{},[45,9548,1897],{},[45,9550,9551,1903,9553,1907],{},[34,9552,1902],{},[34,9554,1906],{},[45,9556,1910],{},[14,9558,61],{"id":61},[10,9560,1581],{},[66,9562,9563],{"className":598,"code":1917,"language":600,"meta":71,"style":71},[34,9564,9565,9571,9577,9581,9591],{"__ignoreMap":71},[75,9566,9567,9569],{"class":77,"line":78},[75,9568,1924],{"class":607},[75,9570,1927],{"class":643},[75,9572,9573,9575],{"class":77,"line":84},[75,9574,1932],{"class":610},[75,9576,1927],{"class":643},[75,9578,9579],{"class":77,"line":91},[75,9580,1939],{"class":610},[75,9582,9583,9585,9587,9589],{"class":77,"line":97},[75,9584,1944],{"class":610},[75,9586,1947],{"class":643},[75,9588,1951],{"class":1950},[75,9590,1222],{"class":643},[75,9592,9593,9595],{"class":77,"line":102},[75,9594,698],{"class":607},[75,9596,1222],{"class":643},[10,9598,142],{},[66,9600,9602],{"className":9601,"code":1965,"language":148,"meta":71},[146],[34,9603,1965],{"__ignoreMap":71},[10,9605,153],{},[14,9607,156],{"id":156},[158,9609,9610,9618],{},[45,9611,9612,1978,9614,1981,9616,1984],{},[34,9613,1924],{},[34,9615,1932],{},[34,9617,1902],{},[45,9619,9620,1989,9622,1993],{},[34,9621,1889],{},[34,9623,1992],{},[14,9625,174],{"id":174},[42,9627,9628,9634],{},[45,9629,2000,9630,1164,9632,168],{},[34,9631,1902],{},[34,9633,1906],{},[45,9635,2007],{},[14,9637,191],{"id":191},[158,9639,9640,9644],{},[45,9641,2014,9642,2018],{},[34,9643,2017],{},[45,9645,2021],{},[10,9647,213],{},[14,9649,216],{"id":216},[10,9651,2028],{},[221,9653,2031],{},{"title":71,"searchDepth":84,"depth":84,"links":9655},[9656,9657,9658,9659,9660,9661,9662,9663],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":1866,"description":1871},[234,2049,2050],{"id":2053,"title":2054,"body":9668,"category":234,"cover":235,"description":2059,"extension":236,"meta":9789,"navigation":87,"path":2208,"pinned":239,"publishedAt":240,"seo":9790,"slug":2210,"stem":2211,"summary":2212,"tags":9791,"updatedAt":240,"visible":87,"__hash__":2216},{"type":7,"value":9669,"toc":9779},[9670,9672,9674,9676,9678,9682,9690,9692,9706,9708,9710,9726,9728,9733,9735,9737,9751,9753,9759,9761,9771,9773,9775,9777],[10,9671,2059],{},[14,9673,16],{"id":16},[10,9675,2064],{},[14,9677,22],{"id":22},[10,9679,9680],{},[26,9681],{"alt":2071,"src":2072},[10,9683,2075,9684,168,9686,2081,9688,168],{},[34,9685,1480],{},[34,9687,2080],{},[34,9689,1788],{},[14,9691,40],{"id":40},[42,9693,9694,9698,9704],{},[45,9695,9696,2093],{},[34,9697,2092],{},[45,9699,9700,2099,9702,168],{},[34,9701,2098],{},[34,9703,2102],{},[45,9705,2105],{},[14,9707,61],{"id":61},[10,9709,64],{},[66,9711,9712],{"className":68,"code":2112,"language":70,"meta":71,"style":71},[34,9713,9714,9718,9722],{"__ignoreMap":71},[75,9715,9716],{"class":77,"line":78},[75,9717,2119],{},[75,9719,9720],{"class":77,"line":84},[75,9721,2124],{},[75,9723,9724],{"class":77,"line":91},[75,9725,2129],{},[10,9727,142],{},[66,9729,9731],{"className":9730,"code":2135,"language":148,"meta":71},[146],[34,9732,2135],{"__ignoreMap":71},[10,9734,153],{},[14,9736,156],{"id":156},[158,9738,9739,9745],{},[45,9740,9741,2149,9743,168],{},[34,9742,2148],{},[34,9744,2102],{},[45,9746,9747,2156,9749,2160],{},[34,9748,1480],{},[34,9750,2159],{},[14,9752,174],{"id":174},[42,9754,9755,9757],{},[45,9756,2167],{},[45,9758,2170],{},[14,9760,191],{"id":191},[158,9762,9763,9765],{},[45,9764,2177],{},[45,9766,2180,9767,2183,9769,2187],{},[34,9768,2080],{},[34,9770,2186],{},[10,9772,213],{},[14,9774,216],{"id":216},[10,9776,2194],{},[221,9778,223],{},{"title":71,"searchDepth":84,"depth":84,"links":9780},[9781,9782,9783,9784,9785,9786,9787,9788],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":2054,"description":2059},[234,2214,2215],{"id":2218,"title":2219,"body":9793,"category":234,"cover":235,"description":2224,"extension":236,"meta":9926,"navigation":87,"path":2392,"pinned":239,"publishedAt":240,"seo":9927,"slug":2394,"stem":2395,"summary":2396,"tags":9928,"updatedAt":240,"visible":87,"__hash__":2400},{"type":7,"value":9794,"toc":9916},[9795,9797,9799,9801,9803,9807,9809,9811,9827,9829,9831,9855,9857,9862,9864,9866,9882,9884,9896,9898,9908,9910,9912,9914],[10,9796,2224],{},[14,9798,16],{"id":16},[10,9800,2229],{},[14,9802,22],{"id":22},[10,9804,9805],{},[26,9806],{"alt":2236,"src":2237},[10,9808,2240],{},[14,9810,40],{"id":40},[42,9812,9813,9815,9821],{},[45,9814,2247],{},[45,9816,2250,9817,2183,9819,2257],{},[34,9818,2253],{},[34,9820,2256],{},[45,9822,2260,9823,2264,9825,2268],{},[34,9824,2263],{},[34,9826,2267],{},[14,9828,61],{"id":61},[10,9830,64],{},[66,9832,9833],{"className":68,"code":2275,"language":70,"meta":71,"style":71},[34,9834,9835,9839,9843,9847,9851],{"__ignoreMap":71},[75,9836,9837],{"class":77,"line":78},[75,9838,2282],{},[75,9840,9841],{"class":77,"line":84},[75,9842,2287],{},[75,9844,9845],{"class":77,"line":91},[75,9846,88],{"emptyLinePlaceholder":87},[75,9848,9849],{"class":77,"line":97},[75,9850,2296],{},[75,9852,9853],{"class":77,"line":102},[75,9854,2287],{},[10,9856,142],{},[66,9858,9860],{"className":9859,"code":2306,"language":148,"meta":71},[146],[34,9861,2306],{"__ignoreMap":71},[10,9863,153],{},[14,9865,156],{"id":156},[158,9867,9868,9874],{},[45,9869,945,9870,2320,9872,2323],{},[34,9871,2319],{},[34,9873,2253],{},[45,9875,945,9876,2329,9878,2333,9880,168],{},[34,9877,2328],{},[34,9879,2332],{},[34,9881,2336],{},[14,9883,174],{"id":174},[42,9885,9886,9888],{},[45,9887,2343],{},[45,9889,2346,9890,2264,9892,2264,9894,2354],{},[34,9891,2263],{},[34,9893,2267],{},[34,9895,2353],{},[14,9897,191],{"id":191},[158,9899,9900,9906],{},[45,9901,2361,9902,1164,9904,2368],{},[34,9903,2364],{},[34,9905,2367],{},[45,9907,2371],{},[10,9909,213],{},[14,9911,216],{"id":216},[10,9913,2378],{},[221,9915,223],{},{"title":71,"searchDepth":84,"depth":84,"links":9917},[9918,9919,9920,9921,9922,9923,9924,9925],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":2219,"description":2224},[234,2398,2399],{"id":2402,"title":2403,"body":9930,"category":234,"cover":235,"description":2408,"extension":236,"meta":10063,"navigation":87,"path":2573,"pinned":239,"publishedAt":240,"seo":10064,"slug":2575,"stem":2576,"summary":2577,"tags":10065,"updatedAt":240,"visible":87,"__hash__":2581},{"type":7,"value":9931,"toc":10053},[9932,9934,9936,9938,9940,9944,9946,9948,9966,9968,9970,10006,10008,10013,10015,10017,10027,10029,10037,10039,10045,10047,10049,10051],[10,9933,2408],{},[14,9935,16],{"id":16},[10,9937,2413],{},[14,9939,22],{"id":22},[10,9941,9942],{},[26,9943],{"alt":2420,"src":2421},[10,9945,2424],{},[14,9947,40],{"id":40},[42,9949,9950,9956,9964],{},[45,9951,9952,2434,9954,2438],{},[34,9953,2433],{},[34,9955,2437],{},[45,9957,9958,2444,9960,2448,9962,2452],{},[34,9959,2443],{},[34,9961,2447],{},[34,9963,2451],{},[45,9965,2455],{},[14,9967,61],{"id":61},[10,9969,64],{},[66,9971,9972],{"className":68,"code":2462,"language":70,"meta":71,"style":71},[34,9973,9974,9978,9982,9986,9990,9994,9998,10002],{"__ignoreMap":71},[75,9975,9976],{"class":77,"line":78},[75,9977,2469],{},[75,9979,9980],{"class":77,"line":84},[75,9981,2474],{},[75,9983,9984],{"class":77,"line":91},[75,9985,2479],{},[75,9987,9988],{"class":77,"line":97},[75,9989,88],{"emptyLinePlaceholder":87},[75,9991,9992],{"class":77,"line":102},[75,9993,2488],{},[75,9995,9996],{"class":77,"line":108},[75,9997,2493],{},[75,9999,10000],{"class":77,"line":114},[75,10001,2498],{},[75,10003,10004],{"class":77,"line":119},[75,10005,2503],{},[10,10007,142],{},[66,10009,10011],{"className":10010,"code":2509,"language":148,"meta":71},[146],[34,10012,2509],{"__ignoreMap":71},[10,10014,153],{},[14,10016,156],{"id":156},[158,10018,10019,10023],{},[45,10020,10021,2523],{},[34,10022,2522],{},[45,10024,10025,2529],{},[34,10026,2528],{},[14,10028,174],{"id":174},[42,10030,10031,10035],{},[45,10032,2536,10033,168],{},[34,10034,2539],{},[45,10036,2542],{},[14,10038,191],{"id":191},[158,10040,10041,10043],{},[45,10042,2549],{},[45,10044,2552],{},[10,10046,213],{},[14,10048,216],{"id":216},[10,10050,2559],{},[221,10052,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10054},[10055,10056,10057,10058,10059,10060,10061,10062],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":2403,"description":2408},[234,2579,2580],{"id":2583,"title":2584,"body":10067,"category":234,"cover":235,"description":2589,"extension":236,"meta":10204,"navigation":87,"path":2766,"pinned":239,"publishedAt":240,"seo":10205,"slug":2768,"stem":2769,"summary":2770,"tags":10206,"updatedAt":240,"visible":87,"__hash__":2774},{"type":7,"value":10068,"toc":10192},[10069,10071,10073,10075,10077,10081,10087,10089,10097,10099,10101,10125,10127,10132,10134,10136,10154,10156,10158,10162,10164,10166,10172,10174,10184,10186,10188,10190],[10,10070,2589],{},[14,10072,16],{"id":16},[10,10074,2594],{},[14,10076,22],{"id":22},[10,10078,10079],{},[26,10080],{"alt":2601,"src":2602},[10,10082,2605,10083,2609,10085,168],{},[34,10084,2608],{},[34,10086,2612],{},[14,10088,40],{"id":40},[42,10090,10091,10093,10095],{},[45,10092,2619],{},[45,10094,2622],{},[45,10096,2625],{},[14,10098,61],{"id":61},[10,10100,64],{},[66,10102,10103],{"className":68,"code":2632,"language":70,"meta":71,"style":71},[34,10104,10105,10109,10113,10117,10121],{"__ignoreMap":71},[75,10106,10107],{"class":77,"line":78},[75,10108,2639],{},[75,10110,10111],{"class":77,"line":84},[75,10112,2644],{},[75,10114,10115],{"class":77,"line":91},[75,10116,2649],{},[75,10118,10119],{"class":77,"line":97},[75,10120,2654],{},[75,10122,10123],{"class":77,"line":102},[75,10124,2659],{},[10,10126,142],{},[66,10128,10130],{"className":10129,"code":2665,"language":148,"meta":71},[146],[34,10131,2665],{"__ignoreMap":71},[10,10133,153],{},[14,10135,156],{"id":156},[158,10137,10138,10146],{},[45,10139,2676,10140,2679,10142,2683,10144,2687],{},[34,10141,234],{},[34,10143,2682],{},[34,10145,2686],{},[45,10147,10148,2693,10150,2697,10152,2701],{},[34,10149,2692],{},[34,10151,2696],{},[34,10153,2700],{},[336,10155,2704],{"id":2704},[10,10157,2707],{},[10,10159,10160],{},[26,10161],{"alt":2712,"src":2713},[10,10163,2716],{},[14,10165,174],{"id":174},[42,10167,10168,10170],{},[45,10169,2723],{},[45,10171,2726],{},[14,10173,191],{"id":191},[158,10175,10176,10182],{},[45,10177,2733,10178,2737,10180,168],{},[34,10179,2736],{},[34,10181,2740],{},[45,10183,2743],{},[10,10185,213],{},[14,10187,216],{"id":216},[10,10189,2750],{},[221,10191,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10193},[10194,10195,10196,10197,10198,10201,10202,10203],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":10199},[10200],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":2584,"description":2589},[234,2772,2773],{"id":2776,"title":2777,"body":10208,"category":234,"cover":235,"description":2782,"extension":236,"meta":10373,"navigation":87,"path":2997,"pinned":239,"publishedAt":240,"seo":10374,"slug":2999,"stem":3000,"summary":3001,"tags":10375,"updatedAt":240,"visible":87,"__hash__":3005},{"type":7,"value":10209,"toc":10361},[10210,10212,10214,10216,10218,10222,10228,10230,10250,10252,10254,10290,10292,10297,10299,10301,10315,10317,10319,10323,10329,10331,10341,10343,10353,10355,10357,10359],[10,10211,2782],{},[14,10213,16],{"id":16},[10,10215,2787],{},[14,10217,22],{"id":22},[10,10219,10220],{},[26,10221],{"alt":2794,"src":2795},[10,10223,2798,10224,1016,10226,2805],{},[34,10225,2801],{},[34,10227,2804],{},[14,10229,40],{"id":40},[42,10231,10232,10240,10248],{},[45,10233,10234,2815,10236,2819,10238,2823],{},[34,10235,2814],{},[34,10237,2818],{},[34,10239,2822],{},[45,10241,10242,2829,10244,2833,10246,2837],{},[34,10243,2828],{},[34,10245,2832],{},[34,10247,2836],{},[45,10249,2840],{},[14,10251,61],{"id":61},[10,10253,64],{},[66,10255,10256],{"className":68,"code":2847,"language":70,"meta":71,"style":71},[34,10257,10258,10262,10266,10270,10274,10278,10282,10286],{"__ignoreMap":71},[75,10259,10260],{"class":77,"line":78},[75,10261,2854],{},[75,10263,10264],{"class":77,"line":84},[75,10265,2859],{},[75,10267,10268],{"class":77,"line":91},[75,10269,88],{"emptyLinePlaceholder":87},[75,10271,10272],{"class":77,"line":97},[75,10273,2868],{},[75,10275,10276],{"class":77,"line":102},[75,10277,2873],{},[75,10279,10280],{"class":77,"line":108},[75,10281,2878],{},[75,10283,10284],{"class":77,"line":114},[75,10285,2883],{},[75,10287,10288],{"class":77,"line":119},[75,10289,2888],{},[10,10291,142],{},[66,10293,10295],{"className":10294,"code":2894,"language":148,"meta":71},[146],[34,10296,2894],{"__ignoreMap":71},[10,10298,153],{},[14,10300,156],{"id":156},[158,10302,10303,10309],{},[45,10304,10305,2908,10307,2912],{},[34,10306,2907],{},[34,10308,2911],{},[45,10310,10311,2918,10313,2921],{},[34,10312,2917],{},[34,10314,2836],{},[336,10316,2704],{"id":2704},[10,10318,2926],{},[10,10320,10321],{},[26,10322],{"alt":2931,"src":2932},[10,10324,10325,2937,10327,2940],{},[34,10326,2828],{},[34,10328,2832],{},[14,10330,174],{"id":174},[42,10332,10333,10339],{},[45,10334,2947,10335,2950,10337,2953],{},[34,10336,2822],{},[34,10338,2814],{},[45,10340,2956],{},[14,10342,191],{"id":191},[158,10344,10345,10349],{},[45,10346,2963,10347,2967],{},[34,10348,2966],{},[45,10350,2970,10351,2974],{},[34,10352,2973],{},[10,10354,213],{},[14,10356,216],{"id":216},[10,10358,2981],{},[221,10360,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10362},[10363,10364,10365,10366,10367,10370,10371,10372],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":10368},[10369],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":2777,"description":2782},[234,3003,3004],{"id":3007,"title":3008,"body":10377,"category":234,"cover":235,"description":3013,"extension":236,"meta":10510,"navigation":87,"path":3182,"pinned":239,"publishedAt":240,"seo":10511,"slug":3184,"stem":3185,"summary":3186,"tags":10512,"updatedAt":240,"visible":87,"__hash__":3189},{"type":7,"value":10378,"toc":10500},[10379,10381,10383,10385,10387,10391,10401,10403,10413,10415,10417,10445,10447,10452,10454,10456,10470,10472,10480,10482,10492,10494,10496,10498],[10,10380,3013],{},[14,10382,16],{"id":16},[10,10384,3018],{},[14,10386,22],{"id":22},[10,10388,10389],{},[26,10390],{"alt":3025,"src":3026},[10,10392,10393,3032,10395,3036,10397,3040,10399,3044],{},[34,10394,3031],{},[34,10396,3035],{},[34,10398,3039],{},[34,10400,3043],{},[14,10402,40],{"id":40},[42,10404,10405,10407,10411],{},[45,10406,3051],{},[45,10408,10409,3056],{},[34,10410,3043],{},[45,10412,3059],{},[14,10414,61],{"id":61},[10,10416,64],{},[66,10418,10419],{"className":68,"code":3066,"language":70,"meta":71,"style":71},[34,10420,10421,10425,10429,10433,10437,10441],{"__ignoreMap":71},[75,10422,10423],{"class":77,"line":78},[75,10424,3073],{},[75,10426,10427],{"class":77,"line":84},[75,10428,3078],{},[75,10430,10431],{"class":77,"line":91},[75,10432,3083],{},[75,10434,10435],{"class":77,"line":97},[75,10436,88],{"emptyLinePlaceholder":87},[75,10438,10439],{"class":77,"line":102},[75,10440,3092],{},[75,10442,10443],{"class":77,"line":108},[75,10444,3097],{},[10,10446,142],{},[66,10448,10450],{"className":10449,"code":3103,"language":148,"meta":71},[146],[34,10451,3103],{"__ignoreMap":71},[10,10453,153],{},[14,10455,156],{"id":156},[158,10457,10458,10464],{},[45,10459,3114,10460,3117,10462,3121],{},[34,10461,3031],{},[34,10463,3120],{},[45,10465,10466,3127,10468,3131],{},[34,10467,3126],{},[34,10469,3130],{},[14,10471,174],{"id":174},[42,10473,10474,10478],{},[45,10475,3138,10476,3142],{},[34,10477,3141],{},[45,10479,3145],{},[14,10481,191],{"id":191},[158,10483,10484,10486],{},[45,10485,3152],{},[45,10487,1727,10488,3158,10490,3161],{},[34,10489,3157],{},[34,10491,3043],{},[10,10493,213],{},[14,10495,216],{"id":216},[10,10497,3168],{},[221,10499,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10501},[10502,10503,10504,10505,10506,10507,10508,10509],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3008,"description":3013},[234,2353,3188],{"id":3191,"title":3192,"body":10514,"category":234,"cover":235,"description":3197,"extension":236,"meta":10643,"navigation":87,"path":3358,"pinned":239,"publishedAt":240,"seo":10644,"slug":3360,"stem":3361,"summary":3362,"tags":10645,"updatedAt":240,"visible":87,"__hash__":3366},{"type":7,"value":10515,"toc":10633},[10516,10518,10520,10522,10524,10528,10532,10534,10544,10546,10548,10580,10582,10587,10589,10591,10603,10605,10615,10617,10625,10627,10629,10631],[10,10517,3197],{},[14,10519,16],{"id":16},[10,10521,3202],{},[14,10523,22],{"id":22},[10,10525,10526],{},[26,10527],{"alt":3209,"src":3210},[10,10529,3213,10530,3217],{},[34,10531,3216],{},[14,10533,40],{"id":40},[42,10535,10536,10538,10540],{},[45,10537,3224],{},[45,10539,3227],{},[45,10541,3230,10542,168],{},[34,10543,3233],{},[14,10545,61],{"id":61},[10,10547,64],{},[66,10549,10550],{"className":68,"code":3240,"language":70,"meta":71,"style":71},[34,10551,10552,10556,10560,10564,10568,10572,10576],{"__ignoreMap":71},[75,10553,10554],{"class":77,"line":78},[75,10555,3247],{},[75,10557,10558],{"class":77,"line":84},[75,10559,3252],{},[75,10561,10562],{"class":77,"line":91},[75,10563,88],{"emptyLinePlaceholder":87},[75,10565,10566],{"class":77,"line":97},[75,10567,3261],{},[75,10569,10570],{"class":77,"line":102},[75,10571,3266],{},[75,10573,10574],{"class":77,"line":108},[75,10575,3271],{},[75,10577,10578],{"class":77,"line":114},[75,10579,3276],{},[10,10581,142],{},[66,10583,10585],{"className":10584,"code":3282,"language":148,"meta":71},[146],[34,10586,3282],{"__ignoreMap":71},[10,10588,153],{},[14,10590,156],{"id":156},[158,10592,10593,10595],{},[45,10594,3293],{},[45,10596,10597,3299,10599,3303,10601,3307],{},[34,10598,3298],{},[34,10600,3302],{},[34,10602,3306],{},[14,10604,174],{"id":174},[42,10606,10607,10613],{},[45,10608,3314,10609,3318,10611,168],{},[34,10610,3317],{},[34,10612,3321],{},[45,10614,3324],{},[14,10616,191],{"id":191},[158,10618,10619,10621],{},[45,10620,3331],{},[45,10622,3334,10623,3337],{},[34,10624,3306],{},[10,10626,213],{},[14,10628,216],{"id":216},[10,10630,3344],{},[221,10632,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10634},[10635,10636,10637,10638,10639,10640,10641,10642],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3192,"description":3197},[234,3364,3365],{"id":3368,"title":3369,"body":10647,"category":234,"cover":235,"description":3374,"extension":236,"meta":10766,"navigation":87,"path":3516,"pinned":239,"publishedAt":240,"seo":10767,"slug":3518,"stem":3519,"summary":3520,"tags":10768,"updatedAt":240,"visible":87,"__hash__":3523},{"type":7,"value":10648,"toc":10756},[10649,10651,10653,10655,10657,10661,10663,10665,10673,10675,10677,10705,10707,10712,10714,10716,10726,10728,10736,10738,10748,10750,10752,10754],[10,10650,3374],{},[14,10652,16],{"id":16},[10,10654,3379],{},[14,10656,22],{"id":22},[10,10658,10659],{},[26,10660],{"alt":3386,"src":3387},[10,10662,3390],{},[14,10664,40],{"id":40},[42,10666,10667,10669,10671],{},[45,10668,3397],{},[45,10670,3400],{},[45,10672,3403],{},[14,10674,61],{"id":61},[10,10676,64],{},[66,10678,10679],{"className":68,"code":3410,"language":70,"meta":71,"style":71},[34,10680,10681,10685,10689,10693,10697,10701],{"__ignoreMap":71},[75,10682,10683],{"class":77,"line":78},[75,10684,3417],{},[75,10686,10687],{"class":77,"line":84},[75,10688,3422],{},[75,10690,10691],{"class":77,"line":91},[75,10692,3427],{},[75,10694,10695],{"class":77,"line":97},[75,10696,88],{"emptyLinePlaceholder":87},[75,10698,10699],{"class":77,"line":102},[75,10700,3436],{},[75,10702,10703],{"class":77,"line":108},[75,10704,3441],{},[10,10706,142],{},[66,10708,10710],{"className":10709,"code":3447,"language":148,"meta":71},[146],[34,10711,3447],{"__ignoreMap":71},[10,10713,153],{},[14,10715,156],{"id":156},[158,10717,10718,10722],{},[45,10719,10720,3461],{},[34,10721,3460],{},[45,10723,10724,3467],{},[34,10725,3466],{},[14,10727,174],{"id":174},[42,10729,10730,10734],{},[45,10731,3474,10732,3478],{},[34,10733,3477],{},[45,10735,3481],{},[14,10737,191],{"id":191},[158,10739,10740,10742],{},[45,10741,3488],{},[45,10743,2180,10744,2183,10746,3495],{},[34,10745,3477],{},[34,10747,3466],{},[10,10749,213],{},[14,10751,216],{"id":216},[10,10753,3502],{},[221,10755,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10757},[10758,10759,10760,10761,10762,10763,10764,10765],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3369,"description":3374},[234,3522,3365],{"id":3525,"title":3526,"body":10770,"category":234,"cover":235,"description":3531,"extension":236,"meta":10895,"navigation":87,"path":3687,"pinned":239,"publishedAt":240,"seo":10896,"slug":3689,"stem":3690,"summary":3691,"tags":10897,"updatedAt":240,"visible":87,"__hash__":3694},{"type":7,"value":10771,"toc":10885},[10772,10774,10776,10778,10780,10784,10790,10792,10802,10804,10806,10834,10836,10841,10843,10845,10855,10857,10869,10871,10877,10879,10881,10883],[10,10773,3531],{},[14,10775,16],{"id":16},[10,10777,3536],{},[14,10779,22],{"id":22},[10,10781,10782],{},[26,10783],{"alt":3543,"src":3544},[10,10785,3547,10786,3551,10788,3554],{},[34,10787,3550],{},[34,10789,2253],{},[14,10791,40],{"id":40},[42,10793,10794,10796,10800],{},[45,10795,3561],{},[45,10797,2346,10798,3567],{},[34,10799,3566],{},[45,10801,3570],{},[14,10803,61],{"id":61},[10,10805,64],{},[66,10807,10808],{"className":68,"code":3577,"language":70,"meta":71,"style":71},[34,10809,10810,10814,10818,10822,10826,10830],{"__ignoreMap":71},[75,10811,10812],{"class":77,"line":78},[75,10813,3584],{},[75,10815,10816],{"class":77,"line":84},[75,10817,3589],{},[75,10819,10820],{"class":77,"line":91},[75,10821,88],{"emptyLinePlaceholder":87},[75,10823,10824],{"class":77,"line":97},[75,10825,3598],{},[75,10827,10828],{"class":77,"line":102},[75,10829,3603],{},[75,10831,10832],{"class":77,"line":108},[75,10833,3608],{},[10,10835,142],{},[66,10837,10839],{"className":10838,"code":3614,"language":148,"meta":71},[146],[34,10840,3614],{"__ignoreMap":71},[10,10842,153],{},[14,10844,156],{"id":156},[158,10846,10847,10849],{},[45,10848,3625],{},[45,10850,3628,10851,3631,10853,3635],{},[34,10852,2253],{},[34,10854,3634],{},[14,10856,174],{"id":174},[42,10858,10859,10863],{},[45,10860,3642,10861,3646],{},[34,10862,3645],{},[45,10864,3649,10865,3653,10867,168],{},[34,10866,3652],{},[34,10868,3656],{},[14,10870,191],{"id":191},[158,10872,10873,10875],{},[45,10874,3663],{},[45,10876,3666],{},[10,10878,213],{},[14,10880,216],{"id":216},[10,10882,3673],{},[221,10884,223],{},{"title":71,"searchDepth":84,"depth":84,"links":10886},[10887,10888,10889,10890,10891,10892,10893,10894],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3526,"description":3531},[234,3693,3365],{"id":3696,"title":3697,"body":10899,"category":234,"cover":235,"description":3702,"extension":236,"meta":11022,"navigation":87,"path":3852,"pinned":239,"publishedAt":240,"seo":11023,"slug":3854,"stem":3855,"summary":3856,"tags":11024,"updatedAt":240,"visible":87,"__hash__":3859},{"type":7,"value":10900,"toc":11012},[10901,10903,10905,10907,10909,10913,10915,10917,10929,10931,10933,10961,10963,10968,10970,10972,10982,10984,10994,10996,11004,11006,11008,11010],[10,10902,3702],{},[14,10904,16],{"id":16},[10,10906,3707],{},[14,10908,22],{"id":22},[10,10910,10911],{},[26,10912],{"alt":3714,"src":3715},[10,10914,3718],{},[14,10916,40],{"id":40},[42,10918,10919,10921,10923],{},[45,10920,3725],{},[45,10922,3728],{},[45,10924,3731,10925,3735,10927,3739],{},[34,10926,3734],{},[34,10928,3738],{},[14,10930,61],{"id":61},[10,10932,64],{},[66,10934,10935],{"className":68,"code":3746,"language":70,"meta":71,"style":71},[34,10936,10937,10941,10945,10949,10953,10957],{"__ignoreMap":71},[75,10938,10939],{"class":77,"line":78},[75,10940,3753],{},[75,10942,10943],{"class":77,"line":84},[75,10944,3758],{},[75,10946,10947],{"class":77,"line":91},[75,10948,88],{"emptyLinePlaceholder":87},[75,10950,10951],{"class":77,"line":97},[75,10952,3767],{},[75,10954,10955],{"class":77,"line":102},[75,10956,3772],{},[75,10958,10959],{"class":77,"line":108},[75,10960,3777],{},[10,10962,142],{},[66,10964,10966],{"className":10965,"code":3783,"language":148,"meta":71},[146],[34,10967,3783],{"__ignoreMap":71},[10,10969,153],{},[14,10971,156],{"id":156},[158,10973,10974,10976],{},[45,10975,3794],{},[45,10977,10978,3800,10980,3804],{},[34,10979,3799],{},[34,10981,3803],{},[14,10983,174],{"id":174},[42,10985,10986,10992],{},[45,10987,2346,10988,3813,10990,168],{},[34,10989,3738],{},[34,10991,3734],{},[45,10993,3818],{},[14,10995,191],{"id":191},[158,10997,10998,11002],{},[45,10999,3825,11000,3828],{},[34,11001,3734],{},[45,11003,3831],{},[10,11005,213],{},[14,11007,216],{"id":216},[10,11009,3838],{},[221,11011,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11013},[11014,11015,11016,11017,11018,11019,11020,11021],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3697,"description":3702},[234,3858,3365],{"id":3861,"title":3862,"body":11026,"category":234,"cover":235,"description":3867,"extension":236,"meta":11185,"navigation":87,"path":4065,"pinned":239,"publishedAt":240,"seo":11186,"slug":4067,"stem":4068,"summary":4069,"tags":11187,"updatedAt":240,"visible":87,"__hash__":4073},{"type":7,"value":11027,"toc":11173},[11028,11030,11032,11034,11036,11040,11046,11048,11060,11062,11064,11104,11106,11111,11113,11115,11129,11131,11133,11137,11139,11141,11151,11153,11165,11167,11169,11171],[10,11029,3867],{},[14,11031,16],{"id":16},[10,11033,3872],{},[14,11035,22],{"id":22},[10,11037,11038],{},[26,11039],{"alt":3879,"src":3880},[10,11041,11042,3886,11044,3890],{},[34,11043,3885],{},[34,11045,3889],{},[14,11047,40],{"id":40},[42,11049,11050,11056,11058],{},[45,11051,11052,3899,11054,3903],{},[34,11053,2814],{},[34,11055,3902],{},[45,11057,3906],{},[45,11059,3909],{},[14,11061,61],{"id":61},[10,11063,64],{},[66,11065,11066],{"className":68,"code":3916,"language":70,"meta":71,"style":71},[34,11067,11068,11072,11076,11080,11084,11088,11092,11096,11100],{"__ignoreMap":71},[75,11069,11070],{"class":77,"line":78},[75,11071,3923],{},[75,11073,11074],{"class":77,"line":84},[75,11075,3928],{},[75,11077,11078],{"class":77,"line":91},[75,11079,3933],{},[75,11081,11082],{"class":77,"line":97},[75,11083,88],{"emptyLinePlaceholder":87},[75,11085,11086],{"class":77,"line":102},[75,11087,3942],{},[75,11089,11090],{"class":77,"line":108},[75,11091,3947],{},[75,11093,11094],{"class":77,"line":114},[75,11095,3952],{},[75,11097,11098],{"class":77,"line":119},[75,11099,3957],{},[75,11101,11102],{"class":77,"line":125},[75,11103,3962],{},[10,11105,142],{},[66,11107,11109],{"className":11108,"code":3968,"language":148,"meta":71},[146],[34,11110,3968],{"__ignoreMap":71},[10,11112,153],{},[14,11114,156],{"id":156},[158,11116,11117,11121],{},[45,11118,11119,3982],{},[34,11120,3981],{},[45,11122,11123,3988,11125,3992,11127,3996],{},[34,11124,3987],{},[34,11126,3991],{},[34,11128,3995],{},[336,11130,2704],{"id":2704},[10,11132,4001],{},[10,11134,11135],{},[26,11136],{"alt":4006,"src":4007},[10,11138,4010],{},[14,11140,174],{"id":174},[42,11142,11143,11149],{},[45,11144,4017,11145,4020,11147,168],{},[34,11146,2814],{},[34,11148,3902],{},[45,11150,4025],{},[14,11152,191],{"id":191},[158,11154,11155,11157],{},[45,11156,4032],{},[45,11158,2346,11159,4038,11161,1164,11163,168],{},[34,11160,4037],{},[34,11162,3902],{},[34,11164,2814],{},[10,11166,213],{},[14,11168,216],{"id":216},[10,11170,4049],{},[221,11172,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11174},[11175,11176,11177,11178,11179,11182,11183,11184],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":11180},[11181],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":3862,"description":3867},[234,4071,4072],{"id":4075,"title":4076,"body":11189,"category":234,"cover":235,"description":4081,"extension":236,"meta":11361,"navigation":87,"path":4294,"pinned":239,"publishedAt":240,"seo":11362,"slug":4296,"stem":4297,"summary":4298,"tags":11363,"updatedAt":240,"visible":87,"__hash__":4301},{"type":7,"value":11190,"toc":11348},[11191,11193,11195,11197,11199,11203,11211,11213,11221,11223,11225,11269,11271,11276,11278,11280,11292,11294,11296,11300,11306,11308,11310,11314,11318,11320,11332,11334,11340,11342,11344,11346],[10,11192,4081],{},[14,11194,16],{"id":16},[10,11196,4086],{},[14,11198,22],{"id":22},[10,11200,11201],{},[26,11202],{"alt":4093,"src":4094},[10,11204,11205,2264,11207,2264,11209,4104],{},[34,11206,1163],{},[34,11208,4101],{},[34,11210,1167],{},[14,11212,40],{"id":40},[42,11214,11215,11217,11219],{},[45,11216,4111],{},[45,11218,4114],{},[45,11220,4117],{},[14,11222,61],{"id":61},[10,11224,64],{},[66,11226,11227],{"className":68,"code":4124,"language":70,"meta":71,"style":71},[34,11228,11229,11233,11237,11241,11245,11249,11253,11257,11261,11265],{"__ignoreMap":71},[75,11230,11231],{"class":77,"line":78},[75,11232,4131],{},[75,11234,11235],{"class":77,"line":84},[75,11236,88],{"emptyLinePlaceholder":87},[75,11238,11239],{"class":77,"line":91},[75,11240,4140],{},[75,11242,11243],{"class":77,"line":97},[75,11244,4145],{},[75,11246,11247],{"class":77,"line":102},[75,11248,4150],{},[75,11250,11251],{"class":77,"line":108},[75,11252,4155],{},[75,11254,11255],{"class":77,"line":114},[75,11256,1153],{},[75,11258,11259],{"class":77,"line":119},[75,11260,4164],{},[75,11262,11263],{"class":77,"line":125},[75,11264,88],{"emptyLinePlaceholder":87},[75,11266,11267],{"class":77,"line":131},[75,11268,4173],{},[10,11270,142],{},[66,11272,11274],{"className":11273,"code":4179,"language":148,"meta":71},[146],[34,11275,4179],{"__ignoreMap":71},[10,11277,153],{},[14,11279,156],{"id":156},[158,11281,11282,11286],{},[45,11283,4190,11284,4194],{},[34,11285,4193],{},[45,11287,11288,4200,11290,4203],{},[34,11289,4199],{},[34,11291,1167],{},[336,11293,2704],{"id":2704},[10,11295,4208],{},[10,11297,11298],{},[26,11299],{"alt":4213,"src":4214},[10,11301,11302,4219,11304,4222],{},[34,11303,4193],{},[34,11305,4199],{},[336,11307,2704],{"id":4225},[10,11309,4228],{},[10,11311,11312],{},[26,11313],{"alt":4233,"src":4234},[10,11315,4237,11316,4240],{},[34,11317,1163],{},[14,11319,174],{"id":174},[42,11321,11322,11326],{},[45,11323,4247,11324,4250],{},[34,11325,4199],{},[45,11327,4253,11328,4256,11330,4260],{},[34,11329,1163],{},[34,11331,4259],{},[14,11333,191],{"id":191},[158,11335,11336,11338],{},[45,11337,4267],{},[45,11339,4270],{},[10,11341,213],{},[14,11343,216],{"id":216},[10,11345,4277],{},[221,11347,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11349},[11350,11351,11352,11353,11354,11358,11359,11360],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":11355},[11356,11357],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":4076,"description":4081},[234,1163,4300],{"id":4303,"title":4304,"body":11365,"category":234,"cover":235,"description":4309,"extension":236,"meta":11502,"navigation":87,"path":4476,"pinned":239,"publishedAt":240,"seo":11503,"slug":4478,"stem":4479,"summary":4480,"tags":11504,"updatedAt":240,"visible":87,"__hash__":4483},{"type":7,"value":11366,"toc":11490},[11367,11369,11371,11373,11375,11379,11383,11385,11395,11397,11399,11431,11433,11438,11440,11442,11452,11454,11456,11460,11464,11466,11472,11474,11482,11484,11486,11488],[10,11368,4309],{},[14,11370,16],{"id":16},[10,11372,4314],{},[14,11374,22],{"id":22},[10,11376,11377],{},[26,11378],{"alt":4321,"src":4322},[10,11380,11381,4328],{},[34,11382,4327],{},[14,11384,40],{"id":40},[42,11386,11387,11389,11391],{},[45,11388,4335],{},[45,11390,4338],{},[45,11392,4341,11393,4345],{},[34,11394,4344],{},[14,11396,61],{"id":61},[10,11398,64],{},[66,11400,11401],{"className":68,"code":4352,"language":70,"meta":71,"style":71},[34,11402,11403,11407,11411,11415,11419,11423,11427],{"__ignoreMap":71},[75,11404,11405],{"class":77,"line":78},[75,11406,4359],{},[75,11408,11409],{"class":77,"line":84},[75,11410,88],{"emptyLinePlaceholder":87},[75,11412,11413],{"class":77,"line":91},[75,11414,4368],{},[75,11416,11417],{"class":77,"line":97},[75,11418,4373],{},[75,11420,11421],{"class":77,"line":102},[75,11422,4378],{},[75,11424,11425],{"class":77,"line":108},[75,11426,88],{"emptyLinePlaceholder":87},[75,11428,11429],{"class":77,"line":114},[75,11430,4387],{},[10,11432,142],{},[66,11434,11436],{"className":11435,"code":4393,"language":148,"meta":71},[146],[34,11437,4393],{"__ignoreMap":71},[10,11439,153],{},[14,11441,156],{"id":156},[158,11443,11444,11448],{},[45,11445,4404,11446,4408],{},[34,11447,4407],{},[45,11449,4411,11450,4414],{},[34,11451,4407],{},[336,11453,2704],{"id":2704},[10,11455,4419],{},[10,11457,11458],{},[26,11459],{"alt":4424,"src":4425},[10,11461,4428,11462,4431],{},[34,11463,4407],{},[14,11465,174],{"id":174},[42,11467,11468,11470],{},[45,11469,4438],{},[45,11471,4441],{},[14,11473,191],{"id":191},[158,11475,11476,11480],{},[45,11477,2346,11478,4450],{},[34,11479,4327],{},[45,11481,4453],{},[10,11483,213],{},[14,11485,216],{"id":216},[10,11487,4460],{},[221,11489,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11491},[11492,11493,11494,11495,11496,11499,11500,11501],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":11497},[11498],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":4304,"description":4309},[234,4327,4482],{"id":4485,"title":4486,"body":11506,"category":234,"cover":235,"description":4491,"extension":236,"meta":11631,"navigation":87,"path":4640,"pinned":239,"publishedAt":240,"seo":11632,"slug":4642,"stem":4643,"summary":4644,"tags":11633,"updatedAt":240,"visible":87,"__hash__":4647},{"type":7,"value":11507,"toc":11621},[11508,11510,11512,11514,11516,11520,11524,11526,11536,11538,11540,11572,11574,11579,11581,11583,11595,11597,11603,11605,11613,11615,11617,11619],[10,11509,4491],{},[14,11511,16],{"id":16},[10,11513,4496],{},[14,11515,22],{"id":22},[10,11517,11518],{},[26,11519],{"alt":4503,"src":4504},[10,11521,11522,4509],{},[34,11523,4344],{},[14,11525,40],{"id":40},[42,11527,11528,11532,11534],{},[45,11529,11530,4519],{},[34,11531,4518],{},[45,11533,4522],{},[45,11535,4525],{},[14,11537,61],{"id":61},[10,11539,64],{},[66,11541,11542],{"className":68,"code":4532,"language":70,"meta":71,"style":71},[34,11543,11544,11548,11552,11556,11560,11564,11568],{"__ignoreMap":71},[75,11545,11546],{"class":77,"line":78},[75,11547,4539],{},[75,11549,11550],{"class":77,"line":84},[75,11551,88],{"emptyLinePlaceholder":87},[75,11553,11554],{"class":77,"line":91},[75,11555,4548],{},[75,11557,11558],{"class":77,"line":97},[75,11559,4553],{},[75,11561,11562],{"class":77,"line":102},[75,11563,88],{"emptyLinePlaceholder":87},[75,11565,11566],{"class":77,"line":108},[75,11567,4562],{},[75,11569,11570],{"class":77,"line":114},[75,11571,4567],{},[10,11573,142],{},[66,11575,11577],{"className":11576,"code":4573,"language":148,"meta":71},[146],[34,11578,4573],{"__ignoreMap":71},[10,11580,153],{},[14,11582,156],{"id":156},[158,11584,11585,11591],{},[45,11586,4584,11587,4587,11589,4591],{},[34,11588,4344],{},[34,11590,4590],{},[45,11592,11593,4596],{},[34,11594,4518],{},[14,11596,174],{"id":174},[42,11598,11599,11601],{},[45,11600,4603],{},[45,11602,4606],{},[14,11604,191],{"id":191},[158,11606,11607,11609],{},[45,11608,4613],{},[45,11610,2346,11611,4619],{},[34,11612,4618],{},[10,11614,213],{},[14,11616,216],{"id":216},[10,11618,4626],{},[221,11620,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11622},[11623,11624,11625,11626,11627,11628,11629,11630],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":4486,"description":4491},[234,4344,4646],{"id":4649,"title":4650,"body":11635,"category":234,"cover":235,"description":4655,"extension":236,"meta":11780,"navigation":87,"path":4829,"pinned":239,"publishedAt":240,"seo":11781,"slug":4831,"stem":4832,"summary":4833,"tags":11782,"updatedAt":240,"visible":87,"__hash__":4835},{"type":7,"value":11636,"toc":11770},[11637,11639,11641,11643,11645,11649,11655,11657,11671,11673,11675,11719,11721,11726,11728,11730,11740,11742,11754,11756,11762,11764,11766,11768],[10,11638,4655],{},[14,11640,16],{"id":16},[10,11642,4660],{},[14,11644,22],{"id":22},[10,11646,11647],{},[26,11648],{"alt":4667,"src":4668},[10,11650,11651,4674,11653,4678],{},[34,11652,4673],{},[34,11654,4677],{},[14,11656,40],{"id":40},[42,11658,11659,11661,11667],{},[45,11660,4685],{},[45,11662,11663,4690,11665,4693],{},[34,11664,4673],{},[34,11666,4327],{},[45,11668,4696,11669,4699],{},[34,11670,4677],{},[14,11672,61],{"id":61},[10,11674,64],{},[66,11676,11677],{"className":68,"code":4706,"language":70,"meta":71,"style":71},[34,11678,11679,11683,11687,11691,11695,11699,11703,11707,11711,11715],{"__ignoreMap":71},[75,11680,11681],{"class":77,"line":78},[75,11682,4713],{},[75,11684,11685],{"class":77,"line":84},[75,11686,88],{"emptyLinePlaceholder":87},[75,11688,11689],{"class":77,"line":91},[75,11690,4722],{},[75,11692,11693],{"class":77,"line":97},[75,11694,4727],{},[75,11696,11697],{"class":77,"line":102},[75,11698,4732],{},[75,11700,11701],{"class":77,"line":108},[75,11702,4737],{},[75,11704,11705],{"class":77,"line":114},[75,11706,4742],{},[75,11708,11709],{"class":77,"line":119},[75,11710,4567],{},[75,11712,11713],{"class":77,"line":125},[75,11714,88],{"emptyLinePlaceholder":87},[75,11716,11717],{"class":77,"line":131},[75,11718,4755],{},[10,11720,142],{},[66,11722,11724],{"className":11723,"code":4761,"language":148,"meta":71},[146],[34,11725,4761],{"__ignoreMap":71},[10,11727,153],{},[14,11729,156],{"id":156},[158,11731,11732,11736],{},[45,11733,4772,11734,4775],{},[34,11735,4673],{},[45,11737,4778,11738,4781],{},[34,11739,4677],{},[14,11741,174],{"id":174},[42,11743,11744,11748],{},[45,11745,3474,11746,4790],{},[34,11747,4673],{},[45,11749,179,11750,4795,11752,4798],{},[34,11751,4327],{},[34,11753,4673],{},[14,11755,191],{"id":191},[158,11757,11758,11760],{},[45,11759,4805],{},[45,11761,4808],{},[10,11763,213],{},[14,11765,216],{"id":216},[10,11767,4815],{},[221,11769,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11771},[11772,11773,11774,11775,11776,11777,11778,11779],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":4650,"description":4655},[234,4677,4673],{"id":4837,"title":4838,"body":11784,"category":234,"cover":235,"description":4843,"extension":236,"meta":11923,"navigation":87,"path":5015,"pinned":239,"publishedAt":240,"seo":11924,"slug":5017,"stem":5018,"summary":5019,"tags":11925,"updatedAt":240,"visible":87,"__hash__":5023},{"type":7,"value":11785,"toc":11911},[11786,11788,11790,11792,11794,11798,11800,11802,11818,11820,11822,11850,11852,11857,11859,11861,11873,11875,11877,11881,11883,11885,11895,11897,11903,11905,11907,11909],[10,11787,4843],{},[14,11789,16],{"id":16},[10,11791,4848],{},[14,11793,22],{"id":22},[10,11795,11796],{},[26,11797],{"alt":4855,"src":4856},[10,11799,4859],{},[14,11801,40],{"id":40},[42,11803,11804,11806,11808],{},[45,11805,4866],{},[45,11807,4869],{},[45,11809,4872,11810,2264,11812,4879,11814,2264,11816,168],{},[34,11811,4875],{},[34,11813,4878],{},[34,11815,4882],{},[34,11817,4885],{},[14,11819,61],{"id":61},[10,11821,64],{},[66,11823,11824],{"className":68,"code":4892,"language":70,"meta":71,"style":71},[34,11825,11826,11830,11834,11838,11842,11846],{"__ignoreMap":71},[75,11827,11828],{"class":77,"line":78},[75,11829,4899],{},[75,11831,11832],{"class":77,"line":84},[75,11833,88],{"emptyLinePlaceholder":87},[75,11835,11836],{"class":77,"line":91},[75,11837,4908],{},[75,11839,11840],{"class":77,"line":97},[75,11841,4913],{},[75,11843,11844],{"class":77,"line":102},[75,11845,4918],{},[75,11847,11848],{"class":77,"line":108},[75,11849,4923],{},[10,11851,142],{},[66,11853,11855],{"className":11854,"code":4929,"language":148,"meta":71},[146],[34,11856,4929],{"__ignoreMap":71},[10,11858,153],{},[14,11860,156],{"id":156},[158,11862,11863,11871],{},[45,11864,4940,11865,4943,11867,1164,11869,168],{},[34,11866,4875],{},[34,11868,4946],{},[34,11870,4949],{},[45,11872,4952],{},[336,11874,2704],{"id":2704},[10,11876,4957],{},[10,11878,11879],{},[26,11880],{"alt":4962,"src":4963},[10,11882,4966],{},[14,11884,174],{"id":174},[42,11886,11887,11893],{},[45,11888,4973,11889,1016,11891,4979],{},[34,11890,4976],{},[34,11892,4882],{},[45,11894,4982],{},[14,11896,191],{"id":191},[158,11898,11899,11901],{},[45,11900,4989],{},[45,11902,4992],{},[10,11904,213],{},[14,11906,216],{"id":216},[10,11908,4999],{},[221,11910,223],{},{"title":71,"searchDepth":84,"depth":84,"links":11912},[11913,11914,11915,11916,11917,11920,11921,11922],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":11918},[11919],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":4838,"description":4843},[234,5021,5022],{"id":5025,"title":5026,"body":11927,"category":234,"cover":235,"description":5031,"extension":236,"meta":12044,"navigation":87,"path":5170,"pinned":239,"publishedAt":240,"seo":12045,"slug":5172,"stem":5173,"summary":5174,"tags":12046,"updatedAt":240,"visible":87,"__hash__":5178},{"type":7,"value":11928,"toc":12034},[11929,11931,11933,11935,11937,11941,11943,11945,11953,11955,11957,11989,11991,11996,11998,12000,12008,12010,12018,12020,12026,12028,12030,12032],[10,11930,5031],{},[14,11932,16],{"id":16},[10,11934,5036],{},[14,11936,22],{"id":22},[10,11938,11939],{},[26,11940],{"alt":5043,"src":5044},[10,11942,5047],{},[14,11944,40],{"id":40},[42,11946,11947,11949,11951],{},[45,11948,5054],{},[45,11950,5057],{},[45,11952,5060],{},[14,11954,61],{"id":61},[10,11956,64],{},[66,11958,11959],{"className":68,"code":5067,"language":70,"meta":71,"style":71},[34,11960,11961,11965,11969,11973,11977,11981,11985],{"__ignoreMap":71},[75,11962,11963],{"class":77,"line":78},[75,11964,5074],{},[75,11966,11967],{"class":77,"line":84},[75,11968,88],{"emptyLinePlaceholder":87},[75,11970,11971],{"class":77,"line":91},[75,11972,5083],{},[75,11974,11975],{"class":77,"line":97},[75,11976,5088],{},[75,11978,11979],{"class":77,"line":102},[75,11980,88],{"emptyLinePlaceholder":87},[75,11982,11983],{"class":77,"line":108},[75,11984,5097],{},[75,11986,11987],{"class":77,"line":114},[75,11988,5102],{},[10,11990,142],{},[66,11992,11994],{"className":11993,"code":5108,"language":148,"meta":71},[146],[34,11995,5108],{"__ignoreMap":71},[10,11997,153],{},[14,11999,156],{"id":156},[158,12001,12002,12004],{},[45,12003,5119],{},[45,12005,5122,12006,5126],{},[34,12007,5125],{},[14,12009,174],{"id":174},[42,12011,12012,12016],{},[45,12013,5133,12014,5136],{},[34,12015,4344],{},[45,12017,5139],{},[14,12019,191],{"id":191},[158,12021,12022,12024],{},[45,12023,5146],{},[45,12025,5149],{},[10,12027,213],{},[14,12029,216],{"id":216},[10,12031,5156],{},[221,12033,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12035},[12036,12037,12038,12039,12040,12041,12042,12043],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5026,"description":5031},[234,5176,5177],{"id":5180,"title":5181,"body":12048,"category":234,"cover":235,"description":5186,"extension":236,"meta":12167,"navigation":87,"path":5330,"pinned":239,"publishedAt":240,"seo":12168,"slug":5332,"stem":5333,"summary":5334,"tags":12169,"updatedAt":240,"visible":87,"__hash__":5338},{"type":7,"value":12049,"toc":12157},[12050,12052,12054,12056,12058,12062,12064,12066,12074,12076,12078,12110,12112,12117,12119,12121,12131,12133,12139,12141,12149,12151,12153,12155],[10,12051,5186],{},[14,12053,16],{"id":16},[10,12055,5191],{},[14,12057,22],{"id":22},[10,12059,12060],{},[26,12061],{"alt":5198,"src":5199},[10,12063,5202],{},[14,12065,40],{"id":40},[42,12067,12068,12070,12072],{},[45,12069,5209],{},[45,12071,5212],{},[45,12073,5215],{},[14,12075,61],{"id":61},[10,12077,64],{},[66,12079,12080],{"className":68,"code":5222,"language":70,"meta":71,"style":71},[34,12081,12082,12086,12090,12094,12098,12102,12106],{"__ignoreMap":71},[75,12083,12084],{"class":77,"line":78},[75,12085,5229],{},[75,12087,12088],{"class":77,"line":84},[75,12089,5234],{},[75,12091,12092],{"class":77,"line":91},[75,12093,5239],{},[75,12095,12096],{"class":77,"line":97},[75,12097,88],{"emptyLinePlaceholder":87},[75,12099,12100],{"class":77,"line":102},[75,12101,5248],{},[75,12103,12104],{"class":77,"line":108},[75,12105,5253],{},[75,12107,12108],{"class":77,"line":114},[75,12109,5258],{},[10,12111,142],{},[66,12113,12115],{"className":12114,"code":5264,"language":148,"meta":71},[146],[34,12116,5264],{"__ignoreMap":71},[10,12118,153],{},[14,12120,156],{"id":156},[158,12122,12123,12127],{},[45,12124,945,12125,5278],{},[34,12126,5277],{},[45,12128,5281,12129,5285],{},[34,12130,5284],{},[14,12132,174],{"id":174},[42,12134,12135,12137],{},[45,12136,5292],{},[45,12138,5295],{},[14,12140,191],{"id":191},[158,12142,12143,12147],{},[45,12144,5302,12145,5306],{},[34,12146,5305],{},[45,12148,5309],{},[10,12150,213],{},[14,12152,216],{"id":216},[10,12154,5316],{},[221,12156,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12158},[12159,12160,12161,12162,12163,12164,12165,12166],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5181,"description":5186},[234,5336,5337],{"id":5340,"title":5341,"body":12171,"category":234,"cover":235,"description":5346,"extension":236,"meta":12316,"navigation":87,"path":5527,"pinned":239,"publishedAt":240,"seo":12317,"slug":5529,"stem":5530,"summary":5531,"tags":12318,"updatedAt":240,"visible":87,"__hash__":5535},{"type":7,"value":12172,"toc":12304},[12173,12175,12177,12179,12181,12185,12189,12191,12203,12205,12207,12235,12237,12242,12244,12246,12260,12262,12264,12268,12276,12278,12288,12290,12296,12298,12300,12302],[10,12174,5346],{},[14,12176,16],{"id":16},[10,12178,5351],{},[14,12180,22],{"id":22},[10,12182,12183],{},[26,12184],{"alt":5358,"src":5359},[10,12186,5362,12187,5366],{},[34,12188,5365],{},[14,12190,40],{"id":40},[42,12192,12193,12195,12197],{},[45,12194,5373],{},[45,12196,5376],{},[45,12198,5379,12199,5382,12201,168],{},[34,12200,5365],{},[34,12202,5385],{},[14,12204,61],{"id":61},[10,12206,64],{},[66,12208,12209],{"className":68,"code":5392,"language":70,"meta":71,"style":71},[34,12210,12211,12215,12219,12223,12227,12231],{"__ignoreMap":71},[75,12212,12213],{"class":77,"line":78},[75,12214,5399],{},[75,12216,12217],{"class":77,"line":84},[75,12218,5404],{},[75,12220,12221],{"class":77,"line":91},[75,12222,5409],{},[75,12224,12225],{"class":77,"line":97},[75,12226,88],{"emptyLinePlaceholder":87},[75,12228,12229],{"class":77,"line":102},[75,12230,5418],{},[75,12232,12233],{"class":77,"line":108},[75,12234,5423],{},[10,12236,142],{},[66,12238,12240],{"className":12239,"code":5429,"language":148,"meta":71},[146],[34,12241,5429],{"__ignoreMap":71},[10,12243,153],{},[14,12245,156],{"id":156},[158,12247,12248,12254],{},[45,12249,5440,12250,2264,12252,5446],{},[34,12251,5443],{},[34,12253,4407],{},[45,12255,12256,5452,12258,5456],{},[34,12257,5451],{},[34,12259,5455],{},[336,12261,2704],{"id":2704},[10,12263,5461],{},[10,12265,12266],{},[26,12267],{"alt":5466,"src":5467},[10,12269,12270,2264,12272,1164,12274,5477],{},[34,12271,5443],{},[34,12273,4407],{},[34,12275,5476],{},[14,12277,174],{"id":174},[42,12279,12280,12284],{},[45,12281,5484,12282,5488],{},[34,12283,5487],{},[45,12285,5491,12286,5494],{},[34,12287,5476],{},[14,12289,191],{"id":191},[158,12291,12292,12294],{},[45,12293,5501],{},[45,12295,5504],{},[10,12297,213],{},[14,12299,216],{"id":216},[10,12301,5511],{},[221,12303,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12305},[12306,12307,12308,12309,12310,12313,12314,12315],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":12311},[12312],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5341,"description":5346},[234,5533,5534],{"id":5537,"title":5538,"body":12320,"category":234,"cover":235,"description":5543,"extension":236,"meta":12469,"navigation":87,"path":5724,"pinned":239,"publishedAt":240,"seo":12470,"slug":5726,"stem":5727,"summary":5728,"tags":12471,"updatedAt":240,"visible":87,"__hash__":5732},{"type":7,"value":12321,"toc":12457},[12322,12324,12326,12328,12330,12334,12336,12338,12350,12352,12354,12398,12400,12405,12407,12409,12421,12423,12425,12429,12431,12433,12441,12443,12449,12451,12453,12455],[10,12323,5543],{},[14,12325,16],{"id":16},[10,12327,5548],{},[14,12329,22],{"id":22},[10,12331,12332],{},[26,12333],{"alt":5555,"src":5556},[10,12335,5559],{},[14,12337,40],{"id":40},[42,12339,12340,12342,12346],{},[45,12341,5566],{},[45,12343,12344,5572],{},[34,12345,5571],{},[45,12347,12348,5578],{},[34,12349,5577],{},[14,12351,61],{"id":61},[10,12353,64],{},[66,12355,12356],{"className":68,"code":5585,"language":70,"meta":71,"style":71},[34,12357,12358,12362,12366,12370,12374,12378,12382,12386,12390,12394],{"__ignoreMap":71},[75,12359,12360],{"class":77,"line":78},[75,12361,5592],{},[75,12363,12364],{"class":77,"line":84},[75,12365,5597],{},[75,12367,12368],{"class":77,"line":91},[75,12369,88],{"emptyLinePlaceholder":87},[75,12371,12372],{"class":77,"line":97},[75,12373,5606],{},[75,12375,12376],{"class":77,"line":102},[75,12377,5611],{},[75,12379,12380],{"class":77,"line":108},[75,12381,88],{"emptyLinePlaceholder":87},[75,12383,12384],{"class":77,"line":114},[75,12385,5620],{},[75,12387,12388],{"class":77,"line":119},[75,12389,5625],{},[75,12391,12392],{"class":77,"line":125},[75,12393,88],{"emptyLinePlaceholder":87},[75,12395,12396],{"class":77,"line":131},[75,12397,5634],{},[10,12399,142],{},[66,12401,12403],{"className":12402,"code":5640,"language":148,"meta":71},[146],[34,12404,5640],{"__ignoreMap":71},[10,12406,153],{},[14,12408,156],{"id":156},[158,12410,12411,12415],{},[45,12412,5651,12413,5655],{},[34,12414,5654],{},[45,12416,12417,5661,12419,168],{},[34,12418,5660],{},[34,12420,5664],{},[336,12422,2704],{"id":2704},[10,12424,5669],{},[10,12426,12427],{},[26,12428],{"alt":5674,"src":5675},[10,12430,5678],{},[14,12432,174],{"id":174},[42,12434,12435,12439],{},[45,12436,5685,12437,5688],{},[34,12438,5385],{},[45,12440,5691],{},[14,12442,191],{"id":191},[158,12444,12445,12447],{},[45,12446,5698],{},[45,12448,5701],{},[10,12450,213],{},[14,12452,216],{"id":216},[10,12454,5708],{},[221,12456,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12458},[12459,12460,12461,12462,12463,12466,12467,12468],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":12464},[12465],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5538,"description":5543},[234,5730,5731],{"id":5734,"title":5735,"body":12473,"category":234,"cover":235,"description":5740,"extension":236,"meta":12634,"navigation":87,"path":5937,"pinned":239,"publishedAt":240,"seo":12635,"slug":5939,"stem":5940,"summary":5941,"tags":12636,"updatedAt":240,"visible":87,"__hash__":5945},{"type":7,"value":12474,"toc":12622},[12475,12477,12479,12481,12483,12487,12489,12491,12503,12505,12507,12559,12561,12566,12568,12570,12588,12590,12592,12596,12598,12600,12606,12608,12614,12616,12618,12620],[10,12476,5740],{},[14,12478,16],{"id":16},[10,12480,5745],{},[14,12482,22],{"id":22},[10,12484,12485],{},[26,12486],{"alt":5752,"src":5753},[10,12488,5756],{},[14,12490,40],{"id":40},[42,12492,12493,12495,12497],{},[45,12494,5763],{},[45,12496,5766],{},[45,12498,12499,2183,12501,5775],{},[34,12500,5771],{},[34,12502,5774],{},[14,12504,61],{"id":61},[10,12506,64],{},[66,12508,12509],{"className":68,"code":5782,"language":70,"meta":71,"style":71},[34,12510,12511,12515,12519,12523,12527,12531,12535,12539,12543,12547,12551,12555],{"__ignoreMap":71},[75,12512,12513],{"class":77,"line":78},[75,12514,5789],{},[75,12516,12517],{"class":77,"line":84},[75,12518,88],{"emptyLinePlaceholder":87},[75,12520,12521],{"class":77,"line":91},[75,12522,5798],{},[75,12524,12525],{"class":77,"line":97},[75,12526,5803],{},[75,12528,12529],{"class":77,"line":102},[75,12530,88],{"emptyLinePlaceholder":87},[75,12532,12533],{"class":77,"line":108},[75,12534,5812],{},[75,12536,12537],{"class":77,"line":114},[75,12538,5817],{},[75,12540,12541],{"class":77,"line":119},[75,12542,5822],{},[75,12544,12545],{"class":77,"line":125},[75,12546,88],{"emptyLinePlaceholder":87},[75,12548,12549],{"class":77,"line":131},[75,12550,5831],{},[75,12552,12553],{"class":77,"line":136},[75,12554,88],{"emptyLinePlaceholder":87},[75,12556,12557],{"class":77,"line":5838},[75,12558,5841],{},[10,12560,142],{},[66,12562,12564],{"className":12563,"code":5847,"language":148,"meta":71},[146],[34,12565,5847],{"__ignoreMap":71},[10,12567,153],{},[14,12569,156],{"id":156},[158,12571,12572,12582],{},[45,12573,12574,5861,12576,5865,12578,5868,12580,5872],{},[34,12575,5860],{},[34,12577,5864],{},[34,12579,5654],{},[34,12581,5871],{},[45,12583,12584,5877,12586,5880],{},[34,12585,4590],{},[34,12587,2215],{},[336,12589,2704],{"id":2704},[10,12591,5885],{},[10,12593,12594],{},[26,12595],{"alt":5890,"src":5891},[10,12597,5894],{},[14,12599,174],{"id":174},[42,12601,12602,12604],{},[45,12603,5901],{},[45,12605,5904],{},[14,12607,191],{"id":191},[158,12609,12610,12612],{},[45,12611,5911],{},[45,12613,5914],{},[10,12615,213],{},[14,12617,216],{"id":216},[10,12619,5921],{},[221,12621,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12623},[12624,12625,12626,12627,12628,12631,12632,12633],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":12629},[12630],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5735,"description":5740},[234,5943,5944],{"id":5947,"title":5948,"body":12638,"category":234,"cover":235,"description":5953,"extension":236,"meta":12761,"navigation":87,"path":6104,"pinned":239,"publishedAt":240,"seo":12762,"slug":6106,"stem":6107,"summary":6108,"tags":12763,"updatedAt":240,"visible":87,"__hash__":6112},{"type":7,"value":12639,"toc":12751},[12640,12642,12644,12646,12648,12652,12654,12656,12670,12672,12674,12702,12704,12709,12711,12713,12723,12725,12733,12735,12743,12745,12747,12749],[10,12641,5953],{},[14,12643,16],{"id":16},[10,12645,5958],{},[14,12647,22],{"id":22},[10,12649,12650],{},[26,12651],{"alt":5965,"src":5966},[10,12653,5969],{},[14,12655,40],{"id":40},[42,12657,12658,12660,12662],{},[45,12659,5976],{},[45,12661,5979],{},[45,12663,5982,12664,2264,12666,2264,12668,5990],{},[34,12665,2267],{},[34,12667,2433],{},[34,12669,5989],{},[14,12671,61],{"id":61},[10,12673,64],{},[66,12675,12676],{"className":68,"code":5997,"language":70,"meta":71,"style":71},[34,12677,12678,12682,12686,12690,12694,12698],{"__ignoreMap":71},[75,12679,12680],{"class":77,"line":78},[75,12681,6004],{},[75,12683,12684],{"class":77,"line":84},[75,12685,6009],{},[75,12687,12688],{"class":77,"line":91},[75,12689,6014],{},[75,12691,12692],{"class":77,"line":97},[75,12693,88],{"emptyLinePlaceholder":87},[75,12695,12696],{"class":77,"line":102},[75,12697,6023],{},[75,12699,12700],{"class":77,"line":108},[75,12701,6028],{},[10,12703,142],{},[66,12705,12707],{"className":12706,"code":6034,"language":148,"meta":71},[146],[34,12708,6034],{"__ignoreMap":71},[10,12710,153],{},[14,12712,156],{"id":156},[158,12714,12715,12721],{},[45,12716,6045,12717,6049,12719,6052],{},[34,12718,6048],{},[34,12720,2253],{},[45,12722,6055],{},[14,12724,174],{"id":174},[42,12726,12727,12731],{},[45,12728,6062,12729,6066],{},[34,12730,6065],{},[45,12732,6069],{},[14,12734,191],{"id":191},[158,12736,12737,12739],{},[45,12738,6076],{},[45,12740,6079,12741,6083],{},[34,12742,6082],{},[10,12744,213],{},[14,12746,216],{"id":216},[10,12748,6090],{},[221,12750,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12752},[12753,12754,12755,12756,12757,12758,12759,12760],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5948,"description":5953},[234,6110,6111],{"id":6114,"title":6115,"body":12765,"category":234,"cover":235,"description":6120,"extension":236,"meta":12942,"navigation":87,"path":6348,"pinned":239,"publishedAt":240,"seo":12943,"slug":6350,"stem":6351,"summary":6352,"tags":12944,"updatedAt":240,"visible":87,"__hash__":6356},{"type":7,"value":12766,"toc":12930},[12767,12769,12771,12775,12777,12781,12787,12789,12801,12803,12807,12831,12835,12851,12857,12859,12864,12866,12868,12884,12886,12888,12892,12896,12898,12910,12912,12922,12924,12926,12928],[10,12768,6120],{},[14,12770,16],{"id":16},[10,12772,6125,12773,6128],{},[302,12774,6048],{},[14,12776,22],{"id":22},[10,12778,12779],{},[26,12780],{"alt":6135,"src":6136},[10,12782,6139,12783,6143,12785,6147],{},[34,12784,6142],{},[34,12786,6146],{},[14,12788,40],{"id":40},[42,12790,12791,12795,12797],{},[45,12792,6154,12793,6157],{},[34,12794,1178],{},[45,12796,6160],{},[45,12798,6163,12799,6167],{},[34,12800,6166],{},[14,12802,61],{"id":61},[10,12804,6172,12805,6176],{},[34,12806,6175],{},[66,12808,12809],{"className":68,"code":6179,"language":70,"meta":71,"style":71},[34,12810,12811,12815,12819,12823,12827],{"__ignoreMap":71},[75,12812,12813],{"class":77,"line":78},[75,12814,6186],{},[75,12816,12817],{"class":77,"line":84},[75,12818,6191],{},[75,12820,12821],{"class":77,"line":91},[75,12822,88],{"emptyLinePlaceholder":87},[75,12824,12825],{"class":77,"line":97},[75,12826,6200],{},[75,12828,12829],{"class":77,"line":102},[75,12830,6205],{},[10,12832,6208,12833,6212],{},[34,12834,6211],{},[66,12836,12837],{"className":68,"code":6215,"language":70,"meta":71,"style":71},[34,12838,12839,12843,12847],{"__ignoreMap":71},[75,12840,12841],{"class":77,"line":78},[75,12842,6222],{},[75,12844,12845],{"class":77,"line":84},[75,12846,88],{"emptyLinePlaceholder":87},[75,12848,12849],{"class":77,"line":91},[75,12850,6231],{},[10,12852,6234,12853,1164,12855,168],{},[34,12854,6237],{},[34,12856,6240],{},[10,12858,142],{},[66,12860,12862],{"className":12861,"code":6246,"language":148,"meta":71},[146],[34,12863,6246],{"__ignoreMap":71},[10,12865,153],{},[14,12867,156],{"id":156},[158,12869,12870,12876],{},[45,12871,6257,12872,6260,12874,6264],{},[34,12873,6175],{},[34,12875,6263],{},[45,12877,12878,6269,12880,6272,12882,6275],{},[34,12879,6211],{},[34,12881,6175],{},[34,12883,6211],{},[336,12885,2704],{"id":2704},[10,12887,6280],{},[10,12889,12890],{},[26,12891],{"alt":6285,"src":6286},[10,12893,6289,12894,6292],{},[34,12895,6263],{},[14,12897,174],{"id":174},[42,12899,12900,12906],{},[45,12901,6299,12902,1164,12904,168],{},[34,12903,6175],{},[34,12905,6211],{},[45,12907,6306,12908,6310],{},[34,12909,6309],{},[14,12911,191],{"id":191},[158,12913,12914,12918],{},[45,12915,2361,12916,6320],{},[34,12917,6319],{},[45,12919,6323,12920,168],{},[34,12921,6142],{},[10,12923,213],{},[14,12925,216],{"id":216},[10,12927,6332],{},[221,12929,223],{},{"title":71,"searchDepth":84,"depth":84,"links":12931},[12932,12933,12934,12935,12936,12939,12940,12941],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":12937},[12938],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":6115,"description":6120},[234,6354,6355],{"id":6358,"title":6359,"body":12946,"category":234,"cover":235,"description":6364,"extension":236,"meta":13085,"navigation":87,"path":6530,"pinned":239,"publishedAt":240,"seo":13086,"slug":6532,"stem":6533,"summary":6534,"tags":13087,"updatedAt":240,"visible":87,"__hash__":6537},{"type":7,"value":12947,"toc":13075},[12948,12950,12952,12954,12956,12960,12962,12964,12974,12976,12978,13018,13020,13025,13027,13029,13047,13049,13057,13059,13067,13069,13071,13073],[10,12949,6364],{},[14,12951,16],{"id":16},[10,12953,6369],{},[14,12955,22],{"id":22},[10,12957,12958],{},[26,12959],{"alt":6376,"src":6377},[10,12961,6380],{},[14,12963,40],{"id":40},[42,12965,12966,12970,12972],{},[45,12967,12968,6390],{},[34,12969,6389],{},[45,12971,6393],{},[45,12973,6396],{},[14,12975,61],{"id":61},[10,12977,1581],{},[66,12979,12980],{"className":598,"code":6403,"language":600,"meta":71,"style":71},[34,12981,12982,12992,12998,13004,13014],{"__ignoreMap":71},[75,12983,12984,12986,12988,12990],{"class":77,"line":78},[75,12985,698],{"class":607},[75,12987,640],{"class":610},[75,12989,6414],{"class":643},[75,12991,6417],{"class":643},[75,12993,12994,12996],{"class":77,"line":84},[75,12995,6422],{"class":610},[75,12997,6425],{"class":643},[75,12999,13000,13002],{"class":77,"line":91},[75,13001,70],{"class":607},[75,13003,611],{"class":610},[75,13005,13006,13008,13010,13012],{"class":77,"line":97},[75,13007,70],{"class":607},[75,13009,640],{"class":610},[75,13011,644],{"class":643},[75,13013,611],{"class":610},[75,13015,13016],{"class":77,"line":102},[75,13017,6446],{"class":607},[10,13019,142],{},[66,13021,13023],{"className":13022,"code":6452,"language":148,"meta":71},[146],[34,13024,6452],{"__ignoreMap":71},[10,13026,153],{},[14,13028,156],{"id":156},[158,13030,13031,13037],{},[45,13032,13033,6466,13035,6469],{},[34,13034,6465],{},[34,13036,698],{},[45,13038,6472,13039,2183,13041,6478,13043,3735,13045,6484],{},[34,13040,70],{},[34,13042,6477],{},[34,13044,6389],{},[34,13046,6483],{},[14,13048,174],{"id":174},[42,13050,13051,13053],{},[45,13052,6491],{},[45,13054,3474,13055,6496],{},[34,13056,6389],{},[14,13058,191],{"id":191},[158,13060,13061,13065],{},[45,13062,6503,13063,168],{},[34,13064,6506],{},[45,13066,6509],{},[10,13068,213],{},[14,13070,216],{"id":216},[10,13072,6516],{},[221,13074,1665],{},{"title":71,"searchDepth":84,"depth":84,"links":13076},[13077,13078,13079,13080,13081,13082,13083,13084],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":6359,"description":6364},[234,6536,268],{"id":6539,"title":6540,"body":13089,"category":234,"cover":235,"description":6545,"extension":236,"meta":13242,"navigation":87,"path":6733,"pinned":239,"publishedAt":240,"seo":13243,"slug":6735,"stem":6736,"summary":6737,"tags":13244,"updatedAt":240,"visible":87,"__hash__":6741},{"type":7,"value":13090,"toc":13232},[13091,13093,13095,13097,13099,13103,13109,13111,13127,13129,13131,13175,13177,13182,13184,13186,13198,13200,13214,13216,13224,13226,13228,13230],[10,13092,6545],{},[14,13094,16],{"id":16},[10,13096,6550],{},[14,13098,22],{"id":22},[10,13100,13101],{},[26,13102],{"alt":6557,"src":6558},[10,13104,13105,6564,13107,6567],{},[34,13106,6563],{},[34,13108,2443],{},[14,13110,40],{"id":40},[42,13112,13113,13115,13123],{},[45,13114,6574],{},[45,13116,13117,2264,13119,2264,13121,6586],{},[34,13118,6579],{},[34,13120,6582],{},[34,13122,6585],{},[45,13124,6589,13125,6593],{},[34,13126,6592],{},[14,13128,61],{"id":61},[10,13130,64],{},[66,13132,13133],{"className":68,"code":6600,"language":70,"meta":71,"style":71},[34,13134,13135,13139,13143,13147,13151,13155,13159,13163,13167,13171],{"__ignoreMap":71},[75,13136,13137],{"class":77,"line":78},[75,13138,81],{},[75,13140,13141],{"class":77,"line":84},[75,13142,88],{"emptyLinePlaceholder":87},[75,13144,13145],{"class":77,"line":91},[75,13146,6615],{},[75,13148,13149],{"class":77,"line":97},[75,13150,6620],{},[75,13152,13153],{"class":77,"line":102},[75,13154,6625],{},[75,13156,13157],{"class":77,"line":108},[75,13158,88],{"emptyLinePlaceholder":87},[75,13160,13161],{"class":77,"line":114},[75,13162,6634],{},[75,13164,13165],{"class":77,"line":119},[75,13166,6639],{},[75,13168,13169],{"class":77,"line":125},[75,13170,6644],{},[75,13172,13173],{"class":77,"line":131},[75,13174,6649],{},[10,13176,142],{},[66,13178,13180],{"className":13179,"code":6655,"language":148,"meta":71},[146],[34,13181,6655],{"__ignoreMap":71},[10,13183,153],{},[14,13185,156],{"id":156},[158,13187,13188,13192],{},[45,13189,13190,6669],{},[34,13191,6668],{},[45,13193,2346,13194,6674,13196,6677],{},[34,13195,2443],{},[34,13197,6563],{},[14,13199,174],{"id":174},[42,13201,13202,13208],{},[45,13203,3474,13204,6686,13206,6689],{},[34,13205,6563],{},[34,13207,6579],{},[45,13209,6692,13210,1016,13212,6698],{},[34,13211,2443],{},[34,13213,6697],{},[14,13215,191],{"id":191},[158,13217,13218,13222],{},[45,13219,6705,13220,6709],{},[34,13221,6708],{},[45,13223,6712],{},[10,13225,213],{},[14,13227,216],{"id":216},[10,13229,6719],{},[221,13231,223],{},{"title":71,"searchDepth":84,"depth":84,"links":13233},[13234,13235,13236,13237,13238,13239,13240,13241],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":6540,"description":6545},[234,6739,6740],{"id":6743,"title":6744,"body":13246,"category":234,"cover":235,"description":6749,"extension":236,"meta":13393,"navigation":87,"path":6926,"pinned":239,"publishedAt":240,"seo":13394,"slug":6928,"stem":6929,"summary":6930,"tags":13395,"updatedAt":240,"visible":87,"__hash__":6934},{"type":7,"value":13247,"toc":13383},[13248,13250,13252,13254,13256,13260,13262,13264,13282,13284,13286,13334,13336,13341,13343,13345,13353,13355,13365,13367,13375,13377,13379,13381],[10,13249,6749],{},[14,13251,16],{"id":16},[10,13253,6754],{},[14,13255,22],{"id":22},[10,13257,13258],{},[26,13259],{"alt":6761,"src":6762},[10,13261,6765],{},[14,13263,40],{"id":40},[42,13265,13266,13270,13276],{},[45,13267,13268,6775],{},[34,13269,6774],{},[45,13271,13272,6781,13274,168],{},[34,13273,6780],{},[34,13275,6784],{},[45,13277,6787,13278,6791,13280,6794],{},[34,13279,6790],{},[34,13281,36],{},[14,13283,61],{"id":61},[10,13285,64],{},[66,13287,13288],{"className":68,"code":6801,"language":70,"meta":71,"style":71},[34,13289,13290,13294,13298,13302,13306,13310,13314,13318,13322,13326,13330],{"__ignoreMap":71},[75,13291,13292],{"class":77,"line":78},[75,13293,81],{},[75,13295,13296],{"class":77,"line":84},[75,13297,88],{"emptyLinePlaceholder":87},[75,13299,13300],{"class":77,"line":91},[75,13301,94],{},[75,13303,13304],{"class":77,"line":97},[75,13305,6820],{},[75,13307,13308],{"class":77,"line":102},[75,13309,6825],{},[75,13311,13312],{"class":77,"line":108},[75,13313,6830],{},[75,13315,13316],{"class":77,"line":114},[75,13317,88],{"emptyLinePlaceholder":87},[75,13319,13320],{"class":77,"line":119},[75,13321,6839],{},[75,13323,13324],{"class":77,"line":125},[75,13325,6844],{},[75,13327,13328],{"class":77,"line":131},[75,13329,6849],{},[75,13331,13332],{"class":77,"line":136},[75,13333,6854],{},[10,13335,142],{},[66,13337,13339],{"className":13338,"code":6860,"language":148,"meta":71},[146],[34,13340,6860],{"__ignoreMap":71},[10,13342,153],{},[14,13344,156],{"id":156},[158,13346,13347,13351],{},[45,13348,6871,13349,6874],{},[34,13350,6790],{},[45,13352,6877],{},[14,13354,174],{"id":174},[42,13356,13357,13361],{},[45,13358,2346,13359,6886],{},[34,13360,6774],{},[45,13362,6889,13363,168],{},[34,13364,6892],{},[14,13366,191],{"id":191},[158,13368,13369,13371],{},[45,13370,6899],{},[45,13372,6902,13373,6905],{},[34,13374,344],{},[10,13376,213],{},[14,13378,216],{"id":216},[10,13380,6912],{},[221,13382,223],{},{"title":71,"searchDepth":84,"depth":84,"links":13384},[13385,13386,13387,13388,13389,13390,13391,13392],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":6744,"description":6749},[234,6932,6933],{"id":6936,"title":6937,"body":13397,"category":234,"cover":235,"description":6942,"extension":236,"meta":13540,"navigation":87,"path":7110,"pinned":239,"publishedAt":240,"seo":13541,"slug":7112,"stem":7113,"summary":7114,"tags":13542,"updatedAt":240,"visible":87,"__hash__":7118},{"type":7,"value":13398,"toc":13530},[13399,13401,13403,13405,13407,13411,13417,13419,13429,13431,13433,13485,13487,13492,13494,13496,13506,13508,13514,13516,13522,13524,13526,13528],[10,13400,6942],{},[14,13402,16],{"id":16},[10,13404,6947],{},[14,13406,22],{"id":22},[10,13408,13409],{},[26,13410],{"alt":6954,"src":6955},[10,13412,13413,6961,13415,6965],{},[34,13414,6960],{},[34,13416,6964],{},[14,13418,40],{"id":40},[42,13420,13421,13423,13427],{},[45,13422,6972],{},[45,13424,13425,6978],{},[34,13426,6977],{},[45,13428,6981],{},[14,13430,61],{"id":61},[10,13432,64],{},[66,13434,13435],{"className":68,"code":6988,"language":70,"meta":71,"style":71},[34,13436,13437,13441,13445,13449,13453,13457,13461,13465,13469,13473,13477,13481],{"__ignoreMap":71},[75,13438,13439],{"class":77,"line":78},[75,13440,6995],{},[75,13442,13443],{"class":77,"line":84},[75,13444,88],{"emptyLinePlaceholder":87},[75,13446,13447],{"class":77,"line":91},[75,13448,7004],{},[75,13450,13451],{"class":77,"line":97},[75,13452,88],{"emptyLinePlaceholder":87},[75,13454,13455],{"class":77,"line":102},[75,13456,7013],{},[75,13458,13459],{"class":77,"line":108},[75,13460,7018],{},[75,13462,13463],{"class":77,"line":114},[75,13464,6830],{},[75,13466,13467],{"class":77,"line":119},[75,13468,88],{"emptyLinePlaceholder":87},[75,13470,13471],{"class":77,"line":125},[75,13472,7031],{},[75,13474,13475],{"class":77,"line":131},[75,13476,7036],{},[75,13478,13479],{"class":77,"line":136},[75,13480,6849],{},[75,13482,13483],{"class":77,"line":5838},[75,13484,7045],{},[10,13486,142],{},[66,13488,13490],{"className":13489,"code":7051,"language":148,"meta":71},[146],[34,13491,7051],{"__ignoreMap":71},[10,13493,153],{},[14,13495,156],{"id":156},[158,13497,13498,13502],{},[45,13499,13500,7064],{},[34,13501,6960],{},[45,13503,13504,7069],{},[34,13505,6964],{},[14,13507,174],{"id":174},[42,13509,13510,13512],{},[45,13511,7076],{},[45,13513,7079],{},[14,13515,191],{"id":191},[158,13517,13518,13520],{},[45,13519,7086],{},[45,13521,7089],{},[10,13523,213],{},[14,13525,216],{"id":216},[10,13527,7096],{},[221,13529,223],{},{"title":71,"searchDepth":84,"depth":84,"links":13531},[13532,13533,13534,13535,13536,13537,13538,13539],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":6937,"description":6942},[234,7116,7117],{"id":7120,"title":7121,"body":13544,"category":234,"cover":235,"description":7126,"extension":236,"meta":13695,"navigation":87,"path":7311,"pinned":239,"publishedAt":240,"seo":13696,"slug":7313,"stem":7314,"summary":7315,"tags":13697,"updatedAt":240,"visible":87,"__hash__":7319},{"type":7,"value":13545,"toc":13685},[13546,13548,13550,13552,13554,13558,13562,13564,13578,13580,13582,13634,13636,13641,13643,13645,13657,13659,13669,13671,13677,13679,13681,13683],[10,13547,7126],{},[14,13549,16],{"id":16},[10,13551,7131],{},[14,13553,22],{"id":22},[10,13555,13556],{},[26,13557],{"alt":7138,"src":7139},[10,13559,13560,7145],{},[34,13561,7144],{},[14,13563,40],{"id":40},[42,13565,13566,13572,13576],{},[45,13567,2346,13568,7155,13570,7159],{},[34,13569,7154],{},[34,13571,7158],{},[45,13573,7162,13574,7166],{},[34,13575,7165],{},[45,13577,7169],{},[14,13579,61],{"id":61},[10,13581,64],{},[66,13583,13584],{"className":68,"code":7176,"language":70,"meta":71,"style":71},[34,13585,13586,13590,13594,13598,13602,13606,13610,13614,13618,13622,13626,13630],{"__ignoreMap":71},[75,13587,13588],{"class":77,"line":78},[75,13589,7183],{},[75,13591,13592],{"class":77,"line":84},[75,13593,88],{"emptyLinePlaceholder":87},[75,13595,13596],{"class":77,"line":91},[75,13597,7192],{},[75,13599,13600],{"class":77,"line":97},[75,13601,7197],{},[75,13603,13604],{"class":77,"line":102},[75,13605,7202],{},[75,13607,13608],{"class":77,"line":108},[75,13609,7207],{},[75,13611,13612],{"class":77,"line":114},[75,13613,7212],{},[75,13615,13616],{"class":77,"line":119},[75,13617,88],{"emptyLinePlaceholder":87},[75,13619,13620],{"class":77,"line":125},[75,13621,7221],{},[75,13623,13624],{"class":77,"line":131},[75,13625,7226],{},[75,13627,13628],{"class":77,"line":136},[75,13629,7231],{},[75,13631,13632],{"class":77,"line":5838},[75,13633,7236],{},[10,13635,142],{},[66,13637,13639],{"className":13638,"code":7242,"language":148,"meta":71},[146],[34,13640,7242],{"__ignoreMap":71},[10,13642,153],{},[14,13644,156],{"id":156},[158,13646,13647,13653],{},[45,13648,13649,7256,13651,7259],{},[34,13650,7255],{},[34,13652,7165],{},[45,13654,13655,7264],{},[34,13656,7144],{},[14,13658,174],{"id":174},[42,13660,13661,13663],{},[45,13662,7271],{},[45,13664,7274,13665,7277,13667,7280],{},[34,13666,7154],{},[34,13668,7158],{},[14,13670,191],{"id":191},[158,13672,13673,13675],{},[45,13674,7287],{},[45,13676,7290],{},[10,13678,213],{},[14,13680,216],{"id":216},[10,13682,7297],{},[221,13684,223],{},{"title":71,"searchDepth":84,"depth":84,"links":13686},[13687,13688,13689,13690,13691,13692,13693,13694],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":7121,"description":7126},[234,7317,7318],{"id":7321,"title":7322,"body":13699,"category":234,"cover":235,"description":7327,"extension":236,"meta":13913,"navigation":87,"path":7601,"pinned":239,"publishedAt":240,"seo":13914,"slug":7603,"stem":7604,"summary":7605,"tags":13915,"updatedAt":240,"visible":87,"__hash__":7609},{"type":7,"value":13700,"toc":13900},[13701,13703,13705,13707,13709,13713,13719,13721,13733,13735,13737,13797,13799,13804,13806,13808,13826,13828,13836,13840,13848,13850,13854,13858,13864,13866,13876,13878,13892,13894,13896,13898],[10,13702,7327],{},[14,13704,16],{"id":16},[10,13706,7332],{},[14,13708,22],{"id":22},[10,13710,13711],{},[26,13712],{"alt":7339,"src":7340},[10,13714,7343,13715,7347,13717,7351],{},[34,13716,7346],{},[34,13718,7350],{},[14,13720,40],{"id":40},[42,13722,13723,13727,13731],{},[45,13724,7358,13725,7361],{},[34,13726,7346],{},[45,13728,13729,7367],{},[34,13730,7366],{},[45,13732,7370],{},[14,13734,61],{"id":61},[10,13736,64],{},[66,13738,13739],{"className":68,"code":7377,"language":70,"meta":71,"style":71},[34,13740,13741,13745,13749,13753,13757,13761,13765,13769,13773,13777,13781,13785,13789,13793],{"__ignoreMap":71},[75,13742,13743],{"class":77,"line":78},[75,13744,7384],{},[75,13746,13747],{"class":77,"line":84},[75,13748,7389],{},[75,13750,13751],{"class":77,"line":91},[75,13752,7394],{},[75,13754,13755],{"class":77,"line":97},[75,13756,7399],{},[75,13758,13759],{"class":77,"line":102},[75,13760,7404],{},[75,13762,13763],{"class":77,"line":108},[75,13764,88],{"emptyLinePlaceholder":87},[75,13766,13767],{"class":77,"line":114},[75,13768,7413],{},[75,13770,13771],{"class":77,"line":119},[75,13772,7418],{},[75,13774,13775],{"class":77,"line":125},[75,13776,7423],{},[75,13778,13779],{"class":77,"line":131},[75,13780,7428],{},[75,13782,13783],{"class":77,"line":136},[75,13784,1153],{},[75,13786,13787],{"class":77,"line":5838},[75,13788,7437],{},[75,13790,13791],{"class":77,"line":7440},[75,13792,7443],{},[75,13794,13795],{"class":77,"line":7446},[75,13796,7449],{},[10,13798,142],{},[66,13800,13802],{"className":13801,"code":7455,"language":148,"meta":71},[146],[34,13803,7455],{"__ignoreMap":71},[10,13805,153],{},[14,13807,156],{"id":156},[158,13809,13810,13818],{},[45,13811,13812,7468,13814,7471,13816,7475],{},[34,13813,3043],{},[34,13815,7366],{},[34,13817,7474],{},[45,13819,7478,13820,7481,13822,7484,13824,168],{},[34,13821,7346],{},[34,13823,1167],{},[34,13825,7350],{},[336,13827,2704],{"id":2704},[10,13829,13830,2264,13832,1164,13834,7497],{},[34,13831,7346],{},[34,13833,1167],{},[34,13835,7350],{},[10,13837,13838],{},[26,13839],{"alt":7502,"src":7503},[10,13841,13842,7508,13844,7511,13846,7514],{},[34,13843,7346],{},[34,13845,1167],{},[34,13847,7350],{},[336,13849,2704],{"id":4225},[10,13851,13852,7522],{},[34,13853,7521],{},[10,13855,13856],{},[26,13857],{"alt":7527,"src":7528},[10,13859,7531,13860,7534,13862,7537],{},[34,13861,7521],{},[34,13863,1167],{},[14,13865,174],{"id":174},[42,13867,13868,13872],{},[45,13869,7544,13870,7548],{},[34,13871,7547],{},[45,13873,7551,13874,7554],{},[34,13875,7521],{},[14,13877,191],{"id":191},[158,13879,13880,13888],{},[45,13881,7561,13882,7565,13884,1164,13886,168],{},[34,13883,7564],{},[34,13885,7568],{},[34,13887,7571],{},[45,13889,7574,13890,7577],{},[34,13891,6784],{},[10,13893,213],{},[14,13895,216],{"id":216},[10,13897,7584],{},[221,13899,223],{},{"title":71,"searchDepth":84,"depth":84,"links":13901},[13902,13903,13904,13905,13906,13910,13911,13912],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":13907},[13908,13909],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":7322,"description":7327},[234,7607,7608],{"id":4,"title":5,"body":13917,"category":234,"cover":235,"description":12,"extension":236,"meta":14068,"navigation":87,"path":238,"pinned":239,"publishedAt":240,"seo":14069,"slug":242,"stem":243,"summary":244,"tags":14070,"updatedAt":240,"visible":87,"__hash__":247},{"type":7,"value":13918,"toc":14058},[13919,13921,13923,13925,13927,13931,13935,13937,13949,13951,13953,14001,14003,14008,14010,14012,14022,14024,14034,14036,14050,14052,14054,14056],[10,13920,12],{},[14,13922,16],{"id":16},[10,13924,19],{},[14,13926,22],{"id":22},[10,13928,13929],{},[26,13930],{"alt":28,"src":29},[10,13932,32,13933,37],{},[34,13934,36],{},[14,13936,40],{"id":40},[42,13938,13939,13943,13947],{},[45,13940,13941,49],{},[34,13942,36],{},[45,13944,13945,55],{},[34,13946,54],{},[45,13948,58],{},[14,13950,61],{"id":61},[10,13952,64],{},[66,13954,13955],{"className":68,"code":69,"language":70,"meta":71,"style":71},[34,13956,13957,13961,13965,13969,13973,13977,13981,13985,13989,13993,13997],{"__ignoreMap":71},[75,13958,13959],{"class":77,"line":78},[75,13960,81],{},[75,13962,13963],{"class":77,"line":84},[75,13964,88],{"emptyLinePlaceholder":87},[75,13966,13967],{"class":77,"line":91},[75,13968,94],{},[75,13970,13971],{"class":77,"line":97},[75,13972,88],{"emptyLinePlaceholder":87},[75,13974,13975],{"class":77,"line":102},[75,13976,105],{},[75,13978,13979],{"class":77,"line":108},[75,13980,111],{},[75,13982,13983],{"class":77,"line":114},[75,13984,88],{"emptyLinePlaceholder":87},[75,13986,13987],{"class":77,"line":119},[75,13988,122],{},[75,13990,13991],{"class":77,"line":125},[75,13992,128],{},[75,13994,13995],{"class":77,"line":131},[75,13996,88],{"emptyLinePlaceholder":87},[75,13998,13999],{"class":77,"line":136},[75,14000,139],{},[10,14002,142],{},[66,14004,14006],{"className":14005,"code":147,"language":148,"meta":71},[146],[34,14007,147],{"__ignoreMap":71},[10,14009,153],{},[14,14011,156],{"id":156},[158,14013,14014,14020],{},[45,14015,32,14016,164,14018,168],{},[34,14017,36],{},[34,14019,167],{},[45,14021,171],{},[14,14023,174],{"id":174},[42,14025,14026,14030],{},[45,14027,179,14028,182],{},[34,14029,36],{},[45,14031,185,14032,188],{},[34,14033,36],{},[14,14035,191],{"id":191},[158,14037,14038,14044],{},[45,14039,196,14040,200,14042,168],{},[34,14041,199],{},[34,14043,36],{},[45,14045,179,14046,207,14048,168],{},[34,14047,36],{},[34,14049,210],{},[10,14051,213],{},[14,14053,216],{"id":216},[10,14055,219],{},[221,14057,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14059},[14060,14061,14062,14063,14064,14065,14066,14067],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":5,"description":12},[234,36,246],{"id":7766,"title":7767,"body":14072,"category":234,"cover":235,"description":7772,"extension":236,"meta":14243,"navigation":87,"path":7985,"pinned":239,"publishedAt":240,"seo":14244,"slug":7987,"stem":7988,"summary":7989,"tags":14245,"updatedAt":240,"visible":87,"__hash__":7993},{"type":7,"value":14073,"toc":14231},[14074,14076,14078,14080,14082,14086,14088,14090,14102,14104,14106,14162,14164,14169,14171,14173,14189,14191,14193,14197,14203,14205,14213,14215,14223,14225,14227,14229],[10,14075,7772],{},[14,14077,16],{"id":16},[10,14079,7777],{},[14,14081,22],{"id":22},[10,14083,14084],{},[26,14085],{"alt":7784,"src":7785},[10,14087,7788],{},[14,14089,40],{"id":40},[42,14091,14092,14096,14100],{},[45,14093,14094,7798],{},[34,14095,7797],{},[45,14097,14098,7804],{},[34,14099,7803],{},[45,14101,7807],{},[14,14103,61],{"id":61},[10,14105,64],{},[66,14107,14108],{"className":68,"code":7814,"language":70,"meta":71,"style":71},[34,14109,14110,14114,14118,14122,14126,14130,14134,14138,14142,14146,14150,14154,14158],{"__ignoreMap":71},[75,14111,14112],{"class":77,"line":78},[75,14113,7821],{},[75,14115,14116],{"class":77,"line":84},[75,14117,7826],{},[75,14119,14120],{"class":77,"line":91},[75,14121,7831],{},[75,14123,14124],{"class":77,"line":97},[75,14125,7836],{},[75,14127,14128],{"class":77,"line":102},[75,14129,88],{"emptyLinePlaceholder":87},[75,14131,14132],{"class":77,"line":108},[75,14133,7845],{},[75,14135,14136],{"class":77,"line":114},[75,14137,7850],{},[75,14139,14140],{"class":77,"line":119},[75,14141,7855],{},[75,14143,14144],{"class":77,"line":125},[75,14145,7860],{},[75,14147,14148],{"class":77,"line":131},[75,14149,88],{"emptyLinePlaceholder":87},[75,14151,14152],{"class":77,"line":136},[75,14153,7869],{},[75,14155,14156],{"class":77,"line":5838},[75,14157,7874],{},[75,14159,14160],{"class":77,"line":7440},[75,14161,7879],{},[10,14163,142],{},[66,14165,14167],{"className":14166,"code":7885,"language":148,"meta":71},[146],[34,14168,7885],{"__ignoreMap":71},[10,14170,153],{},[14,14172,156],{"id":156},[158,14174,14175,14181],{},[45,14176,7896,14177,7900,14179,7903],{},[34,14178,7899],{},[34,14180,7803],{},[45,14182,14183,7909,14185,7913,14187,7916],{},[34,14184,7908],{},[34,14186,7912],{},[34,14188,7797],{},[336,14190,2704],{"id":2704},[10,14192,7921],{},[10,14194,14195],{},[26,14196],{"alt":7926,"src":7927},[10,14198,7930,14199,1164,14201,7936],{},[34,14200,4590],{},[34,14202,7935],{},[14,14204,174],{"id":174},[42,14206,14207,14211],{},[45,14208,7943,14209,7946],{},[34,14210,7797],{},[45,14212,7949],{},[14,14214,191],{"id":191},[158,14216,14217,14221],{},[45,14218,5302,14219,7959],{},[34,14220,7958],{},[45,14222,7962],{},[10,14224,213],{},[14,14226,216],{"id":216},[10,14228,7969],{},[221,14230,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14232},[14233,14234,14235,14236,14237,14240,14241,14242],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":14238},[14239],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":7767,"description":7772},[234,7991,7992],{"id":7995,"title":7996,"body":14247,"category":234,"cover":235,"description":8001,"extension":236,"meta":14394,"navigation":87,"path":8180,"pinned":239,"publishedAt":240,"seo":14395,"slug":8182,"stem":8183,"summary":8184,"tags":14396,"updatedAt":240,"visible":87,"__hash__":8188},{"type":7,"value":14248,"toc":14384},[14249,14251,14253,14255,14257,14261,14263,14265,14273,14275,14277,14333,14335,14340,14342,14344,14356,14358,14364,14366,14376,14378,14380,14382],[10,14250,8001],{},[14,14252,16],{"id":16},[10,14254,8006],{},[14,14256,22],{"id":22},[10,14258,14259],{},[26,14260],{"alt":8013,"src":8014},[10,14262,8017],{},[14,14264,40],{"id":40},[42,14266,14267,14269,14271],{},[45,14268,8024],{},[45,14270,8027],{},[45,14272,8030],{},[14,14274,61],{"id":61},[10,14276,64],{},[66,14278,14279],{"className":68,"code":8037,"language":70,"meta":71,"style":71},[34,14280,14281,14285,14289,14293,14297,14301,14305,14309,14313,14317,14321,14325,14329],{"__ignoreMap":71},[75,14282,14283],{"class":77,"line":78},[75,14284,8044],{},[75,14286,14287],{"class":77,"line":84},[75,14288,8049],{},[75,14290,14291],{"class":77,"line":91},[75,14292,8054],{},[75,14294,14295],{"class":77,"line":97},[75,14296,88],{"emptyLinePlaceholder":87},[75,14298,14299],{"class":77,"line":102},[75,14300,8063],{},[75,14302,14303],{"class":77,"line":108},[75,14304,8068],{},[75,14306,14307],{"class":77,"line":114},[75,14308,8073],{},[75,14310,14311],{"class":77,"line":119},[75,14312,88],{"emptyLinePlaceholder":87},[75,14314,14315],{"class":77,"line":125},[75,14316,8082],{},[75,14318,14319],{"class":77,"line":131},[75,14320,8087],{},[75,14322,14323],{"class":77,"line":136},[75,14324,88],{"emptyLinePlaceholder":87},[75,14326,14327],{"class":77,"line":5838},[75,14328,8096],{},[75,14330,14331],{"class":77,"line":7440},[75,14332,8101],{},[10,14334,142],{},[66,14336,14338],{"className":14337,"code":8107,"language":148,"meta":71},[146],[34,14339,8107],{"__ignoreMap":71},[10,14341,153],{},[14,14343,156],{"id":156},[158,14345,14346,14352],{},[45,14347,14348,8121,14350,8125],{},[34,14349,8120],{},[34,14351,8124],{},[45,14353,8128,14354,8132],{},[34,14355,8131],{},[14,14357,174],{"id":174},[42,14359,14360,14362],{},[45,14361,8139],{},[45,14363,8142],{},[14,14365,191],{"id":191},[158,14367,14368,14374],{},[45,14369,8149,14370,8153,14372,168],{},[34,14371,8152],{},[34,14373,8156],{},[45,14375,8159],{},[10,14377,213],{},[14,14379,216],{"id":216},[10,14381,8166],{},[221,14383,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14385},[14386,14387,14388,14389,14390,14391,14392,14393],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":7996,"description":8001},[234,8186,8187],{"id":8190,"title":8191,"body":14398,"category":234,"cover":235,"description":8196,"extension":236,"meta":14561,"navigation":87,"path":8400,"pinned":239,"publishedAt":240,"seo":14562,"slug":8402,"stem":8403,"summary":8404,"tags":14563,"updatedAt":240,"visible":87,"__hash__":8408},{"type":7,"value":14399,"toc":14549},[14400,14402,14404,14406,14408,14412,14416,14418,14434,14436,14438,14482,14484,14489,14491,14493,14507,14509,14513,14517,14521,14523,14529,14531,14541,14543,14545,14547],[10,14401,8196],{},[14,14403,16],{"id":16},[10,14405,8201],{},[14,14407,22],{"id":22},[10,14409,14410],{},[26,14411],{"alt":8208,"src":8209},[10,14413,8212,14414,8216],{},[34,14415,8215],{},[14,14417,40],{"id":40},[42,14419,14420,14426,14432],{},[45,14421,14422,8226,14424,8230],{},[34,14423,8225],{},[34,14425,8229],{},[45,14427,8233,14428,8237,14430,8240],{},[34,14429,8236],{},[34,14431,4344],{},[45,14433,8243],{},[14,14435,61],{"id":61},[10,14437,64],{},[66,14439,14440],{"className":68,"code":8250,"language":70,"meta":71,"style":71},[34,14441,14442,14446,14450,14454,14458,14462,14466,14470,14474,14478],{"__ignoreMap":71},[75,14443,14444],{"class":77,"line":78},[75,14445,8257],{},[75,14447,14448],{"class":77,"line":84},[75,14449,8262],{},[75,14451,14452],{"class":77,"line":91},[75,14453,8267],{},[75,14455,14456],{"class":77,"line":97},[75,14457,8272],{},[75,14459,14460],{"class":77,"line":102},[75,14461,8277],{},[75,14463,14464],{"class":77,"line":108},[75,14465,88],{"emptyLinePlaceholder":87},[75,14467,14468],{"class":77,"line":114},[75,14469,8286],{},[75,14471,14472],{"class":77,"line":119},[75,14473,8291],{},[75,14475,14476],{"class":77,"line":125},[75,14477,8291],{},[75,14479,14480],{"class":77,"line":131},[75,14481,8291],{},[10,14483,142],{},[66,14485,14487],{"className":14486,"code":8305,"language":148,"meta":71},[146],[34,14488,8305],{"__ignoreMap":71},[10,14490,153],{},[14,14492,156],{"id":156},[158,14494,14495,14499],{},[45,14496,7896,14497,8319],{},[34,14498,8318],{},[45,14500,8322,14501,8325,14503,8328,14505,8332],{},[34,14502,8229],{},[34,14504,8215],{},[34,14506,8331],{},[336,14508,2704],{"id":2704},[10,14510,8337,14511,8340],{},[34,14512,8229],{},[10,14514,14515],{},[26,14516],{"alt":8345,"src":8346},[10,14518,8349,14519,8352],{},[34,14520,8215],{},[14,14522,174],{"id":174},[42,14524,14525,14527],{},[45,14526,8359],{},[45,14528,8362],{},[14,14530,191],{"id":191},[158,14532,14533,14535],{},[45,14534,8369],{},[45,14536,4017,14537,8374,14539,8377],{},[34,14538,4344],{},[34,14540,8229],{},[10,14542,213],{},[14,14544,216],{"id":216},[10,14546,8384],{},[221,14548,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14550},[14551,14552,14553,14554,14555,14558,14559,14560],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":14556},[14557],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":8191,"description":8196},[234,8406,8407],{"id":8410,"title":8411,"body":14565,"category":234,"cover":235,"description":8416,"extension":236,"meta":14748,"navigation":87,"path":8641,"pinned":239,"publishedAt":240,"seo":14749,"slug":8643,"stem":8644,"summary":8645,"tags":14750,"updatedAt":240,"visible":87,"__hash__":8648},{"type":7,"value":14566,"toc":14736},[14567,14569,14571,14573,14575,14579,14581,14583,14597,14599,14601,14669,14671,14676,14678,14680,14694,14696,14698,14702,14708,14710,14718,14720,14728,14730,14732,14734],[10,14568,8416],{},[14,14570,16],{"id":16},[10,14572,8421],{},[14,14574,22],{"id":22},[10,14576,14577],{},[26,14578],{"alt":8428,"src":8429},[10,14580,8432],{},[14,14582,40],{"id":40},[42,14584,14585,14591,14593],{},[45,14586,14587,8442,14589,168],{},[34,14588,8441],{},[34,14590,8445],{},[45,14592,8448],{},[45,14594,14595,8454],{},[34,14596,8453],{},[14,14598,61],{"id":61},[10,14600,64],{},[66,14602,14603],{"className":68,"code":8461,"language":70,"meta":71,"style":71},[34,14604,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661,14665],{"__ignoreMap":71},[75,14606,14607],{"class":77,"line":78},[75,14608,8468],{},[75,14610,14611],{"class":77,"line":84},[75,14612,88],{"emptyLinePlaceholder":87},[75,14614,14615],{"class":77,"line":91},[75,14616,8477],{},[75,14618,14619],{"class":77,"line":97},[75,14620,8482],{},[75,14622,14623],{"class":77,"line":102},[75,14624,8487],{},[75,14626,14627],{"class":77,"line":108},[75,14628,8492],{},[75,14630,14631],{"class":77,"line":114},[75,14632,8497],{},[75,14634,14635],{"class":77,"line":119},[75,14636,8502],{},[75,14638,14639],{"class":77,"line":125},[75,14640,8507],{},[75,14642,14643],{"class":77,"line":131},[75,14644,8512],{},[75,14646,14647],{"class":77,"line":136},[75,14648,88],{"emptyLinePlaceholder":87},[75,14650,14651],{"class":77,"line":5838},[75,14652,8521],{},[75,14654,14655],{"class":77,"line":7440},[75,14656,6186],{},[75,14658,14659],{"class":77,"line":7446},[75,14660,6191],{},[75,14662,14663],{"class":77,"line":8532},[75,14664,88],{"emptyLinePlaceholder":87},[75,14666,14667],{"class":77,"line":8537},[75,14668,8540],{},[10,14670,142],{},[66,14672,14674],{"className":14673,"code":8546,"language":148,"meta":71},[146],[34,14675,8546],{"__ignoreMap":71},[10,14677,153],{},[14,14679,156],{"id":156},[158,14681,14682,14692],{},[45,14683,8557,14684,8561,14686,8565,14688,8569,14690,168],{},[34,14685,8560],{},[34,14687,8564],{},[34,14689,8568],{},[34,14691,8560],{},[45,14693,8574],{},[336,14695,2704],{"id":2704},[10,14697,8579],{},[10,14699,14700],{},[26,14701],{"alt":8584,"src":8585},[10,14703,14704,8590,14706,168],{},[34,14705,8441],{},[34,14707,8445],{},[14,14709,174],{"id":174},[42,14711,14712,14716],{},[45,14713,8599,14714,168],{},[34,14715,5385],{},[45,14717,8604],{},[14,14719,191],{"id":191},[158,14721,14722,14724],{},[45,14723,8611],{},[45,14725,8614,14726,8618],{},[34,14727,8617],{},[10,14729,213],{},[14,14731,216],{"id":216},[10,14733,8625],{},[221,14735,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14737},[14738,14739,14740,14741,14742,14745,14746,14747],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":14743},[14744],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":8411,"description":8416},[234,8647,5336],{"id":8650,"title":8651,"body":14752,"category":234,"cover":235,"description":8656,"extension":236,"meta":14911,"navigation":87,"path":8844,"pinned":239,"publishedAt":240,"seo":14912,"slug":8846,"stem":8847,"summary":8848,"tags":14913,"updatedAt":240,"visible":87,"__hash__":8852},{"type":7,"value":14753,"toc":14899},[14754,14756,14758,14760,14762,14766,14768,14770,14778,14780,14782,14846,14848,14853,14855,14857,14865,14867,14869,14873,14875,14877,14883,14885,14891,14893,14895,14897],[10,14755,8656],{},[14,14757,16],{"id":16},[10,14759,8661],{},[14,14761,22],{"id":22},[10,14763,14764],{},[26,14765],{"alt":8668,"src":8669},[10,14767,8672],{},[14,14769,40],{"id":40},[42,14771,14772,14774,14776],{},[45,14773,8679],{},[45,14775,8682],{},[45,14777,8685],{},[14,14779,61],{"id":61},[10,14781,64],{},[66,14783,14784],{"className":68,"code":8692,"language":70,"meta":71,"style":71},[34,14785,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830,14834,14838,14842],{"__ignoreMap":71},[75,14787,14788],{"class":77,"line":78},[75,14789,8699],{},[75,14791,14792],{"class":77,"line":84},[75,14793,8704],{},[75,14795,14796],{"class":77,"line":91},[75,14797,88],{"emptyLinePlaceholder":87},[75,14799,14800],{"class":77,"line":97},[75,14801,8713],{},[75,14803,14804],{"class":77,"line":102},[75,14805,88],{"emptyLinePlaceholder":87},[75,14807,14808],{"class":77,"line":108},[75,14809,8722],{},[75,14811,14812],{"class":77,"line":114},[75,14813,8727],{},[75,14815,14816],{"class":77,"line":119},[75,14817,8732],{},[75,14819,14820],{"class":77,"line":125},[75,14821,88],{"emptyLinePlaceholder":87},[75,14823,14824],{"class":77,"line":131},[75,14825,8741],{},[75,14827,14828],{"class":77,"line":136},[75,14829,8746],{},[75,14831,14832],{"class":77,"line":5838},[75,14833,8751],{},[75,14835,14836],{"class":77,"line":7440},[75,14837,88],{"emptyLinePlaceholder":87},[75,14839,14840],{"class":77,"line":7446},[75,14841,6200],{},[75,14843,14844],{"class":77,"line":8532},[75,14845,8764],{},[10,14847,142],{},[66,14849,14851],{"className":14850,"code":8770,"language":148,"meta":71},[146],[34,14852,8770],{"__ignoreMap":71},[10,14854,153],{},[14,14856,156],{"id":156},[158,14858,14859,14863],{},[45,14860,14861,8784],{},[34,14862,8783],{},[45,14864,8787],{},[336,14866,2704],{"id":2704},[10,14868,8792],{},[10,14870,14871],{},[26,14872],{"alt":8797,"src":8798},[10,14874,8801],{},[14,14876,174],{"id":174},[42,14878,14879,14881],{},[45,14880,8808],{},[45,14882,8811],{},[14,14884,191],{"id":191},[158,14886,14887,14889],{},[45,14888,8818],{},[45,14890,8821],{},[10,14892,213],{},[14,14894,216],{"id":216},[10,14896,8828],{},[221,14898,223],{},{"title":71,"searchDepth":84,"depth":84,"links":14900},[14901,14902,14903,14904,14905,14908,14909,14910],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":14906},[14907],{"id":2704,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":8651,"description":8656},[234,8850,8851],{"id":8854,"title":8855,"body":14915,"category":234,"cover":235,"description":8860,"extension":236,"meta":15153,"navigation":87,"path":9161,"pinned":239,"publishedAt":240,"seo":15154,"slug":9163,"stem":9164,"summary":9165,"tags":15155,"updatedAt":240,"visible":87,"__hash__":9169},{"type":7,"value":14916,"toc":15140},[14917,14919,14921,14923,14925,14929,14931,14933,14943,14945,14947,15063,15065,15070,15072,15074,15084,15086,15088,15092,15094,15096,15098,15102,15106,15108,15116,15118,15132,15134,15136,15138],[10,14918,8860],{},[14,14920,16],{"id":16},[10,14922,8865],{},[14,14924,22],{"id":22},[10,14926,14927],{},[26,14928],{"alt":8872,"src":8873},[10,14930,8876],{},[14,14932,40],{"id":40},[42,14934,14935,14937,14939],{},[45,14936,8883],{},[45,14938,8886],{},[45,14940,8889,14941,8893],{},[34,14942,8892],{},[14,14944,61],{"id":61},[10,14946,64],{},[66,14948,14949],{"className":68,"code":8900,"language":70,"meta":71,"style":71},[34,14950,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047,15051,15055,15059],{"__ignoreMap":71},[75,14952,14953],{"class":77,"line":78},[75,14954,6995],{},[75,14956,14957],{"class":77,"line":84},[75,14958,81],{},[75,14960,14961],{"class":77,"line":91},[75,14962,88],{"emptyLinePlaceholder":87},[75,14964,14965],{"class":77,"line":97},[75,14966,8919],{},[75,14968,14969],{"class":77,"line":102},[75,14970,8924],{},[75,14972,14973],{"class":77,"line":108},[75,14974,8929],{},[75,14976,14977],{"class":77,"line":114},[75,14978,8934],{},[75,14980,14981],{"class":77,"line":119},[75,14982,88],{"emptyLinePlaceholder":87},[75,14984,14985],{"class":77,"line":125},[75,14986,8943],{},[75,14988,14989],{"class":77,"line":131},[75,14990,8948],{},[75,14992,14993],{"class":77,"line":136},[75,14994,8953],{},[75,14996,14997],{"class":77,"line":5838},[75,14998,8958],{},[75,15000,15001],{"class":77,"line":7440},[75,15002,8963],{},[75,15004,15005],{"class":77,"line":7446},[75,15006,88],{"emptyLinePlaceholder":87},[75,15008,15009],{"class":77,"line":8532},[75,15010,8972],{},[75,15012,15013],{"class":77,"line":8537},[75,15014,8977],{},[75,15016,15017],{"class":77,"line":8980},[75,15018,8983],{},[75,15020,15021],{"class":77,"line":8986},[75,15022,88],{"emptyLinePlaceholder":87},[75,15024,15025],{"class":77,"line":8991},[75,15026,8994],{},[75,15028,15029],{"class":77,"line":8997},[75,15030,88],{"emptyLinePlaceholder":87},[75,15032,15033],{"class":77,"line":9002},[75,15034,7413],{},[75,15036,15037],{"class":77,"line":9007},[75,15038,9010],{},[75,15040,15041],{"class":77,"line":9013},[75,15042,9016],{},[75,15044,15045],{"class":77,"line":9019},[75,15046,9022],{},[75,15048,15049],{"class":77,"line":9025},[75,15050,7423],{},[75,15052,15053],{"class":77,"line":9030},[75,15054,9033],{},[75,15056,15057],{"class":77,"line":9036},[75,15058,1153],{},[75,15060,15061],{"class":77,"line":9041},[75,15062,9044],{},[10,15064,142],{},[66,15066,15068],{"className":15067,"code":9050,"language":148,"meta":71},[146],[34,15069,9050],{"__ignoreMap":71},[10,15071,153],{},[14,15073,156],{"id":156},[158,15075,15076,15080],{},[45,15077,9061,15078,9064],{},[34,15079,8892],{},[45,15081,15082,9069],{},[34,15083,8124],{},[336,15085,2704],{"id":2704},[10,15087,9074],{},[10,15089,15090],{},[26,15091],{"alt":9079,"src":9080},[10,15093,9083],{},[336,15095,2704],{"id":4225},[10,15097,9088],{},[10,15099,15100],{},[26,15101],{"alt":9093,"src":9094},[10,15103,9097,15104,9101],{},[34,15105,9100],{},[14,15107,174],{"id":174},[42,15109,15110,15112],{},[45,15111,9108],{},[45,15113,9111,15114,9114],{},[34,15115,9100],{},[14,15117,191],{"id":191},[158,15119,15120,15124,15126],{},[45,15121,9121,15122,9124],{},[34,15123,9100],{},[45,15125,9127],{},[45,15127,9130,15128,9134,15130,9137],{},[34,15129,9133],{},[34,15131,6142],{},[10,15133,213],{},[14,15135,216],{"id":216},[10,15137,9144],{},[221,15139,223],{},{"title":71,"searchDepth":84,"depth":84,"links":15141},[15142,15143,15144,15145,15146,15150,15151,15152],{"id":16,"depth":84,"text":16},{"id":22,"depth":84,"text":22},{"id":40,"depth":84,"text":40},{"id":61,"depth":84,"text":61},{"id":156,"depth":84,"text":156,"children":15147},[15148,15149],{"id":2704,"depth":91,"text":2704},{"id":4225,"depth":91,"text":2704},{"id":174,"depth":84,"text":174},{"id":191,"depth":84,"text":191},{"id":216,"depth":84,"text":216},{},{"title":8855,"description":8860},[234,9167,9168],{"id":1063,"title":1064,"body":15157,"category":234,"cover":1072,"description":71,"extension":236,"meta":15393,"navigation":87,"path":1389,"pinned":239,"publishedAt":1390,"seo":15394,"slug":1392,"stem":1393,"summary":1394,"tags":15395,"updatedAt":1390,"visible":87,"__hash__":1398},{"type":7,"value":15158,"toc":15378},[15159,15163,15165,15167,15169,15171,15191,15193,15198,15200,15202,15230,15236,15238,15242,15244,15264,15266,15276,15278,15280,15282,15284,15286,15288,15290,15292,15294,15314,15316,15318,15322,15324,15326,15328,15330,15334,15336,15354,15356,15358,15360,15362,15364,15366,15368,15370,15372,15374,15376],[10,15160,15161],{},[26,15162],{"alt":1071,"src":1072},[10,15164,1075],{},[10,15166,1078],{},[14,15168,1082],{"id":1081},[10,15170,1085],{},[66,15172,15173],{"className":68,"code":1088,"language":70,"meta":71,"style":71},[34,15174,15175,15179,15183,15187],{"__ignoreMap":71},[75,15176,15177],{"class":77,"line":78},[75,15178,1095],{},[75,15180,15181],{"class":77,"line":84},[75,15182,1100],{},[75,15184,15185],{"class":77,"line":91},[75,15186,88],{"emptyLinePlaceholder":87},[75,15188,15189],{"class":77,"line":97},[75,15190,1109],{},[10,15192,1112],{},[66,15194,15196],{"className":15195,"code":1116,"language":148,"meta":71},[146],[34,15197,1116],{"__ignoreMap":71},[10,15199,1121],{},[10,15201,1124],{},[66,15203,15204],{"className":68,"code":1127,"language":70,"meta":71,"style":71},[34,15205,15206,15210,15214,15218,15222,15226],{"__ignoreMap":71},[75,15207,15208],{"class":77,"line":78},[75,15209,1134],{},[75,15211,15212],{"class":77,"line":84},[75,15213,88],{"emptyLinePlaceholder":87},[75,15215,15216],{"class":77,"line":91},[75,15217,1143],{},[75,15219,15220],{"class":77,"line":97},[75,15221,1148],{},[75,15223,15224],{"class":77,"line":102},[75,15225,1153],{},[75,15227,15228],{"class":77,"line":108},[75,15229,1158],{},[10,15231,15232,1164,15234,1168],{},[34,15233,1163],{},[34,15235,1167],{},[14,15237,1172],{"id":1171},[10,15239,1175,15240,1179],{},[34,15241,1178],{},[10,15243,1182],{},[66,15245,15246],{"className":68,"code":1185,"language":70,"meta":71,"style":71},[34,15247,15248,15252,15256,15260],{"__ignoreMap":71},[75,15249,15250],{"class":77,"line":78},[75,15251,1192],{},[75,15253,15254],{"class":77,"line":84},[75,15255,1197],{},[75,15257,15258],{"class":77,"line":91},[75,15259,1202],{},[75,15261,15262],{"class":77,"line":97},[75,15263,1207],{},[10,15265,1210],{},[66,15267,15268],{"className":598,"code":1213,"language":600,"meta":71,"style":71},[34,15269,15270],{"__ignoreMap":71},[75,15271,15272,15274],{"class":77,"line":78},[75,15273,698],{"class":607},[75,15275,1222],{"class":643},[10,15277,1225],{},[14,15279,1229],{"id":1228},[336,15281,1232],{"id":1232},[10,15283,1235],{},[336,15285,1238],{"id":1238},[10,15287,1241],{},[336,15289,1244],{"id":1244},[10,15291,1247],{},[10,15293,1250],{},[66,15295,15296],{"className":68,"code":1253,"language":70,"meta":71,"style":71},[34,15297,15298,15302,15306,15310],{"__ignoreMap":71},[75,15299,15300],{"class":77,"line":78},[75,15301,1260],{},[75,15303,15304],{"class":77,"line":84},[75,15305,88],{"emptyLinePlaceholder":87},[75,15307,15308],{"class":77,"line":91},[75,15309,1269],{},[75,15311,15312],{"class":77,"line":97},[75,15313,1274],{},[10,15315,1277],{},[336,15317,1280],{"id":1280},[10,15319,1283,15320,1286],{},[34,15321,268],{},[10,15323,1289],{},[336,15325,1292],{"id":1292},[10,15327,1295],{},[14,15329,1299],{"id":1298},[10,15331,15332],{},[26,15333],{"alt":1304,"src":1305},[10,15335,1308],{},[42,15337,15338,15340,15342,15344,15346,15348,15350,15352],{},[45,15339,1313],{},[45,15341,1316],{},[45,15343,1319],{},[45,15345,1322],{},[45,15347,1325],{},[45,15349,1328],{},[45,15351,1331],{},[45,15353,1334],{},[10,15355,1337],{},[14,15357,1341],{"id":1340},[10,15359,1344],{},[10,15361,1347],{},[14,15363,1351],{"id":1350},[10,15365,1354],{},[10,15367,1357],{},[10,15369,1360],{},[14,15371,1363],{"id":1363},[10,15373,1366],{},[10,15375,1369],{},[221,15377,1372],{},{"title":71,"searchDepth":84,"depth":84,"links":15379},[15380,15381,15382,15389,15390,15391,15392],{"id":1081,"depth":84,"text":1082},{"id":1171,"depth":84,"text":1172},{"id":1228,"depth":84,"text":1229,"children":15383},[15384,15385,15386,15387,15388],{"id":1232,"depth":91,"text":1232},{"id":1238,"depth":91,"text":1238},{"id":1244,"depth":91,"text":1244},{"id":1280,"depth":91,"text":1280},{"id":1292,"depth":91,"text":1292},{"id":1298,"depth":84,"text":1299},{"id":1340,"depth":84,"text":1341},{"id":1350,"depth":84,"text":1351},{"id":1363,"depth":84,"text":1363},{},{"title":1064,"description":71},[234,1396,1397],{"id":250,"title":251,"body":15397,"category":234,"cover":235,"description":71,"extension":236,"meta":15976,"navigation":87,"path":1052,"pinned":239,"publishedAt":1053,"seo":15977,"slug":1055,"stem":1056,"summary":1057,"tags":15978,"updatedAt":1053,"visible":87,"__hash__":1061},{"type":7,"value":15398,"toc":15952},[15399,15401,15403,15405,15409,15411,15413,15437,15449,15451,15453,15458,15462,15466,15478,15482,15486,15490,15492,15526,15528,15532,15536,15538,15560,15590,15602,15612,15620,15622,15628,15638,15640,15645,15649,15651,15665,15671,15691,15693,15695,15697,15707,15711,15713,15722,15726,15728,15730,15750,15754,15756,15758,15760,15762,15782,15784,15786,15788,15814,15816,15832,15834,15850,15854,15856,15858,15878,15880,15882,15884,15888,15898,15900,15902,15904,15914,15922,15924,15926,15940,15950],[14,15400,256],{"id":256},[10,15402,259],{},[10,15404,262],{},[10,15406,265,15407,269],{},[34,15408,268],{},[14,15410,272],{"id":272},[10,15412,275],{},[277,15414,15415,15417],{},[10,15416,281],{},[277,15418,15419,15425,15427,15431,15433],{},[10,15420,286,15421,290,15423,294],{},[34,15422,289],{},[34,15424,293],{},[10,15426,297],{},[10,15428,300,15429,305],{},[302,15430,304],{},[10,15432,308],{},[10,15434,15435],{},[26,15436],{"alt":313,"src":314},[277,15438,15439,15441],{},[10,15440,319],{},[277,15442,15443,15445],{},[10,15444,324],{},[10,15446,15447],{},[26,15448],{"alt":329,"src":330},[14,15450,334],{"id":333},[336,15452,339],{"id":338},[10,15454,342,15455,350],{},[344,15456,349],{"href":346,"rel":15457},[348],[277,15459,15460],{},[10,15461,355],{},[10,15463,15464],{},[26,15465],{"alt":360,"src":361},[42,15467,15468,15472,15476],{},[45,15469,366,15470,168],{},[302,15471,369],{},[45,15473,372,15474,168],{},[302,15475,375],{},[45,15477,378],{},[10,15479,15480],{},[26,15481],{"alt":383,"src":384},[277,15483,15484],{},[10,15485,389],{},[10,15487,15488],{},[26,15489],{"alt":394,"src":395},[336,15491,399],{"id":398},[277,15493,15494,15498,15502,15522],{},[277,15495,15496],{},[10,15497,406],{},[10,15499,409,15500,413],{},[302,15501,412],{},[66,15503,15504],{"className":68,"code":416,"language":70,"meta":71,"style":71},[34,15505,15506,15510,15514,15518],{"__ignoreMap":71},[75,15507,15508],{"class":77,"line":78},[75,15509,423],{},[75,15511,15512],{"class":77,"line":84},[75,15513,428],{},[75,15515,15516],{"class":77,"line":91},[75,15517,433],{},[75,15519,15520],{"class":77,"line":97},[75,15521,438],{},[10,15523,441,15524,445],{},[302,15525,444],{},[10,15527,448],{},[10,15529,451,15530,454],{},[34,15531,70],{},[10,15533,15534],{},[26,15535],{"alt":459,"src":460},[10,15537,463],{},[277,15539,15540,15542,15546],{},[10,15541,468],{},[10,15543,15544],{},[302,15545,473],{},[277,15547,15548,15552,15556],{},[10,15549,478,15550,481],{},[34,15551,70],{},[10,15553,484,15554,487],{},[34,15555,70],{},[10,15557,490,15558,494],{},[302,15559,493],{},[277,15561,15562,15564,15568],{},[10,15563,499],{},[10,15565,15566],{},[302,15567,504],{},[277,15569,15570,15576,15584,15586],{},[10,15571,15572,512,15574,516],{},[34,15573,511],{},[34,15575,515],{},[10,15577,519,15578,522,15580,526,15582,530],{},[34,15579,511],{},[302,15581,525],{},[302,15583,529],{},[10,15585,533],{},[10,15587,15588,539],{},[302,15589,538],{},[277,15591,15592,15594],{},[10,15593,544],{},[277,15595,15596,15600],{},[10,15597,549,15598,553],{},[302,15599,552],{},[10,15601,556],{},[277,15603,15604,15608],{},[10,15605,561,15606],{},[302,15607,564],{},[10,15609,15610],{},[26,15611],{"alt":569,"src":570},[277,15613,15614,15616],{},[10,15615,575],{},[10,15617,15618],{},[26,15619],{"alt":569,"src":580},[336,15621,584],{"id":583},[10,15623,587,15624,591,15626,595],{},[34,15625,590],{},[34,15627,594],{},[66,15629,15630],{"className":598,"code":599,"language":600,"meta":71,"style":71},[34,15631,15632],{"__ignoreMap":71},[75,15633,15634,15636],{"class":77,"line":78},[75,15635,70],{"class":607},[75,15637,611],{"class":610},[10,15639,614],{},[66,15641,15643],{"className":15642,"code":618,"language":148,"meta":71},[146],[34,15644,618],{"__ignoreMap":71},[10,15646,15647],{},[26,15648],{"alt":569,"src":625},[10,15650,628],{},[66,15652,15653],{"className":598,"code":631,"language":600,"meta":71,"style":71},[34,15654,15655],{"__ignoreMap":71},[75,15656,15657,15659,15661,15663],{"class":77,"line":78},[75,15658,70],{"class":607},[75,15660,640],{"class":610},[75,15662,644],{"class":643},[75,15664,611],{"class":610},[10,15666,649,15667,652,15669,656],{},[34,15668,70],{},[34,15670,655],{},[66,15672,15673],{"className":598,"code":659,"language":600,"meta":71,"style":71},[34,15674,15675,15681],{"__ignoreMap":71},[75,15676,15677,15679],{"class":77,"line":78},[75,15678,515],{"class":607},[75,15680,611],{"class":610},[75,15682,15683,15685,15687,15689],{"class":77,"line":84},[75,15684,515],{"class":607},[75,15686,640],{"class":610},[75,15688,644],{"class":643},[75,15690,611],{"class":610},[14,15692,681],{"id":680},[336,15694,685],{"id":684},[10,15696,688],{},[66,15698,15699],{"className":598,"code":691,"language":600,"meta":71,"style":71},[34,15700,15701],{"__ignoreMap":71},[75,15702,15703,15705],{"class":77,"line":78},[75,15704,698],{"class":607},[75,15706,611],{"class":610},[10,15708,703,15709,707],{},[34,15710,706],{},[336,15712,711],{"id":710},[10,15714,342,15715,719,15718,168,15720,726],{},[344,15716,718],{"href":716,"rel":15717},[348],[302,15719,722],{},[34,15721,725],{},[10,15723,729,15724,733],{},[34,15725,732],{},[336,15727,737],{"id":736},[10,15729,740],{},[66,15731,15732],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,15733,15734,15740],{"__ignoreMap":71},[75,15735,15736,15738],{"class":77,"line":78},[75,15737,698],{"class":607},[75,15739,611],{"class":610},[75,15741,15742,15744,15746,15748],{"class":77,"line":84},[75,15743,698],{"class":607},[75,15745,640],{"class":610},[75,15747,644],{"class":643},[75,15749,611],{"class":610},[10,15751,764,15752,767],{},[34,15753,698],{},[14,15755,771],{"id":770},[10,15757,774],{},[336,15759,778],{"id":777},[10,15761,781],{},[66,15763,15764],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,15765,15766,15772],{"__ignoreMap":71},[75,15767,15768,15770],{"class":77,"line":78},[75,15769,698],{"class":607},[75,15771,611],{"class":610},[75,15773,15774,15776,15778,15780],{"class":77,"line":84},[75,15775,698],{"class":607},[75,15777,640],{"class":610},[75,15779,644],{"class":643},[75,15781,611],{"class":610},[10,15783,804],{},[336,15785,808],{"id":807},[10,15787,811],{},[66,15789,15790],{"className":598,"code":814,"language":600,"meta":71,"style":71},[34,15791,15792,15800],{"__ignoreMap":71},[75,15793,15794,15796,15798],{"class":77,"line":78},[75,15795,821],{"class":607},[75,15797,824],{"class":643},[75,15799,827],{"class":643},[75,15801,15802,15804,15806,15808,15810,15812],{"class":77,"line":84},[75,15803,821],{"class":607},[75,15805,824],{"class":643},[75,15807,836],{"class":643},[75,15809,839],{"class":643},[75,15811,842],{"class":643},[75,15813,845],{"class":643},[10,15815,848],{},[66,15817,15818],{"className":598,"code":851,"language":600,"meta":71,"style":71},[34,15819,15820],{"__ignoreMap":71},[75,15821,15822,15824,15826,15828,15830],{"class":77,"line":78},[75,15823,821],{"class":607},[75,15825,860],{"class":643},[75,15827,836],{"class":643},[75,15829,839],{"class":643},[75,15831,867],{"class":643},[10,15833,870],{},[66,15835,15836],{"className":598,"code":873,"language":600,"meta":71,"style":71},[34,15837,15838],{"__ignoreMap":71},[75,15839,15840,15842,15844,15846,15848],{"class":77,"line":78},[75,15841,821],{"class":607},[75,15843,882],{"class":643},[75,15845,885],{"class":610},[75,15847,888],{"class":643},[75,15849,891],{"class":643},[10,15851,15852,896],{},[34,15853,821],{},[336,15855,900],{"id":899},[10,15857,903],{},[66,15859,15860],{"className":598,"code":743,"language":600,"meta":71,"style":71},[34,15861,15862,15868],{"__ignoreMap":71},[75,15863,15864,15866],{"class":77,"line":78},[75,15865,698],{"class":607},[75,15867,611],{"class":610},[75,15869,15870,15872,15874,15876],{"class":77,"line":84},[75,15871,698],{"class":607},[75,15873,640],{"class":610},[75,15875,644],{"class":643},[75,15877,611],{"class":610},[10,15879,926],{},[14,15881,929],{"id":929},[336,15883,933],{"id":932},[10,15885,936,15886,940],{},[34,15887,939],{},[158,15889,15890,15894,15896],{},[45,15891,945,15892,948],{},[34,15893,655],{},[45,15895,951],{},[45,15897,954],{},[10,15899,957],{},[336,15901,961],{"id":960},[10,15903,964],{},[66,15905,15906],{"className":598,"code":691,"language":600,"meta":71,"style":71},[34,15907,15908],{"__ignoreMap":71},[75,15909,15910,15912],{"class":77,"line":78},[75,15911,698],{"class":607},[75,15913,611],{"class":610},[10,15915,977,15916,980,15918,983,15920,168],{},[34,15917,698],{},[34,15919,70],{},[34,15921,698],{},[336,15923,989],{"id":988},[10,15925,992],{},[66,15927,15928],{"className":598,"code":995,"language":600,"meta":71,"style":71},[34,15929,15930],{"__ignoreMap":71},[75,15931,15932,15934,15936,15938],{"class":77,"line":78},[75,15933,698],{"class":607},[75,15935,640],{"class":610},[75,15937,644],{"class":643},[75,15939,611],{"class":610},[10,15941,1010,15942,1013,15944,1016,15946,1019,15948,1023],{},[34,15943,698],{},[34,15945,70],{},[34,15947,515],{},[34,15949,1022],{},[221,15951,1026],{},{"title":71,"searchDepth":84,"depth":84,"links":15953},[15954,15955,15956,15961,15966,15971],{"id":256,"depth":84,"text":256},{"id":272,"depth":84,"text":272},{"id":333,"depth":84,"text":334,"children":15957},[15958,15959,15960],{"id":338,"depth":91,"text":339},{"id":398,"depth":91,"text":399},{"id":583,"depth":91,"text":584},{"id":680,"depth":84,"text":681,"children":15962},[15963,15964,15965],{"id":684,"depth":91,"text":685},{"id":710,"depth":91,"text":711},{"id":736,"depth":91,"text":737},{"id":770,"depth":84,"text":771,"children":15967},[15968,15969,15970],{"id":777,"depth":91,"text":778},{"id":807,"depth":91,"text":808},{"id":899,"depth":91,"text":900},{"id":929,"depth":84,"text":929,"children":15972},[15973,15974,15975],{"id":932,"depth":91,"text":933},{"id":960,"depth":91,"text":961},{"id":988,"depth":91,"text":989},{},{"title":251,"description":71},[234,1059,1060],1786973366373]