[{"data":1,"prerenderedAt":15961},["ShallowReactive",2],{"post-python-variable-references":3,"sidebar-posts":233,"post-related-source":9152},{"id":4,"title":5,"body":6,"category":218,"cover":219,"description":12,"extension":220,"meta":221,"navigation":100,"path":222,"pinned":223,"publishedAt":224,"seo":225,"slug":226,"stem":227,"summary":228,"tags":229,"updatedAt":224,"visible":100,"__hash__":232},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":8,"toc":208},"minimark",[9,13,17,20,23,30,33,36,66,69,72,113,116,124,127,130,157,160,176,179,195,198,201,204],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,31,32],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,34,35],{"id":35},"核心概念",[37,38,39,43,55],"ul",{},[40,41,42],"li",{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,44,45,46,50,51,54],{},"变量名区分大小写，",[47,48,49],"code",{},"score"," 与 ",[47,52,53],{},"Score"," 是两个名字。",[40,56,57,58,61,62,65],{},"使用能表达含义的名称；不要用 ",[47,59,60],{},"list","、",[47,63,64],{},"str"," 等内置名称作为普通变量名。",[14,67,68],{"id":68},"跟着示例运行",[10,70,71],{},"把下面代码保存到本课脚本并运行：",[73,74,79],"pre",{"className":75,"code":76,"language":77,"meta":78,"style":78},"language-python shiki shiki-themes github-dark","score = 90\nprint(score)\n\nscore = 95\nprint(score)\n","python","",[47,80,81,89,95,102,108],{"__ignoreMap":78},[82,83,86],"span",{"class":84,"line":85},"line",1,[82,87,88],{},"score = 90\n",[82,90,92],{"class":84,"line":91},2,[82,93,94],{},"print(score)\n",[82,96,98],{"class":84,"line":97},3,[82,99,101],{"emptyLinePlaceholder":100},true,"\n",[82,103,105],{"class":84,"line":104},4,[82,106,107],{},"score = 95\n",[82,109,111],{"class":84,"line":110},5,[82,112,94],{},[10,114,115],{},"预期结果：",[73,117,122],{"className":118,"code":120,"language":121,"meta":78},[119],"language-text","90\n95\n","text",[47,123,120],{"__ignoreMap":78},[10,125,126],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,128,129],{"id":129},"按执行顺序拆开看",[131,132,133,143],"ol",{},[40,134,135,136,139,140,142],{},"执行 ",[47,137,138],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[47,141,49],{}," 再绑定到它。",[40,144,135,145,148,149,152,153,156],{},[47,146,147],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[47,150,151],{},"90"," 没有被改造成 ",[47,154,155],{},"95","。",[14,158,159],{"id":159},"初学者容易混淆的地方",[37,161,162,165],{},[40,163,164],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,166,167,168,61,170,61,172,175],{},"使用 ",[47,169,60],{},[47,171,64],{},[47,173,174],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,177,178],{"id":178},"练习",[131,180,181,192],{},[40,182,183,184,187,188,191],{},"创建 ",[47,185,186],{},"course_name"," 和 ",[47,189,190],{},"lesson_count"," 两个变量并输出。",[40,193,194],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,196,197],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,199,200],{"id":200},"本篇边界",[10,202,203],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,206,207],"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":78,"searchDepth":91,"depth":91,"links":209},[210,211,212,213,214,215,216,217],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",false,"2026-08-17",{"title":5,"description":12},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[218,230,231],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",[234,1046,1383,1517,1669,1848,2036,2200,2337,2520,2713,2944,3128,3305,3462,3633,3798,4013,4242,4424,4588,4777,4965,5120,5280,5477,5674,5888,6055,6299,6480,6685,6880,7064,7265,7555,7747,7976,8171,8391,8631,8835],{"id":235,"title":236,"body":237,"category":218,"cover":219,"description":78,"extension":220,"meta":1035,"navigation":100,"path":1036,"pinned":223,"publishedAt":1037,"seo":1038,"slug":1039,"stem":1040,"summary":1041,"tags":1042,"updatedAt":1037,"visible":100,"__hash__":1045},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":238,"toc":1011},[239,242,245,248,255,258,261,300,316,320,325,336,341,347,364,370,375,381,385,431,434,440,446,449,480,525,542,556,566,570,581,597,600,606,611,614,632,642,663,667,671,674,686,693,697,712,719,723,726,747,753,757,760,764,767,787,790,794,797,831,834,853,856,877,882,886,889,909,912,915,919,926,939,942,946,949,959,970,974,977,992,1008],[14,240,241],{"id":241},"引言",[10,243,244],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,246,247],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,249,250,251,254],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[47,252,253],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,256,257],{"id":257},"扫盲",[10,259,260],{},"那么这里有几个概念：",[262,263,264,267],"blockquote",{},[10,265,266],{},"为什么需要安装python解释器？",[262,268,269,280,283,291,294],{},[10,270,271,272,275,276,279],{},"我们写的代码，电脑其实看不懂，电脑只认识",[47,273,274],{},"0","和",[47,277,278],{},"1","组成的机器指令。",[10,281,282],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,284,285,286,290],{},"这样，我们就能用",[287,288,289],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,292,293],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,295,296],{},[26,297],{"alt":298,"src":299},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[262,301,302,305],{},[10,303,304],{},"pip又是什么？",[262,306,307,310],{},[10,308,309],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,311,312],{},[26,313],{"alt":314,"src":315},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,317,319],{"id":318},"windows-安装","Windows 安装",[321,322,324],"h3",{"id":323},"_1-下载官方安装程序","1. 下载官方安装程序",[10,326,327,328,335],{},"打开 ",[329,330,334],"a",{"href":331,"rel":332},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[333],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[262,337,338],{},[10,339,340],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,342,343],{},[26,344],{"alt":345,"src":346},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,348,349,355,361],{},[40,350,351,352,156],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[287,353,354],{},"Windows installer (64-bit)",[40,356,357,358,156],{},"搭载 ARM 处理器的 Windows 设备选择 ",[287,359,360],{},"Windows installer (ARM64)",[40,362,363],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,365,366],{},[26,367],{"alt":368,"src":369},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[262,371,372],{},[10,373,374],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,376,377],{},[26,378],{"alt":379,"src":380},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[321,382,384],{"id":383},"_2-安装并加入-path","2. 安装并加入 PATH",[262,386,387,392,399,424],{},[262,388,389],{},[10,390,391],{},"PATH 环境变量",[10,393,394,395,398],{},"Windows 有一个特殊的变量叫 ",[287,396,397],{},"PATH","，它里面存了一串文件夹路径，比如：",[73,400,402],{"className":75,"code":401,"language":77,"meta":78,"style":78},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[47,403,404,409,414,419],{"__ignoreMap":78},[82,405,406],{"class":84,"line":85},[82,407,408],{},"D:\\Python313\\\n",[82,410,411],{"class":84,"line":91},[82,412,413],{},"D:\\Python313\\Scripts\\\n",[82,415,416],{"class":84,"line":97},[82,417,418],{},"C:\\Windows\\System32\\\n",[82,420,421],{"class":84,"line":104},[82,422,423],{},"...\n",[10,425,426,427,430],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[287,428,429],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,432,433],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,435,436,437,439],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[47,438,77],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,441,442],{},[26,443],{"alt":444,"src":445},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,447,448],{},"对安装界面最底部的两个勾选项分别解释 :",[262,450,451,454,459],{},[10,452,453],{},"Add python.exe to PATH",[10,455,456],{},[287,457,458],{},"把 Python 添加到系统环境变量",[262,460,461,467,473],{},[10,462,463,464,466],{},"勾选后，你可以在命令行任意位置直接输入 ",[47,465,77],{}," 就能运行",[10,468,469,470,472],{},"不勾选的话，命令行输入 ",[47,471,77],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,474,475,476,479],{},"必须",[287,477,478],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[262,481,482,485,490],{},[10,483,484],{},"Use admin privileges when installing py.exe",[10,486,487],{},[287,488,489],{},"使用管理员权限安装 py.exe（Python 启动器）",[262,491,492,502,516,519],{},[10,493,494,497,498,501],{},[47,495,496],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[47,499,500],{},"py"," 来启动 Python。",[10,503,504,505,507,508,511,512,515],{},"勾选后，",[47,506,496],{}," 会安装到",[287,509,510],{},"系统级目录","，电脑上",[287,513,514],{},"所有用户账户","都能用",[10,517,518],{},"不勾选，只有当前用户能用",[10,520,521,524],{},[287,522,523],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[262,526,527,530],{},[10,528,529],{},"操作建议",[262,531,532,539],{},[10,533,534,535,538],{},"两个都勾上之后，再点 ",[287,536,537],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,540,541],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[262,543,544,550],{},[10,545,546,547],{},"Python 安装的",[287,548,549],{},"可选功能页",[10,551,552],{},[26,553],{"alt":554,"src":555},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[262,557,558,561],{},[10,559,560],{},"高级选项页",[10,562,563],{},[26,564],{"alt":554,"src":565},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[321,567,569],{"id":568},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,571,572,573,576,577,580],{},"按 ",[47,574,575],{},"Win + R","，输入 ",[47,578,579],{},"cmd"," 并回车，然后执行：",[73,582,586],{"className":583,"code":584,"language":585,"meta":78,"style":78},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[47,587,588],{"__ignoreMap":78},[82,589,590,593],{"class":84,"line":85},[82,591,77],{"class":592},"svObZ",[82,594,596],{"class":595},"sDLfK"," --version\n",[10,598,599],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[73,601,604],{"className":602,"code":603,"language":121,"meta":78},[119],"Python 3.x.x\n",[47,605,603],{"__ignoreMap":78},[10,607,608],{},[26,609],{"alt":554,"src":610},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,612,613],{},"继续检查 pip：",[73,615,617],{"className":583,"code":616,"language":585,"meta":78,"style":78},"python -m pip --version\n",[47,618,619],{"__ignoreMap":78},[82,620,621,623,626,630],{"class":84,"line":85},[82,622,77],{"class":592},[82,624,625],{"class":595}," -m",[82,627,629],{"class":628},"sU2Wk"," pip",[82,631,596],{"class":595},[10,633,634,635,637,638,641],{},"如果 ",[47,636,77],{}," 无法识别，但 ",[47,639,640],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[73,643,645],{"className":583,"code":644,"language":585,"meta":78,"style":78},"py --version\npy -m pip --version\n",[47,646,647,653],{"__ignoreMap":78},[82,648,649,651],{"class":84,"line":85},[82,650,500],{"class":592},[82,652,596],{"class":595},[82,654,655,657,659,661],{"class":84,"line":91},[82,656,500],{"class":592},[82,658,625],{"class":595},[82,660,629],{"class":628},[82,662,596],{"class":595},[14,664,666],{"id":665},"macos-安装","macOS 安装",[321,668,670],{"id":669},"_1-先检查现有环境","1. 先检查现有环境",[10,672,673],{},"打开“终端”应用，执行：",[73,675,677],{"className":583,"code":676,"language":585,"meta":78,"style":78},"python3 --version\n",[47,678,679],{"__ignoreMap":78},[82,680,681,684],{"class":84,"line":85},[82,682,683],{"class":592},"python3",[82,685,596],{"class":595},[10,687,688,689,692],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[47,690,691],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[321,694,696],{"id":695},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,698,327,699,704,705,156,708,711],{},[329,700,703],{"href":701,"rel":702},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[333],"Python macOS 下载页","，下载当前稳定版的 ",[287,706,707],{},"macOS 64-bit universal2 installer",[47,709,710],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,713,714,715,718],{},"下载完成后打开 ",[47,716,717],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[321,720,722],{"id":721},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,724,725],{},"安装完成后重新打开终端，执行：",[73,727,729],{"className":583,"code":728,"language":585,"meta":78,"style":78},"python3 --version\npython3 -m pip --version\n",[47,730,731,737],{"__ignoreMap":78},[82,732,733,735],{"class":84,"line":85},[82,734,683],{"class":592},[82,736,596],{"class":595},[82,738,739,741,743,745],{"class":84,"line":91},[82,740,683],{"class":592},[82,742,625],{"class":595},[82,744,629],{"class":628},[82,746,596],{"class":595},[10,748,749,750,752],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[47,751,683],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,754,756],{"id":755},"linux-安装","Linux 安装",[10,758,759],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[321,761,763],{"id":762},"_1-检查是否已经安装","1. 检查是否已经安装",[10,765,766],{},"打开终端，执行：",[73,768,769],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,770,771,777],{"__ignoreMap":78},[82,772,773,775],{"class":84,"line":85},[82,774,683],{"class":592},[82,776,596],{"class":595},[82,778,779,781,783,785],{"class":84,"line":91},[82,780,683],{"class":592},[82,782,625],{"class":595},[82,784,629],{"class":628},[82,786,596],{"class":595},[10,788,789],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[321,791,793],{"id":792},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,795,796],{},"Ubuntu 或 Debian：",[73,798,800],{"className":583,"code":799,"language":585,"meta":78,"style":78},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[47,801,802,813],{"__ignoreMap":78},[82,803,804,807,810],{"class":84,"line":85},[82,805,806],{"class":592},"sudo",[82,808,809],{"class":628}," apt",[82,811,812],{"class":628}," update\n",[82,814,815,817,819,822,825,828],{"class":84,"line":91},[82,816,806],{"class":592},[82,818,809],{"class":628},[82,820,821],{"class":628}," install",[82,823,824],{"class":628}," python3",[82,826,827],{"class":628}," python3-pip",[82,829,830],{"class":628}," python3-venv\n",[10,832,833],{},"Fedora：",[73,835,837],{"className":583,"code":836,"language":585,"meta":78,"style":78},"sudo dnf install python3 python3-pip\n",[47,838,839],{"__ignoreMap":78},[82,840,841,843,846,848,850],{"class":84,"line":85},[82,842,806],{"class":592},[82,844,845],{"class":628}," dnf",[82,847,821],{"class":628},[82,849,824],{"class":628},[82,851,852],{"class":628}," python3-pip\n",[10,854,855],{},"Arch Linux：",[73,857,859],{"className":583,"code":858,"language":585,"meta":78,"style":78},"sudo pacman -S python python-pip\n",[47,860,861],{"__ignoreMap":78},[82,862,863,865,868,871,874],{"class":84,"line":85},[82,864,806],{"class":592},[82,866,867],{"class":628}," pacman",[82,869,870],{"class":595}," -S",[82,872,873],{"class":628}," python",[82,875,876],{"class":628}," python-pip\n",[10,878,879,881],{},[47,880,806],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[321,883,885],{"id":884},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,887,888],{},"安装结束后执行：",[73,890,891],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,892,893,899],{"__ignoreMap":78},[82,894,895,897],{"class":84,"line":85},[82,896,683],{"class":592},[82,898,596],{"class":595},[82,900,901,903,905,907],{"class":84,"line":91},[82,902,683],{"class":592},[82,904,625],{"class":595},[82,906,629],{"class":628},[82,908,596],{"class":595},[10,910,911],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,913,914],{"id":914},"常见问题",[321,916,918],{"id":917},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,920,921,922,925],{},"先关闭当前命令提示符并重新打开，再执行 ",[47,923,924],{},"python --version","。如果仍然失败，按下面的顺序检查：",[131,927,928,933,936],{},[40,929,135,930,932],{},[47,931,640],{},"，确认 Python Launcher 是否可用。",[40,934,935],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,937,938],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,940,941],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[321,943,945],{"id":944},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,947,948],{},"先尝试：",[73,950,951],{"className":583,"code":676,"language":585,"meta":78,"style":78},[47,952,953],{"__ignoreMap":78},[82,954,955,957],{"class":84,"line":85},[82,956,683],{"class":592},[82,958,596],{"class":595},[10,960,961,962,964,965,967,968,156],{},"在这两个系统中，只有 ",[47,963,683],{}," 命令而没有 ",[47,966,77],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[47,969,683],{},[321,971,973],{"id":972},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,975,976],{},"先使用模块方式检查：",[73,978,980],{"className":583,"code":979,"language":585,"meta":78,"style":78},"python3 -m pip --version\n",[47,981,982],{"__ignoreMap":78},[82,983,984,986,988,990],{"class":84,"line":85},[82,985,683],{"class":592},[82,987,625],{"class":595},[82,989,629],{"class":628},[82,991,596],{"class":595},[10,993,994,995,997,998,1000,1001,1003,1004,1007],{},"Windows 用户将命令中的 ",[47,996,683],{}," 换成 ",[47,999,77],{}," 或 ",[47,1002,500],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[47,1005,1006],{},"python3-pip","；不要直接使用其他系统的安装命令。",[205,1009,1010],{},"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":78,"searchDepth":91,"depth":91,"links":1012},[1013,1014,1015,1020,1025,1030],{"id":241,"depth":91,"text":241},{"id":257,"depth":91,"text":257},{"id":318,"depth":91,"text":319,"children":1016},[1017,1018,1019],{"id":323,"depth":97,"text":324},{"id":383,"depth":97,"text":384},{"id":568,"depth":97,"text":569},{"id":665,"depth":91,"text":666,"children":1021},[1022,1023,1024],{"id":669,"depth":97,"text":670},{"id":695,"depth":97,"text":696},{"id":721,"depth":97,"text":722},{"id":755,"depth":91,"text":756,"children":1026},[1027,1028,1029],{"id":762,"depth":97,"text":763},{"id":792,"depth":97,"text":793},{"id":884,"depth":97,"text":885},{"id":914,"depth":91,"text":914,"children":1031},[1032,1033,1034],{"id":917,"depth":97,"text":918},{"id":944,"depth":97,"text":945},{"id":972,"depth":97,"text":973},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":236,"description":78},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[218,1043,1044],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1047,"title":1048,"body":1049,"category":218,"cover":1056,"description":78,"extension":220,"meta":1372,"navigation":100,"path":1373,"pinned":223,"publishedAt":1374,"seo":1375,"slug":1376,"stem":1377,"summary":1378,"tags":1379,"updatedAt":1374,"visible":100,"__hash__":1382},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1050,"toc":1357},[1051,1057,1060,1063,1067,1070,1094,1097,1103,1106,1109,1144,1153,1157,1164,1167,1192,1195,1207,1210,1214,1217,1220,1223,1226,1229,1232,1235,1259,1262,1265,1271,1274,1277,1280,1284,1290,1293,1319,1322,1326,1329,1332,1336,1339,1342,1345,1348,1351,1354],[10,1052,1053],{},[26,1054],{"alt":1055,"src":1056},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1058,1059],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1061,1062],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1064,1066],{"id":1065},"python-代码是什么样的","Python 代码是什么样的",[10,1068,1069],{},"下面是一段简单的 Python 代码：",[73,1071,1073],{"className":75,"code":1072,"language":77,"meta":78,"style":78},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[47,1074,1075,1080,1085,1089],{"__ignoreMap":78},[82,1076,1077],{"class":84,"line":85},[82,1078,1079],{},"name = \"Python\"\n",[82,1081,1082],{"class":84,"line":91},[82,1083,1084],{},"year = 2026\n",[82,1086,1087],{"class":84,"line":97},[82,1088,101],{"emptyLinePlaceholder":100},[82,1090,1091],{"class":84,"line":104},[82,1092,1093],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1095,1096],{},"运行结果：",[73,1098,1101],{"className":1099,"code":1100,"language":121,"meta":78},[119],"正在学习 Python，当前年份是 2026\n",[47,1102,1100],{"__ignoreMap":78},[10,1104,1105],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1107,1108],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[73,1110,1112],{"className":75,"code":1111,"language":77,"meta":78,"style":78},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[47,1113,1114,1119,1123,1128,1133,1138],{"__ignoreMap":78},[82,1115,1116],{"class":84,"line":85},[82,1117,1118],{},"score = 85\n",[82,1120,1121],{"class":84,"line":91},[82,1122,101],{"emptyLinePlaceholder":100},[82,1124,1125],{"class":84,"line":97},[82,1126,1127],{},"if score >= 60:\n",[82,1129,1130],{"class":84,"line":104},[82,1131,1132],{},"    print(\"成绩合格\")\n",[82,1134,1135],{"class":84,"line":110},[82,1136,1137],{},"else:\n",[82,1139,1141],{"class":84,"line":1140},6,[82,1142,1143],{},"    print(\"需要继续学习\")\n",[10,1145,1146,187,1149,1152],{},[47,1147,1148],{},"if",[47,1150,1151],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1154,1156],{"id":1155},"python-如何运行代码","Python 如何运行代码",[10,1158,1159,1160,1163],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[47,1161,1162],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1165,1166],{},"交互式环境适合快速验证一个表达式：",[73,1168,1170],{"className":75,"code":1169,"language":77,"meta":78,"style":78},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[47,1171,1172,1177,1182,1187],{"__ignoreMap":78},[82,1173,1174],{"class":84,"line":85},[82,1175,1176],{},">>> 10 + 20\n",[82,1178,1179],{"class":84,"line":91},[82,1180,1181],{},"30\n",[82,1183,1184],{"class":84,"line":97},[82,1185,1186],{},">>> \"Python\".lower()\n",[82,1188,1189],{"class":84,"line":104},[82,1190,1191],{},"'python'\n",[10,1193,1194],{},"需要保存和重复运行的程序，则可以写入文件：",[73,1196,1198],{"className":583,"code":1197,"language":585,"meta":78,"style":78},"python3 hello.py\n",[47,1199,1200],{"__ignoreMap":78},[82,1201,1202,1204],{"class":84,"line":85},[82,1203,683],{"class":592},[82,1205,1206],{"class":628}," hello.py\n",[10,1208,1209],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1211,1213],{"id":1212},"python-的特点","Python 的特点",[321,1215,1216],{"id":1216},"语法相对简洁",[10,1218,1219],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[321,1221,1222],{"id":1222},"支持多种编程方式",[10,1224,1225],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[321,1227,1228],{"id":1228},"标准库比较完整",[10,1230,1231],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1233,1234],{},"例如，获取当前时间：",[73,1236,1238],{"className":75,"code":1237,"language":77,"meta":78,"style":78},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[47,1239,1240,1245,1249,1254],{"__ignoreMap":78},[82,1241,1242],{"class":84,"line":85},[82,1243,1244],{},"from datetime import datetime\n",[82,1246,1247],{"class":84,"line":91},[82,1248,101],{"emptyLinePlaceholder":100},[82,1250,1251],{"class":84,"line":97},[82,1252,1253],{},"now = datetime.now()\n",[82,1255,1256],{"class":84,"line":104},[82,1257,1258],{},"print(now)\n",[10,1260,1261],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[321,1263,1264],{"id":1264},"第三方工具丰富",[10,1266,1267,1268,1270],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[47,1269,253],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1272,1273],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[321,1275,1276],{"id":1276},"支持多个操作系统",[10,1278,1279],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1281,1283],{"id":1282},"python-可以做什么","Python 可以做什么",[10,1285,1286],{},[26,1287],{"alt":1288,"src":1289},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1291,1292],{},"Python 的应用范围比较广，常见方向包括：",[37,1294,1295,1298,1301,1304,1307,1310,1313,1316],{},[40,1296,1297],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1299,1300],{},"开发网站后端和 API 服务；",[40,1302,1303],{},"进行数据清洗、统计分析和图表展示；",[40,1305,1306],{},"编写网络爬虫和信息采集工具；",[40,1308,1309],{},"开发自动化测试程序；",[40,1311,1312],{},"进行机器学习和人工智能开发；",[40,1314,1315],{},"编写运维、监控和辅助开发工具；",[40,1317,1318],{},"开发部分桌面应用和插件。",[10,1320,1321],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1323,1325],{"id":1324},"python-的发展","Python 的发展",[10,1327,1328],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1330,1331],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1333,1335],{"id":1334},"python-也有局限","Python 也有局限",[10,1337,1338],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1340,1341],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1343,1344],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1346,1347],{"id":1347},"写在最后",[10,1349,1350],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1352,1353],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[205,1355,1356],{},"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":78,"searchDepth":91,"depth":91,"links":1358},[1359,1360,1361,1368,1369,1370,1371],{"id":1065,"depth":91,"text":1066},{"id":1155,"depth":91,"text":1156},{"id":1212,"depth":91,"text":1213,"children":1362},[1363,1364,1365,1366,1367],{"id":1216,"depth":97,"text":1216},{"id":1222,"depth":97,"text":1222},{"id":1228,"depth":97,"text":1228},{"id":1264,"depth":97,"text":1264},{"id":1276,"depth":97,"text":1276},{"id":1282,"depth":91,"text":1283},{"id":1324,"depth":91,"text":1325},{"id":1334,"depth":91,"text":1335},{"id":1347,"depth":91,"text":1347},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1048,"description":78},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[218,1380,1381],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1384,"title":1385,"body":1386,"category":218,"cover":219,"description":1390,"extension":220,"meta":1508,"navigation":100,"path":1509,"pinned":223,"publishedAt":224,"seo":1510,"slug":1511,"stem":1512,"summary":1513,"tags":1514,"updatedAt":224,"visible":100,"__hash__":1516},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1387,"toc":1498},[1388,1391,1393,1396,1398,1404,1409,1411,1425,1427,1429,1438,1440,1446,1448,1450,1466,1468,1479,1481,1489,1491,1493,1496],[10,1389,1390],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1392,16],{"id":16},[10,1394,1395],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1397,22],{"id":22},[10,1399,1400],{},[26,1401],{"alt":1402,"src":1403},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1405,1406,1408],{},[47,1407,1162],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1410,35],{"id":35},[37,1412,1413,1419,1422],{},[40,1414,1415,1416,1418],{},"源代码是人编写的文本，通常保存在 ",[47,1417,1162],{}," 文件中。",[40,1420,1421],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1423,1424],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1426,68],{"id":68},[10,1428,71],{},[73,1430,1432],{"className":75,"code":1431,"language":77,"meta":78,"style":78},"print(\"你好，Python\")\n",[47,1433,1434],{"__ignoreMap":78},[82,1435,1436],{"class":84,"line":85},[82,1437,1431],{},[10,1439,115],{},[73,1441,1444],{"className":1442,"code":1443,"language":121,"meta":78},[119],"你好，Python\n",[47,1445,1443],{"__ignoreMap":78},[10,1447,126],{},[14,1449,129],{"id":129},[131,1451,1452,1459],{},[40,1453,1454,1455,1458],{},"终端启动解释器后，解释器读取 ",[47,1456,1457],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1460,1461,1462,1465],{},"字符串对象先准备好，再交给 ",[47,1463,1464],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1467,159],{"id":159},[37,1469,1470,1473],{},[40,1471,1472],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1474,1475,1476,1478],{},"认为 ",[47,1477,1162],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1480,178],{"id":178},[131,1482,1483,1486],{},[40,1484,1485],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1487,1488],{},"把示例文字改成自己的学习目标并重新运行。",[10,1490,197],{},[14,1492,200],{"id":200},[10,1494,1495],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,1497,207],{},{"title":78,"searchDepth":91,"depth":91,"links":1499},[1500,1501,1502,1503,1504,1505,1506,1507],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1385,"description":1390},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[218,1380,1515],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1518,"title":1519,"body":1520,"category":218,"cover":219,"description":1524,"extension":220,"meta":1660,"navigation":100,"path":1661,"pinned":223,"publishedAt":224,"seo":1662,"slug":1663,"stem":1664,"summary":1665,"tags":1666,"updatedAt":224,"visible":100,"__hash__":1668},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1521,"toc":1650},[1522,1525,1527,1530,1532,1538,1544,1546,1561,1563,1566,1586,1588,1594,1596,1598,1611,1613,1627,1629,1640,1642,1644,1647],[10,1523,1524],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1526,16],{"id":16},[10,1528,1529],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1531,22],{"id":22},[10,1533,1534],{},[26,1535],{"alt":1536,"src":1537},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1539,1540,1541,1543],{},"终端收到 ",[47,1542,683],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1545,35],{"id":35},[37,1547,1548,1551,1554],{},[40,1549,1550],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1552,1553],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1555,1556,1557,1560],{},"检查 pip 时使用 ",[47,1558,1559],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1562,68],{"id":68},[10,1564,1565],{},"在 macOS 终端执行：",[73,1567,1568],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,1569,1570,1576],{"__ignoreMap":78},[82,1571,1572,1574],{"class":84,"line":85},[82,1573,683],{"class":592},[82,1575,596],{"class":595},[82,1577,1578,1580,1582,1584],{"class":84,"line":91},[82,1579,683],{"class":592},[82,1581,625],{"class":595},[82,1583,629],{"class":628},[82,1585,596],{"class":595},[10,1587,115],{},[73,1589,1592],{"className":1590,"code":1591,"language":121,"meta":78},[119],"Python 3.14.x\npip 版本信息与安装路径\n",[47,1593,1591],{"__ignoreMap":78},[10,1595,126],{},[14,1597,129],{"id":129},[131,1599,1600,1606],{},[40,1601,1602,1605],{},[47,1603,1604],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1607,1608,1610],{},[47,1609,691],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1612,159],{"id":159},[37,1614,1615,1621],{},[40,1616,1617,1618,1620],{},"看到系统已有 ",[47,1619,683],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1622,1623,1624,1626],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[47,1625,683],{},"，不修改系统自带工具。",[14,1628,178],{"id":178},[131,1630,1631,1637],{},[40,1632,135,1633,1636],{},[47,1634,1635],{},"which python3","，记录当前解释器路径。",[40,1638,1639],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1641,197],{},[14,1643,200],{"id":200},[10,1645,1646],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,1648,1649],{},"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":78,"searchDepth":91,"depth":91,"links":1651},[1652,1653,1654,1655,1656,1657,1658,1659],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1519,"description":1524},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[218,1667,1043],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1670,"title":1671,"body":1672,"category":218,"cover":219,"description":1837,"extension":220,"meta":1838,"navigation":100,"path":1839,"pinned":223,"publishedAt":224,"seo":1840,"slug":1841,"stem":1842,"summary":1843,"tags":1844,"updatedAt":224,"visible":100,"__hash__":1847},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1673,"toc":1827},[1674,1680,1682,1685,1687,1693,1696,1698,1722,1724,1726,1753,1755,1761,1763,1765,1783,1785,1799,1801,1815,1817,1819,1825],[10,1675,1676,1677,1679],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[47,1678,1162],{}," 脚本。",[14,1681,16],{"id":16},[10,1683,1684],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1686,22],{"id":22},[10,1688,1689],{},[26,1690],{"alt":1691,"src":1692},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1694,1695],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1697,35],{"id":35},[37,1699,1700,1709,1716],{},[40,1701,1702,1703,1705,1706,156],{},"在终端输入 ",[47,1704,683],{}," 进入 REPL，提示符通常是 ",[47,1707,1708],{},">>>",[40,1710,1711,1712,1715],{},"输入 ",[47,1713,1714],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1717,1718,1719,1721],{},"需要保存、复查或多次运行的代码应写入 ",[47,1720,1162],{}," 文件。",[14,1723,68],{"id":68},[10,1725,71],{},[73,1727,1731],{"className":1728,"code":1729,"language":1730,"meta":78,"style":78},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[47,1732,1733,1738,1743,1748],{"__ignoreMap":78},[82,1734,1735],{"class":84,"line":85},[82,1736,1737],{},">>> 2 + 3\n",[82,1739,1740],{"class":84,"line":91},[82,1741,1742],{},"5\n",[82,1744,1745],{"class":84,"line":97},[82,1746,1747],{},">>> \"python\".upper()\n",[82,1749,1750],{"class":84,"line":104},[82,1751,1752],{},"'PYTHON'\n",[10,1754,115],{},[73,1756,1759],{"className":1757,"code":1758,"language":121,"meta":78},[119],"REPL 会直接显示表达式结果\n",[47,1760,1758],{"__ignoreMap":78},[10,1762,126],{},[14,1764,129],{"id":129},[131,1766,1767,1777],{},[40,1768,1769,1770,1773,1774,156],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[47,1771,1772],{},"2 + 3"," 能直接看到 ",[47,1775,1776],{},"5",[40,1778,1779,1780,1782],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[47,1781,1464],{}," 才会写到标准输出。",[14,1784,159],{"id":159},[37,1786,1787,1796],{},[40,1788,1789,1790,1792,1793,1795],{},"把提示符 ",[47,1791,1708],{}," 复制进 ",[47,1794,1162],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1797,1798],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1800,178],{"id":178},[131,1802,1803,1809],{},[40,1804,1805,1806,156],{},"在 REPL 计算 ",[47,1807,1808],{},"12 * 8",[40,1810,1811,1812,1814],{},"把同一表达式写入脚本；观察脚本中不调用 ",[47,1813,1464],{}," 时是否显示结果。",[10,1816,197],{},[14,1818,200],{"id":200},[10,1820,1821,1822,1824],{},"本篇目标是根据任务选择 REPL 或 ",[47,1823,1162],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,1826,207],{},{"title":78,"searchDepth":91,"depth":91,"links":1828},[1829,1830,1831,1832,1833,1834,1835,1836],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1671,"description":1837},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[218,1845,1846],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1849,"title":1850,"body":1851,"category":218,"cover":219,"description":1855,"extension":220,"meta":2026,"navigation":100,"path":2027,"pinned":223,"publishedAt":224,"seo":2028,"slug":2029,"stem":2030,"summary":2031,"tags":2032,"updatedAt":224,"visible":100,"__hash__":2035},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1852,"toc":2016},[1853,1856,1858,1861,1863,1869,1875,1877,1895,1897,1899,1944,1946,1952,1954,1956,1978,1980,1992,1994,2006,2008,2010,2013],[10,1854,1855],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1857,16],{"id":16},[10,1859,1860],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1862,22],{"id":22},[10,1864,1865],{},[26,1866],{"alt":1867,"src":1868},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1870,1871,1874],{},[47,1872,1873],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1876,35],{"id":35},[37,1878,1879,1882,1892],{},[40,1880,1881],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1883,1884,1887,1888,1891],{},[47,1885,1886],{},"pwd"," 显示当前目录，",[47,1889,1890],{},"ls"," 显示目录里的文件。",[40,1893,1894],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1896,68],{"id":68},[10,1898,1565],{},[73,1900,1902],{"className":583,"code":1901,"language":585,"meta":78,"style":78},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[47,1903,1904,1912,1919,1924,1938],{"__ignoreMap":78},[82,1905,1906,1909],{"class":84,"line":85},[82,1907,1908],{"class":592},"mkdir",[82,1910,1911],{"class":628}," python-study\n",[82,1913,1914,1917],{"class":84,"line":91},[82,1915,1916],{"class":595},"cd",[82,1918,1911],{"class":628},[82,1920,1921],{"class":84,"line":97},[82,1922,1923],{"class":595},"pwd\n",[82,1925,1926,1929,1932,1936],{"class":84,"line":104},[82,1927,1928],{"class":595},"printf",[82,1930,1931],{"class":628}," 'print(\"项目已经运行\")\\n'",[82,1933,1935],{"class":1934},"snl16"," >",[82,1937,1206],{"class":628},[82,1939,1940,1942],{"class":84,"line":110},[82,1941,683],{"class":592},[82,1943,1206],{"class":628},[10,1945,115],{},[73,1947,1950],{"className":1948,"code":1949,"language":121,"meta":78},[119],"项目已经运行\n",[47,1951,1949],{"__ignoreMap":78},[10,1953,126],{},[14,1955,129],{"id":129},[131,1957,1958,1969],{},[40,1959,1960,1962,1963,1965,1966,1968],{},[47,1961,1908],{}," 创建目录，",[47,1964,1916],{}," 改变终端当前目录，",[47,1967,1886],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,1970,1971,1973,1974,1977],{},[47,1972,1873],{}," 会在当前目录寻找 ",[47,1975,1976],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1979,159],{"id":159},[37,1981,1982,1989],{},[40,1983,1984,1985,187,1987,156],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[47,1986,1886],{},[47,1988,1890],{},[40,1990,1991],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1993,178],{"id":178},[131,1995,1996,2003],{},[40,1997,1998,1999,2002],{},"新建 ",[47,2000,2001],{},"lesson01.py"," 并输出课程编号。",[40,2004,2005],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2007,197],{},[14,2009,200],{"id":200},[10,2011,2012],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,2014,2015],{},"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":78,"searchDepth":91,"depth":91,"links":2017},[2018,2019,2020,2021,2022,2023,2024,2025],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1850,"description":1855},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[218,2033,2034],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2037,"title":2038,"body":2039,"category":218,"cover":219,"description":2043,"extension":220,"meta":2190,"navigation":100,"path":2191,"pinned":223,"publishedAt":224,"seo":2192,"slug":2193,"stem":2194,"summary":2195,"tags":2196,"updatedAt":224,"visible":100,"__hash__":2199},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2040,"toc":2180},[2041,2044,2046,2049,2051,2057,2068,2070,2090,2092,2094,2114,2116,2122,2124,2126,2145,2147,2155,2157,2171,2173,2175,2178],[10,2042,2043],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2045,16],{"id":16},[10,2047,2048],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2050,22],{"id":22},[10,2052,2053],{},[26,2054],{"alt":2055,"src":2056},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2058,2059,2060,156,2062,2065,2066,156],{},"Python 先计算表达式，再把得到的对象交给 ",[47,2061,1464],{},[47,2063,2064],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[47,2067,1772],{},[14,2069,35],{"id":35},[37,2071,2072,2078,2087],{},[40,2073,2074,2077],{},[47,2075,2076],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2079,2080,2083,2084,156],{},[47,2081,2082],{},"7 + 5"," 是表达式，运行时先求值得到 ",[47,2085,2086],{},"12",[40,2088,2089],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2091,68],{"id":68},[10,2093,71],{},[73,2095,2097],{"className":75,"code":2096,"language":77,"meta":78,"style":78},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[47,2098,2099,2104,2109],{"__ignoreMap":78},[82,2100,2101],{"class":84,"line":85},[82,2102,2103],{},"print(42)\n",[82,2105,2106],{"class":84,"line":91},[82,2107,2108],{},"print(7 + 5)\n",[82,2110,2111],{"class":84,"line":97},[82,2112,2113],{},"print(\"Python 基础课\")\n",[10,2115,115],{},[73,2117,2120],{"className":2118,"code":2119,"language":121,"meta":78},[119],"42\n12\nPython 基础课\n",[47,2121,2119],{"__ignoreMap":78},[10,2123,126],{},[14,2125,129],{"id":129},[131,2127,2128,2136],{},[40,2129,2130,2133,2134,156],{},[47,2131,2132],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[47,2135,2086],{},[40,2137,2138,2140,2141,2144],{},[47,2139,1464],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[47,2142,2143],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2146,159],{"id":159},[37,2148,2149,2152],{},[40,2150,2151],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2153,2154],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2156,178],{"id":178},[131,2158,2159,2162],{},[40,2160,2161],{},"分别输出一个整数、一个小数和一段文本。",[40,2163,2164,2165,50,2167,2170],{},"比较 ",[47,2166,2064],{},[47,2168,2169],{},"print(\"2 + 3\")"," 的结果。",[10,2172,197],{},[14,2174,200],{"id":200},[10,2176,2177],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,2179,207],{},{"title":78,"searchDepth":91,"depth":91,"links":2181},[2182,2183,2184,2185,2186,2187,2188,2189],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2038,"description":2043},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[218,2197,2198],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":4,"title":5,"body":2201,"category":218,"cover":219,"description":12,"extension":220,"meta":2334,"navigation":100,"path":222,"pinned":223,"publishedAt":224,"seo":2335,"slug":226,"stem":227,"summary":228,"tags":2336,"updatedAt":224,"visible":100,"__hash__":232},{"type":7,"value":2202,"toc":2324},[2203,2205,2207,2209,2211,2215,2217,2219,2235,2237,2239,2263,2265,2270,2272,2274,2290,2292,2304,2306,2316,2318,2320,2322],[10,2204,12],{},[14,2206,16],{"id":16},[10,2208,19],{},[14,2210,22],{"id":22},[10,2212,2213],{},[26,2214],{"alt":28,"src":29},[10,2216,32],{},[14,2218,35],{"id":35},[37,2220,2221,2223,2229],{},[40,2222,42],{},[40,2224,45,2225,50,2227,54],{},[47,2226,49],{},[47,2228,53],{},[40,2230,57,2231,61,2233,65],{},[47,2232,60],{},[47,2234,64],{},[14,2236,68],{"id":68},[10,2238,71],{},[73,2240,2241],{"className":75,"code":76,"language":77,"meta":78,"style":78},[47,2242,2243,2247,2251,2255,2259],{"__ignoreMap":78},[82,2244,2245],{"class":84,"line":85},[82,2246,88],{},[82,2248,2249],{"class":84,"line":91},[82,2250,94],{},[82,2252,2253],{"class":84,"line":97},[82,2254,101],{"emptyLinePlaceholder":100},[82,2256,2257],{"class":84,"line":104},[82,2258,107],{},[82,2260,2261],{"class":84,"line":110},[82,2262,94],{},[10,2264,115],{},[73,2266,2268],{"className":2267,"code":120,"language":121,"meta":78},[119],[47,2269,120],{"__ignoreMap":78},[10,2271,126],{},[14,2273,129],{"id":129},[131,2275,2276,2282],{},[40,2277,135,2278,139,2280,142],{},[47,2279,138],{},[47,2281,49],{},[40,2283,135,2284,148,2286,152,2288,156],{},[47,2285,147],{},[47,2287,151],{},[47,2289,155],{},[14,2291,159],{"id":159},[37,2293,2294,2296],{},[40,2295,164],{},[40,2297,167,2298,61,2300,61,2302,175],{},[47,2299,60],{},[47,2301,64],{},[47,2303,174],{},[14,2305,178],{"id":178},[131,2307,2308,2314],{},[40,2309,183,2310,187,2312,191],{},[47,2311,186],{},[47,2313,190],{},[40,2315,194],{},[10,2317,197],{},[14,2319,200],{"id":200},[10,2321,203],{},[205,2323,207],{},{"title":78,"searchDepth":91,"depth":91,"links":2325},[2326,2327,2328,2329,2330,2331,2332,2333],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5,"description":12},[218,230,231],{"id":2338,"title":2339,"body":2340,"category":218,"cover":219,"description":2344,"extension":220,"meta":2510,"navigation":100,"path":2511,"pinned":223,"publishedAt":224,"seo":2512,"slug":2513,"stem":2514,"summary":2515,"tags":2516,"updatedAt":224,"visible":100,"__hash__":2519},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2341,"toc":2500},[2342,2345,2347,2350,2352,2358,2361,2363,2392,2394,2396,2442,2444,2450,2452,2454,2468,2470,2481,2483,2491,2493,2495,2498],[10,2343,2344],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2346,16],{"id":16},[10,2348,2349],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2351,22],{"id":22},[10,2353,2354],{},[26,2355],{"alt":2356,"src":2357},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2359,2360],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2362,35],{"id":35},[37,2364,2365,2375,2389],{},[40,2366,2367,2370,2371,2374],{},[47,2368,2369],{},"int"," 表示整数，",[47,2372,2373],{},"float"," 表示浮点数。",[40,2376,2377,2380,2381,2384,2385,2388],{},[47,2378,2379],{},"\u002F"," 总是进行真除法；",[47,2382,2383],{},"\u002F\u002F"," 是向下取整除法，",[47,2386,2387],{},"%"," 得到余数。",[40,2390,2391],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2393,68],{"id":68},[10,2395,71],{},[73,2397,2399],{"className":75,"code":2398,"language":77,"meta":78,"style":78},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[47,2400,2401,2406,2411,2416,2420,2425,2430,2436],{"__ignoreMap":78},[82,2402,2403],{"class":84,"line":85},[82,2404,2405],{},"price = 25\n",[82,2407,2408],{"class":84,"line":91},[82,2409,2410],{},"count = 4\n",[82,2412,2413],{"class":84,"line":97},[82,2414,2415],{},"discount = 0.9\n",[82,2417,2418],{"class":84,"line":104},[82,2419,101],{"emptyLinePlaceholder":100},[82,2421,2422],{"class":84,"line":110},[82,2423,2424],{},"total = price * count * discount\n",[82,2426,2427],{"class":84,"line":1140},[82,2428,2429],{},"average = total \u002F count\n",[82,2431,2433],{"class":84,"line":2432},7,[82,2434,2435],{},"print(total)\n",[82,2437,2439],{"class":84,"line":2438},8,[82,2440,2441],{},"print(average)\n",[10,2443,115],{},[73,2445,2448],{"className":2446,"code":2447,"language":121,"meta":78},[119],"90.0\n22.5\n",[47,2449,2447],{"__ignoreMap":78},[10,2451,126],{},[14,2453,129],{"id":129},[131,2455,2456,2462],{},[40,2457,2458,2461],{},[47,2459,2460],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2463,2464,2467],{},[47,2465,2466],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2469,159],{"id":159},[37,2471,2472,2478],{},[40,2473,2474,2475,156],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[47,2476,2477],{},"decimal.Decimal",[40,2479,2480],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2482,178],{"id":178},[131,2484,2485,2488],{},[40,2486,2487],{},"计算 137 除以 10 的商和余数。",[40,2489,2490],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2492,197],{},[14,2494,200],{"id":200},[10,2496,2497],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,2499,207],{},{"title":78,"searchDepth":91,"depth":91,"links":2501},[2502,2503,2504,2505,2506,2507,2508,2509],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2339,"description":2344},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[218,2517,2518],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2521,"title":2522,"body":2523,"category":218,"cover":219,"description":2527,"extension":220,"meta":2703,"navigation":100,"path":2704,"pinned":223,"publishedAt":224,"seo":2705,"slug":2706,"stem":2707,"summary":2708,"tags":2709,"updatedAt":224,"visible":100,"__hash__":2712},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2524,"toc":2691},[2525,2528,2530,2533,2535,2541,2551,2553,2564,2566,2568,2598,2600,2606,2608,2610,2640,2643,2646,2652,2655,2657,2665,2667,2682,2684,2686,2689],[10,2526,2527],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2529,16],{"id":16},[10,2531,2532],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2534,22],{"id":22},[10,2536,2537],{},[26,2538],{"alt":2539,"src":2540},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2542,2543,2544,2547,2548,156],{},"切片 ",[47,2545,2546],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[47,2549,2550],{},"stop - start",[14,2552,35],{"id":35},[37,2554,2555,2558,2561],{},[40,2556,2557],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2559,2560],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2562,2563],{},"切片会创建新的字符串，不会修改原字符串。",[14,2565,68],{"id":68},[10,2567,71],{},[73,2569,2571],{"className":75,"code":2570,"language":77,"meta":78,"style":78},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[47,2572,2573,2578,2583,2588,2593],{"__ignoreMap":78},[82,2574,2575],{"class":84,"line":85},[82,2576,2577],{},"language = \"Python\"\n",[82,2579,2580],{"class":84,"line":91},[82,2581,2582],{},"print(language[0])\n",[82,2584,2585],{"class":84,"line":97},[82,2586,2587],{},"print(language[-1])\n",[82,2589,2590],{"class":84,"line":104},[82,2591,2592],{},"print(language[0:3])\n",[82,2594,2595],{"class":84,"line":110},[82,2596,2597],{},"print(language + \" 3.14\")\n",[10,2599,115],{},[73,2601,2604],{"className":2602,"code":2603,"language":121,"meta":78},[119],"P\nn\nPyt\nPython 3.14\n",[47,2605,2603],{"__ignoreMap":78},[10,2607,126],{},[14,2609,129],{"id":129},[131,2611,2612,2626],{},[40,2613,2614,2615,2617,2618,2621,2622,2625],{},"字符串 ",[47,2616,218],{}," 的正索引从 ",[47,2619,2620],{},"P"," 的 0 开始，负索引从末尾 ",[47,2623,2624],{},"n"," 的 -1 开始。",[40,2627,2628,2631,2632,2635,2636,2639],{},[47,2629,2630],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[47,2633,2634],{},"Pyt","；索引 3 的 ",[47,2637,2638],{},"h"," 不在结果中。",[321,2641,2642],{"id":2642},"再看一个具体细节",[10,2644,2645],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2647,2648],{},[26,2649],{"alt":2650,"src":2651},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2653,2654],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2656,159],{"id":159},[37,2658,2659,2662],{},[40,2660,2661],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2663,2664],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2666,178],{"id":178},[131,2668,2669,2679],{},[40,2670,2671,2672,2675,2676,156],{},"从 ",[47,2673,2674],{},"\"programming\""," 中切出 ",[47,2677,2678],{},"\"gram\"",[40,2680,2681],{},"使用负索引取得字符串倒数第二个字符。",[10,2683,197],{},[14,2685,200],{"id":200},[10,2687,2688],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,2690,207],{},{"title":78,"searchDepth":91,"depth":91,"links":2692},[2693,2694,2695,2696,2697,2700,2701,2702],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":2698},[2699],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2522,"description":2527},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[218,2710,2711],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2714,"title":2715,"body":2716,"category":218,"cover":219,"description":2720,"extension":220,"meta":2934,"navigation":100,"path":2935,"pinned":223,"publishedAt":224,"seo":2936,"slug":2937,"stem":2938,"summary":2939,"tags":2940,"updatedAt":224,"visible":100,"__hash__":2943},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2717,"toc":2922},[2718,2721,2723,2726,2728,2734,2744,2746,2779,2781,2783,2827,2829,2835,2837,2839,2860,2862,2865,2871,2879,2881,2895,2897,2913,2915,2917,2920],[10,2719,2720],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2722,16],{"id":16},[10,2724,2725],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2727,22],{"id":22},[10,2729,2730],{},[26,2731],{"alt":2732,"src":2733},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2735,2736,2737,1000,2740,2743],{},"比较表达式先产生 ",[47,2738,2739],{},"True",[47,2741,2742],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2745,35],{"id":35},[37,2747,2748,2762,2776],{},[40,2749,2750,2753,2754,2757,2758,2761],{},[47,2751,2752],{},"=="," 判断是否相等，",[47,2755,2756],{},"!="," 判断是否不等；单个 ",[47,2759,2760],{},"="," 是赋值。",[40,2763,2764,2767,2768,2771,2772,2775],{},[47,2765,2766],{},"and"," 要求两侧都为真，",[47,2769,2770],{},"or"," 只需一侧为真，",[47,2773,2774],{},"not"," 取反。",[40,2777,2778],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2780,68],{"id":68},[10,2782,71],{},[73,2784,2786],{"className":75,"code":2785,"language":77,"meta":78,"style":78},"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",[47,2787,2788,2793,2798,2802,2807,2812,2817,2822],{"__ignoreMap":78},[82,2789,2790],{"class":84,"line":85},[82,2791,2792],{},"age = 20\n",[82,2794,2795],{"class":84,"line":91},[82,2796,2797],{},"has_ticket = True\n",[82,2799,2800],{"class":84,"line":97},[82,2801,101],{"emptyLinePlaceholder":100},[82,2803,2804],{"class":84,"line":104},[82,2805,2806],{},"is_adult = age >= 18\n",[82,2808,2809],{"class":84,"line":110},[82,2810,2811],{},"can_enter = is_adult and has_ticket\n",[82,2813,2814],{"class":84,"line":1140},[82,2815,2816],{},"print(is_adult)\n",[82,2818,2819],{"class":84,"line":2432},[82,2820,2821],{},"print(can_enter)\n",[82,2823,2824],{"class":84,"line":2438},[82,2825,2826],{},"print(not has_ticket)\n",[10,2828,115],{},[73,2830,2833],{"className":2831,"code":2832,"language":121,"meta":78},[119],"True\nTrue\nFalse\n",[47,2834,2832],{"__ignoreMap":78},[10,2836,126],{},[14,2838,129],{"id":129},[131,2840,2841,2851],{},[40,2842,2843,2846,2847,2850],{},[47,2844,2845],{},"age >= 18"," 先产生布尔值并绑定给 ",[47,2848,2849],{},"is_adult","，这一步没有任何分支跳转。",[40,2852,2853,2856,2857,2859],{},[47,2854,2855],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[47,2858,2774],{}," 只对紧随其后的值取反。",[321,2861,2642],{"id":2642},[10,2863,2864],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2866,2867],{},[26,2868],{"alt":2869,"src":2870},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2872,2873,2875,2876,2878],{},[47,2874,2766],{}," 只有“真、真”得到真；",[47,2877,2770],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2880,159],{"id":159},[37,2882,2883,2892],{},[40,2884,2885,2886,2888,2889,2891],{},"用单个等号判断相等。",[47,2887,2760],{}," 是赋值，",[47,2890,2752],{}," 才是相等比较。",[40,2893,2894],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2896,178],{"id":178},[131,2898,2899,2906],{},[40,2900,2901,2902,2905],{},"判断数字 ",[47,2903,2904],{},"15"," 是否同时大于 10 且小于 20。",[40,2907,2908,2909,2912],{},"分别修改年龄和票据状态，记录 ",[47,2910,2911],{},"can_enter"," 的四种组合结果。",[10,2914,197],{},[14,2916,200],{"id":200},[10,2918,2919],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,2921,207],{},{"title":78,"searchDepth":91,"depth":91,"links":2923},[2924,2925,2926,2927,2928,2931,2932,2933],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":2929},[2930],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2715,"description":2720},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[218,2941,2942],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2945,"title":2946,"body":2947,"category":218,"cover":219,"description":2951,"extension":220,"meta":3119,"navigation":100,"path":3120,"pinned":223,"publishedAt":224,"seo":3121,"slug":3122,"stem":3123,"summary":3124,"tags":3125,"updatedAt":224,"visible":100,"__hash__":3127},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2948,"toc":3109},[2949,2952,2954,2957,2959,2965,2983,2985,2998,3000,3002,3036,3038,3044,3046,3048,3070,3072,3084,3086,3100,3102,3104,3107],[10,2950,2951],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2953,16],{"id":16},[10,2955,2956],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2958,22],{"id":22},[10,2960,2961],{},[26,2962],{"alt":2963,"src":2964},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2966,2967,2970,2971,2974,2975,2978,2979,2982],{},[47,2968,2969],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[47,2972,2973],{},"18","，程序首先得到的也是 ",[47,2976,2977],{},"\"18\"","，需要 ",[47,2980,2981],{},"int()"," 后才能按整数参与计算。",[14,2984,35],{"id":35},[37,2986,2987,2990,2995],{},[40,2988,2989],{},"提示文字应告诉用户需要输入什么。",[40,2991,2992,2994],{},[47,2993,2981],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,2996,2997],{},"输入转换和业务计算分开写，定位问题更直接。",[14,2999,68],{"id":68},[10,3001,71],{},[73,3003,3005],{"className":75,"code":3004,"language":77,"meta":78,"style":78},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[47,3006,3007,3012,3017,3022,3026,3031],{"__ignoreMap":78},[82,3008,3009],{"class":84,"line":85},[82,3010,3011],{},"name = input(\"请输入姓名：\")\n",[82,3013,3014],{"class":84,"line":91},[82,3015,3016],{},"age_text = input(\"请输入年龄：\")\n",[82,3018,3019],{"class":84,"line":97},[82,3020,3021],{},"age = int(age_text)\n",[82,3023,3024],{"class":84,"line":104},[82,3025,101],{"emptyLinePlaceholder":100},[82,3027,3028],{"class":84,"line":110},[82,3029,3030],{},"print(\"你好，\" + name)\n",[82,3032,3033],{"class":84,"line":1140},[82,3034,3035],{},"print(age + 1)\n",[10,3037,115],{},[73,3039,3042],{"className":3040,"code":3041,"language":121,"meta":78},[119],"根据输入显示姓名，并输出下一年的年龄\n",[47,3043,3041],{"__ignoreMap":78},[10,3045,126],{},[14,3047,129],{"id":129},[131,3049,3050,3060],{},[40,3051,3052,3053,3055,3056,3059],{},"两次 ",[47,3054,2969],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[47,3057,3058],{},"age_text"," 用来提醒这仍是文本。",[40,3061,3062,3065,3066,3069],{},[47,3063,3064],{},"int(age_text)"," 创建整数对象，后面的 ",[47,3067,3068],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3071,159],{"id":159},[37,3073,3074,3081],{},[40,3075,3076,3077,3080],{},"直接计算 ",[47,3078,3079],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3082,3083],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3085,178],{"id":178},[131,3087,3088,3091],{},[40,3089,3090],{},"接收两个整数并输出它们的和。",[40,3092,1711,3093,3096,3097,3099],{},[47,3094,3095],{},"18.5"," 给 ",[47,3098,2981],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3101,197],{},[14,3103,200],{"id":200},[10,3105,3106],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3108,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3110},[3111,3112,3113,3114,3115,3116,3117,3118],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2946,"description":2951},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[218,174,3126],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3129,"title":3130,"body":3131,"category":218,"cover":219,"description":3135,"extension":220,"meta":3295,"navigation":100,"path":3296,"pinned":223,"publishedAt":224,"seo":3297,"slug":3298,"stem":3299,"summary":3300,"tags":3301,"updatedAt":224,"visible":100,"__hash__":3304},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3132,"toc":3285},[3133,3136,3138,3141,3143,3149,3156,3158,3172,3174,3176,3215,3217,3223,3225,3227,3246,3248,3263,3265,3276,3278,3280,3283],[10,3134,3135],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3137,16],{"id":16},[10,3139,3140],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3142,22],{"id":22},[10,3144,3145],{},[26,3146],{"alt":3147,"src":3148},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3150,3151,3152,3155],{},"列表为元素维护从 0 开始的位置索引。修改 ",[47,3153,3154],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3157,35],{"id":35},[37,3159,3160,3163,3166],{},[40,3161,3162],{},"列表使用方括号，元素之间用逗号分隔。",[40,3164,3165],{},"列表可变，可以替换、追加和删除元素。",[40,3167,3168,3169,156],{},"访问不存在的索引会产生 ",[47,3170,3171],{},"IndexError",[14,3173,68],{"id":68},[10,3175,71],{},[73,3177,3179],{"className":75,"code":3178,"language":77,"meta":78,"style":78},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[47,3180,3181,3186,3191,3195,3200,3205,3210],{"__ignoreMap":78},[82,3182,3183],{"class":84,"line":85},[82,3184,3185],{},"scores = [82, 90, 76]\n",[82,3187,3188],{"class":84,"line":91},[82,3189,3190],{},"print(scores[0])\n",[82,3192,3193],{"class":84,"line":97},[82,3194,101],{"emptyLinePlaceholder":100},[82,3196,3197],{"class":84,"line":104},[82,3198,3199],{},"scores[1] = 95\n",[82,3201,3202],{"class":84,"line":110},[82,3203,3204],{},"scores.append(88)\n",[82,3206,3207],{"class":84,"line":1140},[82,3208,3209],{},"print(scores)\n",[82,3211,3212],{"class":84,"line":2432},[82,3213,3214],{},"print(len(scores))\n",[10,3216,115],{},[73,3218,3221],{"className":3219,"code":3220,"language":121,"meta":78},[119],"82\n[82, 95, 76, 88]\n4\n",[47,3222,3220],{"__ignoreMap":78},[10,3224,126],{},[14,3226,129],{"id":129},[131,3228,3229,3232],{},[40,3230,3231],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3233,3234,3237,3238,3241,3242,3245],{},[47,3235,3236],{},"scores[1] = 95"," 替换第二个位置，",[47,3239,3240],{},"append(88)"," 在末尾增加新位置，",[47,3243,3244],{},"len()"," 因而从 3 变为 4。",[14,3247,159],{"id":159},[37,3249,3250,3260],{},[40,3251,3252,3253,3256,3257,156],{},"访问 ",[47,3254,3255],{},"scores[len(scores)]","。最后一个合法正索引是 ",[47,3258,3259],{},"len(scores) - 1",[40,3261,3262],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3264,178],{"id":178},[131,3266,3267,3270],{},[40,3268,3269],{},"建立三项学习任务列表，再追加第四项。",[40,3271,3272,3273,3275],{},"修改第二项，并用 ",[47,3274,3244],{}," 检查元素数量。",[10,3277,197],{},[14,3279,200],{"id":200},[10,3281,3282],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3284,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3286},[3287,3288,3289,3290,3291,3292,3293,3294],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3130,"description":3135},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[218,3302,3303],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3306,"title":3307,"body":3308,"category":218,"cover":219,"description":3312,"extension":220,"meta":3453,"navigation":100,"path":3454,"pinned":223,"publishedAt":224,"seo":3455,"slug":3456,"stem":3457,"summary":3458,"tags":3459,"updatedAt":224,"visible":100,"__hash__":3461},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3309,"toc":3443},[3310,3313,3315,3318,3320,3326,3329,3331,3342,3344,3346,3380,3382,3388,3390,3392,3406,3408,3420,3422,3434,3436,3438,3441],[10,3311,3312],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3314,16],{"id":16},[10,3316,3317],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3319,22],{"id":22},[10,3321,3322],{},[26,3323],{"alt":3324,"src":3325},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3327,3328],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3330,35],{"id":35},[37,3332,3333,3336,3339],{},[40,3334,3335],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3337,3338],{},"只有一个元素的元组必须保留尾随逗号。",[40,3340,3341],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3343,68],{"id":68},[10,3345,71],{},[73,3347,3349],{"className":75,"code":3348,"language":77,"meta":78,"style":78},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[47,3350,3351,3356,3361,3366,3370,3375],{"__ignoreMap":78},[82,3352,3353],{"class":84,"line":85},[82,3354,3355],{},"point = (120, 80)\n",[82,3357,3358],{"class":84,"line":91},[82,3359,3360],{},"print(point[0])\n",[82,3362,3363],{"class":84,"line":97},[82,3364,3365],{},"print(point[1])\n",[82,3367,3368],{"class":84,"line":104},[82,3369,101],{"emptyLinePlaceholder":100},[82,3371,3372],{"class":84,"line":110},[82,3373,3374],{},"single = (5,)\n",[82,3376,3377],{"class":84,"line":1140},[82,3378,3379],{},"print(single)\n",[10,3381,115],{},[73,3383,3386],{"className":3384,"code":3385,"language":121,"meta":78},[119],"120\n80\n(5,)\n",[47,3387,3385],{"__ignoreMap":78},[10,3389,126],{},[14,3391,129],{"id":129},[131,3393,3394,3400],{},[40,3395,3396,3399],{},[47,3397,3398],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3401,3402,3405],{},[47,3403,3404],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3407,159],{"id":159},[37,3409,3410,3417],{},[40,3411,3412,3413,3416],{},"把 ",[47,3414,3415],{},"(5)"," 当作元组，实际它仍是整数。",[40,3418,3419],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3421,178],{"id":178},[131,3423,3424,3427],{},[40,3425,3426],{},"用元组表示宽度和高度。",[40,3428,2164,3429,50,3431,3433],{},[47,3430,3415],{},[47,3432,3404],{}," 的类型。",[10,3435,197],{},[14,3437,200],{"id":200},[10,3439,3440],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3442,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3444},[3445,3446,3447,3448,3449,3450,3451,3452],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3307,"description":3312},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[218,3460,3303],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3463,"title":3464,"body":3465,"category":218,"cover":219,"description":3469,"extension":220,"meta":3624,"navigation":100,"path":3625,"pinned":223,"publishedAt":224,"seo":3626,"slug":3627,"stem":3628,"summary":3629,"tags":3630,"updatedAt":224,"visible":100,"__hash__":3632},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3466,"toc":3614},[3467,3470,3472,3475,3477,3483,3493,3495,3509,3511,3513,3547,3549,3555,3557,3559,3574,3576,3595,3597,3605,3607,3609,3612],[10,3468,3469],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3471,16],{"id":16},[10,3473,3474],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3476,22],{"id":22},[10,3478,3479],{},[26,3480],{"alt":3481,"src":3482},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3484,3485,3486,3489,3490,3492],{},"字典通过键定位值，不使用连续位置表达含义。",[47,3487,3488],{},"student[\"score\"]"," 读取的是键 ",[47,3491,49],{}," 对应的值，而不是“第几个元素”。",[14,3494,35],{"id":35},[37,3496,3497,3500,3506],{},[40,3498,3499],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3501,167,3502,3505],{},[47,3503,3504],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3507,3508],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3510,68],{"id":68},[10,3512,71],{},[73,3514,3516],{"className":75,"code":3515,"language":77,"meta":78,"style":78},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[47,3517,3518,3523,3528,3532,3537,3542],{"__ignoreMap":78},[82,3519,3520],{"class":84,"line":85},[82,3521,3522],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[82,3524,3525],{"class":84,"line":91},[82,3526,3527],{},"print(student[\"name\"])\n",[82,3529,3530],{"class":84,"line":97},[82,3531,101],{"emptyLinePlaceholder":100},[82,3533,3534],{"class":84,"line":104},[82,3535,3536],{},"student[\"score\"] = 95\n",[82,3538,3539],{"class":84,"line":110},[82,3540,3541],{},"student[\"city\"] = \"郑州\"\n",[82,3543,3544],{"class":84,"line":1140},[82,3545,3546],{},"print(student)\n",[10,3548,115],{},[73,3550,3553],{"className":3551,"code":3552,"language":121,"meta":78},[119],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[47,3554,3552],{"__ignoreMap":78},[10,3556,126],{},[14,3558,129],{"id":129},[131,3560,3561,3564],{},[40,3562,3563],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3565,3566,3567,3569,3570,3573],{},"给已有键 ",[47,3568,49],{}," 赋值会更新映射，给新键 ",[47,3571,3572],{},"city"," 赋值会增加映射。",[14,3575,159],{"id":159},[37,3577,3578,3585],{},[40,3579,3580,3581,3584],{},"按位置理解字典并尝试 ",[47,3582,3583],{},"student[0]","，而实际键是字符串。",[40,3586,3587,3588,3591,3592,156],{},"直接读取不确定存在的键并忽略 ",[47,3589,3590],{},"KeyError","；后续可根据场景使用成员检查或 ",[47,3593,3594],{},"get()",[14,3596,178],{"id":178},[131,3598,3599,3602],{},[40,3600,3601],{},"建立一本书的标题、作者和页数字典。",[40,3603,3604],{},"添加分类键，再修改页数。",[10,3606,197],{},[14,3608,200],{"id":200},[10,3610,3611],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3613,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3615},[3616,3617,3618,3619,3620,3621,3622,3623],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3464,"description":3469},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[218,3631,3303],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3634,"title":3635,"body":3636,"category":218,"cover":219,"description":3640,"extension":220,"meta":3789,"navigation":100,"path":3790,"pinned":223,"publishedAt":224,"seo":3791,"slug":3792,"stem":3793,"summary":3794,"tags":3795,"updatedAt":224,"visible":100,"__hash__":3797},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3637,"toc":3779},[3638,3641,3643,3646,3648,3654,3657,3659,3678,3680,3682,3716,3718,3724,3726,3728,3743,3745,3757,3759,3770,3772,3774,3777],[10,3639,3640],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3642,16],{"id":16},[10,3644,3645],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3647,22],{"id":22},[10,3649,3650],{},[26,3651],{"alt":3652,"src":3653},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3655,3656],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3658,35],{"id":35},[37,3660,3661,3664,3667],{},[40,3662,3663],{},"集合中的元素不重复。",[40,3665,3666],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3668,3669,3670,3673,3674,3677],{},"创建空集合必须写 ",[47,3671,3672],{},"set()","；",[47,3675,3676],{},"{}"," 创建的是空字典。",[14,3679,68],{"id":68},[10,3681,71],{},[73,3683,3685],{"className":75,"code":3684,"language":77,"meta":78,"style":78},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[47,3686,3687,3692,3697,3701,3706,3711],{"__ignoreMap":78},[82,3688,3689],{"class":84,"line":85},[82,3690,3691],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[82,3693,3694],{"class":84,"line":91},[82,3695,3696],{},"right = {\"Python\", \"Docker\"}\n",[82,3698,3699],{"class":84,"line":97},[82,3700,101],{"emptyLinePlaceholder":100},[82,3702,3703],{"class":84,"line":104},[82,3704,3705],{},"print(left & right)\n",[82,3707,3708],{"class":84,"line":110},[82,3709,3710],{},"print(left | right)\n",[82,3712,3713],{"class":84,"line":1140},[82,3714,3715],{},"print(\"Git\" in left)\n",[10,3717,115],{},[73,3719,3722],{"className":3720,"code":3721,"language":121,"meta":78},[119],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[47,3723,3721],{"__ignoreMap":78},[10,3725,126],{},[14,3727,129],{"id":129},[131,3729,3730,3733],{},[40,3731,3732],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3734,3735,3738,3739,3742],{},[47,3736,3737],{},"&"," 计算交集，",[47,3740,3741],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3744,159],{"id":159},[37,3746,3747,3754],{},[40,3748,167,3749,3751,3752,156],{},[47,3750,3676],{}," 创建空集合，实际得到空字典；空集合应写 ",[47,3753,3672],{},[40,3755,3756],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3758,178],{"id":178},[131,3760,3761,3767],{},[40,3762,3763,3764,3766],{},"把包含重复标签的列表交给 ",[47,3765,3672],{}," 去重。",[40,3768,3769],{},"计算两组课程标签的交集和差集。",[10,3771,197],{},[14,3773,200],{"id":200},[10,3775,3776],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3778,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3780},[3781,3782,3783,3784,3785,3786,3787,3788],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3635,"description":3640},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[218,3796,3303],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3799,"title":3800,"body":3801,"category":218,"cover":219,"description":3805,"extension":220,"meta":4003,"navigation":100,"path":4004,"pinned":223,"publishedAt":224,"seo":4005,"slug":4006,"stem":4007,"summary":4008,"tags":4009,"updatedAt":224,"visible":100,"__hash__":4012},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3802,"toc":3991},[3803,3806,3808,3811,3813,3819,3829,3831,3848,3850,3852,3902,3904,3910,3912,3914,3936,3938,3941,3947,3950,3952,3965,3967,3982,3984,3986,3989],[10,3804,3805],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3807,16],{"id":16},[10,3809,3810],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3812,22],{"id":22},[10,3814,3815],{},[26,3816],{"alt":3817,"src":3818},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3820,3821,3824,3825,3828],{},[47,3822,3823],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[47,3826,3827],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3830,35],{"id":35},[37,3832,3833,3842,3845],{},[40,3834,3835,3837,3838,3841],{},[47,3836,2752],{}," 比较内容是否相等，",[47,3839,3840],{},"is"," 比较是否为同一个对象。",[40,3843,3844],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3846,3847],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3849,68],{"id":68},[10,3851,71],{},[73,3853,3855],{"className":75,"code":3854,"language":77,"meta":78,"style":78},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[47,3856,3857,3862,3867,3872,3876,3881,3886,3891,3896],{"__ignoreMap":78},[82,3858,3859],{"class":84,"line":85},[82,3860,3861],{},"tasks = [\"变量\", \"字符串\"]\n",[82,3863,3864],{"class":84,"line":91},[82,3865,3866],{},"shared = tasks\n",[82,3868,3869],{"class":84,"line":97},[82,3870,3871],{},"backup = tasks.copy()\n",[82,3873,3874],{"class":84,"line":104},[82,3875,101],{"emptyLinePlaceholder":100},[82,3877,3878],{"class":84,"line":110},[82,3879,3880],{},"tasks.append(\"列表\")\n",[82,3882,3883],{"class":84,"line":1140},[82,3884,3885],{},"print(shared)\n",[82,3887,3888],{"class":84,"line":2432},[82,3889,3890],{},"print(backup)\n",[82,3892,3893],{"class":84,"line":2438},[82,3894,3895],{},"print(tasks is shared)\n",[82,3897,3899],{"class":84,"line":3898},9,[82,3900,3901],{},"print(tasks is backup)\n",[10,3903,115],{},[73,3905,3908],{"className":3906,"code":3907,"language":121,"meta":78},[119],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[47,3909,3907],{"__ignoreMap":78},[10,3911,126],{},[14,3913,129],{"id":129},[131,3915,3916,3922],{},[40,3917,3918,3921],{},[47,3919,3920],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,3923,3924,3927,3928,3931,3932,3935],{},[47,3925,3926],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[47,3929,3930],{},"shared"," 能观察到变化，",[47,3933,3934],{},"backup"," 不会。",[321,3937,2642],{"id":2642},[10,3939,3940],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3942,3943],{},[26,3944],{"alt":3945,"src":3946},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3948,3949],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3951,159],{"id":159},[37,3953,3954,3962],{},[40,3955,3956,3957,3959,3960,156],{},"用 ",[47,3958,2752],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[47,3961,3840],{},[40,3963,3964],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3966,178],{"id":178},[131,3968,3969,3972],{},[40,3970,3971],{},"让两个变量引用同一个字典并修改其中一个。",[40,3973,167,3974,3977,3978,187,3980,156],{},[47,3975,3976],{},"copy()"," 创建外层副本，再比较 ",[47,3979,3840],{},[47,3981,2752],{},[10,3983,197],{},[14,3985,200],{"id":200},[10,3987,3988],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,3990,207],{},{"title":78,"searchDepth":91,"depth":91,"links":3992},[3993,3994,3995,3996,3997,4000,4001,4002],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":3998},[3999],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3800,"description":3805},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[218,4010,4011],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4014,"title":4015,"body":4016,"category":218,"cover":219,"description":4020,"extension":220,"meta":4233,"navigation":100,"path":4234,"pinned":223,"publishedAt":224,"seo":4235,"slug":4236,"stem":4237,"summary":4238,"tags":4239,"updatedAt":224,"visible":100,"__hash__":4241},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4017,"toc":4220},[4018,4021,4023,4026,4028,4034,4044,4046,4057,4059,4061,4114,4116,4122,4124,4126,4144,4146,4149,4155,4163,4166,4169,4175,4181,4183,4201,4203,4211,4213,4215,4218],[10,4019,4020],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4022,16],{"id":16},[10,4024,4025],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4027,22],{"id":22},[10,4029,4030],{},[26,4031],{"alt":4032,"src":4033},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4035,4036,61,4038,61,4041,4043],{},[47,4037,1148],{},[47,4039,4040],{},"elif",[47,4042,1151],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4045,35],{"id":35},[37,4047,4048,4051,4054],{},[40,4049,4050],{},"冒号表示接下来开始一个代码块。",[40,4052,4053],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4055,4056],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4058,68],{"id":68},[10,4060,71],{},[73,4062,4064],{"className":75,"code":4063,"language":77,"meta":78,"style":78},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[47,4065,4066,4071,4075,4080,4085,4090,4095,4099,4104,4108],{"__ignoreMap":78},[82,4067,4068],{"class":84,"line":85},[82,4069,4070],{},"score = int(input(\"请输入分数：\"))\n",[82,4072,4073],{"class":84,"line":91},[82,4074,101],{"emptyLinePlaceholder":100},[82,4076,4077],{"class":84,"line":97},[82,4078,4079],{},"if score >= 90:\n",[82,4081,4082],{"class":84,"line":104},[82,4083,4084],{},"    level = \"优秀\"\n",[82,4086,4087],{"class":84,"line":110},[82,4088,4089],{},"elif score >= 60:\n",[82,4091,4092],{"class":84,"line":1140},[82,4093,4094],{},"    level = \"合格\"\n",[82,4096,4097],{"class":84,"line":2432},[82,4098,1137],{},[82,4100,4101],{"class":84,"line":2438},[82,4102,4103],{},"    level = \"需要继续学习\"\n",[82,4105,4106],{"class":84,"line":3898},[82,4107,101],{"emptyLinePlaceholder":100},[82,4109,4111],{"class":84,"line":4110},10,[82,4112,4113],{},"print(level)\n",[10,4115,115],{},[73,4117,4120],{"className":4118,"code":4119,"language":121,"meta":78},[119],"输入 85 时输出：合格\n",[47,4121,4119],{"__ignoreMap":78},[10,4123,126],{},[14,4125,129],{"id":129},[131,4127,4128,4135],{},[40,4129,4130,4131,4134],{},"输入先转换为整数，程序从 ",[47,4132,4133],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4136,4137,4140,4141,4143],{},[47,4138,4139],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[47,4142,1151],{}," 被跳过；最终三个分支只会选择一个。",[321,4145,2642],{"id":2642},[10,4147,4148],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4150,4151],{},[26,4152],{"alt":4153,"src":4154},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4156,4157,4159,4160,4162],{},[47,4158,4133],{}," 必须放在 ",[47,4161,4139],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[321,4164,2642],{"id":4165},"再看一个具体细节-1",[10,4167,4168],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4170,4171],{},[26,4172],{"alt":4173,"src":4174},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4176,4177,4178,4180],{},"同一缩进层级属于同一个代码块；回到 ",[47,4179,1148],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4182,159],{"id":159},[37,4184,4185,4191],{},[40,4186,4187,4188,4190],{},"先写 ",[47,4189,4139],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4192,4193,4194,4196,4197,4200],{},"混用多个独立 ",[47,4195,1148],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[47,4198,4199],{},"if\u002Felif\u002Felse"," 链。",[14,4202,178],{"id":178},[131,4204,4205,4208],{},[40,4206,4207],{},"根据温度输出“冷、适中、热”三个等级。",[40,4209,4210],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4212,197],{},[14,4214,200],{"id":200},[10,4216,4217],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,4219,207],{},{"title":78,"searchDepth":91,"depth":91,"links":4221},[4222,4223,4224,4225,4226,4230,4231,4232],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":4227},[4228,4229],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4015,"description":4020},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[218,1148,4240],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4243,"title":4244,"body":4245,"category":218,"cover":219,"description":4249,"extension":220,"meta":4415,"navigation":100,"path":4416,"pinned":223,"publishedAt":224,"seo":4417,"slug":4418,"stem":4419,"summary":4420,"tags":4421,"updatedAt":224,"visible":100,"__hash__":4423},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4246,"toc":4403},[4247,4250,4252,4255,4257,4263,4269,4271,4286,4288,4290,4328,4330,4336,4338,4340,4355,4357,4360,4366,4372,4374,4382,4384,4394,4396,4398,4401],[10,4248,4249],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4251,16],{"id":16},[10,4253,4254],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4256,22],{"id":22},[10,4258,4259],{},[26,4260],{"alt":4261,"src":4262},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4264,4265,4268],{},[47,4266,4267],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4270,35],{"id":35},[37,4272,4273,4276,4279],{},[40,4274,4275],{},"进入循环前先准备参与条件判断的状态。",[40,4277,4278],{},"循环体中必须有机会让条件变为假。",[40,4280,4281,4282,4285],{},"能够预先确定遍历对象时，后续介绍的 ",[47,4283,4284],{},"for"," 通常更直接。",[14,4287,68],{"id":68},[10,4289,71],{},[73,4291,4293],{"className":75,"code":4292,"language":77,"meta":78,"style":78},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[47,4294,4295,4300,4304,4309,4314,4319,4323],{"__ignoreMap":78},[82,4296,4297],{"class":84,"line":85},[82,4298,4299],{},"count = 1\n",[82,4301,4302],{"class":84,"line":91},[82,4303,101],{"emptyLinePlaceholder":100},[82,4305,4306],{"class":84,"line":97},[82,4307,4308],{},"while count \u003C= 3:\n",[82,4310,4311],{"class":84,"line":104},[82,4312,4313],{},"    print(\"第\", count, \"次练习\")\n",[82,4315,4316],{"class":84,"line":110},[82,4317,4318],{},"    count = count + 1\n",[82,4320,4321],{"class":84,"line":1140},[82,4322,101],{"emptyLinePlaceholder":100},[82,4324,4325],{"class":84,"line":2432},[82,4326,4327],{},"print(\"练习结束\")\n",[10,4329,115],{},[73,4331,4334],{"className":4332,"code":4333,"language":121,"meta":78},[119],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[47,4335,4333],{"__ignoreMap":78},[10,4337,126],{},[14,4339,129],{"id":129},[131,4341,4342,4349],{},[40,4343,4344,4345,4348],{},"进入循环前 ",[47,4346,4347],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4350,4351,4352,4354],{},"循环体末尾把 ",[47,4353,4347],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[321,4356,2642],{"id":2642},[10,4358,4359],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4361,4362],{},[26,4363],{"alt":4364,"src":4365},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4367,4368,4369,4371],{},"第4次检查时 ",[47,4370,4347],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4373,159],{"id":159},[37,4375,4376,4379],{},[40,4377,4378],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4380,4381],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4383,178],{"id":178},[131,4385,4386,4391],{},[40,4387,167,4388,4390],{},[47,4389,4267],{}," 输出 1 到 5。",[40,4392,4393],{},"计算 1 到 10 的累加和。",[10,4395,197],{},[14,4397,200],{"id":200},[10,4399,4400],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,4402,207],{},{"title":78,"searchDepth":91,"depth":91,"links":4404},[4405,4406,4407,4408,4409,4412,4413,4414],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":4410},[4411],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4244,"description":4249},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[218,4267,4422],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4425,"title":4426,"body":4427,"category":218,"cover":219,"description":4431,"extension":220,"meta":4579,"navigation":100,"path":4580,"pinned":223,"publishedAt":224,"seo":4581,"slug":4582,"stem":4583,"summary":4584,"tags":4585,"updatedAt":224,"visible":100,"__hash__":4587},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4428,"toc":4569},[4429,4432,4434,4437,4439,4445,4450,4452,4466,4468,4470,4508,4510,4516,4518,4520,4537,4539,4547,4549,4560,4562,4564,4567],[10,4430,4431],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4433,16],{"id":16},[10,4435,4436],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4438,22],{"id":22},[10,4440,4441],{},[26,4442],{"alt":4443,"src":4444},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4446,4447,4449],{},[47,4448,4284],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4451,35],{"id":35},[37,4453,4454,4460,4463],{},[40,4455,4456,4459],{},[47,4457,4458],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4461,4462],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4464,4465],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4467,68],{"id":68},[10,4469,71],{},[73,4471,4473],{"className":75,"code":4472,"language":77,"meta":78,"style":78},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[47,4474,4475,4480,4484,4489,4494,4498,4503],{"__ignoreMap":78},[82,4476,4477],{"class":84,"line":85},[82,4478,4479],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[82,4481,4482],{"class":84,"line":91},[82,4483,101],{"emptyLinePlaceholder":100},[82,4485,4486],{"class":84,"line":97},[82,4487,4488],{},"for course in courses:\n",[82,4490,4491],{"class":84,"line":104},[82,4492,4493],{},"    print(course)\n",[82,4495,4496],{"class":84,"line":110},[82,4497,101],{"emptyLinePlaceholder":100},[82,4499,4500],{"class":84,"line":1140},[82,4501,4502],{},"for number in range(1, 4):\n",[82,4504,4505],{"class":84,"line":2432},[82,4506,4507],{},"    print(number)\n",[10,4509,115],{},[73,4511,4514],{"className":4512,"code":4513,"language":121,"meta":78},[119],"变量\n字符串\n列表\n1\n2\n3\n",[47,4515,4513],{"__ignoreMap":78},[10,4517,126],{},[14,4519,129],{"id":129},[131,4521,4522,4532],{},[40,4523,4524,4525,4527,4528,4531],{},"第一个 ",[47,4526,4284],{}," 依次从列表取得字符串，循环变量 ",[47,4529,4530],{},"course"," 每轮重新绑定。",[40,4533,4534,4536],{},[47,4535,4458],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4538,159],{"id":159},[37,4540,4541,4544],{},[40,4542,4543],{},"只需要元素却手工维护索引，增加越界风险。",[40,4545,4546],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4548,178],{"id":178},[131,4550,4551,4554],{},[40,4552,4553],{},"逐项输出一个字符串中的字符。",[40,4555,167,4556,4559],{},[47,4557,4558],{},"range()"," 输出 2、4、6、8。",[10,4561,197],{},[14,4563,200],{"id":200},[10,4565,4566],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,4568,207],{},{"title":78,"searchDepth":91,"depth":91,"links":4570},[4571,4572,4573,4574,4575,4576,4577,4578],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4426,"description":4431},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[218,4284,4586],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4589,"title":4590,"body":4591,"category":218,"cover":219,"description":4595,"extension":220,"meta":4769,"navigation":100,"path":4770,"pinned":223,"publishedAt":224,"seo":4771,"slug":4772,"stem":4773,"summary":4774,"tags":4775,"updatedAt":224,"visible":100,"__hash__":4776},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4592,"toc":4759},[4593,4596,4598,4601,4603,4609,4619,4621,4640,4642,4644,4696,4698,4704,4706,4708,4722,4724,4740,4742,4750,4752,4754,4757],[10,4594,4595],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4597,16],{"id":16},[10,4599,4600],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4602,22],{"id":22},[10,4604,4605],{},[26,4606],{"alt":4607,"src":4608},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4610,4611,4614,4615,4618],{},[47,4612,4613],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[47,4616,4617],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4620,35],{"id":35},[37,4622,4623,4626,4634],{},[40,4624,4625],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4627,4628,4630,4631,4633],{},[47,4629,4613],{}," 前要确认不会跳过 ",[47,4632,4267],{}," 循环中的状态更新。",[40,4635,4636,4637,4639],{},"多层嵌套中 ",[47,4638,4617],{}," 只结束它所在的最内层循环。",[14,4641,68],{"id":68},[10,4643,71],{},[73,4645,4647],{"className":75,"code":4646,"language":77,"meta":78,"style":78},"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",[47,4648,4649,4654,4658,4663,4668,4673,4678,4683,4687,4691],{"__ignoreMap":78},[82,4650,4651],{"class":84,"line":85},[82,4652,4653],{},"numbers = [3, -1, 0, 8, 12]\n",[82,4655,4656],{"class":84,"line":91},[82,4657,101],{"emptyLinePlaceholder":100},[82,4659,4660],{"class":84,"line":97},[82,4661,4662],{},"for number in numbers:\n",[82,4664,4665],{"class":84,"line":104},[82,4666,4667],{},"    if number \u003C 0:\n",[82,4669,4670],{"class":84,"line":110},[82,4671,4672],{},"        continue\n",[82,4674,4675],{"class":84,"line":1140},[82,4676,4677],{},"    if number == 0:\n",[82,4679,4680],{"class":84,"line":2432},[82,4681,4682],{},"        break\n",[82,4684,4685],{"class":84,"line":2438},[82,4686,4507],{},[82,4688,4689],{"class":84,"line":3898},[82,4690,101],{"emptyLinePlaceholder":100},[82,4692,4693],{"class":84,"line":4110},[82,4694,4695],{},"print(\"循环结束\")\n",[10,4697,115],{},[73,4699,4702],{"className":4700,"code":4701,"language":121,"meta":78},[119],"3\n循环结束\n",[47,4703,4701],{"__ignoreMap":78},[10,4705,126],{},[14,4707,129],{"id":129},[131,4709,4710,4716],{},[40,4711,4712,4713,4715],{},"遇到 -1 时 ",[47,4714,4613],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4717,4718,4719,4721],{},"遇到 0 时 ",[47,4720,4617],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4723,159],{"id":159},[37,4725,4726,4731],{},[40,4727,3412,4728,4730],{},[47,4729,4613],{}," 当作结束循环，实际它只跳到下一轮。",[40,4732,4733,4734,4736,4737,4739],{},"在 ",[47,4735,4267],{}," 中把状态更新放在可能被 ",[47,4738,4613],{}," 跳过的位置，造成无限循环。",[14,4741,178],{"id":178},[131,4743,4744,4747],{},[40,4745,4746],{},"跳过列表中的空字符串并输出其他内容。",[40,4748,4749],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4751,197],{},[14,4753,200],{"id":200},[10,4755,4756],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,4758,207],{},{"title":78,"searchDepth":91,"depth":91,"links":4760},[4761,4762,4763,4764,4765,4766,4767,4768],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4590,"description":4595},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[218,4617,4613],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4778,"title":4779,"body":4780,"category":218,"cover":219,"description":4784,"extension":220,"meta":4955,"navigation":100,"path":4956,"pinned":223,"publishedAt":224,"seo":4957,"slug":4958,"stem":4959,"summary":4960,"tags":4961,"updatedAt":224,"visible":100,"__hash__":4964},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4781,"toc":4943},[4782,4785,4787,4790,4792,4798,4801,4803,4827,4829,4831,4865,4867,4873,4875,4877,4894,4896,4899,4905,4908,4910,4924,4926,4934,4936,4938,4941],[10,4783,4784],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4786,16],{"id":16},[10,4788,4789],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4791,22],{"id":22},[10,4793,4794],{},[26,4795],{"alt":4796,"src":4797},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4799,4800],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4802,35],{"id":35},[37,4804,4805,4808,4811],{},[40,4806,4807],{},"每增加一层嵌套，阅读成本都会上升。",[40,4809,4810],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4812,4813,4814,61,4817,4820,4821,61,4824,156],{},"变量名使用 ",[47,4815,4816],{},"row",[47,4818,4819],{},"cell"," 等层级含义，避免全部写成 ",[47,4822,4823],{},"i",[47,4825,4826],{},"j",[14,4828,68],{"id":68},[10,4830,71],{},[73,4832,4834],{"className":75,"code":4833,"language":77,"meta":78,"style":78},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[47,4835,4836,4841,4845,4850,4855,4860],{"__ignoreMap":78},[82,4837,4838],{"class":84,"line":85},[82,4839,4840],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[82,4842,4843],{"class":84,"line":91},[82,4844,101],{"emptyLinePlaceholder":100},[82,4846,4847],{"class":84,"line":97},[82,4848,4849],{},"for row in table:\n",[82,4851,4852],{"class":84,"line":104},[82,4853,4854],{},"    for cell in row:\n",[82,4856,4857],{"class":84,"line":110},[82,4858,4859],{},"        print(cell)\n",[82,4861,4862],{"class":84,"line":1140},[82,4863,4864],{},"    print(\"一行结束\")\n",[10,4866,115],{},[73,4868,4871],{"className":4869,"code":4870,"language":121,"meta":78},[119],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[47,4872,4870],{"__ignoreMap":78},[10,4874,126],{},[14,4876,129],{"id":129},[131,4878,4879,4891],{},[40,4880,4881,4882,4884,4885,187,4888,156],{},"外层变量 ",[47,4883,4816],{}," 先引用第一行列表，内层才依次处理 ",[47,4886,4887],{},"A1",[47,4889,4890],{},"A2",[40,4892,4893],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[321,4895,2642],{"id":2642},[10,4897,4898],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4900,4901],{},[26,4902],{"alt":4903,"src":4904},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4906,4907],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4909,159],{"id":159},[37,4911,4912,4921],{},[40,4913,4914,4915,1000,4918,4920],{},"把两层循环变量都叫 ",[47,4916,4917],{},"item",[47,4919,4823],{},"，难以确认当前层级。",[40,4922,4923],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4925,178],{"id":178},[131,4927,4928,4931],{},[40,4929,4930],{},"打印一个 2×3 数字表。",[40,4932,4933],{},"在内层增加条件，只输出大于 3 的元素。",[10,4935,197],{},[14,4937,200],{"id":200},[10,4939,4940],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,4942,207],{},{"title":78,"searchDepth":91,"depth":91,"links":4944},[4945,4946,4947,4948,4949,4952,4953,4954],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":4950},[4951],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4779,"description":4784},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[218,4962,4963],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4966,"title":4967,"body":4968,"category":218,"cover":219,"description":4972,"extension":220,"meta":5110,"navigation":100,"path":5111,"pinned":223,"publishedAt":224,"seo":5112,"slug":5113,"stem":5114,"summary":5115,"tags":5116,"updatedAt":224,"visible":100,"__hash__":5119},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4969,"toc":5100},[4970,4973,4975,4978,4980,4986,4989,4991,5002,5004,5006,5044,5046,5052,5054,5056,5068,5070,5081,5083,5091,5093,5095,5098],[10,4971,4972],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4974,16],{"id":16},[10,4976,4977],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4979,22],{"id":22},[10,4981,4982],{},[26,4983],{"alt":4984,"src":4985},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4987,4988],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4990,35],{"id":35},[37,4992,4993,4996,4999],{},[40,4994,4995],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,4997,4998],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5000,5001],{},"推导式创建新列表，不修改输入列表。",[14,5003,68],{"id":68},[10,5005,71],{},[73,5007,5009],{"className":75,"code":5008,"language":77,"meta":78,"style":78},"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",[47,5010,5011,5016,5020,5025,5030,5034,5039],{"__ignoreMap":78},[82,5012,5013],{"class":84,"line":85},[82,5014,5015],{},"numbers = [1, 2, 3, 4, 5]\n",[82,5017,5018],{"class":84,"line":91},[82,5019,101],{"emptyLinePlaceholder":100},[82,5021,5022],{"class":84,"line":97},[82,5023,5024],{},"squares = [number * number for number in numbers]\n",[82,5026,5027],{"class":84,"line":104},[82,5028,5029],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[82,5031,5032],{"class":84,"line":110},[82,5033,101],{"emptyLinePlaceholder":100},[82,5035,5036],{"class":84,"line":1140},[82,5037,5038],{},"print(squares)\n",[82,5040,5041],{"class":84,"line":2432},[82,5042,5043],{},"print(even_squares)\n",[10,5045,115],{},[73,5047,5050],{"className":5048,"code":5049,"language":121,"meta":78},[119],"[1, 4, 9, 16, 25]\n[4, 16]\n",[47,5051,5049],{"__ignoreMap":78},[10,5053,126],{},[14,5055,129],{"id":129},[131,5057,5058,5061],{},[40,5059,5060],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5062,5063,5064,5067],{},"第二条先用 ",[47,5065,5066],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5069,159],{"id":159},[37,5071,5072,5078],{},[40,5073,5074,5075,5077],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[47,5076,4284],{}," 开始找输入。",[40,5079,5080],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5082,178],{"id":178},[131,5084,5085,5088],{},[40,5086,5087],{},"把字符串列表转换为长度列表。",[40,5089,5090],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5092,197],{},[14,5094,200],{"id":200},[10,5096,5097],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,5099,207],{},{"title":78,"searchDepth":91,"depth":91,"links":5101},[5102,5103,5104,5105,5106,5107,5108,5109],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4967,"description":4972},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[218,5117,5118],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5121,"title":5122,"body":5123,"category":218,"cover":219,"description":5127,"extension":220,"meta":5270,"navigation":100,"path":5271,"pinned":223,"publishedAt":224,"seo":5272,"slug":5273,"stem":5274,"summary":5275,"tags":5276,"updatedAt":224,"visible":100,"__hash__":5279},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5124,"toc":5260},[5125,5128,5130,5133,5135,5141,5144,5146,5157,5159,5161,5200,5202,5208,5210,5212,5227,5229,5237,5239,5251,5253,5255,5258],[10,5126,5127],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5129,16],{"id":16},[10,5131,5132],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5134,22],{"id":22},[10,5136,5137],{},[26,5138],{"alt":5139,"src":5140},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5142,5143],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5145,35],{"id":35},[37,5147,5148,5151,5154],{},[40,5149,5150],{},"函数名描述动作，使用小写字母和下划线。",[40,5152,5153],{},"函数定义要先执行，之后才能调用。",[40,5155,5156],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5158,68],{"id":68},[10,5160,71],{},[73,5162,5164],{"className":75,"code":5163,"language":77,"meta":78,"style":78},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[47,5165,5166,5171,5176,5181,5185,5190,5195],{"__ignoreMap":78},[82,5167,5168],{"class":84,"line":85},[82,5169,5170],{},"def show_progress():\n",[82,5172,5173],{"class":84,"line":91},[82,5174,5175],{},"    print(\"正在学习函数\")\n",[82,5177,5178],{"class":84,"line":97},[82,5179,5180],{},"    print(\"本节完成 50%\")\n",[82,5182,5183],{"class":84,"line":104},[82,5184,101],{"emptyLinePlaceholder":100},[82,5186,5187],{"class":84,"line":110},[82,5188,5189],{},"print(\"调用前\")\n",[82,5191,5192],{"class":84,"line":1140},[82,5193,5194],{},"show_progress()\n",[82,5196,5197],{"class":84,"line":2432},[82,5198,5199],{},"print(\"调用后\")\n",[10,5201,115],{},[73,5203,5206],{"className":5204,"code":5205,"language":121,"meta":78},[119],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[47,5207,5205],{"__ignoreMap":78},[10,5209,126],{},[14,5211,129],{"id":129},[131,5213,5214,5220],{},[40,5215,135,5216,5219],{},[47,5217,5218],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5221,5222,5223,5226],{},"运行到 ",[47,5224,5225],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5228,159],{"id":159},[37,5230,5231,5234],{},[40,5232,5233],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5235,5236],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5238,178],{"id":178},[131,5240,5241,5248],{},[40,5242,5243,5244,5247],{},"定义 ",[47,5245,5246],{},"show_plan()"," 输出两行学习计划。",[40,5249,5250],{},"连续调用同一个函数两次，观察执行顺序。",[10,5252,197],{},[14,5254,200],{"id":200},[10,5256,5257],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,5259,207],{},{"title":78,"searchDepth":91,"depth":91,"links":5261},[5262,5263,5264,5265,5266,5267,5268,5269],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5122,"description":5127},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[218,5277,5278],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5281,"title":5282,"body":5283,"category":218,"cover":219,"description":5287,"extension":220,"meta":5467,"navigation":100,"path":5468,"pinned":223,"publishedAt":224,"seo":5469,"slug":5470,"stem":5471,"summary":5472,"tags":5473,"updatedAt":224,"visible":100,"__hash__":5476},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5284,"toc":5455},[5285,5288,5290,5293,5295,5301,5308,5310,5327,5329,5331,5365,5367,5373,5375,5377,5398,5400,5403,5409,5419,5421,5436,5438,5446,5448,5450,5453],[10,5286,5287],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5289,16],{"id":16},[10,5291,5292],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5294,22],{"id":22},[10,5296,5297],{},[26,5298],{"alt":5299,"src":5300},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5302,5303,5304,5307],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[47,5305,5306],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5309,35],{"id":35},[37,5311,5312,5315,5318],{},[40,5313,5314],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5316,5317],{},"局部变量默认只在函数内部可见。",[40,5319,5320,5321,5323,5324,156],{},"没有显式 ",[47,5322,5306],{}," 的函数会返回 ",[47,5325,5326],{},"None",[14,5328,68],{"id":68},[10,5330,71],{},[73,5332,5334],{"className":75,"code":5333,"language":77,"meta":78,"style":78},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[47,5335,5336,5341,5346,5351,5355,5360],{"__ignoreMap":78},[82,5337,5338],{"class":84,"line":85},[82,5339,5340],{},"def calculate_total(price, count):\n",[82,5342,5343],{"class":84,"line":91},[82,5344,5345],{},"    total = price * count\n",[82,5347,5348],{"class":84,"line":97},[82,5349,5350],{},"    return total\n",[82,5352,5353],{"class":84,"line":104},[82,5354,101],{"emptyLinePlaceholder":100},[82,5356,5357],{"class":84,"line":110},[82,5358,5359],{},"result = calculate_total(25, 4)\n",[82,5361,5362],{"class":84,"line":1140},[82,5363,5364],{},"print(result)\n",[10,5366,115],{},[73,5368,5371],{"className":5369,"code":5370,"language":121,"meta":78},[119],"100\n",[47,5372,5370],{"__ignoreMap":78},[10,5374,126],{},[14,5376,129],{"id":129},[131,5378,5379,5388],{},[40,5380,5381,5382,61,5385,5387],{},"调用时 25 和 4 分别绑定到 ",[47,5383,5384],{},"price",[47,5386,4347],{},"，它们只在本次函数调用的局部范围中使用。",[40,5389,5390,5393,5394,5397],{},[47,5391,5392],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[47,5395,5396],{},"result"," 并输出。",[321,5399,2642],{"id":2642},[10,5401,5402],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5404,5405],{},[26,5406],{"alt":5407,"src":5408},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5410,5411,61,5413,187,5415,5418],{},[47,5412,5384],{},[47,5414,4347],{},[47,5416,5417],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5420,159],{"id":159},[37,5422,5423,5430],{},[40,5424,5425,5426,5429],{},"在函数内部只 ",[47,5427,5428],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5431,5432,5433,5435],{},"试图在函数外直接访问局部变量 ",[47,5434,5417],{},"，它的名字只在调用期间的局部作用域存在。",[14,5437,178],{"id":178},[131,5439,5440,5443],{},[40,5441,5442],{},"编写计算长方形面积的函数。",[40,5444,5445],{},"让函数返回结果后在调用方加上单位再输出。",[10,5447,197],{},[14,5449,200],{"id":200},[10,5451,5452],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,5454,207],{},{"title":78,"searchDepth":91,"depth":91,"links":5456},[5457,5458,5459,5460,5461,5464,5465,5466],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":5462},[5463],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5282,"description":5287},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[218,5474,5475],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5478,"title":5479,"body":5480,"category":218,"cover":219,"description":5484,"extension":220,"meta":5664,"navigation":100,"path":5665,"pinned":223,"publishedAt":224,"seo":5666,"slug":5667,"stem":5668,"summary":5669,"tags":5670,"updatedAt":224,"visible":100,"__hash__":5673},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5481,"toc":5652},[5482,5485,5487,5490,5492,5498,5501,5503,5520,5522,5524,5576,5578,5584,5586,5588,5606,5608,5611,5617,5620,5622,5633,5635,5643,5645,5647,5650],[10,5483,5484],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5486,16],{"id":16},[10,5488,5489],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5491,22],{"id":22},[10,5493,5494],{},[26,5495],{"alt":5496,"src":5497},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5499,5500],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5502,35],{"id":35},[37,5504,5505,5508,5514],{},[40,5506,5507],{},"必需参数应放在有默认值的参数之前。",[40,5509,5510,5513],{},[47,5511,5512],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5515,5516,5519],{},[47,5517,5518],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5521,68],{"id":68},[10,5523,71],{},[73,5525,5527],{"className":75,"code":5526,"language":77,"meta":78,"style":78},"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",[47,5528,5529,5534,5539,5543,5548,5553,5557,5562,5567,5571],{"__ignoreMap":78},[82,5530,5531],{"class":84,"line":85},[82,5532,5533],{},"def build_title(name, level=\"基础\"):\n",[82,5535,5536],{"class":84,"line":91},[82,5537,5538],{},"    return name + \"｜\" + level\n",[82,5540,5541],{"class":84,"line":97},[82,5542,101],{"emptyLinePlaceholder":100},[82,5544,5545],{"class":84,"line":104},[82,5546,5547],{},"print(build_title(\"Python\"))\n",[82,5549,5550],{"class":84,"line":110},[82,5551,5552],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[82,5554,5555],{"class":84,"line":1140},[82,5556,101],{"emptyLinePlaceholder":100},[82,5558,5559],{"class":84,"line":2432},[82,5560,5561],{},"def total(*numbers):\n",[82,5563,5564],{"class":84,"line":2438},[82,5565,5566],{},"    return sum(numbers)\n",[82,5568,5569],{"class":84,"line":3898},[82,5570,101],{"emptyLinePlaceholder":100},[82,5572,5573],{"class":84,"line":4110},[82,5574,5575],{},"print(total(10, 20, 30))\n",[10,5577,115],{},[73,5579,5582],{"className":5580,"code":5581,"language":121,"meta":78},[119],"Python｜基础\n异常处理｜进阶\n60\n",[47,5583,5581],{"__ignoreMap":78},[10,5585,126],{},[14,5587,129],{"id":129},[131,5589,5590,5597],{},[40,5591,5592,5593,5596],{},"第一次调用只提供必需参数，",[47,5594,5595],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5598,5599,5602,5603,156],{},[47,5600,5601],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[47,5604,5605],{},"sum()",[321,5607,2642],{"id":2642},[10,5609,5610],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5612,5613],{},[26,5614],{"alt":5615,"src":5616},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5618,5619],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5621,159],{"id":159},[37,5623,5624,5630],{},[40,5625,5626,5627,5629],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[47,5628,5326],{}," 再在函数内创建。",[40,5631,5632],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5634,178],{"id":178},[131,5636,5637,5640],{},[40,5638,5639],{},"给问候函数增加默认称呼。",[40,5641,5642],{},"编写接收任意数量分数并返回总分的函数。",[10,5644,197],{},[14,5646,200],{"id":200},[10,5648,5649],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,5651,207],{},{"title":78,"searchDepth":91,"depth":91,"links":5653},[5654,5655,5656,5657,5658,5661,5662,5663],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":5659},[5660],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5479,"description":5484},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[218,5671,5672],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5675,"title":5676,"body":5677,"category":218,"cover":219,"description":5681,"extension":220,"meta":5878,"navigation":100,"path":5879,"pinned":223,"publishedAt":224,"seo":5880,"slug":5881,"stem":5882,"summary":5883,"tags":5884,"updatedAt":224,"visible":100,"__hash__":5887},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5678,"toc":5866},[5679,5682,5684,5687,5689,5695,5698,5700,5717,5719,5721,5784,5786,5792,5794,5796,5823,5825,5828,5834,5837,5839,5847,5849,5857,5859,5861,5864],[10,5680,5681],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5683,16],{"id":16},[10,5685,5686],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5688,22],{"id":22},[10,5690,5691],{},[26,5692],{"alt":5693,"src":5694},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5696,5697],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5699,35],{"id":35},[37,5701,5702,5705,5708],{},[40,5703,5704],{},"函数内部赋值默认创建局部变量。",[40,5706,5707],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5709,5710,50,5713,5716],{},[47,5711,5712],{},"global",[47,5714,5715],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5718,68],{"id":68},[10,5720,71],{},[73,5722,5724],{"className":75,"code":5723,"language":77,"meta":78,"style":78},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[47,5725,5726,5731,5735,5740,5745,5749,5754,5759,5764,5768,5773,5778],{"__ignoreMap":78},[82,5727,5728],{"class":84,"line":85},[82,5729,5730],{},"course = \"Python\"\n",[82,5732,5733],{"class":84,"line":91},[82,5734,101],{"emptyLinePlaceholder":100},[82,5736,5737],{"class":84,"line":97},[82,5738,5739],{},"def outer():\n",[82,5741,5742],{"class":84,"line":104},[82,5743,5744],{},"    level = \"基础\"\n",[82,5746,5747],{"class":84,"line":110},[82,5748,101],{"emptyLinePlaceholder":100},[82,5750,5751],{"class":84,"line":1140},[82,5752,5753],{},"    def show():\n",[82,5755,5756],{"class":84,"line":2432},[82,5757,5758],{},"        lesson = \"作用域\"\n",[82,5760,5761],{"class":84,"line":2438},[82,5762,5763],{},"        print(course, level, lesson)\n",[82,5765,5766],{"class":84,"line":3898},[82,5767,101],{"emptyLinePlaceholder":100},[82,5769,5770],{"class":84,"line":4110},[82,5771,5772],{},"    show()\n",[82,5774,5776],{"class":84,"line":5775},11,[82,5777,101],{"emptyLinePlaceholder":100},[82,5779,5781],{"class":84,"line":5780},12,[82,5782,5783],{},"outer()\n",[10,5785,115],{},[73,5787,5790],{"className":5788,"code":5789,"language":121,"meta":78},[119],"Python 基础 作用域\n",[47,5791,5789],{"__ignoreMap":78},[10,5793,126],{},[14,5795,129],{"id":129},[131,5797,5798,5815],{},[40,5799,5800,5803,5804,5807,5808,5810,5811,5814],{},[47,5801,5802],{},"show()"," 中查找 ",[47,5805,5806],{},"lesson"," 时先在局部找到，查找 ",[47,5809,5595],{}," 时到外层 ",[47,5812,5813],{},"outer()"," 找到。",[40,5816,5817,5819,5820,5822],{},[47,5818,4530],{}," 在局部和外层都不存在，继续到模块全局找到；",[47,5821,2198],{}," 最后在内置作用域找到。",[321,5824,2642],{"id":2642},[10,5826,5827],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5829,5830],{},[26,5831],{"alt":5832,"src":5833},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5835,5836],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5838,159],{"id":159},[37,5840,5841,5844],{},[40,5842,5843],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5845,5846],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5848,178],{"id":178},[131,5850,5851,5854],{},[40,5852,5853],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5855,5856],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5858,197],{},[14,5860,200],{"id":200},[10,5862,5863],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,5865,207],{},{"title":78,"searchDepth":91,"depth":91,"links":5867},[5868,5869,5870,5871,5872,5875,5876,5877],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":5873},[5874],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5676,"description":5681},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[218,5885,5886],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5889,"title":5890,"body":5891,"category":218,"cover":219,"description":5895,"extension":220,"meta":6045,"navigation":100,"path":6046,"pinned":223,"publishedAt":224,"seo":6047,"slug":6048,"stem":6049,"summary":6050,"tags":6051,"updatedAt":224,"visible":100,"__hash__":6054},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5892,"toc":6035},[5893,5896,5898,5901,5903,5909,5912,5914,5933,5935,5937,5971,5973,5979,5981,5983,5998,6000,6012,6014,6026,6028,6030,6033],[10,5894,5895],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5897,16],{"id":16},[10,5899,5900],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5902,22],{"id":22},[10,5904,5905],{},[26,5906],{"alt":5907,"src":5908},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5910,5911],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5913,35],{"id":35},[37,5915,5916,5919,5922],{},[40,5917,5918],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,5920,5921],{},"注解表达接口意图，不代替输入校验和测试。",[40,5923,5924,5925,61,5927,61,5929,5932],{},"基础注解优先使用 ",[47,5926,64],{},[47,5928,2369],{},[47,5930,5931],{},"list[str]"," 等直接写法。",[14,5934,68],{"id":68},[10,5936,71],{},[73,5938,5940],{"className":75,"code":5939,"language":77,"meta":78,"style":78},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[47,5941,5942,5947,5952,5957,5961,5966],{"__ignoreMap":78},[82,5943,5944],{"class":84,"line":85},[82,5945,5946],{},"def format_score(name: str, score: int) -> str:\n",[82,5948,5949],{"class":84,"line":91},[82,5950,5951],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[82,5953,5954],{"class":84,"line":97},[82,5955,5956],{},"    return name + \"：\" + str(score)\n",[82,5958,5959],{"class":84,"line":104},[82,5960,101],{"emptyLinePlaceholder":100},[82,5962,5963],{"class":84,"line":110},[82,5964,5965],{},"print(format_score(\"小郑\", 95))\n",[82,5967,5968],{"class":84,"line":1140},[82,5969,5970],{},"print(format_score.__doc__)\n",[10,5972,115],{},[73,5974,5977],{"className":5975,"code":5976,"language":121,"meta":78},[119],"小郑：95\n返回带姓名的分数文本。\n",[47,5978,5976],{"__ignoreMap":78},[10,5980,126],{},[14,5982,129],{"id":129},[131,5984,5985,5995],{},[40,5986,5987,5988,5991,5992,5994],{},"函数签名说明 ",[47,5989,5990],{},"name"," 预期为字符串、",[47,5993,49],{}," 预期为整数，返回值预期为字符串。",[40,5996,5997],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5999,159],{"id":159},[37,6001,6002,6009],{},[40,6003,6004,6005,6008],{},"认为加了 ",[47,6006,6007],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6010,6011],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6013,178],{"id":178},[131,6015,6016,6019],{},[40,6017,6018],{},"为面积函数补充参数和返回值注解。",[40,6020,6021,6022,6025],{},"通过 ",[47,6023,6024],{},"函数名.__doc__"," 查看文档字符串。",[10,6027,197],{},[14,6029,200],{"id":200},[10,6031,6032],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,6034,207],{},{"title":78,"searchDepth":91,"depth":91,"links":6036},[6037,6038,6039,6040,6041,6042,6043,6044],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5890,"description":5895},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[218,6052,6053],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6056,"title":6057,"body":6058,"category":218,"cover":219,"description":6062,"extension":220,"meta":6289,"navigation":100,"path":6290,"pinned":223,"publishedAt":224,"seo":6291,"slug":6292,"stem":6293,"summary":6294,"tags":6295,"updatedAt":224,"visible":100,"__hash__":6298},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6059,"toc":6277},[6060,6063,6065,6071,6073,6079,6090,6092,6110,6112,6119,6148,6155,6174,6183,6185,6191,6193,6195,6218,6220,6223,6229,6235,6237,6253,6255,6268,6270,6272,6275],[10,6061,6062],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6064,16],{"id":16},[10,6066,6067,6068,6070],{},"本篇只处理“模块、import 与 ",[287,6069,5990],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6072,22],{"id":22},[10,6074,6075],{},[26,6076],{"alt":6077,"src":6078},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6080,6081,6082,6085,6086,6089],{},"同一个文件直接运行时 ",[47,6083,6084],{},"__name__"," 等于 ",[47,6087,6088],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6091,35],{"id":35},[37,6093,6094,6100,6103],{},[40,6095,6096,6097,6099],{},"一个 ",[47,6098,1162],{}," 文件就是一个模块。",[40,6101,6102],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6104,6105,6106,6109],{},"避免使用 ",[47,6107,6108],{},"from module import *","，它会让名字来源不清楚。",[14,6111,68],{"id":68},[10,6113,6114,6115,6118],{},"先在同一个目录中创建两个文件。把函数放进 ",[47,6116,6117],{},"calculator.py","：",[73,6120,6122],{"className":75,"code":6121,"language":77,"meta":78,"style":78},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[47,6123,6124,6129,6134,6138,6143],{"__ignoreMap":78},[82,6125,6126],{"class":84,"line":85},[82,6127,6128],{},"def add(left, right):\n",[82,6130,6131],{"class":84,"line":91},[82,6132,6133],{},"    return left + right\n",[82,6135,6136],{"class":84,"line":97},[82,6137,101],{"emptyLinePlaceholder":100},[82,6139,6140],{"class":84,"line":104},[82,6141,6142],{},"if __name__ == \"__main__\":\n",[82,6144,6145],{"class":84,"line":110},[82,6146,6147],{},"    print(add(2, 3))\n",[10,6149,6150,6151,6154],{},"再创建 ",[47,6152,6153],{},"app.py","，从模块中导入函数：",[73,6156,6158],{"className":75,"code":6157,"language":77,"meta":78,"style":78},"from calculator import add\n\nprint(add(10, 20))\n",[47,6159,6160,6165,6169],{"__ignoreMap":78},[82,6161,6162],{"class":84,"line":85},[82,6163,6164],{},"from calculator import add\n",[82,6166,6167],{"class":84,"line":91},[82,6168,101],{"emptyLinePlaceholder":100},[82,6170,6171],{"class":84,"line":97},[82,6172,6173],{},"print(add(10, 20))\n",[10,6175,6176,6177,187,6180,156],{},"分别执行 ",[47,6178,6179],{},"python3 calculator.py",[47,6181,6182],{},"python3 app.py",[10,6184,115],{},[73,6186,6189],{"className":6187,"code":6188,"language":121,"meta":78},[119],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[47,6190,6188],{"__ignoreMap":78},[10,6192,126],{},[14,6194,129],{"id":129},[131,6196,6197,6207],{},[40,6198,6199,6200,6202,6203,6206],{},"直接运行 ",[47,6201,6117],{}," 时，模块名是 ",[47,6204,6205],{},"__main__","，入口代码输出 5。",[40,6208,6209,6211,6212,6214,6215,6217],{},[47,6210,6153],{}," 导入模块时，",[47,6213,6117],{}," 的函数定义会执行，但入口判断为假；随后 ",[47,6216,6153],{}," 调用函数输出 30。",[321,6219,2642],{"id":2642},[10,6221,6222],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6224,6225],{},[26,6226],{"alt":6227,"src":6228},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6230,6231,6232,6234],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[47,6233,6205],{}," 保护下的演示代码。",[14,6236,159],{"id":159},[37,6238,6239,6246],{},[40,6240,6241,6242,187,6244,156],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[47,6243,6117],{},[47,6245,6153],{},[40,6247,6248,6249,6252],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[47,6250,6251],{},"json.py","，导致导入目标被遮蔽。",[14,6254,178],{"id":178},[131,6256,6257,6263],{},[40,6258,183,6259,6262],{},[47,6260,6261],{},"text_tools.py"," 并导出一个格式化函数。",[40,6264,6265,6266,156],{},"分别直接运行模块和从另一个脚本导入，输出 ",[47,6267,6084],{},[10,6269,197],{},[14,6271,200],{"id":200},[10,6273,6274],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,6276,207],{},{"title":78,"searchDepth":91,"depth":91,"links":6278},[6279,6280,6281,6282,6283,6286,6287,6288],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":6284},[6285],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6057,"description":6062},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[218,6296,6297],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6300,"title":6301,"body":6302,"category":218,"cover":219,"description":6306,"extension":220,"meta":6471,"navigation":100,"path":6472,"pinned":223,"publishedAt":224,"seo":6473,"slug":6474,"stem":6475,"summary":6476,"tags":6477,"updatedAt":224,"visible":100,"__hash__":6479},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6303,"toc":6461},[6304,6307,6309,6312,6314,6320,6323,6325,6339,6341,6343,6389,6391,6397,6399,6401,6427,6429,6439,6441,6452,6454,6456,6459],[10,6305,6306],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6308,16],{"id":16},[10,6310,6311],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6313,22],{"id":22},[10,6315,6316],{},[26,6317],{"alt":6318,"src":6319},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6321,6322],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6324,35],{"id":35},[37,6326,6327,6333,6336],{},[40,6328,6329,6332],{},[47,6330,6331],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6334,6335],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6337,6338],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6340,68],{"id":68},[10,6342,1565],{},[73,6344,6346],{"className":583,"code":6345,"language":585,"meta":78,"style":78},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[47,6347,6348,6360,6368,6374,6384],{"__ignoreMap":78},[82,6349,6350,6352,6354,6357],{"class":84,"line":85},[82,6351,683],{"class":592},[82,6353,625],{"class":595},[82,6355,6356],{"class":628}," venv",[82,6358,6359],{"class":628}," .venv\n",[82,6361,6362,6365],{"class":84,"line":91},[82,6363,6364],{"class":595},"source",[82,6366,6367],{"class":628}," .venv\u002Fbin\u002Factivate\n",[82,6369,6370,6372],{"class":84,"line":97},[82,6371,77],{"class":592},[82,6373,596],{"class":595},[82,6375,6376,6378,6380,6382],{"class":84,"line":104},[82,6377,77],{"class":592},[82,6379,625],{"class":595},[82,6381,629],{"class":628},[82,6383,596],{"class":595},[82,6385,6386],{"class":84,"line":110},[82,6387,6388],{"class":592},"deactivate\n",[10,6390,115],{},[73,6392,6395],{"className":6393,"code":6394,"language":121,"meta":78},[119],"Python 和 pip 的路径应指向当前项目的 .venv\n",[47,6396,6394],{"__ignoreMap":78},[10,6398,126],{},[14,6400,129],{"id":129},[131,6402,6403,6412],{},[40,6404,6405,6408,6409,6411],{},[47,6406,6407],{},"venv"," 根据当前 ",[47,6410,683],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6413,6414,6415,50,6417,6420,6421,3673,6423,6426],{},"激活后 ",[47,6416,77],{},[47,6418,6419],{},"python -m pip"," 优先指向 ",[47,6422,6331],{},[47,6424,6425],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6428,159],{"id":159},[37,6430,6431,6434],{},[40,6432,6433],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6435,3412,6436,6438],{},[47,6437,6331],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6440,178],{"id":178},[131,6442,6443,6449],{},[40,6444,6445,6446,156],{},"创建虚拟环境并记录激活前后的 ",[47,6447,6448],{},"which python",[40,6450,6451],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6453,197],{},[14,6455,200],{"id":200},[10,6457,6458],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,6460,1649],{},{"title":78,"searchDepth":91,"depth":91,"links":6462},[6463,6464,6465,6466,6467,6468,6469,6470],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6301,"description":6306},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[218,6478,253],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6481,"title":6482,"body":6483,"category":218,"cover":219,"description":6487,"extension":220,"meta":6675,"navigation":100,"path":6676,"pinned":223,"publishedAt":224,"seo":6677,"slug":6678,"stem":6679,"summary":6680,"tags":6681,"updatedAt":224,"visible":100,"__hash__":6684},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6484,"toc":6665},[6485,6488,6490,6493,6495,6501,6510,6512,6536,6538,6540,6593,6595,6601,6603,6605,6621,6623,6642,6644,6656,6658,6660,6663],[10,6486,6487],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6489,16],{"id":16},[10,6491,6492],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6494,22],{"id":22},[10,6496,6497],{},[26,6498],{"alt":6499,"src":6500},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6502,6503,6506,6507,6509],{},[47,6504,6505],{},"Path"," 使用 ",[47,6508,2379],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6511,35],{"id":35},[37,6513,6514,6517,6529],{},[40,6515,6516],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6518,6519,61,6522,61,6525,6528],{},[47,6520,6521],{},"exists()",[47,6523,6524],{},"is_file()",[47,6526,6527],{},"is_dir()"," 检查真实文件系统状态。",[40,6530,6531,6532,6535],{},"创建目录前明确目标；",[47,6533,6534],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6537,68],{"id":68},[10,6539,71],{},[73,6541,6543],{"className":75,"code":6542,"language":77,"meta":78,"style":78},"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",[47,6544,6545,6550,6554,6559,6564,6569,6573,6578,6583,6588],{"__ignoreMap":78},[82,6546,6547],{"class":84,"line":85},[82,6548,6549],{},"from pathlib import Path\n",[82,6551,6552],{"class":84,"line":91},[82,6553,101],{"emptyLinePlaceholder":100},[82,6555,6556],{"class":84,"line":97},[82,6557,6558],{},"project = Path.cwd()\n",[82,6560,6561],{"class":84,"line":104},[82,6562,6563],{},"data_dir = project \u002F \"data\"\n",[82,6565,6566],{"class":84,"line":110},[82,6567,6568],{},"file_path = data_dir \u002F \"records.json\"\n",[82,6570,6571],{"class":84,"line":1140},[82,6572,101],{"emptyLinePlaceholder":100},[82,6574,6575],{"class":84,"line":2432},[82,6576,6577],{},"print(project)\n",[82,6579,6580],{"class":84,"line":2438},[82,6581,6582],{},"print(file_path.name)\n",[82,6584,6585],{"class":84,"line":3898},[82,6586,6587],{},"print(file_path.suffix)\n",[82,6589,6590],{"class":84,"line":4110},[82,6591,6592],{},"print(file_path.exists())\n",[10,6594,115],{},[73,6596,6599],{"className":6597,"code":6598,"language":121,"meta":78},[119],"显示当前项目路径、records.json、.json 和存在状态\n",[47,6600,6598],{"__ignoreMap":78},[10,6602,126],{},[14,6604,129],{"id":129},[131,6606,6607,6613],{},[40,6608,6609,6612],{},[47,6610,6611],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6614,167,6615,6617,6618,6620],{},[47,6616,2379],{}," 组合路径片段只创建新的 ",[47,6619,6505],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6622,159],{"id":159},[37,6624,6625,6633],{},[40,6626,3412,6627,6629,6630,6632],{},[47,6628,6505],{}," 对象存在当成真实文件存在，仍需调用 ",[47,6631,6521],{}," 等方法确认。",[40,6634,6635,6636,1000,6638,6641],{},"手工拼接 ",[47,6637,2379],{},[47,6639,6640],{},"\\"," 分隔符，降低跨平台可读性。",[14,6643,178],{"id":178},[131,6645,6646,6653],{},[40,6647,6648,6649,6652],{},"组合 ",[47,6650,6651],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6654,6655],{},"输出路径的父目录、文件名和扩展名。",[10,6657,197],{},[14,6659,200],{"id":200},[10,6661,6662],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,6664,207],{},{"title":78,"searchDepth":91,"depth":91,"links":6666},[6667,6668,6669,6670,6671,6672,6673,6674],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6482,"description":6487},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[218,6682,6683],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6686,"title":6687,"body":6688,"category":218,"cover":219,"description":6692,"extension":220,"meta":6870,"navigation":100,"path":6871,"pinned":223,"publishedAt":224,"seo":6872,"slug":6873,"stem":6874,"summary":6875,"tags":6876,"updatedAt":224,"visible":100,"__hash__":6879},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6689,"toc":6860},[6690,6693,6695,6698,6700,6706,6709,6711,6739,6741,6743,6800,6802,6808,6810,6812,6823,6825,6838,6840,6851,6853,6855,6858],[10,6691,6692],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6694,16],{"id":16},[10,6696,6697],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6699,22],{"id":22},[10,6701,6702],{},[26,6703],{"alt":6704,"src":6705},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6707,6708],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6710,35],{"id":35},[37,6712,6713,6719,6728],{},[40,6714,6715,6718],{},[47,6716,6717],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6720,6721,6724,6725,156],{},[47,6722,6723],{},"r"," 模式读取不存在文件会产生 ",[47,6726,6727],{},"FileNotFoundError",[40,6729,6730,6731,6734,6735,6738],{},"本篇显式调用 ",[47,6732,6733],{},"close()","；第 34 篇会用 ",[47,6736,6737],{},"with"," 更可靠地管理关闭动作。",[14,6740,68],{"id":68},[10,6742,71],{},[73,6744,6746],{"className":75,"code":6745,"language":77,"meta":78,"style":78},"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",[47,6747,6748,6752,6756,6761,6766,6771,6776,6780,6785,6790,6795],{"__ignoreMap":78},[82,6749,6750],{"class":84,"line":85},[82,6751,6549],{},[82,6753,6754],{"class":84,"line":91},[82,6755,101],{"emptyLinePlaceholder":100},[82,6757,6758],{"class":84,"line":97},[82,6759,6760],{},"file_path = Path(\"notes.txt\")\n",[82,6762,6763],{"class":84,"line":104},[82,6764,6765],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[82,6767,6768],{"class":84,"line":110},[82,6769,6770],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[82,6772,6773],{"class":84,"line":1140},[82,6774,6775],{},"writer.close()\n",[82,6777,6778],{"class":84,"line":2432},[82,6779,101],{"emptyLinePlaceholder":100},[82,6781,6782],{"class":84,"line":2438},[82,6783,6784],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[82,6786,6787],{"class":84,"line":3898},[82,6788,6789],{},"content = reader.read()\n",[82,6791,6792],{"class":84,"line":4110},[82,6793,6794],{},"reader.close()\n",[82,6796,6797],{"class":84,"line":5775},[82,6798,6799],{},"print(content)\n",[10,6801,115],{},[73,6803,6806],{"className":6804,"code":6805,"language":121,"meta":78},[119],"变量\n循环\n函数\n",[47,6807,6805],{"__ignoreMap":78},[10,6809,126],{},[14,6811,129],{"id":129},[131,6813,6814,6820],{},[40,6815,6816,6817,6819],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[47,6818,6733],{}," 确保缓冲内容交给文件系统。",[40,6821,6822],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6824,159],{"id":159},[37,6826,6827,6832],{},[40,6828,167,6829,6831],{},[47,6830,6717],{}," 模式打开重要文件却未确认覆盖风险。",[40,6833,6834,6835,156],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[47,6836,6837],{},"encoding=\"utf-8\"",[14,6839,178],{"id":178},[131,6841,6842,6845],{},[40,6843,6844],{},"写入三行学习记录并读取。",[40,6846,6847,6848,6850],{},"改用 ",[47,6849,329],{}," 模式追加一行，确认原内容仍保留。",[10,6852,197],{},[14,6854,200],{"id":200},[10,6856,6857],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,6859,207],{},{"title":78,"searchDepth":91,"depth":91,"links":6861},[6862,6863,6864,6865,6866,6867,6868,6869],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6687,"description":6692},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[218,6877,6878],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6881,"title":6882,"body":6883,"category":218,"cover":219,"description":6887,"extension":220,"meta":7054,"navigation":100,"path":7055,"pinned":223,"publishedAt":224,"seo":7056,"slug":7057,"stem":7058,"summary":7059,"tags":7060,"updatedAt":224,"visible":100,"__hash__":7063},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6884,"toc":7044},[6885,6888,6890,6893,6895,6901,6911,6913,6927,6929,6931,6991,6993,6999,7001,7003,7015,7017,7025,7027,7035,7037,7039,7042],[10,6886,6887],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6889,16],{"id":16},[10,6891,6892],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6894,22],{"id":22},[10,6896,6897],{},[26,6898],{"alt":6899,"src":6900},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6902,6903,6906,6907,6910],{},[47,6904,6905],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[47,6908,6909],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6912,35],{"id":35},[37,6914,6915,6918,6924],{},[40,6916,6917],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,6919,6920,6923],{},[47,6921,6922],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,6925,6926],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6928,68],{"id":68},[10,6930,71],{},[73,6932,6934],{"className":75,"code":6933,"language":77,"meta":78,"style":78},"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",[47,6935,6936,6941,6945,6950,6954,6959,6964,6968,6972,6977,6982,6986],{"__ignoreMap":78},[82,6937,6938],{"class":84,"line":85},[82,6939,6940],{},"import json\n",[82,6942,6943],{"class":84,"line":91},[82,6944,101],{"emptyLinePlaceholder":100},[82,6946,6947],{"class":84,"line":97},[82,6948,6949],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[82,6951,6952],{"class":84,"line":104},[82,6953,101],{"emptyLinePlaceholder":100},[82,6955,6956],{"class":84,"line":110},[82,6957,6958],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[82,6960,6961],{"class":84,"line":1140},[82,6962,6963],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[82,6965,6966],{"class":84,"line":2432},[82,6967,6775],{},[82,6969,6970],{"class":84,"line":2438},[82,6971,101],{"emptyLinePlaceholder":100},[82,6973,6974],{"class":84,"line":3898},[82,6975,6976],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[82,6978,6979],{"class":84,"line":4110},[82,6980,6981],{},"loaded = json.load(reader)\n",[82,6983,6984],{"class":84,"line":5775},[82,6985,6794],{},[82,6987,6988],{"class":84,"line":5780},[82,6989,6990],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6992,115],{},[73,6994,6997],{"className":6995,"code":6996,"language":121,"meta":78},[119],"Python 60\n",[47,6998,6996],{"__ignoreMap":78},[10,7000,126],{},[14,7002,129],{"id":129},[131,7004,7005,7010],{},[40,7006,7007,7009],{},[47,7008,6905],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7011,7012,7014],{},[47,7013,6909],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7016,159],{"id":159},[37,7018,7019,7022],{},[40,7020,7021],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7023,7024],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7026,178],{"id":178},[131,7028,7029,7032],{},[40,7030,7031],{},"保存包含两条学习记录的列表。",[40,7033,7034],{},"读取后修改进度，再重新写回文件。",[10,7036,197],{},[14,7038,200],{"id":200},[10,7040,7041],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,7043,207],{},{"title":78,"searchDepth":91,"depth":91,"links":7045},[7046,7047,7048,7049,7050,7051,7052,7053],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6882,"description":6887},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[218,7061,7062],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7065,"title":7066,"body":7067,"category":218,"cover":219,"description":7071,"extension":220,"meta":7255,"navigation":100,"path":7256,"pinned":223,"publishedAt":224,"seo":7257,"slug":7258,"stem":7259,"summary":7260,"tags":7261,"updatedAt":224,"visible":100,"__hash__":7264},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7068,"toc":7245},[7069,7072,7074,7077,7079,7085,7091,7093,7115,7117,7119,7182,7184,7190,7192,7194,7210,7212,7226,7228,7236,7238,7240,7243],[10,7070,7071],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7073,16],{"id":16},[10,7075,7076],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7078,22],{"id":22},[10,7080,7081],{},[26,7082],{"alt":7083,"src":7084},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7086,7087,7090],{},[47,7088,7089],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7092,35],{"id":35},[37,7094,7095,7105,7112],{},[40,7096,167,7097,7100,7101,7104],{},[47,7098,7099],{},"newline=\"\""," 让 ",[47,7102,7103],{},"csv"," 模块正确处理换行。",[40,7106,7107,7108,7111],{},"字段顺序由 ",[47,7109,7110],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7113,7114],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7116,68],{"id":68},[10,7118,71],{},[73,7120,7122],{"className":75,"code":7121,"language":77,"meta":78,"style":78},"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",[47,7123,7124,7129,7133,7138,7143,7148,7153,7158,7162,7167,7172,7177],{"__ignoreMap":78},[82,7125,7126],{"class":84,"line":85},[82,7127,7128],{},"import csv\n",[82,7130,7131],{"class":84,"line":91},[82,7132,101],{"emptyLinePlaceholder":100},[82,7134,7135],{"class":84,"line":97},[82,7136,7137],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[82,7139,7140],{"class":84,"line":104},[82,7141,7142],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[82,7144,7145],{"class":84,"line":110},[82,7146,7147],{},"writer.writeheader()\n",[82,7149,7150],{"class":84,"line":1140},[82,7151,7152],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[82,7154,7155],{"class":84,"line":2432},[82,7156,7157],{},"writer_file.close()\n",[82,7159,7160],{"class":84,"line":2438},[82,7161,101],{"emptyLinePlaceholder":100},[82,7163,7164],{"class":84,"line":3898},[82,7165,7166],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[82,7168,7169],{"class":84,"line":4110},[82,7170,7171],{},"for row in csv.DictReader(reader_file):\n",[82,7173,7174],{"class":84,"line":5775},[82,7175,7176],{},"    print(row[\"name\"], row[\"score\"])\n",[82,7178,7179],{"class":84,"line":5780},[82,7180,7181],{},"reader_file.close()\n",[10,7183,115],{},[73,7185,7188],{"className":7186,"code":7187,"language":121,"meta":78},[119],"小郑 95\n",[47,7189,7187],{"__ignoreMap":78},[10,7191,126],{},[14,7193,129],{"id":129},[131,7195,7196,7205],{},[40,7197,7198,7201,7202,7204],{},[47,7199,7200],{},"DictWriter"," 按 ",[47,7203,7110],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7206,7207,7209],{},[47,7208,7089],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7211,159],{"id":159},[37,7213,7214,7217],{},[40,7215,7216],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7218,7219,7220,7222,7223,7225],{},"在 macOS 以外环境忽略 ",[47,7221,7099],{}," 可能出现额外空行；统一交给 ",[47,7224,7103],{}," 模块管理换行。",[14,7227,178],{"id":178},[131,7229,7230,7233],{},[40,7231,7232],{},"写入三名学习者的课程和分数。",[40,7234,7235],{},"读取 CSV 后把分数字符串转换为整数。",[10,7237,197],{},[14,7239,200],{"id":200},[10,7241,7242],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,7244,207],{},{"title":78,"searchDepth":91,"depth":91,"links":7246},[7247,7248,7249,7250,7251,7252,7253,7254],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7066,"description":7071},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[218,7262,7263],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7266,"title":7267,"body":7268,"category":218,"cover":219,"description":7272,"extension":220,"meta":7545,"navigation":100,"path":7546,"pinned":223,"publishedAt":224,"seo":7547,"slug":7548,"stem":7549,"summary":7550,"tags":7551,"updatedAt":224,"visible":100,"__hash__":7554},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7269,"toc":7532},[7270,7273,7275,7278,7280,7286,7297,7299,7316,7318,7320,7395,7397,7403,7405,7407,7432,7434,7443,7449,7460,7462,7468,7474,7483,7485,7500,7502,7523,7525,7527,7530],[10,7271,7272],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7274,16],{"id":16},[10,7276,7277],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7279,22],{"id":22},[10,7281,7282],{},[26,7283],{"alt":7284,"src":7285},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7287,7288,7289,7292,7293,7296],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[47,7290,7291],{},"except","；无论是否异常，",[47,7294,7295],{},"finally"," 都会在离开结构前执行。",[14,7298,35],{"id":35},[37,7300,7301,7307,7313],{},[40,7302,7303,7304,7306],{},"只捕获能够处理的具体异常，不使用空的 ",[47,7305,7291],{}," 吞掉全部错误。",[40,7308,7309,7312],{},[47,7310,7311],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7314,7315],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7317,68],{"id":68},[10,7319,71],{},[73,7321,7323],{"className":75,"code":7322,"language":77,"meta":78,"style":78},"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",[47,7324,7325,7330,7335,7340,7345,7350,7354,7359,7364,7369,7374,7378,7383,7389],{"__ignoreMap":78},[82,7326,7327],{"class":84,"line":85},[82,7328,7329],{},"def parse_age(text):\n",[82,7331,7332],{"class":84,"line":91},[82,7333,7334],{},"    age = int(text)\n",[82,7336,7337],{"class":84,"line":97},[82,7338,7339],{},"    if age \u003C 0:\n",[82,7341,7342],{"class":84,"line":104},[82,7343,7344],{},"        raise ValueError(\"年龄不能为负数\")\n",[82,7346,7347],{"class":84,"line":110},[82,7348,7349],{},"    return age\n",[82,7351,7352],{"class":84,"line":1140},[82,7353,101],{"emptyLinePlaceholder":100},[82,7355,7356],{"class":84,"line":2432},[82,7357,7358],{},"try:\n",[82,7360,7361],{"class":84,"line":2438},[82,7362,7363],{},"    age = parse_age(\"18\")\n",[82,7365,7366],{"class":84,"line":3898},[82,7367,7368],{},"except ValueError as error:\n",[82,7370,7371],{"class":84,"line":4110},[82,7372,7373],{},"    print(\"输入错误：\", error)\n",[82,7375,7376],{"class":84,"line":5775},[82,7377,1137],{},[82,7379,7380],{"class":84,"line":5780},[82,7381,7382],{},"    print(\"年龄：\", age)\n",[82,7384,7386],{"class":84,"line":7385},13,[82,7387,7388],{},"finally:\n",[82,7390,7392],{"class":84,"line":7391},14,[82,7393,7394],{},"    print(\"处理结束\")\n",[10,7396,115],{},[73,7398,7401],{"className":7399,"code":7400,"language":121,"meta":78},[119],"年龄： 18\n处理结束\n",[47,7402,7400],{"__ignoreMap":78},[10,7404,126],{},[14,7406,129],{"id":129},[131,7408,7409,7421],{},[40,7410,7411,7413,7414,7416,7417,7420],{},[47,7412,2981],{}," 或主动 ",[47,7415,7311],{}," 都可能产生 ",[47,7418,7419],{},"ValueError","，控制流立即离开当前正常路径。",[40,7422,7423,7424,7426,7427,7429,7430,156],{},"有异常时进入匹配的 ",[47,7425,7291],{},"；没有异常时执行 ",[47,7428,1151],{},"；两种情况最后都会执行 ",[47,7431,7295],{},[321,7433,2642],{"id":2642},[10,7435,7436,61,7438,187,7440,7442],{},[47,7437,7291],{},[47,7439,1151],{},[47,7441,7295],{}," 的职责不同，不能只看它们出现的顺序。",[10,7444,7445],{},[26,7446],{"alt":7447,"src":7448},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7450,7451,7453,7454,7456,7457,7459],{},[47,7452,7291],{}," 处理匹配异常，",[47,7455,1151],{}," 只在无异常时运行，",[47,7458,7295],{}," 负责两条路径都需要的清理动作。",[321,7461,2642],{"id":4165},[10,7463,7464,7467],{},[47,7465,7466],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7469,7470],{},[26,7471],{"alt":7472,"src":7473},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7475,7476,7477,7479,7480,7482],{},"只把可能产生预期异常的操作放进 ",[47,7478,7466],{},"，后续正常业务放进 ",[47,7481,1151],{},"，错误边界会更清楚。",[14,7484,159],{"id":159},[37,7486,7487,7494],{},[40,7488,7489,7490,7493],{},"使用裸 ",[47,7491,7492],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7495,7496,7497,7499],{},"把整个程序包在一个巨大 ",[47,7498,7466],{}," 中，无法判断究竟哪一步允许失败。",[14,7501,178],{"id":178},[131,7503,7504,7517],{},[40,7505,7506,7507,7510,7511,187,7514,156],{},"让 ",[47,7508,7509],{},"parse_age"," 分别处理 ",[47,7512,7513],{},"\"abc\"",[47,7515,7516],{},"\"-1\"",[40,7518,7519,7520,7522],{},"为文件读取捕获 ",[47,7521,6727],{}," 并给出清晰提示。",[10,7524,197],{},[14,7526,200],{"id":200},[10,7528,7529],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,7531,207],{},{"title":78,"searchDepth":91,"depth":91,"links":7533},[7534,7535,7536,7537,7538,7542,7543,7544],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":7539},[7540,7541],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7267,"description":7272},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[218,7552,7553],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7556,"title":7557,"body":7558,"category":218,"cover":219,"description":7562,"extension":220,"meta":7738,"navigation":100,"path":7739,"pinned":223,"publishedAt":224,"seo":7740,"slug":7741,"stem":7742,"summary":7743,"tags":7744,"updatedAt":224,"visible":100,"__hash__":7746},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7559,"toc":7728},[7560,7563,7565,7568,7570,7576,7582,7584,7600,7602,7604,7658,7660,7666,7668,7670,7683,7685,7698,7700,7719,7721,7723,7726],[10,7561,7562],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7564,16],{"id":16},[10,7566,7567],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7569,22],{"id":22},[10,7571,7572],{},[26,7573],{"alt":7574,"src":7575},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7577,7578,7579,7581],{},"进入 ",[47,7580,6737],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7583,35],{"id":35},[37,7585,7586,7591,7597],{},[40,7587,7588,7590],{},[47,7589,6737],{}," 把资源获取和释放配成一个清晰边界。",[40,7592,7593,7596],{},[47,7594,7595],{},"as file"," 得到的是上下文返回的资源对象。",[40,7598,7599],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7601,68],{"id":68},[10,7603,71],{},[73,7605,7607],{"className":75,"code":7606,"language":77,"meta":78,"style":78},"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",[47,7608,7609,7613,7617,7621,7625,7630,7635,7639,7644,7649,7653],{"__ignoreMap":78},[82,7610,7611],{"class":84,"line":85},[82,7612,6549],{},[82,7614,7615],{"class":84,"line":91},[82,7616,101],{"emptyLinePlaceholder":100},[82,7618,7619],{"class":84,"line":97},[82,7620,6760],{},[82,7622,7623],{"class":84,"line":104},[82,7624,101],{"emptyLinePlaceholder":100},[82,7626,7627],{"class":84,"line":110},[82,7628,7629],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[82,7631,7632],{"class":84,"line":1140},[82,7633,7634],{},"    file.write(\"上下文管理器\\n\")\n",[82,7636,7637],{"class":84,"line":2432},[82,7638,101],{"emptyLinePlaceholder":100},[82,7640,7641],{"class":84,"line":2438},[82,7642,7643],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[82,7645,7646],{"class":84,"line":3898},[82,7647,7648],{},"    print(file.read())\n",[82,7650,7651],{"class":84,"line":4110},[82,7652,101],{"emptyLinePlaceholder":100},[82,7654,7655],{"class":84,"line":5775},[82,7656,7657],{},"print(file.closed)\n",[10,7659,115],{},[73,7661,7664],{"className":7662,"code":7663,"language":121,"meta":78},[119],"上下文管理器\n\nTrue\n",[47,7665,7663],{"__ignoreMap":78},[10,7667,126],{},[14,7669,129],{"id":129},[131,7671,7672,7680],{},[40,7673,7578,7674,7676,7677,156],{},[47,7675,6737],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[47,7678,7679],{},"file",[40,7681,7682],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7684,159],{"id":159},[37,7686,7687,7692],{},[40,7688,4733,7689,7691],{},[47,7690,6737],{}," 代码块外继续读写已经关闭的文件对象。",[40,7693,7694,7695,7697],{},"误以为 ",[47,7696,6737],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7699,178],{"id":178},[131,7701,7702,7711],{},[40,7703,7704,7705,7708,7709,156],{},"把第 30 篇的手动 ",[47,7706,7707],{},"open\u002Fclose"," 改写为 ",[47,7710,6737],{},[40,7712,4733,7713,7715,7716,156],{},[47,7714,6737],{}," 块后检查 ",[47,7717,7718],{},"file.closed",[10,7720,197],{},[14,7722,200],{"id":200},[10,7724,7725],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,7727,207],{},{"title":78,"searchDepth":91,"depth":91,"links":7729},[7730,7731,7732,7733,7734,7735,7736,7737],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7557,"description":7562},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[218,6737,7745],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7748,"title":7749,"body":7750,"category":218,"cover":219,"description":7754,"extension":220,"meta":7966,"navigation":100,"path":7967,"pinned":223,"publishedAt":224,"seo":7968,"slug":7969,"stem":7970,"summary":7971,"tags":7972,"updatedAt":224,"visible":100,"__hash__":7975},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7751,"toc":7954},[7752,7755,7757,7760,7762,7768,7771,7773,7790,7792,7794,7862,7864,7870,7872,7874,7899,7901,7904,7910,7919,7921,7932,7934,7945,7947,7949,7952],[10,7753,7754],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7756,16],{"id":16},[10,7758,7759],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7761,22],{"id":22},[10,7763,7764],{},[26,7765],{"alt":7766,"src":7767},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7769,7770],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7772,35],{"id":35},[37,7774,7775,7781,7787],{},[40,7776,7777,7780],{},[47,7778,7779],{},"self"," 表示当前实例，由方法调用自动传入。",[40,7782,7783,7786],{},[47,7784,7785],{},"__init__"," 在实例创建过程中初始化属性。",[40,7788,7789],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7791,68],{"id":68},[10,7793,71],{},[73,7795,7797],{"className":75,"code":7796,"language":77,"meta":78,"style":78},"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",[47,7798,7799,7804,7809,7814,7819,7823,7828,7833,7838,7843,7847,7852,7857],{"__ignoreMap":78},[82,7800,7801],{"class":84,"line":85},[82,7802,7803],{},"class LearningRecord:\n",[82,7805,7806],{"class":84,"line":91},[82,7807,7808],{},"    def __init__(self, course, progress=0):\n",[82,7810,7811],{"class":84,"line":97},[82,7812,7813],{},"        self.course = course\n",[82,7815,7816],{"class":84,"line":104},[82,7817,7818],{},"        self.progress = progress\n",[82,7820,7821],{"class":84,"line":110},[82,7822,101],{"emptyLinePlaceholder":100},[82,7824,7825],{"class":84,"line":1140},[82,7826,7827],{},"    def advance(self, amount):\n",[82,7829,7830],{"class":84,"line":2432},[82,7831,7832],{},"        self.progress = self.progress + amount\n",[82,7834,7835],{"class":84,"line":2438},[82,7836,7837],{},"        if self.progress > 100:\n",[82,7839,7840],{"class":84,"line":3898},[82,7841,7842],{},"            self.progress = 100\n",[82,7844,7845],{"class":84,"line":4110},[82,7846,101],{"emptyLinePlaceholder":100},[82,7848,7849],{"class":84,"line":5775},[82,7850,7851],{},"record = LearningRecord(\"Python\", 40)\n",[82,7853,7854],{"class":84,"line":5780},[82,7855,7856],{},"record.advance(15)\n",[82,7858,7859],{"class":84,"line":7385},[82,7860,7861],{},"print(record.course, record.progress)\n",[10,7863,115],{},[73,7865,7868],{"className":7866,"code":7867,"language":121,"meta":78},[119],"Python 55\n",[47,7869,7867],{"__ignoreMap":78},[10,7871,126],{},[14,7873,129],{"id":129},[131,7875,7876,7886],{},[40,7877,7878,7879,7882,7883,7885],{},"调用 ",[47,7880,7881],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[47,7884,7785],{}," 把课程和进度保存在该实例属性中。",[40,7887,7888,7891,7892,7895,7896,7898],{},[47,7889,7890],{},"record.advance(15)"," 自动把 ",[47,7893,7894],{},"record"," 作为 ",[47,7897,7779],{},"，方法更新同一实例的进度并限制上限。",[321,7900,2642],{"id":2642},[10,7902,7903],{},"类是共同定义，实例则各自保存状态。",[10,7905,7906],{},[26,7907],{"alt":7908,"src":7909},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7911,7912,7913,187,7915,7918],{},"两个实例共享同一套方法定义，但 ",[47,7914,4530],{},[47,7916,7917],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7920,159],{"id":159},[37,7922,7923,7929],{},[40,7924,7925,7926,7928],{},"调用实例方法时手工再传一次 ",[47,7927,7779],{},"。通过实例调用时 Python 会自动绑定。",[40,7930,7931],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7933,178],{"id":178},[131,7935,7936,7942],{},[40,7937,5243,7938,7941],{},[47,7939,7940],{},"Book"," 类，保存标题和阅读页数。",[40,7943,7944],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7946,197],{},[14,7948,200],{"id":200},[10,7950,7951],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,7953,207],{},{"title":78,"searchDepth":91,"depth":91,"links":7955},[7956,7957,7958,7959,7960,7963,7964,7965],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":7961},[7962],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7749,"description":7754},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[218,7973,7974],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7977,"title":7978,"body":7979,"category":218,"cover":219,"description":7983,"extension":220,"meta":8161,"navigation":100,"path":8162,"pinned":223,"publishedAt":224,"seo":8163,"slug":8164,"stem":8165,"summary":8166,"tags":8167,"updatedAt":224,"visible":100,"__hash__":8170},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7980,"toc":8151},[7981,7984,7986,7989,7991,7997,8000,8002,8013,8015,8017,8084,8086,8092,8094,8096,8115,8117,8125,8127,8142,8144,8146,8149],[10,7982,7983],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7985,16],{"id":16},[10,7987,7988],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7990,22],{"id":22},[10,7992,7993],{},[26,7994],{"alt":7995,"src":7996},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7998,7999],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8001,35],{"id":35},[37,8003,8004,8007,8010],{},[40,8005,8006],{},"封装让对象通过方法维护自己的有效状态。",[40,8008,8009],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8011,8012],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8014,68],{"id":68},[10,8016,71],{},[73,8018,8020],{"className":75,"code":8019,"language":77,"meta":78,"style":78},"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",[47,8021,8022,8027,8032,8037,8041,8046,8051,8056,8060,8065,8070,8074,8079],{"__ignoreMap":78},[82,8023,8024],{"class":84,"line":85},[82,8025,8026],{},"class Storage:\n",[82,8028,8029],{"class":84,"line":91},[82,8030,8031],{},"    def save(self, text):\n",[82,8033,8034],{"class":84,"line":97},[82,8035,8036],{},"        print(\"保存：\", text)\n",[82,8038,8039],{"class":84,"line":104},[82,8040,101],{"emptyLinePlaceholder":100},[82,8042,8043],{"class":84,"line":110},[82,8044,8045],{},"class LearningService:\n",[82,8047,8048],{"class":84,"line":1140},[82,8049,8050],{},"    def __init__(self, storage):\n",[82,8052,8053],{"class":84,"line":2432},[82,8054,8055],{},"        self.storage = storage\n",[82,8057,8058],{"class":84,"line":2438},[82,8059,101],{"emptyLinePlaceholder":100},[82,8061,8062],{"class":84,"line":3898},[82,8063,8064],{},"    def finish_lesson(self, title):\n",[82,8066,8067],{"class":84,"line":4110},[82,8068,8069],{},"        self.storage.save(title)\n",[82,8071,8072],{"class":84,"line":5775},[82,8073,101],{"emptyLinePlaceholder":100},[82,8075,8076],{"class":84,"line":5780},[82,8077,8078],{},"service = LearningService(Storage())\n",[82,8080,8081],{"class":84,"line":7385},[82,8082,8083],{},"service.finish_lesson(\"异常处理\")\n",[10,8085,115],{},[73,8087,8090],{"className":8088,"code":8089,"language":121,"meta":78},[119],"保存： 异常处理\n",[47,8091,8089],{"__ignoreMap":78},[10,8093,126],{},[14,8095,129],{"id":129},[131,8097,8098,8108],{},[40,8099,8100,8103,8104,8107],{},[47,8101,8102],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[47,8105,8106],{},"save()"," 的协作对象。",[40,8109,8110,8111,8114],{},"调用业务方法时，服务把保存动作委托给 ",[47,8112,8113],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8116,159],{"id":159},[37,8118,8119,8122],{},[40,8120,8121],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8123,8124],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8126,178],{"id":178},[131,8128,8129,8139],{},[40,8130,8131,8132,8135,8136,156],{},"用组合让 ",[47,8133,8134],{},"OrderService"," 使用一个 ",[47,8137,8138],{},"Notifier",[40,8140,8141],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8143,197],{},[14,8145,200],{"id":200},[10,8147,8148],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,8150,207],{},{"title":78,"searchDepth":91,"depth":91,"links":8152},[8153,8154,8155,8156,8157,8158,8159,8160],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7978,"description":7983},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[218,8168,8169],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8172,"title":8173,"body":8174,"category":218,"cover":219,"description":8178,"extension":220,"meta":8381,"navigation":100,"path":8382,"pinned":223,"publishedAt":224,"seo":8383,"slug":8384,"stem":8385,"summary":8386,"tags":8387,"updatedAt":224,"visible":100,"__hash__":8390},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8175,"toc":8369},[8176,8179,8181,8184,8186,8192,8199,8201,8226,8228,8230,8282,8284,8290,8292,8294,8315,8317,8323,8329,8335,8337,8345,8347,8360,8362,8364,8367],[10,8177,8178],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8180,16],{"id":16},[10,8182,8183],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8185,22],{"id":22},[10,8187,8188],{},[26,8189],{"alt":8190,"src":8191},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8193,8194,8195,8198],{},"生成器运行到 ",[47,8196,8197],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8200,35],{"id":35},[37,8202,8203,8213,8223],{},[40,8204,8205,8208,8209,8212],{},[47,8206,8207],{},"iter()"," 从可迭代对象取得迭代器，",[47,8210,8211],{},"next()"," 请求下一个值。",[40,8214,8215,8216,8219,8220,8222],{},"没有更多值时迭代器抛出 ",[47,8217,8218],{},"StopIteration","，",[47,8221,4284],{}," 会自动处理。",[40,8224,8225],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8227,68],{"id":68},[10,8229,71],{},[73,8231,8233],{"className":75,"code":8232,"language":77,"meta":78,"style":78},"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",[47,8234,8235,8240,8245,8250,8255,8260,8264,8269,8274,8278],{"__ignoreMap":78},[82,8236,8237],{"class":84,"line":85},[82,8238,8239],{},"def countdown(start):\n",[82,8241,8242],{"class":84,"line":91},[82,8243,8244],{},"    current = start\n",[82,8246,8247],{"class":84,"line":97},[82,8248,8249],{},"    while current > 0:\n",[82,8251,8252],{"class":84,"line":104},[82,8253,8254],{},"        yield current\n",[82,8256,8257],{"class":84,"line":110},[82,8258,8259],{},"        current = current - 1\n",[82,8261,8262],{"class":84,"line":1140},[82,8263,101],{"emptyLinePlaceholder":100},[82,8265,8266],{"class":84,"line":2432},[82,8267,8268],{},"iterator = countdown(3)\n",[82,8270,8271],{"class":84,"line":2438},[82,8272,8273],{},"print(next(iterator))\n",[82,8275,8276],{"class":84,"line":3898},[82,8277,8273],{},[82,8279,8280],{"class":84,"line":4110},[82,8281,8273],{},[10,8283,115],{},[73,8285,8288],{"className":8286,"code":8287,"language":121,"meta":78},[119],"3\n2\n1\n",[47,8289,8287],{"__ignoreMap":78},[10,8291,126],{},[14,8293,129],{"id":129},[131,8295,8296,8302],{},[40,8297,7878,8298,8301],{},[47,8299,8300],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8303,8304,8305,8307,8308,8310,8311,8314],{},"每次 ",[47,8306,8211],{}," 运行到下一个 ",[47,8309,8197],{}," 并暂停，局部变量 ",[47,8312,8313],{},"current"," 和执行位置被保留。",[321,8316,2642],{"id":2642},[10,8318,8319,8320,8322],{},"生成器的暂停位置可以展开成多次 ",[47,8321,8211],{}," 的时间线。",[10,8324,8325],{},[26,8326],{"alt":8327,"src":8328},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8330,8331,8332,8334],{},"每次请求只推进到下一个 ",[47,8333,8197],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8336,159],{"id":159},[37,8338,8339,8342],{},[40,8340,8341],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8343,8344],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8346,178],{"id":178},[131,8348,8349,8352],{},[40,8350,8351],{},"编写产生 1 到指定上限偶数的生成器。",[40,8353,3956,8354,8356,8357,8359],{},[47,8355,4284],{}," 遍历生成器，比较手动 ",[47,8358,8211],{}," 的差异。",[10,8361,197],{},[14,8363,200],{"id":200},[10,8365,8366],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,8368,207],{},{"title":78,"searchDepth":91,"depth":91,"links":8370},[8371,8372,8373,8374,8375,8378,8379,8380],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":8376},[8377],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8173,"description":8178},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[218,8388,8389],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8392,"title":8393,"body":8394,"category":218,"cover":219,"description":8398,"extension":220,"meta":8622,"navigation":100,"path":8623,"pinned":223,"publishedAt":224,"seo":8624,"slug":8625,"stem":8626,"summary":8627,"tags":8628,"updatedAt":224,"visible":100,"__hash__":8630},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8395,"toc":8610},[8396,8399,8401,8404,8406,8412,8415,8417,8437,8439,8441,8523,8525,8531,8533,8535,8557,8559,8562,8568,8575,8577,8587,8589,8601,8603,8605,8608],[10,8397,8398],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8400,16],{"id":16},[10,8402,8403],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8405,22],{"id":22},[10,8407,8408],{},[26,8409],{"alt":8410,"src":8411},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8413,8414],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8416,35],{"id":35},[37,8418,8419,8428,8431],{},[40,8420,8421,8424,8425,156],{},[47,8422,8423],{},"@trace"," 等价于 ",[47,8426,8427],{},"add = trace(add)",[40,8429,8430],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8432,8433,8436],{},[47,8434,8435],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8438,68],{"id":68},[10,8440,71],{},[73,8442,8444],{"className":75,"code":8443,"language":77,"meta":78,"style":78},"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",[47,8445,8446,8451,8455,8460,8465,8470,8475,8480,8485,8490,8495,8499,8504,8508,8512,8517],{"__ignoreMap":78},[82,8447,8448],{"class":84,"line":85},[82,8449,8450],{},"from functools import wraps\n",[82,8452,8453],{"class":84,"line":91},[82,8454,101],{"emptyLinePlaceholder":100},[82,8456,8457],{"class":84,"line":97},[82,8458,8459],{},"def trace(function):\n",[82,8461,8462],{"class":84,"line":104},[82,8463,8464],{},"    @wraps(function)\n",[82,8466,8467],{"class":84,"line":110},[82,8468,8469],{},"    def wrapper(*args, **kwargs):\n",[82,8471,8472],{"class":84,"line":1140},[82,8473,8474],{},"        print(\"开始：\", function.__name__)\n",[82,8476,8477],{"class":84,"line":2432},[82,8478,8479],{},"        result = function(*args, **kwargs)\n",[82,8481,8482],{"class":84,"line":2438},[82,8483,8484],{},"        print(\"结束：\", function.__name__)\n",[82,8486,8487],{"class":84,"line":3898},[82,8488,8489],{},"        return result\n",[82,8491,8492],{"class":84,"line":4110},[82,8493,8494],{},"    return wrapper\n",[82,8496,8497],{"class":84,"line":5775},[82,8498,101],{"emptyLinePlaceholder":100},[82,8500,8501],{"class":84,"line":5780},[82,8502,8503],{},"@trace\n",[82,8505,8506],{"class":84,"line":7385},[82,8507,6128],{},[82,8509,8510],{"class":84,"line":7391},[82,8511,6133],{},[82,8513,8515],{"class":84,"line":8514},15,[82,8516,101],{"emptyLinePlaceholder":100},[82,8518,8520],{"class":84,"line":8519},16,[82,8521,8522],{},"print(add(2, 3))\n",[10,8524,115],{},[73,8526,8529],{"className":8527,"code":8528,"language":121,"meta":78},[119],"开始： add\n结束： add\n5\n",[47,8530,8528],{"__ignoreMap":78},[10,8532,126],{},[14,8534,129],{"id":129},[131,8536,8537,8554],{},[40,8538,8539,8540,8543,8544,8547,8548,8551,8552,156],{},"解释器执行定义时，把原 ",[47,8541,8542],{},"add"," 函数交给 ",[47,8545,8546],{},"trace","，返回的 ",[47,8549,8550],{},"wrapper"," 重新绑定到名字 ",[47,8553,8542],{},[40,8555,8556],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[321,8558,2642],{"id":2642},[10,8560,8561],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8563,8564],{},[26,8565],{"alt":8566,"src":8567},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8569,8570,8572,8573,156],{},[47,8571,8423],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[47,8574,8427],{},[14,8576,159],{"id":159},[37,8578,8579,8584],{},[40,8580,8581,8582,156],{},"包装函数忘记返回原函数结果，调用方得到 ",[47,8583,5326],{},[40,8585,8586],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8588,178],{"id":178},[131,8590,8591,8594],{},[40,8592,8593],{},"编写只记录调用次数的简单装饰器。",[40,8595,8596,8597,8600],{},"删除包装函数的 ",[47,8598,8599],{},"return result","，观察调用方得到什么。",[10,8602,197],{},[14,8604,200],{"id":200},[10,8606,8607],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,8609,207],{},{"title":78,"searchDepth":91,"depth":91,"links":8611},[8612,8613,8614,8615,8616,8619,8620,8621],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":8617},[8618],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8393,"description":8398},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[218,8629,5277],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8632,"title":8633,"body":8634,"category":218,"cover":219,"description":8638,"extension":220,"meta":8825,"navigation":100,"path":8826,"pinned":223,"publishedAt":224,"seo":8827,"slug":8828,"stem":8829,"summary":8830,"tags":8831,"updatedAt":224,"visible":100,"__hash__":8834},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8635,"toc":8813},[8636,8639,8641,8644,8646,8652,8655,8657,8668,8670,8672,8747,8749,8755,8757,8759,8770,8772,8775,8781,8784,8786,8794,8796,8804,8806,8808,8811],[10,8637,8638],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8640,16],{"id":16},[10,8642,8643],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8645,22],{"id":22},[10,8647,8648],{},[26,8649],{"alt":8650,"src":8651},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8653,8654],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8656,35],{"id":35},[37,8658,8659,8662,8665],{},[40,8660,8661],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8663,8664],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8666,8667],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8669,68],{"id":68},[10,8671,71],{},[73,8673,8675],{"className":75,"code":8674,"language":77,"meta":78,"style":78},"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",[47,8676,8677,8682,8687,8691,8696,8700,8705,8710,8715,8719,8724,8729,8734,8738,8742],{"__ignoreMap":78},[82,8678,8679],{"class":84,"line":85},[82,8680,8681],{},"import logging\n",[82,8683,8684],{"class":84,"line":91},[82,8685,8686],{},"import unittest\n",[82,8688,8689],{"class":84,"line":97},[82,8690,101],{"emptyLinePlaceholder":100},[82,8692,8693],{"class":84,"line":104},[82,8694,8695],{},"logging.basicConfig(level=logging.INFO)\n",[82,8697,8698],{"class":84,"line":110},[82,8699,101],{"emptyLinePlaceholder":100},[82,8701,8702],{"class":84,"line":1140},[82,8703,8704],{},"def clamp_progress(value):\n",[82,8706,8707],{"class":84,"line":2432},[82,8708,8709],{},"    logging.info(\"检查进度：%s\", value)\n",[82,8711,8712],{"class":84,"line":2438},[82,8713,8714],{},"    return max(0, min(100, value))\n",[82,8716,8717],{"class":84,"line":3898},[82,8718,101],{"emptyLinePlaceholder":100},[82,8720,8721],{"class":84,"line":4110},[82,8722,8723],{},"class ProgressTest(unittest.TestCase):\n",[82,8725,8726],{"class":84,"line":5775},[82,8727,8728],{},"    def test_upper_limit(self):\n",[82,8730,8731],{"class":84,"line":5780},[82,8732,8733],{},"        self.assertEqual(clamp_progress(120), 100)\n",[82,8735,8736],{"class":84,"line":7385},[82,8737,101],{"emptyLinePlaceholder":100},[82,8739,8740],{"class":84,"line":7391},[82,8741,6142],{},[82,8743,8744],{"class":84,"line":8514},[82,8745,8746],{},"    unittest.main()\n",[10,8748,115],{},[73,8750,8753],{"className":8751,"code":8752,"language":121,"meta":78},[119],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[47,8754,8752],{"__ignoreMap":78},[10,8756,126],{},[14,8758,129],{"id":129},[131,8760,8761,8767],{},[40,8762,8763,8766],{},[47,8764,8765],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8768,8769],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[321,8771,2642],{"id":2642},[10,8773,8774],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8776,8777],{},[26,8778],{"alt":8779,"src":8780},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8782,8783],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8785,159],{"id":159},[37,8787,8788,8791],{},[40,8789,8790],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8792,8793],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8795,178],{"id":178},[131,8797,8798,8801],{},[40,8799,8800],{},"为负数进度增加测试。",[40,8802,8803],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8805,197],{},[14,8807,200],{"id":200},[10,8809,8810],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,8812,207],{},{"title":78,"searchDepth":91,"depth":91,"links":8814},[8815,8816,8817,8818,8819,8822,8823,8824],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":8820},[8821],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8633,"description":8638},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[218,8832,8833],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8836,"title":8837,"body":8838,"category":218,"cover":219,"description":8842,"extension":220,"meta":9142,"navigation":100,"path":9143,"pinned":223,"publishedAt":224,"seo":9144,"slug":9145,"stem":9146,"summary":9147,"tags":9148,"updatedAt":224,"visible":100,"__hash__":9151},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8839,"toc":9129},[8840,8843,8845,8848,8850,8856,8859,8861,8876,8878,8880,9027,9029,9035,9037,9039,9052,9054,9057,9063,9066,9068,9071,9077,9084,9086,9097,9099,9120,9122,9124,9127],[10,8841,8842],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8844,16],{"id":16},[10,8846,8847],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8849,22],{"id":22},[10,8851,8852],{},[26,8853],{"alt":8854,"src":8855},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8857,8858],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8860,35],{"id":35},[37,8862,8863,8866,8869],{},[40,8864,8865],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8867,8868],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8870,8871,8872,8875],{},"实际扩展前先为 ",[47,8873,8874],{},"add()"," 和存储边界补充测试。",[14,8877,68],{"id":68},[10,8879,71],{},[73,8881,8883],{"className":75,"code":8882,"language":77,"meta":78,"style":78},"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",[47,8884,8885,8889,8893,8897,8902,8907,8912,8917,8921,8926,8931,8936,8941,8946,8950,8955,8960,8966,8971,8977,8982,8987,8993,8999,9005,9010,9016,9021],{"__ignoreMap":78},[82,8886,8887],{"class":84,"line":85},[82,8888,6940],{},[82,8890,8891],{"class":84,"line":91},[82,8892,6549],{},[82,8894,8895],{"class":84,"line":97},[82,8896,101],{"emptyLinePlaceholder":100},[82,8898,8899],{"class":84,"line":104},[82,8900,8901],{},"class LearningRecords:\n",[82,8903,8904],{"class":84,"line":110},[82,8905,8906],{},"    def __init__(self, file_path):\n",[82,8908,8909],{"class":84,"line":1140},[82,8910,8911],{},"        self.file_path = Path(file_path)\n",[82,8913,8914],{"class":84,"line":2432},[82,8915,8916],{},"        self.items = []\n",[82,8918,8919],{"class":84,"line":2438},[82,8920,101],{"emptyLinePlaceholder":100},[82,8922,8923],{"class":84,"line":3898},[82,8924,8925],{},"    def add(self, title):\n",[82,8927,8928],{"class":84,"line":4110},[82,8929,8930],{},"        title = title.strip()\n",[82,8932,8933],{"class":84,"line":5775},[82,8934,8935],{},"        if not title:\n",[82,8937,8938],{"class":84,"line":5780},[82,8939,8940],{},"            raise ValueError(\"课程名称不能为空\")\n",[82,8942,8943],{"class":84,"line":7385},[82,8944,8945],{},"        self.items.append({\"title\": title, \"done\": False})\n",[82,8947,8948],{"class":84,"line":7391},[82,8949,101],{"emptyLinePlaceholder":100},[82,8951,8952],{"class":84,"line":8514},[82,8953,8954],{},"    def save(self):\n",[82,8956,8957],{"class":84,"line":8519},[82,8958,8959],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[82,8961,8963],{"class":84,"line":8962},17,[82,8964,8965],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[82,8967,8969],{"class":84,"line":8968},18,[82,8970,101],{"emptyLinePlaceholder":100},[82,8972,8974],{"class":84,"line":8973},19,[82,8975,8976],{},"records = LearningRecords(\"learning-records.json\")\n",[82,8978,8980],{"class":84,"line":8979},20,[82,8981,101],{"emptyLinePlaceholder":100},[82,8983,8985],{"class":84,"line":8984},21,[82,8986,7358],{},[82,8988,8990],{"class":84,"line":8989},22,[82,8991,8992],{},"    title = input(\"输入已学习课程：\")\n",[82,8994,8996],{"class":84,"line":8995},23,[82,8997,8998],{},"    records.add(title)\n",[82,9000,9002],{"class":84,"line":9001},24,[82,9003,9004],{},"    records.save()\n",[82,9006,9008],{"class":84,"line":9007},25,[82,9009,7368],{},[82,9011,9013],{"class":84,"line":9012},26,[82,9014,9015],{},"    print(\"无法保存：\", error)\n",[82,9017,9019],{"class":84,"line":9018},27,[82,9020,1137],{},[82,9022,9024],{"class":84,"line":9023},28,[82,9025,9026],{},"    print(\"已保存 1 条学习记录\")\n",[10,9028,115],{},[73,9030,9033],{"className":9031,"code":9032,"language":121,"meta":78},[119],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[47,9034,9032],{"__ignoreMap":78},[10,9036,126],{},[14,9038,129],{"id":129},[131,9040,9041,9047],{},[40,9042,9043,9044,9046],{},"输入层取得课程名后，",[47,9045,8874],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9048,9049,9051],{},[47,9050,8106],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[321,9053,2642],{"id":2642},[10,9055,9056],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9058,9059],{},[26,9060],{"alt":9061,"src":9062},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9064,9065],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[321,9067,2642],{"id":4165},[10,9069,9070],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9072,9073],{},[26,9074],{"alt":9075,"src":9076},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9078,9079,9080,9083],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[47,9081,9082],{},"load()"," 把文件状态恢复到内存。",[14,9085,159],{"id":159},[37,9087,9088,9091],{},[40,9089,9090],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9092,9093,9094,9096],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[47,9095,9082],{}," 是下一项必要扩展。",[14,9098,178],{"id":178},[131,9100,9101,9107,9110],{},[40,9102,9103,9104,9106],{},"增加 ",[47,9105,9082],{},"，文件不存在时从空列表开始。",[40,9108,9109],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9111,9112,9113,9116,9117,9119],{},"把输入循环放进 ",[47,9114,9115],{},"main()","，通过 ",[47,9118,6084],{}," 控制程序入口。",[10,9121,197],{},[14,9123,200],{"id":200},[10,9125,9126],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[205,9128,207],{},{"title":78,"searchDepth":91,"depth":91,"links":9130},[9131,9132,9133,9134,9135,9139,9140,9141],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":9136},[9137,9138],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8837,"description":8842},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[218,9149,9150],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9153,9256,9375,9506,9649,9774,9911,10048,10189,10358,10495,10628,10751,10880,11007,11170,11346,11487,11616,11765,11908,12029,12152,12301,12454,12619,12746,12927,13070,13227,13378,13525,13680,13898,14053,14228,14379,14546,14733,14896,15138,15378],{"id":1384,"title":1385,"body":9154,"category":218,"cover":219,"description":1390,"extension":220,"meta":9253,"navigation":100,"path":1509,"pinned":223,"publishedAt":224,"seo":9254,"slug":1511,"stem":1512,"summary":1513,"tags":9255,"updatedAt":224,"visible":100,"__hash__":1516},{"type":7,"value":9155,"toc":9243},[9156,9158,9160,9162,9164,9168,9172,9174,9184,9186,9188,9196,9198,9203,9205,9207,9217,9219,9227,9229,9235,9237,9239,9241],[10,9157,1390],{},[14,9159,16],{"id":16},[10,9161,1395],{},[14,9163,22],{"id":22},[10,9165,9166],{},[26,9167],{"alt":1402,"src":1403},[10,9169,9170,1408],{},[47,9171,1162],{},[14,9173,35],{"id":35},[37,9175,9176,9180,9182],{},[40,9177,1415,9178,1418],{},[47,9179,1162],{},[40,9181,1421],{},[40,9183,1424],{},[14,9185,68],{"id":68},[10,9187,71],{},[73,9189,9190],{"className":75,"code":1431,"language":77,"meta":78,"style":78},[47,9191,9192],{"__ignoreMap":78},[82,9193,9194],{"class":84,"line":85},[82,9195,1431],{},[10,9197,115],{},[73,9199,9201],{"className":9200,"code":1443,"language":121,"meta":78},[119],[47,9202,1443],{"__ignoreMap":78},[10,9204,126],{},[14,9206,129],{"id":129},[131,9208,9209,9213],{},[40,9210,1454,9211,1458],{},[47,9212,1457],{},[40,9214,1461,9215,1465],{},[47,9216,1464],{},[14,9218,159],{"id":159},[37,9220,9221,9223],{},[40,9222,1472],{},[40,9224,1475,9225,1478],{},[47,9226,1162],{},[14,9228,178],{"id":178},[131,9230,9231,9233],{},[40,9232,1485],{},[40,9234,1488],{},[10,9236,197],{},[14,9238,200],{"id":200},[10,9240,1495],{},[205,9242,207],{},{"title":78,"searchDepth":91,"depth":91,"links":9244},[9245,9246,9247,9248,9249,9250,9251,9252],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":1385,"description":1390},[218,1380,1515],{"id":1518,"title":1519,"body":9257,"category":218,"cover":219,"description":1524,"extension":220,"meta":9372,"navigation":100,"path":1661,"pinned":223,"publishedAt":224,"seo":9373,"slug":1663,"stem":1664,"summary":1665,"tags":9374,"updatedAt":224,"visible":100,"__hash__":1668},{"type":7,"value":9258,"toc":9362},[9259,9261,9263,9265,9267,9271,9275,9277,9287,9289,9291,9311,9313,9318,9320,9322,9332,9334,9344,9346,9354,9356,9358,9360],[10,9260,1524],{},[14,9262,16],{"id":16},[10,9264,1529],{},[14,9266,22],{"id":22},[10,9268,9269],{},[26,9270],{"alt":1536,"src":1537},[10,9272,1540,9273,1543],{},[47,9274,683],{},[14,9276,35],{"id":35},[37,9278,9279,9281,9283],{},[40,9280,1550],{},[40,9282,1553],{},[40,9284,1556,9285,1560],{},[47,9286,1559],{},[14,9288,68],{"id":68},[10,9290,1565],{},[73,9292,9293],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,9294,9295,9301],{"__ignoreMap":78},[82,9296,9297,9299],{"class":84,"line":85},[82,9298,683],{"class":592},[82,9300,596],{"class":595},[82,9302,9303,9305,9307,9309],{"class":84,"line":91},[82,9304,683],{"class":592},[82,9306,625],{"class":595},[82,9308,629],{"class":628},[82,9310,596],{"class":595},[10,9312,115],{},[73,9314,9316],{"className":9315,"code":1591,"language":121,"meta":78},[119],[47,9317,1591],{"__ignoreMap":78},[10,9319,126],{},[14,9321,129],{"id":129},[131,9323,9324,9328],{},[40,9325,9326,1605],{},[47,9327,1604],{},[40,9329,9330,1610],{},[47,9331,691],{},[14,9333,159],{"id":159},[37,9335,9336,9340],{},[40,9337,1617,9338,1620],{},[47,9339,683],{},[40,9341,1623,9342,1626],{},[47,9343,683],{},[14,9345,178],{"id":178},[131,9347,9348,9352],{},[40,9349,135,9350,1636],{},[47,9351,1635],{},[40,9353,1639],{},[10,9355,197],{},[14,9357,200],{"id":200},[10,9359,1646],{},[205,9361,1649],{},{"title":78,"searchDepth":91,"depth":91,"links":9363},[9364,9365,9366,9367,9368,9369,9370,9371],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":1519,"description":1524},[218,1667,1043],{"id":1670,"title":1671,"body":9376,"category":218,"cover":219,"description":1837,"extension":220,"meta":9503,"navigation":100,"path":1839,"pinned":223,"publishedAt":224,"seo":9504,"slug":1841,"stem":1842,"summary":1843,"tags":9505,"updatedAt":224,"visible":100,"__hash__":1847},{"type":7,"value":9377,"toc":9493},[9378,9382,9384,9386,9388,9392,9394,9396,9412,9414,9416,9436,9438,9443,9445,9447,9459,9461,9471,9473,9483,9485,9487,9491],[10,9379,1676,9380,1679],{},[47,9381,1162],{},[14,9383,16],{"id":16},[10,9385,1684],{},[14,9387,22],{"id":22},[10,9389,9390],{},[26,9391],{"alt":1691,"src":1692},[10,9393,1695],{},[14,9395,35],{"id":35},[37,9397,9398,9404,9408],{},[40,9399,1702,9400,1705,9402,156],{},[47,9401,683],{},[47,9403,1708],{},[40,9405,1711,9406,1715],{},[47,9407,1714],{},[40,9409,1718,9410,1721],{},[47,9411,1162],{},[14,9413,68],{"id":68},[10,9415,71],{},[73,9417,9418],{"className":1728,"code":1729,"language":1730,"meta":78,"style":78},[47,9419,9420,9424,9428,9432],{"__ignoreMap":78},[82,9421,9422],{"class":84,"line":85},[82,9423,1737],{},[82,9425,9426],{"class":84,"line":91},[82,9427,1742],{},[82,9429,9430],{"class":84,"line":97},[82,9431,1747],{},[82,9433,9434],{"class":84,"line":104},[82,9435,1752],{},[10,9437,115],{},[73,9439,9441],{"className":9440,"code":1758,"language":121,"meta":78},[119],[47,9442,1758],{"__ignoreMap":78},[10,9444,126],{},[14,9446,129],{"id":129},[131,9448,9449,9455],{},[40,9450,1769,9451,1773,9453,156],{},[47,9452,1772],{},[47,9454,1776],{},[40,9456,1779,9457,1782],{},[47,9458,1464],{},[14,9460,159],{"id":159},[37,9462,9463,9469],{},[40,9464,1789,9465,1792,9467,1795],{},[47,9466,1708],{},[47,9468,1162],{},[40,9470,1798],{},[14,9472,178],{"id":178},[131,9474,9475,9479],{},[40,9476,1805,9477,156],{},[47,9478,1808],{},[40,9480,1811,9481,1814],{},[47,9482,1464],{},[10,9484,197],{},[14,9486,200],{"id":200},[10,9488,1821,9489,1824],{},[47,9490,1162],{},[205,9492,207],{},{"title":78,"searchDepth":91,"depth":91,"links":9494},[9495,9496,9497,9498,9499,9500,9501,9502],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":1671,"description":1837},[218,1845,1846],{"id":1849,"title":1850,"body":9507,"category":218,"cover":219,"description":1855,"extension":220,"meta":9646,"navigation":100,"path":2027,"pinned":223,"publishedAt":224,"seo":9647,"slug":2029,"stem":2030,"summary":2031,"tags":9648,"updatedAt":224,"visible":100,"__hash__":2035},{"type":7,"value":9508,"toc":9636},[9509,9511,9513,9515,9517,9521,9525,9527,9539,9541,9543,9579,9581,9586,9588,9590,9606,9608,9618,9620,9628,9630,9632,9634],[10,9510,1855],{},[14,9512,16],{"id":16},[10,9514,1860],{},[14,9516,22],{"id":22},[10,9518,9519],{},[26,9520],{"alt":1867,"src":1868},[10,9522,9523,1874],{},[47,9524,1873],{},[14,9526,35],{"id":35},[37,9528,9529,9531,9537],{},[40,9530,1881],{},[40,9532,9533,1887,9535,1891],{},[47,9534,1886],{},[47,9536,1890],{},[40,9538,1894],{},[14,9540,68],{"id":68},[10,9542,1565],{},[73,9544,9545],{"className":583,"code":1901,"language":585,"meta":78,"style":78},[47,9546,9547,9553,9559,9563,9573],{"__ignoreMap":78},[82,9548,9549,9551],{"class":84,"line":85},[82,9550,1908],{"class":592},[82,9552,1911],{"class":628},[82,9554,9555,9557],{"class":84,"line":91},[82,9556,1916],{"class":595},[82,9558,1911],{"class":628},[82,9560,9561],{"class":84,"line":97},[82,9562,1923],{"class":595},[82,9564,9565,9567,9569,9571],{"class":84,"line":104},[82,9566,1928],{"class":595},[82,9568,1931],{"class":628},[82,9570,1935],{"class":1934},[82,9572,1206],{"class":628},[82,9574,9575,9577],{"class":84,"line":110},[82,9576,683],{"class":592},[82,9578,1206],{"class":628},[10,9580,115],{},[73,9582,9584],{"className":9583,"code":1949,"language":121,"meta":78},[119],[47,9585,1949],{"__ignoreMap":78},[10,9587,126],{},[14,9589,129],{"id":129},[131,9591,9592,9600],{},[40,9593,9594,1962,9596,1965,9598,1968],{},[47,9595,1908],{},[47,9597,1916],{},[47,9599,1886],{},[40,9601,9602,1973,9604,1977],{},[47,9603,1873],{},[47,9605,1976],{},[14,9607,159],{"id":159},[37,9609,9610,9616],{},[40,9611,1984,9612,187,9614,156],{},[47,9613,1886],{},[47,9615,1890],{},[40,9617,1991],{},[14,9619,178],{"id":178},[131,9621,9622,9626],{},[40,9623,1998,9624,2002],{},[47,9625,2001],{},[40,9627,2005],{},[10,9629,197],{},[14,9631,200],{"id":200},[10,9633,2012],{},[205,9635,2015],{},{"title":78,"searchDepth":91,"depth":91,"links":9637},[9638,9639,9640,9641,9642,9643,9644,9645],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":1850,"description":1855},[218,2033,2034],{"id":2037,"title":2038,"body":9650,"category":218,"cover":219,"description":2043,"extension":220,"meta":9771,"navigation":100,"path":2191,"pinned":223,"publishedAt":224,"seo":9772,"slug":2193,"stem":2194,"summary":2195,"tags":9773,"updatedAt":224,"visible":100,"__hash__":2199},{"type":7,"value":9651,"toc":9761},[9652,9654,9656,9658,9660,9664,9672,9674,9688,9690,9692,9708,9710,9715,9717,9719,9733,9735,9741,9743,9753,9755,9757,9759],[10,9653,2043],{},[14,9655,16],{"id":16},[10,9657,2048],{},[14,9659,22],{"id":22},[10,9661,9662],{},[26,9663],{"alt":2055,"src":2056},[10,9665,2059,9666,156,9668,2065,9670,156],{},[47,9667,1464],{},[47,9669,2064],{},[47,9671,1772],{},[14,9673,35],{"id":35},[37,9675,9676,9680,9686],{},[40,9677,9678,2077],{},[47,9679,2076],{},[40,9681,9682,2083,9684,156],{},[47,9683,2082],{},[47,9685,2086],{},[40,9687,2089],{},[14,9689,68],{"id":68},[10,9691,71],{},[73,9693,9694],{"className":75,"code":2096,"language":77,"meta":78,"style":78},[47,9695,9696,9700,9704],{"__ignoreMap":78},[82,9697,9698],{"class":84,"line":85},[82,9699,2103],{},[82,9701,9702],{"class":84,"line":91},[82,9703,2108],{},[82,9705,9706],{"class":84,"line":97},[82,9707,2113],{},[10,9709,115],{},[73,9711,9713],{"className":9712,"code":2119,"language":121,"meta":78},[119],[47,9714,2119],{"__ignoreMap":78},[10,9716,126],{},[14,9718,129],{"id":129},[131,9720,9721,9727],{},[40,9722,9723,2133,9725,156],{},[47,9724,2132],{},[47,9726,2086],{},[40,9728,9729,2140,9731,2144],{},[47,9730,1464],{},[47,9732,2143],{},[14,9734,159],{"id":159},[37,9736,9737,9739],{},[40,9738,2151],{},[40,9740,2154],{},[14,9742,178],{"id":178},[131,9744,9745,9747],{},[40,9746,2161],{},[40,9748,2164,9749,50,9751,2170],{},[47,9750,2064],{},[47,9752,2169],{},[10,9754,197],{},[14,9756,200],{"id":200},[10,9758,2177],{},[205,9760,207],{},{"title":78,"searchDepth":91,"depth":91,"links":9762},[9763,9764,9765,9766,9767,9768,9769,9770],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":2038,"description":2043},[218,2197,2198],{"id":4,"title":5,"body":9775,"category":218,"cover":219,"description":12,"extension":220,"meta":9908,"navigation":100,"path":222,"pinned":223,"publishedAt":224,"seo":9909,"slug":226,"stem":227,"summary":228,"tags":9910,"updatedAt":224,"visible":100,"__hash__":232},{"type":7,"value":9776,"toc":9898},[9777,9779,9781,9783,9785,9789,9791,9793,9809,9811,9813,9837,9839,9844,9846,9848,9864,9866,9878,9880,9890,9892,9894,9896],[10,9778,12],{},[14,9780,16],{"id":16},[10,9782,19],{},[14,9784,22],{"id":22},[10,9786,9787],{},[26,9788],{"alt":28,"src":29},[10,9790,32],{},[14,9792,35],{"id":35},[37,9794,9795,9797,9803],{},[40,9796,42],{},[40,9798,45,9799,50,9801,54],{},[47,9800,49],{},[47,9802,53],{},[40,9804,57,9805,61,9807,65],{},[47,9806,60],{},[47,9808,64],{},[14,9810,68],{"id":68},[10,9812,71],{},[73,9814,9815],{"className":75,"code":76,"language":77,"meta":78,"style":78},[47,9816,9817,9821,9825,9829,9833],{"__ignoreMap":78},[82,9818,9819],{"class":84,"line":85},[82,9820,88],{},[82,9822,9823],{"class":84,"line":91},[82,9824,94],{},[82,9826,9827],{"class":84,"line":97},[82,9828,101],{"emptyLinePlaceholder":100},[82,9830,9831],{"class":84,"line":104},[82,9832,107],{},[82,9834,9835],{"class":84,"line":110},[82,9836,94],{},[10,9838,115],{},[73,9840,9842],{"className":9841,"code":120,"language":121,"meta":78},[119],[47,9843,120],{"__ignoreMap":78},[10,9845,126],{},[14,9847,129],{"id":129},[131,9849,9850,9856],{},[40,9851,135,9852,139,9854,142],{},[47,9853,138],{},[47,9855,49],{},[40,9857,135,9858,148,9860,152,9862,156],{},[47,9859,147],{},[47,9861,151],{},[47,9863,155],{},[14,9865,159],{"id":159},[37,9867,9868,9870],{},[40,9869,164],{},[40,9871,167,9872,61,9874,61,9876,175],{},[47,9873,60],{},[47,9875,64],{},[47,9877,174],{},[14,9879,178],{"id":178},[131,9881,9882,9888],{},[40,9883,183,9884,187,9886,191],{},[47,9885,186],{},[47,9887,190],{},[40,9889,194],{},[10,9891,197],{},[14,9893,200],{"id":200},[10,9895,203],{},[205,9897,207],{},{"title":78,"searchDepth":91,"depth":91,"links":9899},[9900,9901,9902,9903,9904,9905,9906,9907],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5,"description":12},[218,230,231],{"id":2338,"title":2339,"body":9912,"category":218,"cover":219,"description":2344,"extension":220,"meta":10045,"navigation":100,"path":2511,"pinned":223,"publishedAt":224,"seo":10046,"slug":2513,"stem":2514,"summary":2515,"tags":10047,"updatedAt":224,"visible":100,"__hash__":2519},{"type":7,"value":9913,"toc":10035},[9914,9916,9918,9920,9922,9926,9928,9930,9948,9950,9952,9988,9990,9995,9997,9999,10009,10011,10019,10021,10027,10029,10031,10033],[10,9915,2344],{},[14,9917,16],{"id":16},[10,9919,2349],{},[14,9921,22],{"id":22},[10,9923,9924],{},[26,9925],{"alt":2356,"src":2357},[10,9927,2360],{},[14,9929,35],{"id":35},[37,9931,9932,9938,9946],{},[40,9933,9934,2370,9936,2374],{},[47,9935,2369],{},[47,9937,2373],{},[40,9939,9940,2380,9942,2384,9944,2388],{},[47,9941,2379],{},[47,9943,2383],{},[47,9945,2387],{},[40,9947,2391],{},[14,9949,68],{"id":68},[10,9951,71],{},[73,9953,9954],{"className":75,"code":2398,"language":77,"meta":78,"style":78},[47,9955,9956,9960,9964,9968,9972,9976,9980,9984],{"__ignoreMap":78},[82,9957,9958],{"class":84,"line":85},[82,9959,2405],{},[82,9961,9962],{"class":84,"line":91},[82,9963,2410],{},[82,9965,9966],{"class":84,"line":97},[82,9967,2415],{},[82,9969,9970],{"class":84,"line":104},[82,9971,101],{"emptyLinePlaceholder":100},[82,9973,9974],{"class":84,"line":110},[82,9975,2424],{},[82,9977,9978],{"class":84,"line":1140},[82,9979,2429],{},[82,9981,9982],{"class":84,"line":2432},[82,9983,2435],{},[82,9985,9986],{"class":84,"line":2438},[82,9987,2441],{},[10,9989,115],{},[73,9991,9993],{"className":9992,"code":2447,"language":121,"meta":78},[119],[47,9994,2447],{"__ignoreMap":78},[10,9996,126],{},[14,9998,129],{"id":129},[131,10000,10001,10005],{},[40,10002,10003,2461],{},[47,10004,2460],{},[40,10006,10007,2467],{},[47,10008,2466],{},[14,10010,159],{"id":159},[37,10012,10013,10017],{},[40,10014,2474,10015,156],{},[47,10016,2477],{},[40,10018,2480],{},[14,10020,178],{"id":178},[131,10022,10023,10025],{},[40,10024,2487],{},[40,10026,2490],{},[10,10028,197],{},[14,10030,200],{"id":200},[10,10032,2497],{},[205,10034,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10036},[10037,10038,10039,10040,10041,10042,10043,10044],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":2339,"description":2344},[218,2517,2518],{"id":2521,"title":2522,"body":10049,"category":218,"cover":219,"description":2527,"extension":220,"meta":10186,"navigation":100,"path":2704,"pinned":223,"publishedAt":224,"seo":10187,"slug":2706,"stem":2707,"summary":2708,"tags":10188,"updatedAt":224,"visible":100,"__hash__":2712},{"type":7,"value":10050,"toc":10174},[10051,10053,10055,10057,10059,10063,10069,10071,10079,10081,10083,10107,10109,10114,10116,10118,10136,10138,10140,10144,10146,10148,10154,10156,10166,10168,10170,10172],[10,10052,2527],{},[14,10054,16],{"id":16},[10,10056,2532],{},[14,10058,22],{"id":22},[10,10060,10061],{},[26,10062],{"alt":2539,"src":2540},[10,10064,2543,10065,2547,10067,156],{},[47,10066,2546],{},[47,10068,2550],{},[14,10070,35],{"id":35},[37,10072,10073,10075,10077],{},[40,10074,2557],{},[40,10076,2560],{},[40,10078,2563],{},[14,10080,68],{"id":68},[10,10082,71],{},[73,10084,10085],{"className":75,"code":2570,"language":77,"meta":78,"style":78},[47,10086,10087,10091,10095,10099,10103],{"__ignoreMap":78},[82,10088,10089],{"class":84,"line":85},[82,10090,2577],{},[82,10092,10093],{"class":84,"line":91},[82,10094,2582],{},[82,10096,10097],{"class":84,"line":97},[82,10098,2587],{},[82,10100,10101],{"class":84,"line":104},[82,10102,2592],{},[82,10104,10105],{"class":84,"line":110},[82,10106,2597],{},[10,10108,115],{},[73,10110,10112],{"className":10111,"code":2603,"language":121,"meta":78},[119],[47,10113,2603],{"__ignoreMap":78},[10,10115,126],{},[14,10117,129],{"id":129},[131,10119,10120,10128],{},[40,10121,2614,10122,2617,10124,2621,10126,2625],{},[47,10123,218],{},[47,10125,2620],{},[47,10127,2624],{},[40,10129,10130,2631,10132,2635,10134,2639],{},[47,10131,2630],{},[47,10133,2634],{},[47,10135,2638],{},[321,10137,2642],{"id":2642},[10,10139,2645],{},[10,10141,10142],{},[26,10143],{"alt":2650,"src":2651},[10,10145,2654],{},[14,10147,159],{"id":159},[37,10149,10150,10152],{},[40,10151,2661],{},[40,10153,2664],{},[14,10155,178],{"id":178},[131,10157,10158,10164],{},[40,10159,2671,10160,2675,10162,156],{},[47,10161,2674],{},[47,10163,2678],{},[40,10165,2681],{},[10,10167,197],{},[14,10169,200],{"id":200},[10,10171,2688],{},[205,10173,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10175},[10176,10177,10178,10179,10180,10183,10184,10185],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":10181},[10182],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":2522,"description":2527},[218,2710,2711],{"id":2714,"title":2715,"body":10190,"category":218,"cover":219,"description":2720,"extension":220,"meta":10355,"navigation":100,"path":2935,"pinned":223,"publishedAt":224,"seo":10356,"slug":2937,"stem":2938,"summary":2939,"tags":10357,"updatedAt":224,"visible":100,"__hash__":2943},{"type":7,"value":10191,"toc":10343},[10192,10194,10196,10198,10200,10204,10210,10212,10232,10234,10236,10272,10274,10279,10281,10283,10297,10299,10301,10305,10311,10313,10323,10325,10335,10337,10339,10341],[10,10193,2720],{},[14,10195,16],{"id":16},[10,10197,2725],{},[14,10199,22],{"id":22},[10,10201,10202],{},[26,10203],{"alt":2732,"src":2733},[10,10205,2736,10206,1000,10208,2743],{},[47,10207,2739],{},[47,10209,2742],{},[14,10211,35],{"id":35},[37,10213,10214,10222,10230],{},[40,10215,10216,2753,10218,2757,10220,2761],{},[47,10217,2752],{},[47,10219,2756],{},[47,10221,2760],{},[40,10223,10224,2767,10226,2771,10228,2775],{},[47,10225,2766],{},[47,10227,2770],{},[47,10229,2774],{},[40,10231,2778],{},[14,10233,68],{"id":68},[10,10235,71],{},[73,10237,10238],{"className":75,"code":2785,"language":77,"meta":78,"style":78},[47,10239,10240,10244,10248,10252,10256,10260,10264,10268],{"__ignoreMap":78},[82,10241,10242],{"class":84,"line":85},[82,10243,2792],{},[82,10245,10246],{"class":84,"line":91},[82,10247,2797],{},[82,10249,10250],{"class":84,"line":97},[82,10251,101],{"emptyLinePlaceholder":100},[82,10253,10254],{"class":84,"line":104},[82,10255,2806],{},[82,10257,10258],{"class":84,"line":110},[82,10259,2811],{},[82,10261,10262],{"class":84,"line":1140},[82,10263,2816],{},[82,10265,10266],{"class":84,"line":2432},[82,10267,2821],{},[82,10269,10270],{"class":84,"line":2438},[82,10271,2826],{},[10,10273,115],{},[73,10275,10277],{"className":10276,"code":2832,"language":121,"meta":78},[119],[47,10278,2832],{"__ignoreMap":78},[10,10280,126],{},[14,10282,129],{"id":129},[131,10284,10285,10291],{},[40,10286,10287,2846,10289,2850],{},[47,10288,2845],{},[47,10290,2849],{},[40,10292,10293,2856,10295,2859],{},[47,10294,2855],{},[47,10296,2774],{},[321,10298,2642],{"id":2642},[10,10300,2864],{},[10,10302,10303],{},[26,10304],{"alt":2869,"src":2870},[10,10306,10307,2875,10309,2878],{},[47,10308,2766],{},[47,10310,2770],{},[14,10312,159],{"id":159},[37,10314,10315,10321],{},[40,10316,2885,10317,2888,10319,2891],{},[47,10318,2760],{},[47,10320,2752],{},[40,10322,2894],{},[14,10324,178],{"id":178},[131,10326,10327,10331],{},[40,10328,2901,10329,2905],{},[47,10330,2904],{},[40,10332,2908,10333,2912],{},[47,10334,2911],{},[10,10336,197],{},[14,10338,200],{"id":200},[10,10340,2919],{},[205,10342,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10344},[10345,10346,10347,10348,10349,10352,10353,10354],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":10350},[10351],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":2715,"description":2720},[218,2941,2942],{"id":2945,"title":2946,"body":10359,"category":218,"cover":219,"description":2951,"extension":220,"meta":10492,"navigation":100,"path":3120,"pinned":223,"publishedAt":224,"seo":10493,"slug":3122,"stem":3123,"summary":3124,"tags":10494,"updatedAt":224,"visible":100,"__hash__":3127},{"type":7,"value":10360,"toc":10482},[10361,10363,10365,10367,10369,10373,10383,10385,10395,10397,10399,10427,10429,10434,10436,10438,10452,10454,10462,10464,10474,10476,10478,10480],[10,10362,2951],{},[14,10364,16],{"id":16},[10,10366,2956],{},[14,10368,22],{"id":22},[10,10370,10371],{},[26,10372],{"alt":2963,"src":2964},[10,10374,10375,2970,10377,2974,10379,2978,10381,2982],{},[47,10376,2969],{},[47,10378,2973],{},[47,10380,2977],{},[47,10382,2981],{},[14,10384,35],{"id":35},[37,10386,10387,10389,10393],{},[40,10388,2989],{},[40,10390,10391,2994],{},[47,10392,2981],{},[40,10394,2997],{},[14,10396,68],{"id":68},[10,10398,71],{},[73,10400,10401],{"className":75,"code":3004,"language":77,"meta":78,"style":78},[47,10402,10403,10407,10411,10415,10419,10423],{"__ignoreMap":78},[82,10404,10405],{"class":84,"line":85},[82,10406,3011],{},[82,10408,10409],{"class":84,"line":91},[82,10410,3016],{},[82,10412,10413],{"class":84,"line":97},[82,10414,3021],{},[82,10416,10417],{"class":84,"line":104},[82,10418,101],{"emptyLinePlaceholder":100},[82,10420,10421],{"class":84,"line":110},[82,10422,3030],{},[82,10424,10425],{"class":84,"line":1140},[82,10426,3035],{},[10,10428,115],{},[73,10430,10432],{"className":10431,"code":3041,"language":121,"meta":78},[119],[47,10433,3041],{"__ignoreMap":78},[10,10435,126],{},[14,10437,129],{"id":129},[131,10439,10440,10446],{},[40,10441,3052,10442,3055,10444,3059],{},[47,10443,2969],{},[47,10445,3058],{},[40,10447,10448,3065,10450,3069],{},[47,10449,3064],{},[47,10451,3068],{},[14,10453,159],{"id":159},[37,10455,10456,10460],{},[40,10457,3076,10458,3080],{},[47,10459,3079],{},[40,10461,3083],{},[14,10463,178],{"id":178},[131,10465,10466,10468],{},[40,10467,3090],{},[40,10469,1711,10470,3096,10472,3099],{},[47,10471,3095],{},[47,10473,2981],{},[10,10475,197],{},[14,10477,200],{"id":200},[10,10479,3106],{},[205,10481,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10483},[10484,10485,10486,10487,10488,10489,10490,10491],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":2946,"description":2951},[218,174,3126],{"id":3129,"title":3130,"body":10496,"category":218,"cover":219,"description":3135,"extension":220,"meta":10625,"navigation":100,"path":3296,"pinned":223,"publishedAt":224,"seo":10626,"slug":3298,"stem":3299,"summary":3300,"tags":10627,"updatedAt":224,"visible":100,"__hash__":3304},{"type":7,"value":10497,"toc":10615},[10498,10500,10502,10504,10506,10510,10514,10516,10526,10528,10530,10562,10564,10569,10571,10573,10585,10587,10597,10599,10607,10609,10611,10613],[10,10499,3135],{},[14,10501,16],{"id":16},[10,10503,3140],{},[14,10505,22],{"id":22},[10,10507,10508],{},[26,10509],{"alt":3147,"src":3148},[10,10511,3151,10512,3155],{},[47,10513,3154],{},[14,10515,35],{"id":35},[37,10517,10518,10520,10522],{},[40,10519,3162],{},[40,10521,3165],{},[40,10523,3168,10524,156],{},[47,10525,3171],{},[14,10527,68],{"id":68},[10,10529,71],{},[73,10531,10532],{"className":75,"code":3178,"language":77,"meta":78,"style":78},[47,10533,10534,10538,10542,10546,10550,10554,10558],{"__ignoreMap":78},[82,10535,10536],{"class":84,"line":85},[82,10537,3185],{},[82,10539,10540],{"class":84,"line":91},[82,10541,3190],{},[82,10543,10544],{"class":84,"line":97},[82,10545,101],{"emptyLinePlaceholder":100},[82,10547,10548],{"class":84,"line":104},[82,10549,3199],{},[82,10551,10552],{"class":84,"line":110},[82,10553,3204],{},[82,10555,10556],{"class":84,"line":1140},[82,10557,3209],{},[82,10559,10560],{"class":84,"line":2432},[82,10561,3214],{},[10,10563,115],{},[73,10565,10567],{"className":10566,"code":3220,"language":121,"meta":78},[119],[47,10568,3220],{"__ignoreMap":78},[10,10570,126],{},[14,10572,129],{"id":129},[131,10574,10575,10577],{},[40,10576,3231],{},[40,10578,10579,3237,10581,3241,10583,3245],{},[47,10580,3236],{},[47,10582,3240],{},[47,10584,3244],{},[14,10586,159],{"id":159},[37,10588,10589,10595],{},[40,10590,3252,10591,3256,10593,156],{},[47,10592,3255],{},[47,10594,3259],{},[40,10596,3262],{},[14,10598,178],{"id":178},[131,10600,10601,10603],{},[40,10602,3269],{},[40,10604,3272,10605,3275],{},[47,10606,3244],{},[10,10608,197],{},[14,10610,200],{"id":200},[10,10612,3282],{},[205,10614,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10616},[10617,10618,10619,10620,10621,10622,10623,10624],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":3130,"description":3135},[218,3302,3303],{"id":3306,"title":3307,"body":10629,"category":218,"cover":219,"description":3312,"extension":220,"meta":10748,"navigation":100,"path":3454,"pinned":223,"publishedAt":224,"seo":10749,"slug":3456,"stem":3457,"summary":3458,"tags":10750,"updatedAt":224,"visible":100,"__hash__":3461},{"type":7,"value":10630,"toc":10738},[10631,10633,10635,10637,10639,10643,10645,10647,10655,10657,10659,10687,10689,10694,10696,10698,10708,10710,10718,10720,10730,10732,10734,10736],[10,10632,3312],{},[14,10634,16],{"id":16},[10,10636,3317],{},[14,10638,22],{"id":22},[10,10640,10641],{},[26,10642],{"alt":3324,"src":3325},[10,10644,3328],{},[14,10646,35],{"id":35},[37,10648,10649,10651,10653],{},[40,10650,3335],{},[40,10652,3338],{},[40,10654,3341],{},[14,10656,68],{"id":68},[10,10658,71],{},[73,10660,10661],{"className":75,"code":3348,"language":77,"meta":78,"style":78},[47,10662,10663,10667,10671,10675,10679,10683],{"__ignoreMap":78},[82,10664,10665],{"class":84,"line":85},[82,10666,3355],{},[82,10668,10669],{"class":84,"line":91},[82,10670,3360],{},[82,10672,10673],{"class":84,"line":97},[82,10674,3365],{},[82,10676,10677],{"class":84,"line":104},[82,10678,101],{"emptyLinePlaceholder":100},[82,10680,10681],{"class":84,"line":110},[82,10682,3374],{},[82,10684,10685],{"class":84,"line":1140},[82,10686,3379],{},[10,10688,115],{},[73,10690,10692],{"className":10691,"code":3385,"language":121,"meta":78},[119],[47,10693,3385],{"__ignoreMap":78},[10,10695,126],{},[14,10697,129],{"id":129},[131,10699,10700,10704],{},[40,10701,10702,3399],{},[47,10703,3398],{},[40,10705,10706,3405],{},[47,10707,3404],{},[14,10709,159],{"id":159},[37,10711,10712,10716],{},[40,10713,3412,10714,3416],{},[47,10715,3415],{},[40,10717,3419],{},[14,10719,178],{"id":178},[131,10721,10722,10724],{},[40,10723,3426],{},[40,10725,2164,10726,50,10728,3433],{},[47,10727,3415],{},[47,10729,3404],{},[10,10731,197],{},[14,10733,200],{"id":200},[10,10735,3440],{},[205,10737,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10739},[10740,10741,10742,10743,10744,10745,10746,10747],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":3307,"description":3312},[218,3460,3303],{"id":3463,"title":3464,"body":10752,"category":218,"cover":219,"description":3469,"extension":220,"meta":10877,"navigation":100,"path":3625,"pinned":223,"publishedAt":224,"seo":10878,"slug":3627,"stem":3628,"summary":3629,"tags":10879,"updatedAt":224,"visible":100,"__hash__":3632},{"type":7,"value":10753,"toc":10867},[10754,10756,10758,10760,10762,10766,10772,10774,10784,10786,10788,10816,10818,10823,10825,10827,10837,10839,10851,10853,10859,10861,10863,10865],[10,10755,3469],{},[14,10757,16],{"id":16},[10,10759,3474],{},[14,10761,22],{"id":22},[10,10763,10764],{},[26,10765],{"alt":3481,"src":3482},[10,10767,3485,10768,3489,10770,3492],{},[47,10769,3488],{},[47,10771,49],{},[14,10773,35],{"id":35},[37,10775,10776,10778,10782],{},[40,10777,3499],{},[40,10779,167,10780,3505],{},[47,10781,3504],{},[40,10783,3508],{},[14,10785,68],{"id":68},[10,10787,71],{},[73,10789,10790],{"className":75,"code":3515,"language":77,"meta":78,"style":78},[47,10791,10792,10796,10800,10804,10808,10812],{"__ignoreMap":78},[82,10793,10794],{"class":84,"line":85},[82,10795,3522],{},[82,10797,10798],{"class":84,"line":91},[82,10799,3527],{},[82,10801,10802],{"class":84,"line":97},[82,10803,101],{"emptyLinePlaceholder":100},[82,10805,10806],{"class":84,"line":104},[82,10807,3536],{},[82,10809,10810],{"class":84,"line":110},[82,10811,3541],{},[82,10813,10814],{"class":84,"line":1140},[82,10815,3546],{},[10,10817,115],{},[73,10819,10821],{"className":10820,"code":3552,"language":121,"meta":78},[119],[47,10822,3552],{"__ignoreMap":78},[10,10824,126],{},[14,10826,129],{"id":129},[131,10828,10829,10831],{},[40,10830,3563],{},[40,10832,3566,10833,3569,10835,3573],{},[47,10834,49],{},[47,10836,3572],{},[14,10838,159],{"id":159},[37,10840,10841,10845],{},[40,10842,3580,10843,3584],{},[47,10844,3583],{},[40,10846,3587,10847,3591,10849,156],{},[47,10848,3590],{},[47,10850,3594],{},[14,10852,178],{"id":178},[131,10854,10855,10857],{},[40,10856,3601],{},[40,10858,3604],{},[10,10860,197],{},[14,10862,200],{"id":200},[10,10864,3611],{},[205,10866,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10868},[10869,10870,10871,10872,10873,10874,10875,10876],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":3464,"description":3469},[218,3631,3303],{"id":3634,"title":3635,"body":10881,"category":218,"cover":219,"description":3640,"extension":220,"meta":11004,"navigation":100,"path":3790,"pinned":223,"publishedAt":224,"seo":11005,"slug":3792,"stem":3793,"summary":3794,"tags":11006,"updatedAt":224,"visible":100,"__hash__":3797},{"type":7,"value":10882,"toc":10994},[10883,10885,10887,10889,10891,10895,10897,10899,10911,10913,10915,10943,10945,10950,10952,10954,10964,10966,10976,10978,10986,10988,10990,10992],[10,10884,3640],{},[14,10886,16],{"id":16},[10,10888,3645],{},[14,10890,22],{"id":22},[10,10892,10893],{},[26,10894],{"alt":3652,"src":3653},[10,10896,3656],{},[14,10898,35],{"id":35},[37,10900,10901,10903,10905],{},[40,10902,3663],{},[40,10904,3666],{},[40,10906,3669,10907,3673,10909,3677],{},[47,10908,3672],{},[47,10910,3676],{},[14,10912,68],{"id":68},[10,10914,71],{},[73,10916,10917],{"className":75,"code":3684,"language":77,"meta":78,"style":78},[47,10918,10919,10923,10927,10931,10935,10939],{"__ignoreMap":78},[82,10920,10921],{"class":84,"line":85},[82,10922,3691],{},[82,10924,10925],{"class":84,"line":91},[82,10926,3696],{},[82,10928,10929],{"class":84,"line":97},[82,10930,101],{"emptyLinePlaceholder":100},[82,10932,10933],{"class":84,"line":104},[82,10934,3705],{},[82,10936,10937],{"class":84,"line":110},[82,10938,3710],{},[82,10940,10941],{"class":84,"line":1140},[82,10942,3715],{},[10,10944,115],{},[73,10946,10948],{"className":10947,"code":3721,"language":121,"meta":78},[119],[47,10949,3721],{"__ignoreMap":78},[10,10951,126],{},[14,10953,129],{"id":129},[131,10955,10956,10958],{},[40,10957,3732],{},[40,10959,10960,3738,10962,3742],{},[47,10961,3737],{},[47,10963,3741],{},[14,10965,159],{"id":159},[37,10967,10968,10974],{},[40,10969,167,10970,3751,10972,156],{},[47,10971,3676],{},[47,10973,3672],{},[40,10975,3756],{},[14,10977,178],{"id":178},[131,10979,10980,10984],{},[40,10981,3763,10982,3766],{},[47,10983,3672],{},[40,10985,3769],{},[10,10987,197],{},[14,10989,200],{"id":200},[10,10991,3776],{},[205,10993,207],{},{"title":78,"searchDepth":91,"depth":91,"links":10995},[10996,10997,10998,10999,11000,11001,11002,11003],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":3635,"description":3640},[218,3796,3303],{"id":3799,"title":3800,"body":11008,"category":218,"cover":219,"description":3805,"extension":220,"meta":11167,"navigation":100,"path":4004,"pinned":223,"publishedAt":224,"seo":11168,"slug":4006,"stem":4007,"summary":4008,"tags":11169,"updatedAt":224,"visible":100,"__hash__":4012},{"type":7,"value":11009,"toc":11155},[11010,11012,11014,11016,11018,11022,11028,11030,11042,11044,11046,11086,11088,11093,11095,11097,11111,11113,11115,11119,11121,11123,11133,11135,11147,11149,11151,11153],[10,11011,3805],{},[14,11013,16],{"id":16},[10,11015,3810],{},[14,11017,22],{"id":22},[10,11019,11020],{},[26,11021],{"alt":3817,"src":3818},[10,11023,11024,3824,11026,3828],{},[47,11025,3823],{},[47,11027,3827],{},[14,11029,35],{"id":35},[37,11031,11032,11038,11040],{},[40,11033,11034,3837,11036,3841],{},[47,11035,2752],{},[47,11037,3840],{},[40,11039,3844],{},[40,11041,3847],{},[14,11043,68],{"id":68},[10,11045,71],{},[73,11047,11048],{"className":75,"code":3854,"language":77,"meta":78,"style":78},[47,11049,11050,11054,11058,11062,11066,11070,11074,11078,11082],{"__ignoreMap":78},[82,11051,11052],{"class":84,"line":85},[82,11053,3861],{},[82,11055,11056],{"class":84,"line":91},[82,11057,3866],{},[82,11059,11060],{"class":84,"line":97},[82,11061,3871],{},[82,11063,11064],{"class":84,"line":104},[82,11065,101],{"emptyLinePlaceholder":100},[82,11067,11068],{"class":84,"line":110},[82,11069,3880],{},[82,11071,11072],{"class":84,"line":1140},[82,11073,3885],{},[82,11075,11076],{"class":84,"line":2432},[82,11077,3890],{},[82,11079,11080],{"class":84,"line":2438},[82,11081,3895],{},[82,11083,11084],{"class":84,"line":3898},[82,11085,3901],{},[10,11087,115],{},[73,11089,11091],{"className":11090,"code":3907,"language":121,"meta":78},[119],[47,11092,3907],{"__ignoreMap":78},[10,11094,126],{},[14,11096,129],{"id":129},[131,11098,11099,11103],{},[40,11100,11101,3921],{},[47,11102,3920],{},[40,11104,11105,3927,11107,3931,11109,3935],{},[47,11106,3926],{},[47,11108,3930],{},[47,11110,3934],{},[321,11112,2642],{"id":2642},[10,11114,3940],{},[10,11116,11117],{},[26,11118],{"alt":3945,"src":3946},[10,11120,3949],{},[14,11122,159],{"id":159},[37,11124,11125,11131],{},[40,11126,3956,11127,3959,11129,156],{},[47,11128,2752],{},[47,11130,3840],{},[40,11132,3964],{},[14,11134,178],{"id":178},[131,11136,11137,11139],{},[40,11138,3971],{},[40,11140,167,11141,3977,11143,187,11145,156],{},[47,11142,3976],{},[47,11144,3840],{},[47,11146,2752],{},[10,11148,197],{},[14,11150,200],{"id":200},[10,11152,3988],{},[205,11154,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11156},[11157,11158,11159,11160,11161,11164,11165,11166],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":11162},[11163],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":3800,"description":3805},[218,4010,4011],{"id":4014,"title":4015,"body":11171,"category":218,"cover":219,"description":4020,"extension":220,"meta":11343,"navigation":100,"path":4234,"pinned":223,"publishedAt":224,"seo":11344,"slug":4236,"stem":4237,"summary":4238,"tags":11345,"updatedAt":224,"visible":100,"__hash__":4241},{"type":7,"value":11172,"toc":11330},[11173,11175,11177,11179,11181,11185,11193,11195,11203,11205,11207,11251,11253,11258,11260,11262,11274,11276,11278,11282,11288,11290,11292,11296,11300,11302,11314,11316,11322,11324,11326,11328],[10,11174,4020],{},[14,11176,16],{"id":16},[10,11178,4025],{},[14,11180,22],{"id":22},[10,11182,11183],{},[26,11184],{"alt":4032,"src":4033},[10,11186,11187,61,11189,61,11191,4043],{},[47,11188,1148],{},[47,11190,4040],{},[47,11192,1151],{},[14,11194,35],{"id":35},[37,11196,11197,11199,11201],{},[40,11198,4050],{},[40,11200,4053],{},[40,11202,4056],{},[14,11204,68],{"id":68},[10,11206,71],{},[73,11208,11209],{"className":75,"code":4063,"language":77,"meta":78,"style":78},[47,11210,11211,11215,11219,11223,11227,11231,11235,11239,11243,11247],{"__ignoreMap":78},[82,11212,11213],{"class":84,"line":85},[82,11214,4070],{},[82,11216,11217],{"class":84,"line":91},[82,11218,101],{"emptyLinePlaceholder":100},[82,11220,11221],{"class":84,"line":97},[82,11222,4079],{},[82,11224,11225],{"class":84,"line":104},[82,11226,4084],{},[82,11228,11229],{"class":84,"line":110},[82,11230,4089],{},[82,11232,11233],{"class":84,"line":1140},[82,11234,4094],{},[82,11236,11237],{"class":84,"line":2432},[82,11238,1137],{},[82,11240,11241],{"class":84,"line":2438},[82,11242,4103],{},[82,11244,11245],{"class":84,"line":3898},[82,11246,101],{"emptyLinePlaceholder":100},[82,11248,11249],{"class":84,"line":4110},[82,11250,4113],{},[10,11252,115],{},[73,11254,11256],{"className":11255,"code":4119,"language":121,"meta":78},[119],[47,11257,4119],{"__ignoreMap":78},[10,11259,126],{},[14,11261,129],{"id":129},[131,11263,11264,11268],{},[40,11265,4130,11266,4134],{},[47,11267,4133],{},[40,11269,11270,4140,11272,4143],{},[47,11271,4139],{},[47,11273,1151],{},[321,11275,2642],{"id":2642},[10,11277,4148],{},[10,11279,11280],{},[26,11281],{"alt":4153,"src":4154},[10,11283,11284,4159,11286,4162],{},[47,11285,4133],{},[47,11287,4139],{},[321,11289,2642],{"id":4165},[10,11291,4168],{},[10,11293,11294],{},[26,11295],{"alt":4173,"src":4174},[10,11297,4177,11298,4180],{},[47,11299,1148],{},[14,11301,159],{"id":159},[37,11303,11304,11308],{},[40,11305,4187,11306,4190],{},[47,11307,4139],{},[40,11309,4193,11310,4196,11312,4200],{},[47,11311,1148],{},[47,11313,4199],{},[14,11315,178],{"id":178},[131,11317,11318,11320],{},[40,11319,4207],{},[40,11321,4210],{},[10,11323,197],{},[14,11325,200],{"id":200},[10,11327,4217],{},[205,11329,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11331},[11332,11333,11334,11335,11336,11340,11341,11342],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":11337},[11338,11339],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4015,"description":4020},[218,1148,4240],{"id":4243,"title":4244,"body":11347,"category":218,"cover":219,"description":4249,"extension":220,"meta":11484,"navigation":100,"path":4416,"pinned":223,"publishedAt":224,"seo":11485,"slug":4418,"stem":4419,"summary":4420,"tags":11486,"updatedAt":224,"visible":100,"__hash__":4423},{"type":7,"value":11348,"toc":11472},[11349,11351,11353,11355,11357,11361,11365,11367,11377,11379,11381,11413,11415,11420,11422,11424,11434,11436,11438,11442,11446,11448,11454,11456,11464,11466,11468,11470],[10,11350,4249],{},[14,11352,16],{"id":16},[10,11354,4254],{},[14,11356,22],{"id":22},[10,11358,11359],{},[26,11360],{"alt":4261,"src":4262},[10,11362,11363,4268],{},[47,11364,4267],{},[14,11366,35],{"id":35},[37,11368,11369,11371,11373],{},[40,11370,4275],{},[40,11372,4278],{},[40,11374,4281,11375,4285],{},[47,11376,4284],{},[14,11378,68],{"id":68},[10,11380,71],{},[73,11382,11383],{"className":75,"code":4292,"language":77,"meta":78,"style":78},[47,11384,11385,11389,11393,11397,11401,11405,11409],{"__ignoreMap":78},[82,11386,11387],{"class":84,"line":85},[82,11388,4299],{},[82,11390,11391],{"class":84,"line":91},[82,11392,101],{"emptyLinePlaceholder":100},[82,11394,11395],{"class":84,"line":97},[82,11396,4308],{},[82,11398,11399],{"class":84,"line":104},[82,11400,4313],{},[82,11402,11403],{"class":84,"line":110},[82,11404,4318],{},[82,11406,11407],{"class":84,"line":1140},[82,11408,101],{"emptyLinePlaceholder":100},[82,11410,11411],{"class":84,"line":2432},[82,11412,4327],{},[10,11414,115],{},[73,11416,11418],{"className":11417,"code":4333,"language":121,"meta":78},[119],[47,11419,4333],{"__ignoreMap":78},[10,11421,126],{},[14,11423,129],{"id":129},[131,11425,11426,11430],{},[40,11427,4344,11428,4348],{},[47,11429,4347],{},[40,11431,4351,11432,4354],{},[47,11433,4347],{},[321,11435,2642],{"id":2642},[10,11437,4359],{},[10,11439,11440],{},[26,11441],{"alt":4364,"src":4365},[10,11443,4368,11444,4371],{},[47,11445,4347],{},[14,11447,159],{"id":159},[37,11449,11450,11452],{},[40,11451,4378],{},[40,11453,4381],{},[14,11455,178],{"id":178},[131,11457,11458,11462],{},[40,11459,167,11460,4390],{},[47,11461,4267],{},[40,11463,4393],{},[10,11465,197],{},[14,11467,200],{"id":200},[10,11469,4400],{},[205,11471,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11473},[11474,11475,11476,11477,11478,11481,11482,11483],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":11479},[11480],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4244,"description":4249},[218,4267,4422],{"id":4425,"title":4426,"body":11488,"category":218,"cover":219,"description":4431,"extension":220,"meta":11613,"navigation":100,"path":4580,"pinned":223,"publishedAt":224,"seo":11614,"slug":4582,"stem":4583,"summary":4584,"tags":11615,"updatedAt":224,"visible":100,"__hash__":4587},{"type":7,"value":11489,"toc":11603},[11490,11492,11494,11496,11498,11502,11506,11508,11518,11520,11522,11554,11556,11561,11563,11565,11577,11579,11585,11587,11595,11597,11599,11601],[10,11491,4431],{},[14,11493,16],{"id":16},[10,11495,4436],{},[14,11497,22],{"id":22},[10,11499,11500],{},[26,11501],{"alt":4443,"src":4444},[10,11503,11504,4449],{},[47,11505,4284],{},[14,11507,35],{"id":35},[37,11509,11510,11514,11516],{},[40,11511,11512,4459],{},[47,11513,4458],{},[40,11515,4462],{},[40,11517,4465],{},[14,11519,68],{"id":68},[10,11521,71],{},[73,11523,11524],{"className":75,"code":4472,"language":77,"meta":78,"style":78},[47,11525,11526,11530,11534,11538,11542,11546,11550],{"__ignoreMap":78},[82,11527,11528],{"class":84,"line":85},[82,11529,4479],{},[82,11531,11532],{"class":84,"line":91},[82,11533,101],{"emptyLinePlaceholder":100},[82,11535,11536],{"class":84,"line":97},[82,11537,4488],{},[82,11539,11540],{"class":84,"line":104},[82,11541,4493],{},[82,11543,11544],{"class":84,"line":110},[82,11545,101],{"emptyLinePlaceholder":100},[82,11547,11548],{"class":84,"line":1140},[82,11549,4502],{},[82,11551,11552],{"class":84,"line":2432},[82,11553,4507],{},[10,11555,115],{},[73,11557,11559],{"className":11558,"code":4513,"language":121,"meta":78},[119],[47,11560,4513],{"__ignoreMap":78},[10,11562,126],{},[14,11564,129],{"id":129},[131,11566,11567,11573],{},[40,11568,4524,11569,4527,11571,4531],{},[47,11570,4284],{},[47,11572,4530],{},[40,11574,11575,4536],{},[47,11576,4458],{},[14,11578,159],{"id":159},[37,11580,11581,11583],{},[40,11582,4543],{},[40,11584,4546],{},[14,11586,178],{"id":178},[131,11588,11589,11591],{},[40,11590,4553],{},[40,11592,167,11593,4559],{},[47,11594,4558],{},[10,11596,197],{},[14,11598,200],{"id":200},[10,11600,4566],{},[205,11602,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11604},[11605,11606,11607,11608,11609,11610,11611,11612],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4426,"description":4431},[218,4284,4586],{"id":4589,"title":4590,"body":11617,"category":218,"cover":219,"description":4595,"extension":220,"meta":11762,"navigation":100,"path":4770,"pinned":223,"publishedAt":224,"seo":11763,"slug":4772,"stem":4773,"summary":4774,"tags":11764,"updatedAt":224,"visible":100,"__hash__":4776},{"type":7,"value":11618,"toc":11752},[11619,11621,11623,11625,11627,11631,11637,11639,11653,11655,11657,11701,11703,11708,11710,11712,11722,11724,11736,11738,11744,11746,11748,11750],[10,11620,4595],{},[14,11622,16],{"id":16},[10,11624,4600],{},[14,11626,22],{"id":22},[10,11628,11629],{},[26,11630],{"alt":4607,"src":4608},[10,11632,11633,4614,11635,4618],{},[47,11634,4613],{},[47,11636,4617],{},[14,11638,35],{"id":35},[37,11640,11641,11643,11649],{},[40,11642,4625],{},[40,11644,11645,4630,11647,4633],{},[47,11646,4613],{},[47,11648,4267],{},[40,11650,4636,11651,4639],{},[47,11652,4617],{},[14,11654,68],{"id":68},[10,11656,71],{},[73,11658,11659],{"className":75,"code":4646,"language":77,"meta":78,"style":78},[47,11660,11661,11665,11669,11673,11677,11681,11685,11689,11693,11697],{"__ignoreMap":78},[82,11662,11663],{"class":84,"line":85},[82,11664,4653],{},[82,11666,11667],{"class":84,"line":91},[82,11668,101],{"emptyLinePlaceholder":100},[82,11670,11671],{"class":84,"line":97},[82,11672,4662],{},[82,11674,11675],{"class":84,"line":104},[82,11676,4667],{},[82,11678,11679],{"class":84,"line":110},[82,11680,4672],{},[82,11682,11683],{"class":84,"line":1140},[82,11684,4677],{},[82,11686,11687],{"class":84,"line":2432},[82,11688,4682],{},[82,11690,11691],{"class":84,"line":2438},[82,11692,4507],{},[82,11694,11695],{"class":84,"line":3898},[82,11696,101],{"emptyLinePlaceholder":100},[82,11698,11699],{"class":84,"line":4110},[82,11700,4695],{},[10,11702,115],{},[73,11704,11706],{"className":11705,"code":4701,"language":121,"meta":78},[119],[47,11707,4701],{"__ignoreMap":78},[10,11709,126],{},[14,11711,129],{"id":129},[131,11713,11714,11718],{},[40,11715,4712,11716,4715],{},[47,11717,4613],{},[40,11719,4718,11720,4721],{},[47,11721,4617],{},[14,11723,159],{"id":159},[37,11725,11726,11730],{},[40,11727,3412,11728,4730],{},[47,11729,4613],{},[40,11731,4733,11732,4736,11734,4739],{},[47,11733,4267],{},[47,11735,4613],{},[14,11737,178],{"id":178},[131,11739,11740,11742],{},[40,11741,4746],{},[40,11743,4749],{},[10,11745,197],{},[14,11747,200],{"id":200},[10,11749,4756],{},[205,11751,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11753},[11754,11755,11756,11757,11758,11759,11760,11761],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4590,"description":4595},[218,4617,4613],{"id":4778,"title":4779,"body":11766,"category":218,"cover":219,"description":4784,"extension":220,"meta":11905,"navigation":100,"path":4956,"pinned":223,"publishedAt":224,"seo":11906,"slug":4958,"stem":4959,"summary":4960,"tags":11907,"updatedAt":224,"visible":100,"__hash__":4964},{"type":7,"value":11767,"toc":11893},[11768,11770,11772,11774,11776,11780,11782,11784,11800,11802,11804,11832,11834,11839,11841,11843,11855,11857,11859,11863,11865,11867,11877,11879,11885,11887,11889,11891],[10,11769,4784],{},[14,11771,16],{"id":16},[10,11773,4789],{},[14,11775,22],{"id":22},[10,11777,11778],{},[26,11779],{"alt":4796,"src":4797},[10,11781,4800],{},[14,11783,35],{"id":35},[37,11785,11786,11788,11790],{},[40,11787,4807],{},[40,11789,4810],{},[40,11791,4813,11792,61,11794,4820,11796,61,11798,156],{},[47,11793,4816],{},[47,11795,4819],{},[47,11797,4823],{},[47,11799,4826],{},[14,11801,68],{"id":68},[10,11803,71],{},[73,11805,11806],{"className":75,"code":4833,"language":77,"meta":78,"style":78},[47,11807,11808,11812,11816,11820,11824,11828],{"__ignoreMap":78},[82,11809,11810],{"class":84,"line":85},[82,11811,4840],{},[82,11813,11814],{"class":84,"line":91},[82,11815,101],{"emptyLinePlaceholder":100},[82,11817,11818],{"class":84,"line":97},[82,11819,4849],{},[82,11821,11822],{"class":84,"line":104},[82,11823,4854],{},[82,11825,11826],{"class":84,"line":110},[82,11827,4859],{},[82,11829,11830],{"class":84,"line":1140},[82,11831,4864],{},[10,11833,115],{},[73,11835,11837],{"className":11836,"code":4870,"language":121,"meta":78},[119],[47,11838,4870],{"__ignoreMap":78},[10,11840,126],{},[14,11842,129],{"id":129},[131,11844,11845,11853],{},[40,11846,4881,11847,4884,11849,187,11851,156],{},[47,11848,4816],{},[47,11850,4887],{},[47,11852,4890],{},[40,11854,4893],{},[321,11856,2642],{"id":2642},[10,11858,4898],{},[10,11860,11861],{},[26,11862],{"alt":4903,"src":4904},[10,11864,4907],{},[14,11866,159],{"id":159},[37,11868,11869,11875],{},[40,11870,4914,11871,1000,11873,4920],{},[47,11872,4917],{},[47,11874,4823],{},[40,11876,4923],{},[14,11878,178],{"id":178},[131,11880,11881,11883],{},[40,11882,4930],{},[40,11884,4933],{},[10,11886,197],{},[14,11888,200],{"id":200},[10,11890,4940],{},[205,11892,207],{},{"title":78,"searchDepth":91,"depth":91,"links":11894},[11895,11896,11897,11898,11899,11902,11903,11904],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":11900},[11901],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4779,"description":4784},[218,4962,4963],{"id":4966,"title":4967,"body":11909,"category":218,"cover":219,"description":4972,"extension":220,"meta":12026,"navigation":100,"path":5111,"pinned":223,"publishedAt":224,"seo":12027,"slug":5113,"stem":5114,"summary":5115,"tags":12028,"updatedAt":224,"visible":100,"__hash__":5119},{"type":7,"value":11910,"toc":12016},[11911,11913,11915,11917,11919,11923,11925,11927,11935,11937,11939,11971,11973,11978,11980,11982,11990,11992,12000,12002,12008,12010,12012,12014],[10,11912,4972],{},[14,11914,16],{"id":16},[10,11916,4977],{},[14,11918,22],{"id":22},[10,11920,11921],{},[26,11922],{"alt":4984,"src":4985},[10,11924,4988],{},[14,11926,35],{"id":35},[37,11928,11929,11931,11933],{},[40,11930,4995],{},[40,11932,4998],{},[40,11934,5001],{},[14,11936,68],{"id":68},[10,11938,71],{},[73,11940,11941],{"className":75,"code":5008,"language":77,"meta":78,"style":78},[47,11942,11943,11947,11951,11955,11959,11963,11967],{"__ignoreMap":78},[82,11944,11945],{"class":84,"line":85},[82,11946,5015],{},[82,11948,11949],{"class":84,"line":91},[82,11950,101],{"emptyLinePlaceholder":100},[82,11952,11953],{"class":84,"line":97},[82,11954,5024],{},[82,11956,11957],{"class":84,"line":104},[82,11958,5029],{},[82,11960,11961],{"class":84,"line":110},[82,11962,101],{"emptyLinePlaceholder":100},[82,11964,11965],{"class":84,"line":1140},[82,11966,5038],{},[82,11968,11969],{"class":84,"line":2432},[82,11970,5043],{},[10,11972,115],{},[73,11974,11976],{"className":11975,"code":5049,"language":121,"meta":78},[119],[47,11977,5049],{"__ignoreMap":78},[10,11979,126],{},[14,11981,129],{"id":129},[131,11983,11984,11986],{},[40,11985,5060],{},[40,11987,5063,11988,5067],{},[47,11989,5066],{},[14,11991,159],{"id":159},[37,11993,11994,11998],{},[40,11995,5074,11996,5077],{},[47,11997,4284],{},[40,11999,5080],{},[14,12001,178],{"id":178},[131,12003,12004,12006],{},[40,12005,5087],{},[40,12007,5090],{},[10,12009,197],{},[14,12011,200],{"id":200},[10,12013,5097],{},[205,12015,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12017},[12018,12019,12020,12021,12022,12023,12024,12025],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":4967,"description":4972},[218,5117,5118],{"id":5121,"title":5122,"body":12030,"category":218,"cover":219,"description":5127,"extension":220,"meta":12149,"navigation":100,"path":5271,"pinned":223,"publishedAt":224,"seo":12150,"slug":5273,"stem":5274,"summary":5275,"tags":12151,"updatedAt":224,"visible":100,"__hash__":5279},{"type":7,"value":12031,"toc":12139},[12032,12034,12036,12038,12040,12044,12046,12048,12056,12058,12060,12092,12094,12099,12101,12103,12113,12115,12121,12123,12131,12133,12135,12137],[10,12033,5127],{},[14,12035,16],{"id":16},[10,12037,5132],{},[14,12039,22],{"id":22},[10,12041,12042],{},[26,12043],{"alt":5139,"src":5140},[10,12045,5143],{},[14,12047,35],{"id":35},[37,12049,12050,12052,12054],{},[40,12051,5150],{},[40,12053,5153],{},[40,12055,5156],{},[14,12057,68],{"id":68},[10,12059,71],{},[73,12061,12062],{"className":75,"code":5163,"language":77,"meta":78,"style":78},[47,12063,12064,12068,12072,12076,12080,12084,12088],{"__ignoreMap":78},[82,12065,12066],{"class":84,"line":85},[82,12067,5170],{},[82,12069,12070],{"class":84,"line":91},[82,12071,5175],{},[82,12073,12074],{"class":84,"line":97},[82,12075,5180],{},[82,12077,12078],{"class":84,"line":104},[82,12079,101],{"emptyLinePlaceholder":100},[82,12081,12082],{"class":84,"line":110},[82,12083,5189],{},[82,12085,12086],{"class":84,"line":1140},[82,12087,5194],{},[82,12089,12090],{"class":84,"line":2432},[82,12091,5199],{},[10,12093,115],{},[73,12095,12097],{"className":12096,"code":5205,"language":121,"meta":78},[119],[47,12098,5205],{"__ignoreMap":78},[10,12100,126],{},[14,12102,129],{"id":129},[131,12104,12105,12109],{},[40,12106,135,12107,5219],{},[47,12108,5218],{},[40,12110,5222,12111,5226],{},[47,12112,5225],{},[14,12114,159],{"id":159},[37,12116,12117,12119],{},[40,12118,5233],{},[40,12120,5236],{},[14,12122,178],{"id":178},[131,12124,12125,12129],{},[40,12126,5243,12127,5247],{},[47,12128,5246],{},[40,12130,5250],{},[10,12132,197],{},[14,12134,200],{"id":200},[10,12136,5257],{},[205,12138,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12140},[12141,12142,12143,12144,12145,12146,12147,12148],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5122,"description":5127},[218,5277,5278],{"id":5281,"title":5282,"body":12153,"category":218,"cover":219,"description":5287,"extension":220,"meta":12298,"navigation":100,"path":5468,"pinned":223,"publishedAt":224,"seo":12299,"slug":5470,"stem":5471,"summary":5472,"tags":12300,"updatedAt":224,"visible":100,"__hash__":5476},{"type":7,"value":12154,"toc":12286},[12155,12157,12159,12161,12163,12167,12171,12173,12185,12187,12189,12217,12219,12224,12226,12228,12242,12244,12246,12250,12258,12260,12270,12272,12278,12280,12282,12284],[10,12156,5287],{},[14,12158,16],{"id":16},[10,12160,5292],{},[14,12162,22],{"id":22},[10,12164,12165],{},[26,12166],{"alt":5299,"src":5300},[10,12168,5303,12169,5307],{},[47,12170,5306],{},[14,12172,35],{"id":35},[37,12174,12175,12177,12179],{},[40,12176,5314],{},[40,12178,5317],{},[40,12180,5320,12181,5323,12183,156],{},[47,12182,5306],{},[47,12184,5326],{},[14,12186,68],{"id":68},[10,12188,71],{},[73,12190,12191],{"className":75,"code":5333,"language":77,"meta":78,"style":78},[47,12192,12193,12197,12201,12205,12209,12213],{"__ignoreMap":78},[82,12194,12195],{"class":84,"line":85},[82,12196,5340],{},[82,12198,12199],{"class":84,"line":91},[82,12200,5345],{},[82,12202,12203],{"class":84,"line":97},[82,12204,5350],{},[82,12206,12207],{"class":84,"line":104},[82,12208,101],{"emptyLinePlaceholder":100},[82,12210,12211],{"class":84,"line":110},[82,12212,5359],{},[82,12214,12215],{"class":84,"line":1140},[82,12216,5364],{},[10,12218,115],{},[73,12220,12222],{"className":12221,"code":5370,"language":121,"meta":78},[119],[47,12223,5370],{"__ignoreMap":78},[10,12225,126],{},[14,12227,129],{"id":129},[131,12229,12230,12236],{},[40,12231,5381,12232,61,12234,5387],{},[47,12233,5384],{},[47,12235,4347],{},[40,12237,12238,5393,12240,5397],{},[47,12239,5392],{},[47,12241,5396],{},[321,12243,2642],{"id":2642},[10,12245,5402],{},[10,12247,12248],{},[26,12249],{"alt":5407,"src":5408},[10,12251,12252,61,12254,187,12256,5418],{},[47,12253,5384],{},[47,12255,4347],{},[47,12257,5417],{},[14,12259,159],{"id":159},[37,12261,12262,12266],{},[40,12263,5425,12264,5429],{},[47,12265,5428],{},[40,12267,5432,12268,5435],{},[47,12269,5417],{},[14,12271,178],{"id":178},[131,12273,12274,12276],{},[40,12275,5442],{},[40,12277,5445],{},[10,12279,197],{},[14,12281,200],{"id":200},[10,12283,5452],{},[205,12285,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12287},[12288,12289,12290,12291,12292,12295,12296,12297],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":12293},[12294],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5282,"description":5287},[218,5474,5475],{"id":5478,"title":5479,"body":12302,"category":218,"cover":219,"description":5484,"extension":220,"meta":12451,"navigation":100,"path":5665,"pinned":223,"publishedAt":224,"seo":12452,"slug":5667,"stem":5668,"summary":5669,"tags":12453,"updatedAt":224,"visible":100,"__hash__":5673},{"type":7,"value":12303,"toc":12439},[12304,12306,12308,12310,12312,12316,12318,12320,12332,12334,12336,12380,12382,12387,12389,12391,12403,12405,12407,12411,12413,12415,12423,12425,12431,12433,12435,12437],[10,12305,5484],{},[14,12307,16],{"id":16},[10,12309,5489],{},[14,12311,22],{"id":22},[10,12313,12314],{},[26,12315],{"alt":5496,"src":5497},[10,12317,5500],{},[14,12319,35],{"id":35},[37,12321,12322,12324,12328],{},[40,12323,5507],{},[40,12325,12326,5513],{},[47,12327,5512],{},[40,12329,12330,5519],{},[47,12331,5518],{},[14,12333,68],{"id":68},[10,12335,71],{},[73,12337,12338],{"className":75,"code":5526,"language":77,"meta":78,"style":78},[47,12339,12340,12344,12348,12352,12356,12360,12364,12368,12372,12376],{"__ignoreMap":78},[82,12341,12342],{"class":84,"line":85},[82,12343,5533],{},[82,12345,12346],{"class":84,"line":91},[82,12347,5538],{},[82,12349,12350],{"class":84,"line":97},[82,12351,101],{"emptyLinePlaceholder":100},[82,12353,12354],{"class":84,"line":104},[82,12355,5547],{},[82,12357,12358],{"class":84,"line":110},[82,12359,5552],{},[82,12361,12362],{"class":84,"line":1140},[82,12363,101],{"emptyLinePlaceholder":100},[82,12365,12366],{"class":84,"line":2432},[82,12367,5561],{},[82,12369,12370],{"class":84,"line":2438},[82,12371,5566],{},[82,12373,12374],{"class":84,"line":3898},[82,12375,101],{"emptyLinePlaceholder":100},[82,12377,12378],{"class":84,"line":4110},[82,12379,5575],{},[10,12381,115],{},[73,12383,12385],{"className":12384,"code":5581,"language":121,"meta":78},[119],[47,12386,5581],{"__ignoreMap":78},[10,12388,126],{},[14,12390,129],{"id":129},[131,12392,12393,12397],{},[40,12394,5592,12395,5596],{},[47,12396,5595],{},[40,12398,12399,5602,12401,156],{},[47,12400,5601],{},[47,12402,5605],{},[321,12404,2642],{"id":2642},[10,12406,5610],{},[10,12408,12409],{},[26,12410],{"alt":5615,"src":5616},[10,12412,5619],{},[14,12414,159],{"id":159},[37,12416,12417,12421],{},[40,12418,5626,12419,5629],{},[47,12420,5326],{},[40,12422,5632],{},[14,12424,178],{"id":178},[131,12426,12427,12429],{},[40,12428,5639],{},[40,12430,5642],{},[10,12432,197],{},[14,12434,200],{"id":200},[10,12436,5649],{},[205,12438,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12440},[12441,12442,12443,12444,12445,12448,12449,12450],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":12446},[12447],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5479,"description":5484},[218,5671,5672],{"id":5675,"title":5676,"body":12455,"category":218,"cover":219,"description":5681,"extension":220,"meta":12616,"navigation":100,"path":5879,"pinned":223,"publishedAt":224,"seo":12617,"slug":5881,"stem":5882,"summary":5883,"tags":12618,"updatedAt":224,"visible":100,"__hash__":5887},{"type":7,"value":12456,"toc":12604},[12457,12459,12461,12463,12465,12469,12471,12473,12485,12487,12489,12541,12543,12548,12550,12552,12570,12572,12574,12578,12580,12582,12588,12590,12596,12598,12600,12602],[10,12458,5681],{},[14,12460,16],{"id":16},[10,12462,5686],{},[14,12464,22],{"id":22},[10,12466,12467],{},[26,12468],{"alt":5693,"src":5694},[10,12470,5697],{},[14,12472,35],{"id":35},[37,12474,12475,12477,12479],{},[40,12476,5704],{},[40,12478,5707],{},[40,12480,12481,50,12483,5716],{},[47,12482,5712],{},[47,12484,5715],{},[14,12486,68],{"id":68},[10,12488,71],{},[73,12490,12491],{"className":75,"code":5723,"language":77,"meta":78,"style":78},[47,12492,12493,12497,12501,12505,12509,12513,12517,12521,12525,12529,12533,12537],{"__ignoreMap":78},[82,12494,12495],{"class":84,"line":85},[82,12496,5730],{},[82,12498,12499],{"class":84,"line":91},[82,12500,101],{"emptyLinePlaceholder":100},[82,12502,12503],{"class":84,"line":97},[82,12504,5739],{},[82,12506,12507],{"class":84,"line":104},[82,12508,5744],{},[82,12510,12511],{"class":84,"line":110},[82,12512,101],{"emptyLinePlaceholder":100},[82,12514,12515],{"class":84,"line":1140},[82,12516,5753],{},[82,12518,12519],{"class":84,"line":2432},[82,12520,5758],{},[82,12522,12523],{"class":84,"line":2438},[82,12524,5763],{},[82,12526,12527],{"class":84,"line":3898},[82,12528,101],{"emptyLinePlaceholder":100},[82,12530,12531],{"class":84,"line":4110},[82,12532,5772],{},[82,12534,12535],{"class":84,"line":5775},[82,12536,101],{"emptyLinePlaceholder":100},[82,12538,12539],{"class":84,"line":5780},[82,12540,5783],{},[10,12542,115],{},[73,12544,12546],{"className":12545,"code":5789,"language":121,"meta":78},[119],[47,12547,5789],{"__ignoreMap":78},[10,12549,126],{},[14,12551,129],{"id":129},[131,12553,12554,12564],{},[40,12555,12556,5803,12558,5807,12560,5810,12562,5814],{},[47,12557,5802],{},[47,12559,5806],{},[47,12561,5595],{},[47,12563,5813],{},[40,12565,12566,5819,12568,5822],{},[47,12567,4530],{},[47,12569,2198],{},[321,12571,2642],{"id":2642},[10,12573,5827],{},[10,12575,12576],{},[26,12577],{"alt":5832,"src":5833},[10,12579,5836],{},[14,12581,159],{"id":159},[37,12583,12584,12586],{},[40,12585,5843],{},[40,12587,5846],{},[14,12589,178],{"id":178},[131,12591,12592,12594],{},[40,12593,5853],{},[40,12595,5856],{},[10,12597,197],{},[14,12599,200],{"id":200},[10,12601,5863],{},[205,12603,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12605},[12606,12607,12608,12609,12610,12613,12614,12615],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":12611},[12612],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5676,"description":5681},[218,5885,5886],{"id":5889,"title":5890,"body":12620,"category":218,"cover":219,"description":5895,"extension":220,"meta":12743,"navigation":100,"path":6046,"pinned":223,"publishedAt":224,"seo":12744,"slug":6048,"stem":6049,"summary":6050,"tags":12745,"updatedAt":224,"visible":100,"__hash__":6054},{"type":7,"value":12621,"toc":12733},[12622,12624,12626,12628,12630,12634,12636,12638,12652,12654,12656,12684,12686,12691,12693,12695,12705,12707,12715,12717,12725,12727,12729,12731],[10,12623,5895],{},[14,12625,16],{"id":16},[10,12627,5900],{},[14,12629,22],{"id":22},[10,12631,12632],{},[26,12633],{"alt":5907,"src":5908},[10,12635,5911],{},[14,12637,35],{"id":35},[37,12639,12640,12642,12644],{},[40,12641,5918],{},[40,12643,5921],{},[40,12645,5924,12646,61,12648,61,12650,5932],{},[47,12647,64],{},[47,12649,2369],{},[47,12651,5931],{},[14,12653,68],{"id":68},[10,12655,71],{},[73,12657,12658],{"className":75,"code":5939,"language":77,"meta":78,"style":78},[47,12659,12660,12664,12668,12672,12676,12680],{"__ignoreMap":78},[82,12661,12662],{"class":84,"line":85},[82,12663,5946],{},[82,12665,12666],{"class":84,"line":91},[82,12667,5951],{},[82,12669,12670],{"class":84,"line":97},[82,12671,5956],{},[82,12673,12674],{"class":84,"line":104},[82,12675,101],{"emptyLinePlaceholder":100},[82,12677,12678],{"class":84,"line":110},[82,12679,5965],{},[82,12681,12682],{"class":84,"line":1140},[82,12683,5970],{},[10,12685,115],{},[73,12687,12689],{"className":12688,"code":5976,"language":121,"meta":78},[119],[47,12690,5976],{"__ignoreMap":78},[10,12692,126],{},[14,12694,129],{"id":129},[131,12696,12697,12703],{},[40,12698,5987,12699,5991,12701,5994],{},[47,12700,5990],{},[47,12702,49],{},[40,12704,5997],{},[14,12706,159],{"id":159},[37,12708,12709,12713],{},[40,12710,6004,12711,6008],{},[47,12712,6007],{},[40,12714,6011],{},[14,12716,178],{"id":178},[131,12718,12719,12721],{},[40,12720,6018],{},[40,12722,6021,12723,6025],{},[47,12724,6024],{},[10,12726,197],{},[14,12728,200],{"id":200},[10,12730,6032],{},[205,12732,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12734},[12735,12736,12737,12738,12739,12740,12741,12742],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":5890,"description":5895},[218,6052,6053],{"id":6056,"title":6057,"body":12747,"category":218,"cover":219,"description":6062,"extension":220,"meta":12924,"navigation":100,"path":6290,"pinned":223,"publishedAt":224,"seo":12925,"slug":6292,"stem":6293,"summary":6294,"tags":12926,"updatedAt":224,"visible":100,"__hash__":6298},{"type":7,"value":12748,"toc":12912},[12749,12751,12753,12757,12759,12763,12769,12771,12783,12785,12789,12813,12817,12833,12839,12841,12846,12848,12850,12866,12868,12870,12874,12878,12880,12892,12894,12904,12906,12908,12910],[10,12750,6062],{},[14,12752,16],{"id":16},[10,12754,6067,12755,6070],{},[287,12756,5990],{},[14,12758,22],{"id":22},[10,12760,12761],{},[26,12762],{"alt":6077,"src":6078},[10,12764,6081,12765,6085,12767,6089],{},[47,12766,6084],{},[47,12768,6088],{},[14,12770,35],{"id":35},[37,12772,12773,12777,12779],{},[40,12774,6096,12775,6099],{},[47,12776,1162],{},[40,12778,6102],{},[40,12780,6105,12781,6109],{},[47,12782,6108],{},[14,12784,68],{"id":68},[10,12786,6114,12787,6118],{},[47,12788,6117],{},[73,12790,12791],{"className":75,"code":6121,"language":77,"meta":78,"style":78},[47,12792,12793,12797,12801,12805,12809],{"__ignoreMap":78},[82,12794,12795],{"class":84,"line":85},[82,12796,6128],{},[82,12798,12799],{"class":84,"line":91},[82,12800,6133],{},[82,12802,12803],{"class":84,"line":97},[82,12804,101],{"emptyLinePlaceholder":100},[82,12806,12807],{"class":84,"line":104},[82,12808,6142],{},[82,12810,12811],{"class":84,"line":110},[82,12812,6147],{},[10,12814,6150,12815,6154],{},[47,12816,6153],{},[73,12818,12819],{"className":75,"code":6157,"language":77,"meta":78,"style":78},[47,12820,12821,12825,12829],{"__ignoreMap":78},[82,12822,12823],{"class":84,"line":85},[82,12824,6164],{},[82,12826,12827],{"class":84,"line":91},[82,12828,101],{"emptyLinePlaceholder":100},[82,12830,12831],{"class":84,"line":97},[82,12832,6173],{},[10,12834,6176,12835,187,12837,156],{},[47,12836,6179],{},[47,12838,6182],{},[10,12840,115],{},[73,12842,12844],{"className":12843,"code":6188,"language":121,"meta":78},[119],[47,12845,6188],{"__ignoreMap":78},[10,12847,126],{},[14,12849,129],{"id":129},[131,12851,12852,12858],{},[40,12853,6199,12854,6202,12856,6206],{},[47,12855,6117],{},[47,12857,6205],{},[40,12859,12860,6211,12862,6214,12864,6217],{},[47,12861,6153],{},[47,12863,6117],{},[47,12865,6153],{},[321,12867,2642],{"id":2642},[10,12869,6222],{},[10,12871,12872],{},[26,12873],{"alt":6227,"src":6228},[10,12875,6231,12876,6234],{},[47,12877,6205],{},[14,12879,159],{"id":159},[37,12881,12882,12888],{},[40,12883,6241,12884,187,12886,156],{},[47,12885,6117],{},[47,12887,6153],{},[40,12889,6248,12890,6252],{},[47,12891,6251],{},[14,12893,178],{"id":178},[131,12895,12896,12900],{},[40,12897,183,12898,6262],{},[47,12899,6261],{},[40,12901,6265,12902,156],{},[47,12903,6084],{},[10,12905,197],{},[14,12907,200],{"id":200},[10,12909,6274],{},[205,12911,207],{},{"title":78,"searchDepth":91,"depth":91,"links":12913},[12914,12915,12916,12917,12918,12921,12922,12923],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":12919},[12920],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":6057,"description":6062},[218,6296,6297],{"id":6300,"title":6301,"body":12928,"category":218,"cover":219,"description":6306,"extension":220,"meta":13067,"navigation":100,"path":6472,"pinned":223,"publishedAt":224,"seo":13068,"slug":6474,"stem":6475,"summary":6476,"tags":13069,"updatedAt":224,"visible":100,"__hash__":6479},{"type":7,"value":12929,"toc":13057},[12930,12932,12934,12936,12938,12942,12944,12946,12956,12958,12960,13000,13002,13007,13009,13011,13029,13031,13039,13041,13049,13051,13053,13055],[10,12931,6306],{},[14,12933,16],{"id":16},[10,12935,6311],{},[14,12937,22],{"id":22},[10,12939,12940],{},[26,12941],{"alt":6318,"src":6319},[10,12943,6322],{},[14,12945,35],{"id":35},[37,12947,12948,12952,12954],{},[40,12949,12950,6332],{},[47,12951,6331],{},[40,12953,6335],{},[40,12955,6338],{},[14,12957,68],{"id":68},[10,12959,1565],{},[73,12961,12962],{"className":583,"code":6345,"language":585,"meta":78,"style":78},[47,12963,12964,12974,12980,12986,12996],{"__ignoreMap":78},[82,12965,12966,12968,12970,12972],{"class":84,"line":85},[82,12967,683],{"class":592},[82,12969,625],{"class":595},[82,12971,6356],{"class":628},[82,12973,6359],{"class":628},[82,12975,12976,12978],{"class":84,"line":91},[82,12977,6364],{"class":595},[82,12979,6367],{"class":628},[82,12981,12982,12984],{"class":84,"line":97},[82,12983,77],{"class":592},[82,12985,596],{"class":595},[82,12987,12988,12990,12992,12994],{"class":84,"line":104},[82,12989,77],{"class":592},[82,12991,625],{"class":595},[82,12993,629],{"class":628},[82,12995,596],{"class":595},[82,12997,12998],{"class":84,"line":110},[82,12999,6388],{"class":592},[10,13001,115],{},[73,13003,13005],{"className":13004,"code":6394,"language":121,"meta":78},[119],[47,13006,6394],{"__ignoreMap":78},[10,13008,126],{},[14,13010,129],{"id":129},[131,13012,13013,13019],{},[40,13014,13015,6408,13017,6411],{},[47,13016,6407],{},[47,13018,683],{},[40,13020,6414,13021,50,13023,6420,13025,3673,13027,6426],{},[47,13022,77],{},[47,13024,6419],{},[47,13026,6331],{},[47,13028,6425],{},[14,13030,159],{"id":159},[37,13032,13033,13035],{},[40,13034,6433],{},[40,13036,3412,13037,6438],{},[47,13038,6331],{},[14,13040,178],{"id":178},[131,13042,13043,13047],{},[40,13044,6445,13045,156],{},[47,13046,6448],{},[40,13048,6451],{},[10,13050,197],{},[14,13052,200],{"id":200},[10,13054,6458],{},[205,13056,1649],{},{"title":78,"searchDepth":91,"depth":91,"links":13058},[13059,13060,13061,13062,13063,13064,13065,13066],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":6301,"description":6306},[218,6478,253],{"id":6481,"title":6482,"body":13071,"category":218,"cover":219,"description":6487,"extension":220,"meta":13224,"navigation":100,"path":6676,"pinned":223,"publishedAt":224,"seo":13225,"slug":6678,"stem":6679,"summary":6680,"tags":13226,"updatedAt":224,"visible":100,"__hash__":6684},{"type":7,"value":13072,"toc":13214},[13073,13075,13077,13079,13081,13085,13091,13093,13109,13111,13113,13157,13159,13164,13166,13168,13180,13182,13196,13198,13206,13208,13210,13212],[10,13074,6487],{},[14,13076,16],{"id":16},[10,13078,6492],{},[14,13080,22],{"id":22},[10,13082,13083],{},[26,13084],{"alt":6499,"src":6500},[10,13086,13087,6506,13089,6509],{},[47,13088,6505],{},[47,13090,2379],{},[14,13092,35],{"id":35},[37,13094,13095,13097,13105],{},[40,13096,6516],{},[40,13098,13099,61,13101,61,13103,6528],{},[47,13100,6521],{},[47,13102,6524],{},[47,13104,6527],{},[40,13106,6531,13107,6535],{},[47,13108,6534],{},[14,13110,68],{"id":68},[10,13112,71],{},[73,13114,13115],{"className":75,"code":6542,"language":77,"meta":78,"style":78},[47,13116,13117,13121,13125,13129,13133,13137,13141,13145,13149,13153],{"__ignoreMap":78},[82,13118,13119],{"class":84,"line":85},[82,13120,6549],{},[82,13122,13123],{"class":84,"line":91},[82,13124,101],{"emptyLinePlaceholder":100},[82,13126,13127],{"class":84,"line":97},[82,13128,6558],{},[82,13130,13131],{"class":84,"line":104},[82,13132,6563],{},[82,13134,13135],{"class":84,"line":110},[82,13136,6568],{},[82,13138,13139],{"class":84,"line":1140},[82,13140,101],{"emptyLinePlaceholder":100},[82,13142,13143],{"class":84,"line":2432},[82,13144,6577],{},[82,13146,13147],{"class":84,"line":2438},[82,13148,6582],{},[82,13150,13151],{"class":84,"line":3898},[82,13152,6587],{},[82,13154,13155],{"class":84,"line":4110},[82,13156,6592],{},[10,13158,115],{},[73,13160,13162],{"className":13161,"code":6598,"language":121,"meta":78},[119],[47,13163,6598],{"__ignoreMap":78},[10,13165,126],{},[14,13167,129],{"id":129},[131,13169,13170,13174],{},[40,13171,13172,6612],{},[47,13173,6611],{},[40,13175,167,13176,6617,13178,6620],{},[47,13177,2379],{},[47,13179,6505],{},[14,13181,159],{"id":159},[37,13183,13184,13190],{},[40,13185,3412,13186,6629,13188,6632],{},[47,13187,6505],{},[47,13189,6521],{},[40,13191,6635,13192,1000,13194,6641],{},[47,13193,2379],{},[47,13195,6640],{},[14,13197,178],{"id":178},[131,13199,13200,13204],{},[40,13201,6648,13202,6652],{},[47,13203,6651],{},[40,13205,6655],{},[10,13207,197],{},[14,13209,200],{"id":200},[10,13211,6662],{},[205,13213,207],{},{"title":78,"searchDepth":91,"depth":91,"links":13215},[13216,13217,13218,13219,13220,13221,13222,13223],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":6482,"description":6487},[218,6682,6683],{"id":6686,"title":6687,"body":13228,"category":218,"cover":219,"description":6692,"extension":220,"meta":13375,"navigation":100,"path":6871,"pinned":223,"publishedAt":224,"seo":13376,"slug":6873,"stem":6874,"summary":6875,"tags":13377,"updatedAt":224,"visible":100,"__hash__":6879},{"type":7,"value":13229,"toc":13365},[13230,13232,13234,13236,13238,13242,13244,13246,13264,13266,13268,13316,13318,13323,13325,13327,13335,13337,13347,13349,13357,13359,13361,13363],[10,13231,6692],{},[14,13233,16],{"id":16},[10,13235,6697],{},[14,13237,22],{"id":22},[10,13239,13240],{},[26,13241],{"alt":6704,"src":6705},[10,13243,6708],{},[14,13245,35],{"id":35},[37,13247,13248,13252,13258],{},[40,13249,13250,6718],{},[47,13251,6717],{},[40,13253,13254,6724,13256,156],{},[47,13255,6723],{},[47,13257,6727],{},[40,13259,6730,13260,6734,13262,6738],{},[47,13261,6733],{},[47,13263,6737],{},[14,13265,68],{"id":68},[10,13267,71],{},[73,13269,13270],{"className":75,"code":6745,"language":77,"meta":78,"style":78},[47,13271,13272,13276,13280,13284,13288,13292,13296,13300,13304,13308,13312],{"__ignoreMap":78},[82,13273,13274],{"class":84,"line":85},[82,13275,6549],{},[82,13277,13278],{"class":84,"line":91},[82,13279,101],{"emptyLinePlaceholder":100},[82,13281,13282],{"class":84,"line":97},[82,13283,6760],{},[82,13285,13286],{"class":84,"line":104},[82,13287,6765],{},[82,13289,13290],{"class":84,"line":110},[82,13291,6770],{},[82,13293,13294],{"class":84,"line":1140},[82,13295,6775],{},[82,13297,13298],{"class":84,"line":2432},[82,13299,101],{"emptyLinePlaceholder":100},[82,13301,13302],{"class":84,"line":2438},[82,13303,6784],{},[82,13305,13306],{"class":84,"line":3898},[82,13307,6789],{},[82,13309,13310],{"class":84,"line":4110},[82,13311,6794],{},[82,13313,13314],{"class":84,"line":5775},[82,13315,6799],{},[10,13317,115],{},[73,13319,13321],{"className":13320,"code":6805,"language":121,"meta":78},[119],[47,13322,6805],{"__ignoreMap":78},[10,13324,126],{},[14,13326,129],{"id":129},[131,13328,13329,13333],{},[40,13330,6816,13331,6819],{},[47,13332,6733],{},[40,13334,6822],{},[14,13336,159],{"id":159},[37,13338,13339,13343],{},[40,13340,167,13341,6831],{},[47,13342,6717],{},[40,13344,6834,13345,156],{},[47,13346,6837],{},[14,13348,178],{"id":178},[131,13350,13351,13353],{},[40,13352,6844],{},[40,13354,6847,13355,6850],{},[47,13356,329],{},[10,13358,197],{},[14,13360,200],{"id":200},[10,13362,6857],{},[205,13364,207],{},{"title":78,"searchDepth":91,"depth":91,"links":13366},[13367,13368,13369,13370,13371,13372,13373,13374],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":6687,"description":6692},[218,6877,6878],{"id":6881,"title":6882,"body":13379,"category":218,"cover":219,"description":6887,"extension":220,"meta":13522,"navigation":100,"path":7055,"pinned":223,"publishedAt":224,"seo":13523,"slug":7057,"stem":7058,"summary":7059,"tags":13524,"updatedAt":224,"visible":100,"__hash__":7063},{"type":7,"value":13380,"toc":13512},[13381,13383,13385,13387,13389,13393,13399,13401,13411,13413,13415,13467,13469,13474,13476,13478,13488,13490,13496,13498,13504,13506,13508,13510],[10,13382,6887],{},[14,13384,16],{"id":16},[10,13386,6892],{},[14,13388,22],{"id":22},[10,13390,13391],{},[26,13392],{"alt":6899,"src":6900},[10,13394,13395,6906,13397,6910],{},[47,13396,6905],{},[47,13398,6909],{},[14,13400,35],{"id":35},[37,13402,13403,13405,13409],{},[40,13404,6917],{},[40,13406,13407,6923],{},[47,13408,6922],{},[40,13410,6926],{},[14,13412,68],{"id":68},[10,13414,71],{},[73,13416,13417],{"className":75,"code":6933,"language":77,"meta":78,"style":78},[47,13418,13419,13423,13427,13431,13435,13439,13443,13447,13451,13455,13459,13463],{"__ignoreMap":78},[82,13420,13421],{"class":84,"line":85},[82,13422,6940],{},[82,13424,13425],{"class":84,"line":91},[82,13426,101],{"emptyLinePlaceholder":100},[82,13428,13429],{"class":84,"line":97},[82,13430,6949],{},[82,13432,13433],{"class":84,"line":104},[82,13434,101],{"emptyLinePlaceholder":100},[82,13436,13437],{"class":84,"line":110},[82,13438,6958],{},[82,13440,13441],{"class":84,"line":1140},[82,13442,6963],{},[82,13444,13445],{"class":84,"line":2432},[82,13446,6775],{},[82,13448,13449],{"class":84,"line":2438},[82,13450,101],{"emptyLinePlaceholder":100},[82,13452,13453],{"class":84,"line":3898},[82,13454,6976],{},[82,13456,13457],{"class":84,"line":4110},[82,13458,6981],{},[82,13460,13461],{"class":84,"line":5775},[82,13462,6794],{},[82,13464,13465],{"class":84,"line":5780},[82,13466,6990],{},[10,13468,115],{},[73,13470,13472],{"className":13471,"code":6996,"language":121,"meta":78},[119],[47,13473,6996],{"__ignoreMap":78},[10,13475,126],{},[14,13477,129],{"id":129},[131,13479,13480,13484],{},[40,13481,13482,7009],{},[47,13483,6905],{},[40,13485,13486,7014],{},[47,13487,6909],{},[14,13489,159],{"id":159},[37,13491,13492,13494],{},[40,13493,7021],{},[40,13495,7024],{},[14,13497,178],{"id":178},[131,13499,13500,13502],{},[40,13501,7031],{},[40,13503,7034],{},[10,13505,197],{},[14,13507,200],{"id":200},[10,13509,7041],{},[205,13511,207],{},{"title":78,"searchDepth":91,"depth":91,"links":13513},[13514,13515,13516,13517,13518,13519,13520,13521],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":6882,"description":6887},[218,7061,7062],{"id":7065,"title":7066,"body":13526,"category":218,"cover":219,"description":7071,"extension":220,"meta":13677,"navigation":100,"path":7256,"pinned":223,"publishedAt":224,"seo":13678,"slug":7258,"stem":7259,"summary":7260,"tags":13679,"updatedAt":224,"visible":100,"__hash__":7264},{"type":7,"value":13527,"toc":13667},[13528,13530,13532,13534,13536,13540,13544,13546,13560,13562,13564,13616,13618,13623,13625,13627,13639,13641,13651,13653,13659,13661,13663,13665],[10,13529,7071],{},[14,13531,16],{"id":16},[10,13533,7076],{},[14,13535,22],{"id":22},[10,13537,13538],{},[26,13539],{"alt":7083,"src":7084},[10,13541,13542,7090],{},[47,13543,7089],{},[14,13545,35],{"id":35},[37,13547,13548,13554,13558],{},[40,13549,167,13550,7100,13552,7104],{},[47,13551,7099],{},[47,13553,7103],{},[40,13555,7107,13556,7111],{},[47,13557,7110],{},[40,13559,7114],{},[14,13561,68],{"id":68},[10,13563,71],{},[73,13565,13566],{"className":75,"code":7121,"language":77,"meta":78,"style":78},[47,13567,13568,13572,13576,13580,13584,13588,13592,13596,13600,13604,13608,13612],{"__ignoreMap":78},[82,13569,13570],{"class":84,"line":85},[82,13571,7128],{},[82,13573,13574],{"class":84,"line":91},[82,13575,101],{"emptyLinePlaceholder":100},[82,13577,13578],{"class":84,"line":97},[82,13579,7137],{},[82,13581,13582],{"class":84,"line":104},[82,13583,7142],{},[82,13585,13586],{"class":84,"line":110},[82,13587,7147],{},[82,13589,13590],{"class":84,"line":1140},[82,13591,7152],{},[82,13593,13594],{"class":84,"line":2432},[82,13595,7157],{},[82,13597,13598],{"class":84,"line":2438},[82,13599,101],{"emptyLinePlaceholder":100},[82,13601,13602],{"class":84,"line":3898},[82,13603,7166],{},[82,13605,13606],{"class":84,"line":4110},[82,13607,7171],{},[82,13609,13610],{"class":84,"line":5775},[82,13611,7176],{},[82,13613,13614],{"class":84,"line":5780},[82,13615,7181],{},[10,13617,115],{},[73,13619,13621],{"className":13620,"code":7187,"language":121,"meta":78},[119],[47,13622,7187],{"__ignoreMap":78},[10,13624,126],{},[14,13626,129],{"id":129},[131,13628,13629,13635],{},[40,13630,13631,7201,13633,7204],{},[47,13632,7200],{},[47,13634,7110],{},[40,13636,13637,7209],{},[47,13638,7089],{},[14,13640,159],{"id":159},[37,13642,13643,13645],{},[40,13644,7216],{},[40,13646,7219,13647,7222,13649,7225],{},[47,13648,7099],{},[47,13650,7103],{},[14,13652,178],{"id":178},[131,13654,13655,13657],{},[40,13656,7232],{},[40,13658,7235],{},[10,13660,197],{},[14,13662,200],{"id":200},[10,13664,7242],{},[205,13666,207],{},{"title":78,"searchDepth":91,"depth":91,"links":13668},[13669,13670,13671,13672,13673,13674,13675,13676],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":7066,"description":7071},[218,7262,7263],{"id":7266,"title":7267,"body":13681,"category":218,"cover":219,"description":7272,"extension":220,"meta":13895,"navigation":100,"path":7546,"pinned":223,"publishedAt":224,"seo":13896,"slug":7548,"stem":7549,"summary":7550,"tags":13897,"updatedAt":224,"visible":100,"__hash__":7554},{"type":7,"value":13682,"toc":13882},[13683,13685,13687,13689,13691,13695,13701,13703,13715,13717,13719,13779,13781,13786,13788,13790,13808,13810,13818,13822,13830,13832,13836,13840,13846,13848,13858,13860,13874,13876,13878,13880],[10,13684,7272],{},[14,13686,16],{"id":16},[10,13688,7277],{},[14,13690,22],{"id":22},[10,13692,13693],{},[26,13694],{"alt":7284,"src":7285},[10,13696,7288,13697,7292,13699,7296],{},[47,13698,7291],{},[47,13700,7295],{},[14,13702,35],{"id":35},[37,13704,13705,13709,13713],{},[40,13706,7303,13707,7306],{},[47,13708,7291],{},[40,13710,13711,7312],{},[47,13712,7311],{},[40,13714,7315],{},[14,13716,68],{"id":68},[10,13718,71],{},[73,13720,13721],{"className":75,"code":7322,"language":77,"meta":78,"style":78},[47,13722,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763,13767,13771,13775],{"__ignoreMap":78},[82,13724,13725],{"class":84,"line":85},[82,13726,7329],{},[82,13728,13729],{"class":84,"line":91},[82,13730,7334],{},[82,13732,13733],{"class":84,"line":97},[82,13734,7339],{},[82,13736,13737],{"class":84,"line":104},[82,13738,7344],{},[82,13740,13741],{"class":84,"line":110},[82,13742,7349],{},[82,13744,13745],{"class":84,"line":1140},[82,13746,101],{"emptyLinePlaceholder":100},[82,13748,13749],{"class":84,"line":2432},[82,13750,7358],{},[82,13752,13753],{"class":84,"line":2438},[82,13754,7363],{},[82,13756,13757],{"class":84,"line":3898},[82,13758,7368],{},[82,13760,13761],{"class":84,"line":4110},[82,13762,7373],{},[82,13764,13765],{"class":84,"line":5775},[82,13766,1137],{},[82,13768,13769],{"class":84,"line":5780},[82,13770,7382],{},[82,13772,13773],{"class":84,"line":7385},[82,13774,7388],{},[82,13776,13777],{"class":84,"line":7391},[82,13778,7394],{},[10,13780,115],{},[73,13782,13784],{"className":13783,"code":7400,"language":121,"meta":78},[119],[47,13785,7400],{"__ignoreMap":78},[10,13787,126],{},[14,13789,129],{"id":129},[131,13791,13792,13800],{},[40,13793,13794,7413,13796,7416,13798,7420],{},[47,13795,2981],{},[47,13797,7311],{},[47,13799,7419],{},[40,13801,7423,13802,7426,13804,7429,13806,156],{},[47,13803,7291],{},[47,13805,1151],{},[47,13807,7295],{},[321,13809,2642],{"id":2642},[10,13811,13812,61,13814,187,13816,7442],{},[47,13813,7291],{},[47,13815,1151],{},[47,13817,7295],{},[10,13819,13820],{},[26,13821],{"alt":7447,"src":7448},[10,13823,13824,7453,13826,7456,13828,7459],{},[47,13825,7291],{},[47,13827,1151],{},[47,13829,7295],{},[321,13831,2642],{"id":4165},[10,13833,13834,7467],{},[47,13835,7466],{},[10,13837,13838],{},[26,13839],{"alt":7472,"src":7473},[10,13841,7476,13842,7479,13844,7482],{},[47,13843,7466],{},[47,13845,1151],{},[14,13847,159],{"id":159},[37,13849,13850,13854],{},[40,13851,7489,13852,7493],{},[47,13853,7492],{},[40,13855,7496,13856,7499],{},[47,13857,7466],{},[14,13859,178],{"id":178},[131,13861,13862,13870],{},[40,13863,7506,13864,7510,13866,187,13868,156],{},[47,13865,7509],{},[47,13867,7513],{},[47,13869,7516],{},[40,13871,7519,13872,7522],{},[47,13873,6727],{},[10,13875,197],{},[14,13877,200],{"id":200},[10,13879,7529],{},[205,13881,207],{},{"title":78,"searchDepth":91,"depth":91,"links":13883},[13884,13885,13886,13887,13888,13892,13893,13894],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":13889},[13890,13891],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":7267,"description":7272},[218,7552,7553],{"id":7556,"title":7557,"body":13899,"category":218,"cover":219,"description":7562,"extension":220,"meta":14050,"navigation":100,"path":7739,"pinned":223,"publishedAt":224,"seo":14051,"slug":7741,"stem":7742,"summary":7743,"tags":14052,"updatedAt":224,"visible":100,"__hash__":7746},{"type":7,"value":13900,"toc":14040},[13901,13903,13905,13907,13909,13913,13917,13919,13931,13933,13935,13983,13985,13990,13992,13994,14004,14006,14016,14018,14032,14034,14036,14038],[10,13902,7562],{},[14,13904,16],{"id":16},[10,13906,7567],{},[14,13908,22],{"id":22},[10,13910,13911],{},[26,13912],{"alt":7574,"src":7575},[10,13914,7578,13915,7581],{},[47,13916,6737],{},[14,13918,35],{"id":35},[37,13920,13921,13925,13929],{},[40,13922,13923,7590],{},[47,13924,6737],{},[40,13926,13927,7596],{},[47,13928,7595],{},[40,13930,7599],{},[14,13932,68],{"id":68},[10,13934,71],{},[73,13936,13937],{"className":75,"code":7606,"language":77,"meta":78,"style":78},[47,13938,13939,13943,13947,13951,13955,13959,13963,13967,13971,13975,13979],{"__ignoreMap":78},[82,13940,13941],{"class":84,"line":85},[82,13942,6549],{},[82,13944,13945],{"class":84,"line":91},[82,13946,101],{"emptyLinePlaceholder":100},[82,13948,13949],{"class":84,"line":97},[82,13950,6760],{},[82,13952,13953],{"class":84,"line":104},[82,13954,101],{"emptyLinePlaceholder":100},[82,13956,13957],{"class":84,"line":110},[82,13958,7629],{},[82,13960,13961],{"class":84,"line":1140},[82,13962,7634],{},[82,13964,13965],{"class":84,"line":2432},[82,13966,101],{"emptyLinePlaceholder":100},[82,13968,13969],{"class":84,"line":2438},[82,13970,7643],{},[82,13972,13973],{"class":84,"line":3898},[82,13974,7648],{},[82,13976,13977],{"class":84,"line":4110},[82,13978,101],{"emptyLinePlaceholder":100},[82,13980,13981],{"class":84,"line":5775},[82,13982,7657],{},[10,13984,115],{},[73,13986,13988],{"className":13987,"code":7663,"language":121,"meta":78},[119],[47,13989,7663],{"__ignoreMap":78},[10,13991,126],{},[14,13993,129],{"id":129},[131,13995,13996,14002],{},[40,13997,7578,13998,7676,14000,156],{},[47,13999,6737],{},[47,14001,7679],{},[40,14003,7682],{},[14,14005,159],{"id":159},[37,14007,14008,14012],{},[40,14009,4733,14010,7691],{},[47,14011,6737],{},[40,14013,7694,14014,7697],{},[47,14015,6737],{},[14,14017,178],{"id":178},[131,14019,14020,14026],{},[40,14021,7704,14022,7708,14024,156],{},[47,14023,7707],{},[47,14025,6737],{},[40,14027,4733,14028,7715,14030,156],{},[47,14029,6737],{},[47,14031,7718],{},[10,14033,197],{},[14,14035,200],{"id":200},[10,14037,7725],{},[205,14039,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14041},[14042,14043,14044,14045,14046,14047,14048,14049],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":7557,"description":7562},[218,6737,7745],{"id":7748,"title":7749,"body":14054,"category":218,"cover":219,"description":7754,"extension":220,"meta":14225,"navigation":100,"path":7967,"pinned":223,"publishedAt":224,"seo":14226,"slug":7969,"stem":7970,"summary":7971,"tags":14227,"updatedAt":224,"visible":100,"__hash__":7975},{"type":7,"value":14055,"toc":14213},[14056,14058,14060,14062,14064,14068,14070,14072,14084,14086,14088,14144,14146,14151,14153,14155,14171,14173,14175,14179,14185,14187,14195,14197,14205,14207,14209,14211],[10,14057,7754],{},[14,14059,16],{"id":16},[10,14061,7759],{},[14,14063,22],{"id":22},[10,14065,14066],{},[26,14067],{"alt":7766,"src":7767},[10,14069,7770],{},[14,14071,35],{"id":35},[37,14073,14074,14078,14082],{},[40,14075,14076,7780],{},[47,14077,7779],{},[40,14079,14080,7786],{},[47,14081,7785],{},[40,14083,7789],{},[14,14085,68],{"id":68},[10,14087,71],{},[73,14089,14090],{"className":75,"code":7796,"language":77,"meta":78,"style":78},[47,14091,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128,14132,14136,14140],{"__ignoreMap":78},[82,14093,14094],{"class":84,"line":85},[82,14095,7803],{},[82,14097,14098],{"class":84,"line":91},[82,14099,7808],{},[82,14101,14102],{"class":84,"line":97},[82,14103,7813],{},[82,14105,14106],{"class":84,"line":104},[82,14107,7818],{},[82,14109,14110],{"class":84,"line":110},[82,14111,101],{"emptyLinePlaceholder":100},[82,14113,14114],{"class":84,"line":1140},[82,14115,7827],{},[82,14117,14118],{"class":84,"line":2432},[82,14119,7832],{},[82,14121,14122],{"class":84,"line":2438},[82,14123,7837],{},[82,14125,14126],{"class":84,"line":3898},[82,14127,7842],{},[82,14129,14130],{"class":84,"line":4110},[82,14131,101],{"emptyLinePlaceholder":100},[82,14133,14134],{"class":84,"line":5775},[82,14135,7851],{},[82,14137,14138],{"class":84,"line":5780},[82,14139,7856],{},[82,14141,14142],{"class":84,"line":7385},[82,14143,7861],{},[10,14145,115],{},[73,14147,14149],{"className":14148,"code":7867,"language":121,"meta":78},[119],[47,14150,7867],{"__ignoreMap":78},[10,14152,126],{},[14,14154,129],{"id":129},[131,14156,14157,14163],{},[40,14158,7878,14159,7882,14161,7885],{},[47,14160,7881],{},[47,14162,7785],{},[40,14164,14165,7891,14167,7895,14169,7898],{},[47,14166,7890],{},[47,14168,7894],{},[47,14170,7779],{},[321,14172,2642],{"id":2642},[10,14174,7903],{},[10,14176,14177],{},[26,14178],{"alt":7908,"src":7909},[10,14180,7912,14181,187,14183,7918],{},[47,14182,4530],{},[47,14184,7917],{},[14,14186,159],{"id":159},[37,14188,14189,14193],{},[40,14190,7925,14191,7928],{},[47,14192,7779],{},[40,14194,7931],{},[14,14196,178],{"id":178},[131,14198,14199,14203],{},[40,14200,5243,14201,7941],{},[47,14202,7940],{},[40,14204,7944],{},[10,14206,197],{},[14,14208,200],{"id":200},[10,14210,7951],{},[205,14212,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14214},[14215,14216,14217,14218,14219,14222,14223,14224],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":14220},[14221],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":7749,"description":7754},[218,7973,7974],{"id":7977,"title":7978,"body":14229,"category":218,"cover":219,"description":7983,"extension":220,"meta":14376,"navigation":100,"path":8162,"pinned":223,"publishedAt":224,"seo":14377,"slug":8164,"stem":8165,"summary":8166,"tags":14378,"updatedAt":224,"visible":100,"__hash__":8170},{"type":7,"value":14230,"toc":14366},[14231,14233,14235,14237,14239,14243,14245,14247,14255,14257,14259,14315,14317,14322,14324,14326,14338,14340,14346,14348,14358,14360,14362,14364],[10,14232,7983],{},[14,14234,16],{"id":16},[10,14236,7988],{},[14,14238,22],{"id":22},[10,14240,14241],{},[26,14242],{"alt":7995,"src":7996},[10,14244,7999],{},[14,14246,35],{"id":35},[37,14248,14249,14251,14253],{},[40,14250,8006],{},[40,14252,8009],{},[40,14254,8012],{},[14,14256,68],{"id":68},[10,14258,71],{},[73,14260,14261],{"className":75,"code":8019,"language":77,"meta":78,"style":78},[47,14262,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299,14303,14307,14311],{"__ignoreMap":78},[82,14264,14265],{"class":84,"line":85},[82,14266,8026],{},[82,14268,14269],{"class":84,"line":91},[82,14270,8031],{},[82,14272,14273],{"class":84,"line":97},[82,14274,8036],{},[82,14276,14277],{"class":84,"line":104},[82,14278,101],{"emptyLinePlaceholder":100},[82,14280,14281],{"class":84,"line":110},[82,14282,8045],{},[82,14284,14285],{"class":84,"line":1140},[82,14286,8050],{},[82,14288,14289],{"class":84,"line":2432},[82,14290,8055],{},[82,14292,14293],{"class":84,"line":2438},[82,14294,101],{"emptyLinePlaceholder":100},[82,14296,14297],{"class":84,"line":3898},[82,14298,8064],{},[82,14300,14301],{"class":84,"line":4110},[82,14302,8069],{},[82,14304,14305],{"class":84,"line":5775},[82,14306,101],{"emptyLinePlaceholder":100},[82,14308,14309],{"class":84,"line":5780},[82,14310,8078],{},[82,14312,14313],{"class":84,"line":7385},[82,14314,8083],{},[10,14316,115],{},[73,14318,14320],{"className":14319,"code":8089,"language":121,"meta":78},[119],[47,14321,8089],{"__ignoreMap":78},[10,14323,126],{},[14,14325,129],{"id":129},[131,14327,14328,14334],{},[40,14329,14330,8103,14332,8107],{},[47,14331,8102],{},[47,14333,8106],{},[40,14335,8110,14336,8114],{},[47,14337,8113],{},[14,14339,159],{"id":159},[37,14341,14342,14344],{},[40,14343,8121],{},[40,14345,8124],{},[14,14347,178],{"id":178},[131,14349,14350,14356],{},[40,14351,8131,14352,8135,14354,156],{},[47,14353,8134],{},[47,14355,8138],{},[40,14357,8141],{},[10,14359,197],{},[14,14361,200],{"id":200},[10,14363,8148],{},[205,14365,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14367},[14368,14369,14370,14371,14372,14373,14374,14375],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":7978,"description":7983},[218,8168,8169],{"id":8172,"title":8173,"body":14380,"category":218,"cover":219,"description":8178,"extension":220,"meta":14543,"navigation":100,"path":8382,"pinned":223,"publishedAt":224,"seo":14544,"slug":8384,"stem":8385,"summary":8386,"tags":14545,"updatedAt":224,"visible":100,"__hash__":8390},{"type":7,"value":14381,"toc":14531},[14382,14384,14386,14388,14390,14394,14398,14400,14416,14418,14420,14464,14466,14471,14473,14475,14489,14491,14495,14499,14503,14505,14511,14513,14523,14525,14527,14529],[10,14383,8178],{},[14,14385,16],{"id":16},[10,14387,8183],{},[14,14389,22],{"id":22},[10,14391,14392],{},[26,14393],{"alt":8190,"src":8191},[10,14395,8194,14396,8198],{},[47,14397,8197],{},[14,14399,35],{"id":35},[37,14401,14402,14408,14414],{},[40,14403,14404,8208,14406,8212],{},[47,14405,8207],{},[47,14407,8211],{},[40,14409,8215,14410,8219,14412,8222],{},[47,14411,8218],{},[47,14413,4284],{},[40,14415,8225],{},[14,14417,68],{"id":68},[10,14419,71],{},[73,14421,14422],{"className":75,"code":8232,"language":77,"meta":78,"style":78},[47,14423,14424,14428,14432,14436,14440,14444,14448,14452,14456,14460],{"__ignoreMap":78},[82,14425,14426],{"class":84,"line":85},[82,14427,8239],{},[82,14429,14430],{"class":84,"line":91},[82,14431,8244],{},[82,14433,14434],{"class":84,"line":97},[82,14435,8249],{},[82,14437,14438],{"class":84,"line":104},[82,14439,8254],{},[82,14441,14442],{"class":84,"line":110},[82,14443,8259],{},[82,14445,14446],{"class":84,"line":1140},[82,14447,101],{"emptyLinePlaceholder":100},[82,14449,14450],{"class":84,"line":2432},[82,14451,8268],{},[82,14453,14454],{"class":84,"line":2438},[82,14455,8273],{},[82,14457,14458],{"class":84,"line":3898},[82,14459,8273],{},[82,14461,14462],{"class":84,"line":4110},[82,14463,8273],{},[10,14465,115],{},[73,14467,14469],{"className":14468,"code":8287,"language":121,"meta":78},[119],[47,14470,8287],{"__ignoreMap":78},[10,14472,126],{},[14,14474,129],{"id":129},[131,14476,14477,14481],{},[40,14478,7878,14479,8301],{},[47,14480,8300],{},[40,14482,8304,14483,8307,14485,8310,14487,8314],{},[47,14484,8211],{},[47,14486,8197],{},[47,14488,8313],{},[321,14490,2642],{"id":2642},[10,14492,8319,14493,8322],{},[47,14494,8211],{},[10,14496,14497],{},[26,14498],{"alt":8327,"src":8328},[10,14500,8331,14501,8334],{},[47,14502,8197],{},[14,14504,159],{"id":159},[37,14506,14507,14509],{},[40,14508,8341],{},[40,14510,8344],{},[14,14512,178],{"id":178},[131,14514,14515,14517],{},[40,14516,8351],{},[40,14518,3956,14519,8356,14521,8359],{},[47,14520,4284],{},[47,14522,8211],{},[10,14524,197],{},[14,14526,200],{"id":200},[10,14528,8366],{},[205,14530,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14532},[14533,14534,14535,14536,14537,14540,14541,14542],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":14538},[14539],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":8173,"description":8178},[218,8388,8389],{"id":8392,"title":8393,"body":14547,"category":218,"cover":219,"description":8398,"extension":220,"meta":14730,"navigation":100,"path":8623,"pinned":223,"publishedAt":224,"seo":14731,"slug":8625,"stem":8626,"summary":8627,"tags":14732,"updatedAt":224,"visible":100,"__hash__":8630},{"type":7,"value":14548,"toc":14718},[14549,14551,14553,14555,14557,14561,14563,14565,14579,14581,14583,14651,14653,14658,14660,14662,14676,14678,14680,14684,14690,14692,14700,14702,14710,14712,14714,14716],[10,14550,8398],{},[14,14552,16],{"id":16},[10,14554,8403],{},[14,14556,22],{"id":22},[10,14558,14559],{},[26,14560],{"alt":8410,"src":8411},[10,14562,8414],{},[14,14564,35],{"id":35},[37,14566,14567,14573,14575],{},[40,14568,14569,8424,14571,156],{},[47,14570,8423],{},[47,14572,8427],{},[40,14574,8430],{},[40,14576,14577,8436],{},[47,14578,8435],{},[14,14580,68],{"id":68},[10,14582,71],{},[73,14584,14585],{"className":75,"code":8443,"language":77,"meta":78,"style":78},[47,14586,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635,14639,14643,14647],{"__ignoreMap":78},[82,14588,14589],{"class":84,"line":85},[82,14590,8450],{},[82,14592,14593],{"class":84,"line":91},[82,14594,101],{"emptyLinePlaceholder":100},[82,14596,14597],{"class":84,"line":97},[82,14598,8459],{},[82,14600,14601],{"class":84,"line":104},[82,14602,8464],{},[82,14604,14605],{"class":84,"line":110},[82,14606,8469],{},[82,14608,14609],{"class":84,"line":1140},[82,14610,8474],{},[82,14612,14613],{"class":84,"line":2432},[82,14614,8479],{},[82,14616,14617],{"class":84,"line":2438},[82,14618,8484],{},[82,14620,14621],{"class":84,"line":3898},[82,14622,8489],{},[82,14624,14625],{"class":84,"line":4110},[82,14626,8494],{},[82,14628,14629],{"class":84,"line":5775},[82,14630,101],{"emptyLinePlaceholder":100},[82,14632,14633],{"class":84,"line":5780},[82,14634,8503],{},[82,14636,14637],{"class":84,"line":7385},[82,14638,6128],{},[82,14640,14641],{"class":84,"line":7391},[82,14642,6133],{},[82,14644,14645],{"class":84,"line":8514},[82,14646,101],{"emptyLinePlaceholder":100},[82,14648,14649],{"class":84,"line":8519},[82,14650,8522],{},[10,14652,115],{},[73,14654,14656],{"className":14655,"code":8528,"language":121,"meta":78},[119],[47,14657,8528],{"__ignoreMap":78},[10,14659,126],{},[14,14661,129],{"id":129},[131,14663,14664,14674],{},[40,14665,8539,14666,8543,14668,8547,14670,8551,14672,156],{},[47,14667,8542],{},[47,14669,8546],{},[47,14671,8550],{},[47,14673,8542],{},[40,14675,8556],{},[321,14677,2642],{"id":2642},[10,14679,8561],{},[10,14681,14682],{},[26,14683],{"alt":8566,"src":8567},[10,14685,14686,8572,14688,156],{},[47,14687,8423],{},[47,14689,8427],{},[14,14691,159],{"id":159},[37,14693,14694,14698],{},[40,14695,8581,14696,156],{},[47,14697,5326],{},[40,14699,8586],{},[14,14701,178],{"id":178},[131,14703,14704,14706],{},[40,14705,8593],{},[40,14707,8596,14708,8600],{},[47,14709,8599],{},[10,14711,197],{},[14,14713,200],{"id":200},[10,14715,8607],{},[205,14717,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14719},[14720,14721,14722,14723,14724,14727,14728,14729],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":14725},[14726],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":8393,"description":8398},[218,8629,5277],{"id":8632,"title":8633,"body":14734,"category":218,"cover":219,"description":8638,"extension":220,"meta":14893,"navigation":100,"path":8826,"pinned":223,"publishedAt":224,"seo":14894,"slug":8828,"stem":8829,"summary":8830,"tags":14895,"updatedAt":224,"visible":100,"__hash__":8834},{"type":7,"value":14735,"toc":14881},[14736,14738,14740,14742,14744,14748,14750,14752,14760,14762,14764,14828,14830,14835,14837,14839,14847,14849,14851,14855,14857,14859,14865,14867,14873,14875,14877,14879],[10,14737,8638],{},[14,14739,16],{"id":16},[10,14741,8643],{},[14,14743,22],{"id":22},[10,14745,14746],{},[26,14747],{"alt":8650,"src":8651},[10,14749,8654],{},[14,14751,35],{"id":35},[37,14753,14754,14756,14758],{},[40,14755,8661],{},[40,14757,8664],{},[40,14759,8667],{},[14,14761,68],{"id":68},[10,14763,71],{},[73,14765,14766],{"className":75,"code":8674,"language":77,"meta":78,"style":78},[47,14767,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812,14816,14820,14824],{"__ignoreMap":78},[82,14769,14770],{"class":84,"line":85},[82,14771,8681],{},[82,14773,14774],{"class":84,"line":91},[82,14775,8686],{},[82,14777,14778],{"class":84,"line":97},[82,14779,101],{"emptyLinePlaceholder":100},[82,14781,14782],{"class":84,"line":104},[82,14783,8695],{},[82,14785,14786],{"class":84,"line":110},[82,14787,101],{"emptyLinePlaceholder":100},[82,14789,14790],{"class":84,"line":1140},[82,14791,8704],{},[82,14793,14794],{"class":84,"line":2432},[82,14795,8709],{},[82,14797,14798],{"class":84,"line":2438},[82,14799,8714],{},[82,14801,14802],{"class":84,"line":3898},[82,14803,101],{"emptyLinePlaceholder":100},[82,14805,14806],{"class":84,"line":4110},[82,14807,8723],{},[82,14809,14810],{"class":84,"line":5775},[82,14811,8728],{},[82,14813,14814],{"class":84,"line":5780},[82,14815,8733],{},[82,14817,14818],{"class":84,"line":7385},[82,14819,101],{"emptyLinePlaceholder":100},[82,14821,14822],{"class":84,"line":7391},[82,14823,6142],{},[82,14825,14826],{"class":84,"line":8514},[82,14827,8746],{},[10,14829,115],{},[73,14831,14833],{"className":14832,"code":8752,"language":121,"meta":78},[119],[47,14834,8752],{"__ignoreMap":78},[10,14836,126],{},[14,14838,129],{"id":129},[131,14840,14841,14845],{},[40,14842,14843,8766],{},[47,14844,8765],{},[40,14846,8769],{},[321,14848,2642],{"id":2642},[10,14850,8774],{},[10,14852,14853],{},[26,14854],{"alt":8779,"src":8780},[10,14856,8783],{},[14,14858,159],{"id":159},[37,14860,14861,14863],{},[40,14862,8790],{},[40,14864,8793],{},[14,14866,178],{"id":178},[131,14868,14869,14871],{},[40,14870,8800],{},[40,14872,8803],{},[10,14874,197],{},[14,14876,200],{"id":200},[10,14878,8810],{},[205,14880,207],{},{"title":78,"searchDepth":91,"depth":91,"links":14882},[14883,14884,14885,14886,14887,14890,14891,14892],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":14888},[14889],{"id":2642,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":8633,"description":8638},[218,8832,8833],{"id":8836,"title":8837,"body":14897,"category":218,"cover":219,"description":8842,"extension":220,"meta":15135,"navigation":100,"path":9143,"pinned":223,"publishedAt":224,"seo":15136,"slug":9145,"stem":9146,"summary":9147,"tags":15137,"updatedAt":224,"visible":100,"__hash__":9151},{"type":7,"value":14898,"toc":15122},[14899,14901,14903,14905,14907,14911,14913,14915,14925,14927,14929,15045,15047,15052,15054,15056,15066,15068,15070,15074,15076,15078,15080,15084,15088,15090,15098,15100,15114,15116,15118,15120],[10,14900,8842],{},[14,14902,16],{"id":16},[10,14904,8847],{},[14,14906,22],{"id":22},[10,14908,14909],{},[26,14910],{"alt":8854,"src":8855},[10,14912,8858],{},[14,14914,35],{"id":35},[37,14916,14917,14919,14921],{},[40,14918,8865],{},[40,14920,8868],{},[40,14922,8871,14923,8875],{},[47,14924,8874],{},[14,14926,68],{"id":68},[10,14928,71],{},[73,14930,14931],{"className":75,"code":8882,"language":77,"meta":78,"style":78},[47,14932,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029,15033,15037,15041],{"__ignoreMap":78},[82,14934,14935],{"class":84,"line":85},[82,14936,6940],{},[82,14938,14939],{"class":84,"line":91},[82,14940,6549],{},[82,14942,14943],{"class":84,"line":97},[82,14944,101],{"emptyLinePlaceholder":100},[82,14946,14947],{"class":84,"line":104},[82,14948,8901],{},[82,14950,14951],{"class":84,"line":110},[82,14952,8906],{},[82,14954,14955],{"class":84,"line":1140},[82,14956,8911],{},[82,14958,14959],{"class":84,"line":2432},[82,14960,8916],{},[82,14962,14963],{"class":84,"line":2438},[82,14964,101],{"emptyLinePlaceholder":100},[82,14966,14967],{"class":84,"line":3898},[82,14968,8925],{},[82,14970,14971],{"class":84,"line":4110},[82,14972,8930],{},[82,14974,14975],{"class":84,"line":5775},[82,14976,8935],{},[82,14978,14979],{"class":84,"line":5780},[82,14980,8940],{},[82,14982,14983],{"class":84,"line":7385},[82,14984,8945],{},[82,14986,14987],{"class":84,"line":7391},[82,14988,101],{"emptyLinePlaceholder":100},[82,14990,14991],{"class":84,"line":8514},[82,14992,8954],{},[82,14994,14995],{"class":84,"line":8519},[82,14996,8959],{},[82,14998,14999],{"class":84,"line":8962},[82,15000,8965],{},[82,15002,15003],{"class":84,"line":8968},[82,15004,101],{"emptyLinePlaceholder":100},[82,15006,15007],{"class":84,"line":8973},[82,15008,8976],{},[82,15010,15011],{"class":84,"line":8979},[82,15012,101],{"emptyLinePlaceholder":100},[82,15014,15015],{"class":84,"line":8984},[82,15016,7358],{},[82,15018,15019],{"class":84,"line":8989},[82,15020,8992],{},[82,15022,15023],{"class":84,"line":8995},[82,15024,8998],{},[82,15026,15027],{"class":84,"line":9001},[82,15028,9004],{},[82,15030,15031],{"class":84,"line":9007},[82,15032,7368],{},[82,15034,15035],{"class":84,"line":9012},[82,15036,9015],{},[82,15038,15039],{"class":84,"line":9018},[82,15040,1137],{},[82,15042,15043],{"class":84,"line":9023},[82,15044,9026],{},[10,15046,115],{},[73,15048,15050],{"className":15049,"code":9032,"language":121,"meta":78},[119],[47,15051,9032],{"__ignoreMap":78},[10,15053,126],{},[14,15055,129],{"id":129},[131,15057,15058,15062],{},[40,15059,9043,15060,9046],{},[47,15061,8874],{},[40,15063,15064,9051],{},[47,15065,8106],{},[321,15067,2642],{"id":2642},[10,15069,9056],{},[10,15071,15072],{},[26,15073],{"alt":9061,"src":9062},[10,15075,9065],{},[321,15077,2642],{"id":4165},[10,15079,9070],{},[10,15081,15082],{},[26,15083],{"alt":9075,"src":9076},[10,15085,9079,15086,9083],{},[47,15087,9082],{},[14,15089,159],{"id":159},[37,15091,15092,15094],{},[40,15093,9090],{},[40,15095,9093,15096,9096],{},[47,15097,9082],{},[14,15099,178],{"id":178},[131,15101,15102,15106,15108],{},[40,15103,9103,15104,9106],{},[47,15105,9082],{},[40,15107,9109],{},[40,15109,9112,15110,9116,15112,9119],{},[47,15111,9115],{},[47,15113,6084],{},[10,15115,197],{},[14,15117,200],{"id":200},[10,15119,9126],{},[205,15121,207],{},{"title":78,"searchDepth":91,"depth":91,"links":15123},[15124,15125,15126,15127,15128,15132,15133,15134],{"id":16,"depth":91,"text":16},{"id":22,"depth":91,"text":22},{"id":35,"depth":91,"text":35},{"id":68,"depth":91,"text":68},{"id":129,"depth":91,"text":129,"children":15129},[15130,15131],{"id":2642,"depth":97,"text":2642},{"id":4165,"depth":97,"text":2642},{"id":159,"depth":91,"text":159},{"id":178,"depth":91,"text":178},{"id":200,"depth":91,"text":200},{},{"title":8837,"description":8842},[218,9149,9150],{"id":1047,"title":1048,"body":15139,"category":218,"cover":1056,"description":78,"extension":220,"meta":15375,"navigation":100,"path":1373,"pinned":223,"publishedAt":1374,"seo":15376,"slug":1376,"stem":1377,"summary":1378,"tags":15377,"updatedAt":1374,"visible":100,"__hash__":1382},{"type":7,"value":15140,"toc":15360},[15141,15145,15147,15149,15151,15153,15173,15175,15180,15182,15184,15212,15218,15220,15224,15226,15246,15248,15258,15260,15262,15264,15266,15268,15270,15272,15274,15276,15296,15298,15300,15304,15306,15308,15310,15312,15316,15318,15336,15338,15340,15342,15344,15346,15348,15350,15352,15354,15356,15358],[10,15142,15143],{},[26,15144],{"alt":1055,"src":1056},[10,15146,1059],{},[10,15148,1062],{},[14,15150,1066],{"id":1065},[10,15152,1069],{},[73,15154,15155],{"className":75,"code":1072,"language":77,"meta":78,"style":78},[47,15156,15157,15161,15165,15169],{"__ignoreMap":78},[82,15158,15159],{"class":84,"line":85},[82,15160,1079],{},[82,15162,15163],{"class":84,"line":91},[82,15164,1084],{},[82,15166,15167],{"class":84,"line":97},[82,15168,101],{"emptyLinePlaceholder":100},[82,15170,15171],{"class":84,"line":104},[82,15172,1093],{},[10,15174,1096],{},[73,15176,15178],{"className":15177,"code":1100,"language":121,"meta":78},[119],[47,15179,1100],{"__ignoreMap":78},[10,15181,1105],{},[10,15183,1108],{},[73,15185,15186],{"className":75,"code":1111,"language":77,"meta":78,"style":78},[47,15187,15188,15192,15196,15200,15204,15208],{"__ignoreMap":78},[82,15189,15190],{"class":84,"line":85},[82,15191,1118],{},[82,15193,15194],{"class":84,"line":91},[82,15195,101],{"emptyLinePlaceholder":100},[82,15197,15198],{"class":84,"line":97},[82,15199,1127],{},[82,15201,15202],{"class":84,"line":104},[82,15203,1132],{},[82,15205,15206],{"class":84,"line":110},[82,15207,1137],{},[82,15209,15210],{"class":84,"line":1140},[82,15211,1143],{},[10,15213,15214,187,15216,1152],{},[47,15215,1148],{},[47,15217,1151],{},[14,15219,1156],{"id":1155},[10,15221,1159,15222,1163],{},[47,15223,1162],{},[10,15225,1166],{},[73,15227,15228],{"className":75,"code":1169,"language":77,"meta":78,"style":78},[47,15229,15230,15234,15238,15242],{"__ignoreMap":78},[82,15231,15232],{"class":84,"line":85},[82,15233,1176],{},[82,15235,15236],{"class":84,"line":91},[82,15237,1181],{},[82,15239,15240],{"class":84,"line":97},[82,15241,1186],{},[82,15243,15244],{"class":84,"line":104},[82,15245,1191],{},[10,15247,1194],{},[73,15249,15250],{"className":583,"code":1197,"language":585,"meta":78,"style":78},[47,15251,15252],{"__ignoreMap":78},[82,15253,15254,15256],{"class":84,"line":85},[82,15255,683],{"class":592},[82,15257,1206],{"class":628},[10,15259,1209],{},[14,15261,1213],{"id":1212},[321,15263,1216],{"id":1216},[10,15265,1219],{},[321,15267,1222],{"id":1222},[10,15269,1225],{},[321,15271,1228],{"id":1228},[10,15273,1231],{},[10,15275,1234],{},[73,15277,15278],{"className":75,"code":1237,"language":77,"meta":78,"style":78},[47,15279,15280,15284,15288,15292],{"__ignoreMap":78},[82,15281,15282],{"class":84,"line":85},[82,15283,1244],{},[82,15285,15286],{"class":84,"line":91},[82,15287,101],{"emptyLinePlaceholder":100},[82,15289,15290],{"class":84,"line":97},[82,15291,1253],{},[82,15293,15294],{"class":84,"line":104},[82,15295,1258],{},[10,15297,1261],{},[321,15299,1264],{"id":1264},[10,15301,1267,15302,1270],{},[47,15303,253],{},[10,15305,1273],{},[321,15307,1276],{"id":1276},[10,15309,1279],{},[14,15311,1283],{"id":1282},[10,15313,15314],{},[26,15315],{"alt":1288,"src":1289},[10,15317,1292],{},[37,15319,15320,15322,15324,15326,15328,15330,15332,15334],{},[40,15321,1297],{},[40,15323,1300],{},[40,15325,1303],{},[40,15327,1306],{},[40,15329,1309],{},[40,15331,1312],{},[40,15333,1315],{},[40,15335,1318],{},[10,15337,1321],{},[14,15339,1325],{"id":1324},[10,15341,1328],{},[10,15343,1331],{},[14,15345,1335],{"id":1334},[10,15347,1338],{},[10,15349,1341],{},[10,15351,1344],{},[14,15353,1347],{"id":1347},[10,15355,1350],{},[10,15357,1353],{},[205,15359,1356],{},{"title":78,"searchDepth":91,"depth":91,"links":15361},[15362,15363,15364,15371,15372,15373,15374],{"id":1065,"depth":91,"text":1066},{"id":1155,"depth":91,"text":1156},{"id":1212,"depth":91,"text":1213,"children":15365},[15366,15367,15368,15369,15370],{"id":1216,"depth":97,"text":1216},{"id":1222,"depth":97,"text":1222},{"id":1228,"depth":97,"text":1228},{"id":1264,"depth":97,"text":1264},{"id":1276,"depth":97,"text":1276},{"id":1282,"depth":91,"text":1283},{"id":1324,"depth":91,"text":1325},{"id":1334,"depth":91,"text":1335},{"id":1347,"depth":91,"text":1347},{},{"title":1048,"description":78},[218,1380,1381],{"id":235,"title":236,"body":15379,"category":218,"cover":219,"description":78,"extension":220,"meta":15958,"navigation":100,"path":1036,"pinned":223,"publishedAt":1037,"seo":15959,"slug":1039,"stem":1040,"summary":1041,"tags":15960,"updatedAt":1037,"visible":100,"__hash__":1045},{"type":7,"value":15380,"toc":15934},[15381,15383,15385,15387,15391,15393,15395,15419,15431,15433,15435,15440,15444,15448,15460,15464,15468,15472,15474,15508,15510,15514,15518,15520,15542,15572,15584,15594,15602,15604,15610,15620,15622,15627,15631,15633,15647,15653,15673,15675,15677,15679,15689,15693,15695,15704,15708,15710,15712,15732,15736,15738,15740,15742,15744,15764,15766,15768,15770,15796,15798,15814,15816,15832,15836,15838,15840,15860,15862,15864,15866,15870,15880,15882,15884,15886,15896,15904,15906,15908,15922,15932],[14,15382,241],{"id":241},[10,15384,244],{},[10,15386,247],{},[10,15388,250,15389,254],{},[47,15390,253],{},[14,15392,257],{"id":257},[10,15394,260],{},[262,15396,15397,15399],{},[10,15398,266],{},[262,15400,15401,15407,15409,15413,15415],{},[10,15402,271,15403,275,15405,279],{},[47,15404,274],{},[47,15406,278],{},[10,15408,282],{},[10,15410,285,15411,290],{},[287,15412,289],{},[10,15414,293],{},[10,15416,15417],{},[26,15418],{"alt":298,"src":299},[262,15420,15421,15423],{},[10,15422,304],{},[262,15424,15425,15427],{},[10,15426,309],{},[10,15428,15429],{},[26,15430],{"alt":314,"src":315},[14,15432,319],{"id":318},[321,15434,324],{"id":323},[10,15436,327,15437,335],{},[329,15438,334],{"href":331,"rel":15439},[333],[262,15441,15442],{},[10,15443,340],{},[10,15445,15446],{},[26,15447],{"alt":345,"src":346},[37,15449,15450,15454,15458],{},[40,15451,351,15452,156],{},[287,15453,354],{},[40,15455,357,15456,156],{},[287,15457,360],{},[40,15459,363],{},[10,15461,15462],{},[26,15463],{"alt":368,"src":369},[262,15465,15466],{},[10,15467,374],{},[10,15469,15470],{},[26,15471],{"alt":379,"src":380},[321,15473,384],{"id":383},[262,15475,15476,15480,15484,15504],{},[262,15477,15478],{},[10,15479,391],{},[10,15481,394,15482,398],{},[287,15483,397],{},[73,15485,15486],{"className":75,"code":401,"language":77,"meta":78,"style":78},[47,15487,15488,15492,15496,15500],{"__ignoreMap":78},[82,15489,15490],{"class":84,"line":85},[82,15491,408],{},[82,15493,15494],{"class":84,"line":91},[82,15495,413],{},[82,15497,15498],{"class":84,"line":97},[82,15499,418],{},[82,15501,15502],{"class":84,"line":104},[82,15503,423],{},[10,15505,426,15506,430],{},[287,15507,429],{},[10,15509,433],{},[10,15511,436,15512,439],{},[47,15513,77],{},[10,15515,15516],{},[26,15517],{"alt":444,"src":445},[10,15519,448],{},[262,15521,15522,15524,15528],{},[10,15523,453],{},[10,15525,15526],{},[287,15527,458],{},[262,15529,15530,15534,15538],{},[10,15531,463,15532,466],{},[47,15533,77],{},[10,15535,469,15536,472],{},[47,15537,77],{},[10,15539,475,15540,479],{},[287,15541,478],{},[262,15543,15544,15546,15550],{},[10,15545,484],{},[10,15547,15548],{},[287,15549,489],{},[262,15551,15552,15558,15566,15568],{},[10,15553,15554,497,15556,501],{},[47,15555,496],{},[47,15557,500],{},[10,15559,504,15560,507,15562,511,15564,515],{},[47,15561,496],{},[287,15563,510],{},[287,15565,514],{},[10,15567,518],{},[10,15569,15570,524],{},[287,15571,523],{},[262,15573,15574,15576],{},[10,15575,529],{},[262,15577,15578,15582],{},[10,15579,534,15580,538],{},[287,15581,537],{},[10,15583,541],{},[262,15585,15586,15590],{},[10,15587,546,15588],{},[287,15589,549],{},[10,15591,15592],{},[26,15593],{"alt":554,"src":555},[262,15595,15596,15598],{},[10,15597,560],{},[10,15599,15600],{},[26,15601],{"alt":554,"src":565},[321,15603,569],{"id":568},[10,15605,572,15606,576,15608,580],{},[47,15607,575],{},[47,15609,579],{},[73,15611,15612],{"className":583,"code":584,"language":585,"meta":78,"style":78},[47,15613,15614],{"__ignoreMap":78},[82,15615,15616,15618],{"class":84,"line":85},[82,15617,77],{"class":592},[82,15619,596],{"class":595},[10,15621,599],{},[73,15623,15625],{"className":15624,"code":603,"language":121,"meta":78},[119],[47,15626,603],{"__ignoreMap":78},[10,15628,15629],{},[26,15630],{"alt":554,"src":610},[10,15632,613],{},[73,15634,15635],{"className":583,"code":616,"language":585,"meta":78,"style":78},[47,15636,15637],{"__ignoreMap":78},[82,15638,15639,15641,15643,15645],{"class":84,"line":85},[82,15640,77],{"class":592},[82,15642,625],{"class":595},[82,15644,629],{"class":628},[82,15646,596],{"class":595},[10,15648,634,15649,637,15651,641],{},[47,15650,77],{},[47,15652,640],{},[73,15654,15655],{"className":583,"code":644,"language":585,"meta":78,"style":78},[47,15656,15657,15663],{"__ignoreMap":78},[82,15658,15659,15661],{"class":84,"line":85},[82,15660,500],{"class":592},[82,15662,596],{"class":595},[82,15664,15665,15667,15669,15671],{"class":84,"line":91},[82,15666,500],{"class":592},[82,15668,625],{"class":595},[82,15670,629],{"class":628},[82,15672,596],{"class":595},[14,15674,666],{"id":665},[321,15676,670],{"id":669},[10,15678,673],{},[73,15680,15681],{"className":583,"code":676,"language":585,"meta":78,"style":78},[47,15682,15683],{"__ignoreMap":78},[82,15684,15685,15687],{"class":84,"line":85},[82,15686,683],{"class":592},[82,15688,596],{"class":595},[10,15690,688,15691,692],{},[47,15692,691],{},[321,15694,696],{"id":695},[10,15696,327,15697,704,15700,156,15702,711],{},[329,15698,703],{"href":701,"rel":15699},[333],[287,15701,707],{},[47,15703,710],{},[10,15705,714,15706,718],{},[47,15707,717],{},[321,15709,722],{"id":721},[10,15711,725],{},[73,15713,15714],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,15715,15716,15722],{"__ignoreMap":78},[82,15717,15718,15720],{"class":84,"line":85},[82,15719,683],{"class":592},[82,15721,596],{"class":595},[82,15723,15724,15726,15728,15730],{"class":84,"line":91},[82,15725,683],{"class":592},[82,15727,625],{"class":595},[82,15729,629],{"class":628},[82,15731,596],{"class":595},[10,15733,749,15734,752],{},[47,15735,683],{},[14,15737,756],{"id":755},[10,15739,759],{},[321,15741,763],{"id":762},[10,15743,766],{},[73,15745,15746],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,15747,15748,15754],{"__ignoreMap":78},[82,15749,15750,15752],{"class":84,"line":85},[82,15751,683],{"class":592},[82,15753,596],{"class":595},[82,15755,15756,15758,15760,15762],{"class":84,"line":91},[82,15757,683],{"class":592},[82,15759,625],{"class":595},[82,15761,629],{"class":628},[82,15763,596],{"class":595},[10,15765,789],{},[321,15767,793],{"id":792},[10,15769,796],{},[73,15771,15772],{"className":583,"code":799,"language":585,"meta":78,"style":78},[47,15773,15774,15782],{"__ignoreMap":78},[82,15775,15776,15778,15780],{"class":84,"line":85},[82,15777,806],{"class":592},[82,15779,809],{"class":628},[82,15781,812],{"class":628},[82,15783,15784,15786,15788,15790,15792,15794],{"class":84,"line":91},[82,15785,806],{"class":592},[82,15787,809],{"class":628},[82,15789,821],{"class":628},[82,15791,824],{"class":628},[82,15793,827],{"class":628},[82,15795,830],{"class":628},[10,15797,833],{},[73,15799,15800],{"className":583,"code":836,"language":585,"meta":78,"style":78},[47,15801,15802],{"__ignoreMap":78},[82,15803,15804,15806,15808,15810,15812],{"class":84,"line":85},[82,15805,806],{"class":592},[82,15807,845],{"class":628},[82,15809,821],{"class":628},[82,15811,824],{"class":628},[82,15813,852],{"class":628},[10,15815,855],{},[73,15817,15818],{"className":583,"code":858,"language":585,"meta":78,"style":78},[47,15819,15820],{"__ignoreMap":78},[82,15821,15822,15824,15826,15828,15830],{"class":84,"line":85},[82,15823,806],{"class":592},[82,15825,867],{"class":628},[82,15827,870],{"class":595},[82,15829,873],{"class":628},[82,15831,876],{"class":628},[10,15833,15834,881],{},[47,15835,806],{},[321,15837,885],{"id":884},[10,15839,888],{},[73,15841,15842],{"className":583,"code":728,"language":585,"meta":78,"style":78},[47,15843,15844,15850],{"__ignoreMap":78},[82,15845,15846,15848],{"class":84,"line":85},[82,15847,683],{"class":592},[82,15849,596],{"class":595},[82,15851,15852,15854,15856,15858],{"class":84,"line":91},[82,15853,683],{"class":592},[82,15855,625],{"class":595},[82,15857,629],{"class":628},[82,15859,596],{"class":595},[10,15861,911],{},[14,15863,914],{"id":914},[321,15865,918],{"id":917},[10,15867,921,15868,925],{},[47,15869,924],{},[131,15871,15872,15876,15878],{},[40,15873,135,15874,932],{},[47,15875,640],{},[40,15877,935],{},[40,15879,938],{},[10,15881,941],{},[321,15883,945],{"id":944},[10,15885,948],{},[73,15887,15888],{"className":583,"code":676,"language":585,"meta":78,"style":78},[47,15889,15890],{"__ignoreMap":78},[82,15891,15892,15894],{"class":84,"line":85},[82,15893,683],{"class":592},[82,15895,596],{"class":595},[10,15897,961,15898,964,15900,967,15902,156],{},[47,15899,683],{},[47,15901,77],{},[47,15903,683],{},[321,15905,973],{"id":972},[10,15907,976],{},[73,15909,15910],{"className":583,"code":979,"language":585,"meta":78,"style":78},[47,15911,15912],{"__ignoreMap":78},[82,15913,15914,15916,15918,15920],{"class":84,"line":85},[82,15915,683],{"class":592},[82,15917,625],{"class":595},[82,15919,629],{"class":628},[82,15921,596],{"class":595},[10,15923,994,15924,997,15926,1000,15928,1003,15930,1007],{},[47,15925,683],{},[47,15927,77],{},[47,15929,500],{},[47,15931,1006],{},[205,15933,1010],{},{"title":78,"searchDepth":91,"depth":91,"links":15935},[15936,15937,15938,15943,15948,15953],{"id":241,"depth":91,"text":241},{"id":257,"depth":91,"text":257},{"id":318,"depth":91,"text":319,"children":15939},[15940,15941,15942],{"id":323,"depth":97,"text":324},{"id":383,"depth":97,"text":384},{"id":568,"depth":97,"text":569},{"id":665,"depth":91,"text":666,"children":15944},[15945,15946,15947],{"id":669,"depth":97,"text":670},{"id":695,"depth":97,"text":696},{"id":721,"depth":97,"text":722},{"id":755,"depth":91,"text":756,"children":15949},[15950,15951,15952],{"id":762,"depth":97,"text":763},{"id":792,"depth":97,"text":793},{"id":884,"depth":97,"text":885},{"id":914,"depth":91,"text":914,"children":15954},[15955,15956,15957],{"id":917,"depth":97,"text":918},{"id":944,"depth":97,"text":945},{"id":972,"depth":97,"text":973},{},{"title":236,"description":78},[218,1043,1044],1786973364168]