[{"data":1,"prerenderedAt":15999},["ShallowReactive",2],{"post-python-class-object":3,"sidebar-posts":287,"post-related-source":9190},{"id":4,"title":5,"body":6,"category":272,"cover":273,"description":12,"extension":274,"meta":275,"navigation":102,"path":276,"pinned":277,"publishedAt":278,"seo":279,"slug":280,"stem":281,"summary":282,"tags":283,"updatedAt":278,"visible":102,"__hash__":286},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":8,"toc":260},"minimark",[9,13,17,20,23,30,33,36,56,59,62,151,154,162,165,168,194,198,201,207,218,221,232,235,247,250,253,256],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,31,32],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,34,35],{"id":35},"核心概念",[37,38,39,47,53],"ul",{},[40,41,42,46],"li",{},[43,44,45],"code",{},"self"," 表示当前实例，由方法调用自动传入。",[40,48,49,52],{},[43,50,51],{},"__init__"," 在实例创建过程中初始化属性。",[40,54,55],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,57,58],{"id":58},"跟着示例运行",[10,60,61],{},"把下面代码保存到本课脚本并运行：",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-python shiki shiki-themes github-dark","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","python","",[43,70,71,79,85,91,97,104,110,116,122,128,133,139,145],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,78],{},"class LearningRecord:\n",[72,80,82],{"class":74,"line":81},2,[72,83,84],{},"    def __init__(self, course, progress=0):\n",[72,86,88],{"class":74,"line":87},3,[72,89,90],{},"        self.course = course\n",[72,92,94],{"class":74,"line":93},4,[72,95,96],{},"        self.progress = progress\n",[72,98,100],{"class":74,"line":99},5,[72,101,103],{"emptyLinePlaceholder":102},true,"\n",[72,105,107],{"class":74,"line":106},6,[72,108,109],{},"    def advance(self, amount):\n",[72,111,113],{"class":74,"line":112},7,[72,114,115],{},"        self.progress = self.progress + amount\n",[72,117,119],{"class":74,"line":118},8,[72,120,121],{},"        if self.progress > 100:\n",[72,123,125],{"class":74,"line":124},9,[72,126,127],{},"            self.progress = 100\n",[72,129,131],{"class":74,"line":130},10,[72,132,103],{"emptyLinePlaceholder":102},[72,134,136],{"class":74,"line":135},11,[72,137,138],{},"record = LearningRecord(\"Python\", 40)\n",[72,140,142],{"class":74,"line":141},12,[72,143,144],{},"record.advance(15)\n",[72,146,148],{"class":74,"line":147},13,[72,149,150],{},"print(record.course, record.progress)\n",[10,152,153],{},"预期结果：",[63,155,160],{"className":156,"code":158,"language":159,"meta":68},[157],"language-text","Python 55\n","text",[43,161,158],{"__ignoreMap":68},[10,163,164],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,166,167],{"id":167},"按执行顺序拆开看",[169,170,171,181],"ol",{},[40,172,173,174,177,178,180],{},"调用 ",[43,175,176],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[43,179,51],{}," 把课程和进度保存在该实例属性中。",[40,182,183,186,187,190,191,193],{},[43,184,185],{},"record.advance(15)"," 自动把 ",[43,188,189],{},"record"," 作为 ",[43,192,45],{},"，方法更新同一实例的进度并限制上限。",[195,196,197],"h3",{"id":197},"再看一个具体细节",[10,199,200],{},"类是共同定义，实例则各自保存状态。",[10,202,203],{},[26,204],{"alt":205,"src":206},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,208,209,210,213,214,217],{},"两个实例共享同一套方法定义，但 ",[43,211,212],{},"course"," 和 ",[43,215,216],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,219,220],{"id":220},"初学者容易混淆的地方",[37,222,223,229],{},[40,224,225,226,228],{},"调用实例方法时手工再传一次 ",[43,227,45],{},"。通过实例调用时 Python 会自动绑定。",[40,230,231],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,233,234],{"id":234},"练习",[169,236,237,244],{},[40,238,239,240,243],{},"定义 ",[43,241,242],{},"Book"," 类，保存标题和阅读页数。",[40,245,246],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,248,249],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,251,252],{"id":252},"本篇边界",[10,254,255],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,258,259],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":261},[262,263,264,265,266,269,270,271],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":267},[268],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F35-python-class-object",false,"2026-08-17",{"title":5,"description":12},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[272,284,285],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",[288,1101,1437,1571,1723,1902,2090,2255,2439,2620,2812,3043,3227,3404,3561,3732,3897,4111,4339,4521,4684,4873,5061,5216,5375,5572,5769,5981,6148,6392,6573,6778,6973,7157,7358,7647,7839,8014,8209,8429,8669,8873],{"id":289,"title":290,"body":291,"category":272,"cover":273,"description":68,"extension":274,"meta":1090,"navigation":102,"path":1091,"pinned":277,"publishedAt":1092,"seo":1093,"slug":1094,"stem":1095,"summary":1096,"tags":1097,"updatedAt":1092,"visible":102,"__hash__":1100},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":292,"toc":1066},[293,296,299,302,309,312,315,354,370,374,378,389,394,400,418,424,429,435,439,485,488,494,500,503,534,579,596,610,620,624,635,651,654,660,665,668,686,696,717,721,725,728,740,747,751,766,773,777,780,801,807,811,814,818,821,841,844,848,851,885,888,907,910,931,936,940,943,963,966,969,973,980,994,997,1001,1004,1014,1025,1029,1032,1047,1063],[14,294,295],{"id":295},"引言",[10,297,298],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,300,301],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,303,304,305,308],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[43,306,307],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,310,311],{"id":311},"扫盲",[10,313,314],{},"那么这里有几个概念：",[316,317,318,321],"blockquote",{},[10,319,320],{},"为什么需要安装python解释器？",[316,322,323,334,337,345,348],{},[10,324,325,326,329,330,333],{},"我们写的代码，电脑其实看不懂，电脑只认识",[43,327,328],{},"0","和",[43,331,332],{},"1","组成的机器指令。",[10,335,336],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,338,339,340,344],{},"这样，我们就能用",[341,342,343],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,346,347],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,349,350],{},[26,351],{"alt":352,"src":353},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[316,355,356,359],{},[10,357,358],{},"pip又是什么？",[316,360,361,364],{},[10,362,363],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,365,366],{},[26,367],{"alt":368,"src":369},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,371,373],{"id":372},"windows-安装","Windows 安装",[195,375,377],{"id":376},"_1-下载官方安装程序","1. 下载官方安装程序",[10,379,380,381,388],{},"打开 ",[382,383,387],"a",{"href":384,"rel":385},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[386],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[316,390,391],{},[10,392,393],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,395,396],{},[26,397],{"alt":398,"src":399},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[37,401,402,409,415],{},[40,403,404,405,408],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[341,406,407],{},"Windows installer (64-bit)","。",[40,410,411,412,408],{},"搭载 ARM 处理器的 Windows 设备选择 ",[341,413,414],{},"Windows installer (ARM64)",[40,416,417],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,419,420],{},[26,421],{"alt":422,"src":423},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[316,425,426],{},[10,427,428],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,430,431],{},[26,432],{"alt":433,"src":434},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[195,436,438],{"id":437},"_2-安装并加入-path","2. 安装并加入 PATH",[316,440,441,446,453,478],{},[316,442,443],{},[10,444,445],{},"PATH 环境变量",[10,447,448,449,452],{},"Windows 有一个特殊的变量叫 ",[341,450,451],{},"PATH","，它里面存了一串文件夹路径，比如：",[63,454,456],{"className":65,"code":455,"language":67,"meta":68,"style":68},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[43,457,458,463,468,473],{"__ignoreMap":68},[72,459,460],{"class":74,"line":75},[72,461,462],{},"D:\\Python313\\\n",[72,464,465],{"class":74,"line":81},[72,466,467],{},"D:\\Python313\\Scripts\\\n",[72,469,470],{"class":74,"line":87},[72,471,472],{},"C:\\Windows\\System32\\\n",[72,474,475],{"class":74,"line":93},[72,476,477],{},"...\n",[10,479,480,481,484],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[341,482,483],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,486,487],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,489,490,491,493],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[43,492,67],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,495,496],{},[26,497],{"alt":498,"src":499},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,501,502],{},"对安装界面最底部的两个勾选项分别解释 :",[316,504,505,508,513],{},[10,506,507],{},"Add python.exe to PATH",[10,509,510],{},[341,511,512],{},"把 Python 添加到系统环境变量",[316,514,515,521,527],{},[10,516,517,518,520],{},"勾选后，你可以在命令行任意位置直接输入 ",[43,519,67],{}," 就能运行",[10,522,523,524,526],{},"不勾选的话，命令行输入 ",[43,525,67],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,528,529,530,533],{},"必须",[341,531,532],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[316,535,536,539,544],{},[10,537,538],{},"Use admin privileges when installing py.exe",[10,540,541],{},[341,542,543],{},"使用管理员权限安装 py.exe（Python 启动器）",[316,545,546,556,570,573],{},[10,547,548,551,552,555],{},[43,549,550],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[43,553,554],{},"py"," 来启动 Python。",[10,557,558,559,561,562,565,566,569],{},"勾选后，",[43,560,550],{}," 会安装到",[341,563,564],{},"系统级目录","，电脑上",[341,567,568],{},"所有用户账户","都能用",[10,571,572],{},"不勾选，只有当前用户能用",[10,574,575,578],{},[341,576,577],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[316,580,581,584],{},[10,582,583],{},"操作建议",[316,585,586,593],{},[10,587,588,589,592],{},"两个都勾上之后，再点 ",[341,590,591],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,594,595],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[316,597,598,604],{},[10,599,600,601],{},"Python 安装的",[341,602,603],{},"可选功能页",[10,605,606],{},[26,607],{"alt":608,"src":609},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[316,611,612,615],{},[10,613,614],{},"高级选项页",[10,616,617],{},[26,618],{"alt":608,"src":619},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[195,621,623],{"id":622},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,625,626,627,630,631,634],{},"按 ",[43,628,629],{},"Win + R","，输入 ",[43,632,633],{},"cmd"," 并回车，然后执行：",[63,636,640],{"className":637,"code":638,"language":639,"meta":68,"style":68},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[43,641,642],{"__ignoreMap":68},[72,643,644,647],{"class":74,"line":75},[72,645,67],{"class":646},"svObZ",[72,648,650],{"class":649},"sDLfK"," --version\n",[10,652,653],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[63,655,658],{"className":656,"code":657,"language":159,"meta":68},[157],"Python 3.x.x\n",[43,659,657],{"__ignoreMap":68},[10,661,662],{},[26,663],{"alt":608,"src":664},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,666,667],{},"继续检查 pip：",[63,669,671],{"className":637,"code":670,"language":639,"meta":68,"style":68},"python -m pip --version\n",[43,672,673],{"__ignoreMap":68},[72,674,675,677,680,684],{"class":74,"line":75},[72,676,67],{"class":646},[72,678,679],{"class":649}," -m",[72,681,683],{"class":682},"sU2Wk"," pip",[72,685,650],{"class":649},[10,687,688,689,691,692,695],{},"如果 ",[43,690,67],{}," 无法识别，但 ",[43,693,694],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[63,697,699],{"className":637,"code":698,"language":639,"meta":68,"style":68},"py --version\npy -m pip --version\n",[43,700,701,707],{"__ignoreMap":68},[72,702,703,705],{"class":74,"line":75},[72,704,554],{"class":646},[72,706,650],{"class":649},[72,708,709,711,713,715],{"class":74,"line":81},[72,710,554],{"class":646},[72,712,679],{"class":649},[72,714,683],{"class":682},[72,716,650],{"class":649},[14,718,720],{"id":719},"macos-安装","macOS 安装",[195,722,724],{"id":723},"_1-先检查现有环境","1. 先检查现有环境",[10,726,727],{},"打开“终端”应用，执行：",[63,729,731],{"className":637,"code":730,"language":639,"meta":68,"style":68},"python3 --version\n",[43,732,733],{"__ignoreMap":68},[72,734,735,738],{"class":74,"line":75},[72,736,737],{"class":646},"python3",[72,739,650],{"class":649},[10,741,742,743,746],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[43,744,745],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[195,748,750],{"id":749},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,752,380,753,758,759,408,762,765],{},[382,754,757],{"href":755,"rel":756},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[386],"Python macOS 下载页","，下载当前稳定版的 ",[341,760,761],{},"macOS 64-bit universal2 installer",[43,763,764],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,767,768,769,772],{},"下载完成后打开 ",[43,770,771],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[195,774,776],{"id":775},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,778,779],{},"安装完成后重新打开终端，执行：",[63,781,783],{"className":637,"code":782,"language":639,"meta":68,"style":68},"python3 --version\npython3 -m pip --version\n",[43,784,785,791],{"__ignoreMap":68},[72,786,787,789],{"class":74,"line":75},[72,788,737],{"class":646},[72,790,650],{"class":649},[72,792,793,795,797,799],{"class":74,"line":81},[72,794,737],{"class":646},[72,796,679],{"class":649},[72,798,683],{"class":682},[72,800,650],{"class":649},[10,802,803,804,806],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[43,805,737],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,808,810],{"id":809},"linux-安装","Linux 安装",[10,812,813],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[195,815,817],{"id":816},"_1-检查是否已经安装","1. 检查是否已经安装",[10,819,820],{},"打开终端，执行：",[63,822,823],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,824,825,831],{"__ignoreMap":68},[72,826,827,829],{"class":74,"line":75},[72,828,737],{"class":646},[72,830,650],{"class":649},[72,832,833,835,837,839],{"class":74,"line":81},[72,834,737],{"class":646},[72,836,679],{"class":649},[72,838,683],{"class":682},[72,840,650],{"class":649},[10,842,843],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[195,845,847],{"id":846},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,849,850],{},"Ubuntu 或 Debian：",[63,852,854],{"className":637,"code":853,"language":639,"meta":68,"style":68},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[43,855,856,867],{"__ignoreMap":68},[72,857,858,861,864],{"class":74,"line":75},[72,859,860],{"class":646},"sudo",[72,862,863],{"class":682}," apt",[72,865,866],{"class":682}," update\n",[72,868,869,871,873,876,879,882],{"class":74,"line":81},[72,870,860],{"class":646},[72,872,863],{"class":682},[72,874,875],{"class":682}," install",[72,877,878],{"class":682}," python3",[72,880,881],{"class":682}," python3-pip",[72,883,884],{"class":682}," python3-venv\n",[10,886,887],{},"Fedora：",[63,889,891],{"className":637,"code":890,"language":639,"meta":68,"style":68},"sudo dnf install python3 python3-pip\n",[43,892,893],{"__ignoreMap":68},[72,894,895,897,900,902,904],{"class":74,"line":75},[72,896,860],{"class":646},[72,898,899],{"class":682}," dnf",[72,901,875],{"class":682},[72,903,878],{"class":682},[72,905,906],{"class":682}," python3-pip\n",[10,908,909],{},"Arch Linux：",[63,911,913],{"className":637,"code":912,"language":639,"meta":68,"style":68},"sudo pacman -S python python-pip\n",[43,914,915],{"__ignoreMap":68},[72,916,917,919,922,925,928],{"class":74,"line":75},[72,918,860],{"class":646},[72,920,921],{"class":682}," pacman",[72,923,924],{"class":649}," -S",[72,926,927],{"class":682}," python",[72,929,930],{"class":682}," python-pip\n",[10,932,933,935],{},[43,934,860],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[195,937,939],{"id":938},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,941,942],{},"安装结束后执行：",[63,944,945],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,946,947,953],{"__ignoreMap":68},[72,948,949,951],{"class":74,"line":75},[72,950,737],{"class":646},[72,952,650],{"class":649},[72,954,955,957,959,961],{"class":74,"line":81},[72,956,737],{"class":646},[72,958,679],{"class":649},[72,960,683],{"class":682},[72,962,650],{"class":649},[10,964,965],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,967,968],{"id":968},"常见问题",[195,970,972],{"id":971},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,974,975,976,979],{},"先关闭当前命令提示符并重新打开，再执行 ",[43,977,978],{},"python --version","。如果仍然失败，按下面的顺序检查：",[169,981,982,988,991],{},[40,983,984,985,987],{},"执行 ",[43,986,694],{},"，确认 Python Launcher 是否可用。",[40,989,990],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[40,992,993],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,995,996],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[195,998,1000],{"id":999},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,1002,1003],{},"先尝试：",[63,1005,1006],{"className":637,"code":730,"language":639,"meta":68,"style":68},[43,1007,1008],{"__ignoreMap":68},[72,1009,1010,1012],{"class":74,"line":75},[72,1011,737],{"class":646},[72,1013,650],{"class":649},[10,1015,1016,1017,1019,1020,1022,1023,408],{},"在这两个系统中，只有 ",[43,1018,737],{}," 命令而没有 ",[43,1021,67],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[43,1024,737],{},[195,1026,1028],{"id":1027},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,1030,1031],{},"先使用模块方式检查：",[63,1033,1035],{"className":637,"code":1034,"language":639,"meta":68,"style":68},"python3 -m pip --version\n",[43,1036,1037],{"__ignoreMap":68},[72,1038,1039,1041,1043,1045],{"class":74,"line":75},[72,1040,737],{"class":646},[72,1042,679],{"class":649},[72,1044,683],{"class":682},[72,1046,650],{"class":649},[10,1048,1049,1050,1052,1053,1055,1056,1058,1059,1062],{},"Windows 用户将命令中的 ",[43,1051,737],{}," 换成 ",[43,1054,67],{}," 或 ",[43,1057,554],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[43,1060,1061],{},"python3-pip","；不要直接使用其他系统的安装命令。",[257,1064,1065],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":81,"depth":81,"links":1067},[1068,1069,1070,1075,1080,1085],{"id":295,"depth":81,"text":295},{"id":311,"depth":81,"text":311},{"id":372,"depth":81,"text":373,"children":1071},[1072,1073,1074],{"id":376,"depth":87,"text":377},{"id":437,"depth":87,"text":438},{"id":622,"depth":87,"text":623},{"id":719,"depth":81,"text":720,"children":1076},[1077,1078,1079],{"id":723,"depth":87,"text":724},{"id":749,"depth":87,"text":750},{"id":775,"depth":87,"text":776},{"id":809,"depth":81,"text":810,"children":1081},[1082,1083,1084],{"id":816,"depth":87,"text":817},{"id":846,"depth":87,"text":847},{"id":938,"depth":87,"text":939},{"id":968,"depth":81,"text":968,"children":1086},[1087,1088,1089],{"id":971,"depth":87,"text":972},{"id":999,"depth":87,"text":1000},{"id":1027,"depth":87,"text":1028},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":290,"description":68},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[272,1098,1099],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1102,"title":1103,"body":1104,"category":272,"cover":1111,"description":68,"extension":274,"meta":1426,"navigation":102,"path":1427,"pinned":277,"publishedAt":1428,"seo":1429,"slug":1430,"stem":1431,"summary":1432,"tags":1433,"updatedAt":1428,"visible":102,"__hash__":1436},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1105,"toc":1411},[1106,1112,1115,1118,1122,1125,1149,1152,1158,1161,1164,1198,1207,1211,1218,1221,1246,1249,1261,1264,1268,1271,1274,1277,1280,1283,1286,1289,1313,1316,1319,1325,1328,1331,1334,1338,1344,1347,1373,1376,1380,1383,1386,1390,1393,1396,1399,1402,1405,1408],[10,1107,1108],{},[26,1109],{"alt":1110,"src":1111},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1113,1114],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1116,1117],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1119,1121],{"id":1120},"python-代码是什么样的","Python 代码是什么样的",[10,1123,1124],{},"下面是一段简单的 Python 代码：",[63,1126,1128],{"className":65,"code":1127,"language":67,"meta":68,"style":68},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[43,1129,1130,1135,1140,1144],{"__ignoreMap":68},[72,1131,1132],{"class":74,"line":75},[72,1133,1134],{},"name = \"Python\"\n",[72,1136,1137],{"class":74,"line":81},[72,1138,1139],{},"year = 2026\n",[72,1141,1142],{"class":74,"line":87},[72,1143,103],{"emptyLinePlaceholder":102},[72,1145,1146],{"class":74,"line":93},[72,1147,1148],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1150,1151],{},"运行结果：",[63,1153,1156],{"className":1154,"code":1155,"language":159,"meta":68},[157],"正在学习 Python，当前年份是 2026\n",[43,1157,1155],{"__ignoreMap":68},[10,1159,1160],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1162,1163],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[63,1165,1167],{"className":65,"code":1166,"language":67,"meta":68,"style":68},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[43,1168,1169,1174,1178,1183,1188,1193],{"__ignoreMap":68},[72,1170,1171],{"class":74,"line":75},[72,1172,1173],{},"score = 85\n",[72,1175,1176],{"class":74,"line":81},[72,1177,103],{"emptyLinePlaceholder":102},[72,1179,1180],{"class":74,"line":87},[72,1181,1182],{},"if score >= 60:\n",[72,1184,1185],{"class":74,"line":93},[72,1186,1187],{},"    print(\"成绩合格\")\n",[72,1189,1190],{"class":74,"line":99},[72,1191,1192],{},"else:\n",[72,1194,1195],{"class":74,"line":106},[72,1196,1197],{},"    print(\"需要继续学习\")\n",[10,1199,1200,213,1203,1206],{},[43,1201,1202],{},"if",[43,1204,1205],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1208,1210],{"id":1209},"python-如何运行代码","Python 如何运行代码",[10,1212,1213,1214,1217],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[43,1215,1216],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1219,1220],{},"交互式环境适合快速验证一个表达式：",[63,1222,1224],{"className":65,"code":1223,"language":67,"meta":68,"style":68},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[43,1225,1226,1231,1236,1241],{"__ignoreMap":68},[72,1227,1228],{"class":74,"line":75},[72,1229,1230],{},">>> 10 + 20\n",[72,1232,1233],{"class":74,"line":81},[72,1234,1235],{},"30\n",[72,1237,1238],{"class":74,"line":87},[72,1239,1240],{},">>> \"Python\".lower()\n",[72,1242,1243],{"class":74,"line":93},[72,1244,1245],{},"'python'\n",[10,1247,1248],{},"需要保存和重复运行的程序，则可以写入文件：",[63,1250,1252],{"className":637,"code":1251,"language":639,"meta":68,"style":68},"python3 hello.py\n",[43,1253,1254],{"__ignoreMap":68},[72,1255,1256,1258],{"class":74,"line":75},[72,1257,737],{"class":646},[72,1259,1260],{"class":682}," hello.py\n",[10,1262,1263],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1265,1267],{"id":1266},"python-的特点","Python 的特点",[195,1269,1270],{"id":1270},"语法相对简洁",[10,1272,1273],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[195,1275,1276],{"id":1276},"支持多种编程方式",[10,1278,1279],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[195,1281,1282],{"id":1282},"标准库比较完整",[10,1284,1285],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1287,1288],{},"例如，获取当前时间：",[63,1290,1292],{"className":65,"code":1291,"language":67,"meta":68,"style":68},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[43,1293,1294,1299,1303,1308],{"__ignoreMap":68},[72,1295,1296],{"class":74,"line":75},[72,1297,1298],{},"from datetime import datetime\n",[72,1300,1301],{"class":74,"line":81},[72,1302,103],{"emptyLinePlaceholder":102},[72,1304,1305],{"class":74,"line":87},[72,1306,1307],{},"now = datetime.now()\n",[72,1309,1310],{"class":74,"line":93},[72,1311,1312],{},"print(now)\n",[10,1314,1315],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[195,1317,1318],{"id":1318},"第三方工具丰富",[10,1320,1321,1322,1324],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[43,1323,307],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1326,1327],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[195,1329,1330],{"id":1330},"支持多个操作系统",[10,1332,1333],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1335,1337],{"id":1336},"python-可以做什么","Python 可以做什么",[10,1339,1340],{},[26,1341],{"alt":1342,"src":1343},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1345,1346],{},"Python 的应用范围比较广，常见方向包括：",[37,1348,1349,1352,1355,1358,1361,1364,1367,1370],{},[40,1350,1351],{},"编写自动化脚本，批量处理文件和重复任务；",[40,1353,1354],{},"开发网站后端和 API 服务；",[40,1356,1357],{},"进行数据清洗、统计分析和图表展示；",[40,1359,1360],{},"编写网络爬虫和信息采集工具；",[40,1362,1363],{},"开发自动化测试程序；",[40,1365,1366],{},"进行机器学习和人工智能开发；",[40,1368,1369],{},"编写运维、监控和辅助开发工具；",[40,1371,1372],{},"开发部分桌面应用和插件。",[10,1374,1375],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1377,1379],{"id":1378},"python-的发展","Python 的发展",[10,1381,1382],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1384,1385],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1387,1389],{"id":1388},"python-也有局限","Python 也有局限",[10,1391,1392],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1394,1395],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1397,1398],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1400,1401],{"id":1401},"写在最后",[10,1403,1404],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1406,1407],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[257,1409,1410],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":81,"depth":81,"links":1412},[1413,1414,1415,1422,1423,1424,1425],{"id":1120,"depth":81,"text":1121},{"id":1209,"depth":81,"text":1210},{"id":1266,"depth":81,"text":1267,"children":1416},[1417,1418,1419,1420,1421],{"id":1270,"depth":87,"text":1270},{"id":1276,"depth":87,"text":1276},{"id":1282,"depth":87,"text":1282},{"id":1318,"depth":87,"text":1318},{"id":1330,"depth":87,"text":1330},{"id":1336,"depth":81,"text":1337},{"id":1378,"depth":81,"text":1379},{"id":1388,"depth":81,"text":1389},{"id":1401,"depth":81,"text":1401},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1103,"description":68},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[272,1434,1435],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1438,"title":1439,"body":1440,"category":272,"cover":273,"description":1444,"extension":274,"meta":1562,"navigation":102,"path":1563,"pinned":277,"publishedAt":278,"seo":1564,"slug":1565,"stem":1566,"summary":1567,"tags":1568,"updatedAt":278,"visible":102,"__hash__":1570},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1441,"toc":1552},[1442,1445,1447,1450,1452,1458,1463,1465,1479,1481,1483,1492,1494,1500,1502,1504,1520,1522,1533,1535,1543,1545,1547,1550],[10,1443,1444],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1446,16],{"id":16},[10,1448,1449],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1451,22],{"id":22},[10,1453,1454],{},[26,1455],{"alt":1456,"src":1457},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1459,1460,1462],{},[43,1461,1216],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1464,35],{"id":35},[37,1466,1467,1473,1476],{},[40,1468,1469,1470,1472],{},"源代码是人编写的文本，通常保存在 ",[43,1471,1216],{}," 文件中。",[40,1474,1475],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[40,1477,1478],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1480,58],{"id":58},[10,1482,61],{},[63,1484,1486],{"className":65,"code":1485,"language":67,"meta":68,"style":68},"print(\"你好，Python\")\n",[43,1487,1488],{"__ignoreMap":68},[72,1489,1490],{"class":74,"line":75},[72,1491,1485],{},[10,1493,153],{},[63,1495,1498],{"className":1496,"code":1497,"language":159,"meta":68},[157],"你好，Python\n",[43,1499,1497],{"__ignoreMap":68},[10,1501,164],{},[14,1503,167],{"id":167},[169,1505,1506,1513],{},[40,1507,1508,1509,1512],{},"终端启动解释器后，解释器读取 ",[43,1510,1511],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[40,1514,1515,1516,1519],{},"字符串对象先准备好，再交给 ",[43,1517,1518],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1521,220],{"id":220},[37,1523,1524,1527],{},[40,1525,1526],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[40,1528,1529,1530,1532],{},"认为 ",[43,1531,1216],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1534,234],{"id":234},[169,1536,1537,1540],{},[40,1538,1539],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[40,1541,1542],{},"把示例文字改成自己的学习目标并重新运行。",[10,1544,249],{},[14,1546,252],{"id":252},[10,1548,1549],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,1551,259],{},{"title":68,"searchDepth":81,"depth":81,"links":1553},[1554,1555,1556,1557,1558,1559,1560,1561],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1439,"description":1444},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[272,1434,1569],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1572,"title":1573,"body":1574,"category":272,"cover":273,"description":1578,"extension":274,"meta":1714,"navigation":102,"path":1715,"pinned":277,"publishedAt":278,"seo":1716,"slug":1717,"stem":1718,"summary":1719,"tags":1720,"updatedAt":278,"visible":102,"__hash__":1722},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1575,"toc":1704},[1576,1579,1581,1584,1586,1592,1598,1600,1615,1617,1620,1640,1642,1648,1650,1652,1665,1667,1681,1683,1694,1696,1698,1701],[10,1577,1578],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1580,16],{"id":16},[10,1582,1583],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1585,22],{"id":22},[10,1587,1588],{},[26,1589],{"alt":1590,"src":1591},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1593,1594,1595,1597],{},"终端收到 ",[43,1596,737],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1599,35],{"id":35},[37,1601,1602,1605,1608],{},[40,1603,1604],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[40,1606,1607],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[40,1609,1610,1611,1614],{},"检查 pip 时使用 ",[43,1612,1613],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1616,58],{"id":58},[10,1618,1619],{},"在 macOS 终端执行：",[63,1621,1622],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,1623,1624,1630],{"__ignoreMap":68},[72,1625,1626,1628],{"class":74,"line":75},[72,1627,737],{"class":646},[72,1629,650],{"class":649},[72,1631,1632,1634,1636,1638],{"class":74,"line":81},[72,1633,737],{"class":646},[72,1635,679],{"class":649},[72,1637,683],{"class":682},[72,1639,650],{"class":649},[10,1641,153],{},[63,1643,1646],{"className":1644,"code":1645,"language":159,"meta":68},[157],"Python 3.14.x\npip 版本信息与安装路径\n",[43,1647,1645],{"__ignoreMap":68},[10,1649,164],{},[14,1651,167],{"id":167},[169,1653,1654,1660],{},[40,1655,1656,1659],{},[43,1657,1658],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[40,1661,1662,1664],{},[43,1663,745],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1666,220],{"id":220},[37,1668,1669,1675],{},[40,1670,1671,1672,1674],{},"看到系统已有 ",[43,1673,737],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[40,1676,1677,1678,1680],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[43,1679,737],{},"，不修改系统自带工具。",[14,1682,234],{"id":234},[169,1684,1685,1691],{},[40,1686,984,1687,1690],{},[43,1688,1689],{},"which python3","，记录当前解释器路径。",[40,1692,1693],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1695,249],{},[14,1697,252],{"id":252},[10,1699,1700],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,1702,1703],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":1705},[1706,1707,1708,1709,1710,1711,1712,1713],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1573,"description":1578},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[272,1721,1098],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1724,"title":1725,"body":1726,"category":272,"cover":273,"description":1891,"extension":274,"meta":1892,"navigation":102,"path":1893,"pinned":277,"publishedAt":278,"seo":1894,"slug":1895,"stem":1896,"summary":1897,"tags":1898,"updatedAt":278,"visible":102,"__hash__":1901},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1727,"toc":1881},[1728,1734,1736,1739,1741,1747,1750,1752,1776,1778,1780,1807,1809,1815,1817,1819,1837,1839,1853,1855,1869,1871,1873,1879],[10,1729,1730,1731,1733],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[43,1732,1216],{}," 脚本。",[14,1735,16],{"id":16},[10,1737,1738],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1740,22],{"id":22},[10,1742,1743],{},[26,1744],{"alt":1745,"src":1746},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1748,1749],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1751,35],{"id":35},[37,1753,1754,1763,1770],{},[40,1755,1756,1757,1759,1760,408],{},"在终端输入 ",[43,1758,737],{}," 进入 REPL，提示符通常是 ",[43,1761,1762],{},">>>",[40,1764,1765,1766,1769],{},"输入 ",[43,1767,1768],{},"exit()"," 或按 Control-D 退出 REPL。",[40,1771,1772,1773,1775],{},"需要保存、复查或多次运行的代码应写入 ",[43,1774,1216],{}," 文件。",[14,1777,58],{"id":58},[10,1779,61],{},[63,1781,1785],{"className":1782,"code":1783,"language":1784,"meta":68,"style":68},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[43,1786,1787,1792,1797,1802],{"__ignoreMap":68},[72,1788,1789],{"class":74,"line":75},[72,1790,1791],{},">>> 2 + 3\n",[72,1793,1794],{"class":74,"line":81},[72,1795,1796],{},"5\n",[72,1798,1799],{"class":74,"line":87},[72,1800,1801],{},">>> \"python\".upper()\n",[72,1803,1804],{"class":74,"line":93},[72,1805,1806],{},"'PYTHON'\n",[10,1808,153],{},[63,1810,1813],{"className":1811,"code":1812,"language":159,"meta":68},[157],"REPL 会直接显示表达式结果\n",[43,1814,1812],{"__ignoreMap":68},[10,1816,164],{},[14,1818,167],{"id":167},[169,1820,1821,1831],{},[40,1822,1823,1824,1827,1828,408],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[43,1825,1826],{},"2 + 3"," 能直接看到 ",[43,1829,1830],{},"5",[40,1832,1833,1834,1836],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[43,1835,1518],{}," 才会写到标准输出。",[14,1838,220],{"id":220},[37,1840,1841,1850],{},[40,1842,1843,1844,1846,1847,1849],{},"把提示符 ",[43,1845,1762],{}," 复制进 ",[43,1848,1216],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[40,1851,1852],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1854,234],{"id":234},[169,1856,1857,1863],{},[40,1858,1859,1860,408],{},"在 REPL 计算 ",[43,1861,1862],{},"12 * 8",[40,1864,1865,1866,1868],{},"把同一表达式写入脚本；观察脚本中不调用 ",[43,1867,1518],{}," 时是否显示结果。",[10,1870,249],{},[14,1872,252],{"id":252},[10,1874,1875,1876,1878],{},"本篇目标是根据任务选择 REPL 或 ",[43,1877,1216],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,1880,259],{},{"title":68,"searchDepth":81,"depth":81,"links":1882},[1883,1884,1885,1886,1887,1888,1889,1890],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1725,"description":1891},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[272,1899,1900],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1903,"title":1904,"body":1905,"category":272,"cover":273,"description":1909,"extension":274,"meta":2080,"navigation":102,"path":2081,"pinned":277,"publishedAt":278,"seo":2082,"slug":2083,"stem":2084,"summary":2085,"tags":2086,"updatedAt":278,"visible":102,"__hash__":2089},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1906,"toc":2070},[1907,1910,1912,1915,1917,1923,1929,1931,1949,1951,1953,1998,2000,2006,2008,2010,2032,2034,2046,2048,2060,2062,2064,2067],[10,1908,1909],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1911,16],{"id":16},[10,1913,1914],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1916,22],{"id":22},[10,1918,1919],{},[26,1920],{"alt":1921,"src":1922},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1924,1925,1928],{},[43,1926,1927],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1930,35],{"id":35},[37,1932,1933,1936,1946],{},[40,1934,1935],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[40,1937,1938,1941,1942,1945],{},[43,1939,1940],{},"pwd"," 显示当前目录，",[43,1943,1944],{},"ls"," 显示目录里的文件。",[40,1947,1948],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1950,58],{"id":58},[10,1952,1619],{},[63,1954,1956],{"className":637,"code":1955,"language":639,"meta":68,"style":68},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[43,1957,1958,1966,1973,1978,1992],{"__ignoreMap":68},[72,1959,1960,1963],{"class":74,"line":75},[72,1961,1962],{"class":646},"mkdir",[72,1964,1965],{"class":682}," python-study\n",[72,1967,1968,1971],{"class":74,"line":81},[72,1969,1970],{"class":649},"cd",[72,1972,1965],{"class":682},[72,1974,1975],{"class":74,"line":87},[72,1976,1977],{"class":649},"pwd\n",[72,1979,1980,1983,1986,1990],{"class":74,"line":93},[72,1981,1982],{"class":649},"printf",[72,1984,1985],{"class":682}," 'print(\"项目已经运行\")\\n'",[72,1987,1989],{"class":1988},"snl16"," >",[72,1991,1260],{"class":682},[72,1993,1994,1996],{"class":74,"line":99},[72,1995,737],{"class":646},[72,1997,1260],{"class":682},[10,1999,153],{},[63,2001,2004],{"className":2002,"code":2003,"language":159,"meta":68},[157],"项目已经运行\n",[43,2005,2003],{"__ignoreMap":68},[10,2007,164],{},[14,2009,167],{"id":167},[169,2011,2012,2023],{},[40,2013,2014,2016,2017,2019,2020,2022],{},[43,2015,1962],{}," 创建目录，",[43,2018,1970],{}," 改变终端当前目录，",[43,2021,1940],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[40,2024,2025,2027,2028,2031],{},[43,2026,1927],{}," 会在当前目录寻找 ",[43,2029,2030],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2033,220],{"id":220},[37,2035,2036,2043],{},[40,2037,2038,2039,213,2041,408],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[43,2040,1940],{},[43,2042,1944],{},[40,2044,2045],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2047,234],{"id":234},[169,2049,2050,2057],{},[40,2051,2052,2053,2056],{},"新建 ",[43,2054,2055],{},"lesson01.py"," 并输出课程编号。",[40,2058,2059],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2061,249],{},[14,2063,252],{"id":252},[10,2065,2066],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,2068,2069],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":81,"depth":81,"links":2071},[2072,2073,2074,2075,2076,2077,2078,2079],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1904,"description":1909},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[272,2087,2088],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2091,"title":2092,"body":2093,"category":272,"cover":273,"description":2097,"extension":274,"meta":2245,"navigation":102,"path":2246,"pinned":277,"publishedAt":278,"seo":2247,"slug":2248,"stem":2249,"summary":2250,"tags":2251,"updatedAt":278,"visible":102,"__hash__":2254},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2094,"toc":2235},[2095,2098,2100,2103,2105,2111,2122,2124,2144,2146,2148,2168,2170,2176,2178,2180,2199,2201,2209,2211,2226,2228,2230,2233],[10,2096,2097],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2099,16],{"id":16},[10,2101,2102],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2104,22],{"id":22},[10,2106,2107],{},[26,2108],{"alt":2109,"src":2110},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2112,2113,2114,408,2116,2119,2120,408],{},"Python 先计算表达式，再把得到的对象交给 ",[43,2115,1518],{},[43,2117,2118],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[43,2121,1826],{},[14,2123,35],{"id":35},[37,2125,2126,2132,2141],{},[40,2127,2128,2131],{},[43,2129,2130],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[40,2133,2134,2137,2138,408],{},[43,2135,2136],{},"7 + 5"," 是表达式，运行时先求值得到 ",[43,2139,2140],{},"12",[40,2142,2143],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2145,58],{"id":58},[10,2147,61],{},[63,2149,2151],{"className":65,"code":2150,"language":67,"meta":68,"style":68},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[43,2152,2153,2158,2163],{"__ignoreMap":68},[72,2154,2155],{"class":74,"line":75},[72,2156,2157],{},"print(42)\n",[72,2159,2160],{"class":74,"line":81},[72,2161,2162],{},"print(7 + 5)\n",[72,2164,2165],{"class":74,"line":87},[72,2166,2167],{},"print(\"Python 基础课\")\n",[10,2169,153],{},[63,2171,2174],{"className":2172,"code":2173,"language":159,"meta":68},[157],"42\n12\nPython 基础课\n",[43,2175,2173],{"__ignoreMap":68},[10,2177,164],{},[14,2179,167],{"id":167},[169,2181,2182,2190],{},[40,2183,2184,2187,2188,408],{},[43,2185,2186],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[43,2189,2140],{},[40,2191,2192,2194,2195,2198],{},[43,2193,1518],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[43,2196,2197],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2200,220],{"id":220},[37,2202,2203,2206],{},[40,2204,2205],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[40,2207,2208],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2210,234],{"id":234},[169,2212,2213,2216],{},[40,2214,2215],{},"分别输出一个整数、一个小数和一段文本。",[40,2217,2218,2219,2221,2222,2225],{},"比较 ",[43,2220,2118],{}," 与 ",[43,2223,2224],{},"print(\"2 + 3\")"," 的结果。",[10,2227,249],{},[14,2229,252],{"id":252},[10,2231,2232],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,2234,259],{},{"title":68,"searchDepth":81,"depth":81,"links":2236},[2237,2238,2239,2240,2241,2242,2243,2244],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2092,"description":2097},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[272,2252,2253],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2256,"title":2257,"body":2258,"category":272,"cover":273,"description":2262,"extension":274,"meta":2429,"navigation":102,"path":2430,"pinned":277,"publishedAt":278,"seo":2431,"slug":2432,"stem":2433,"summary":2434,"tags":2435,"updatedAt":278,"visible":102,"__hash__":2438},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2259,"toc":2419},[2260,2263,2265,2268,2270,2276,2279,2281,2307,2309,2311,2339,2341,2347,2349,2351,2375,2377,2393,2395,2410,2412,2414,2417],[10,2261,2262],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2264,16],{"id":16},[10,2266,2267],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2269,22],{"id":22},[10,2271,2272],{},[26,2273],{"alt":2274,"src":2275},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2277,2278],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2280,35],{"id":35},[37,2282,2283,2286,2296],{},[40,2284,2285],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[40,2287,2288,2289,2221,2292,2295],{},"变量名区分大小写，",[43,2290,2291],{},"score",[43,2293,2294],{},"Score"," 是两个名字。",[40,2297,2298,2299,2302,2303,2306],{},"使用能表达含义的名称；不要用 ",[43,2300,2301],{},"list","、",[43,2304,2305],{},"str"," 等内置名称作为普通变量名。",[14,2308,58],{"id":58},[10,2310,61],{},[63,2312,2314],{"className":65,"code":2313,"language":67,"meta":68,"style":68},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[43,2315,2316,2321,2326,2330,2335],{"__ignoreMap":68},[72,2317,2318],{"class":74,"line":75},[72,2319,2320],{},"score = 90\n",[72,2322,2323],{"class":74,"line":81},[72,2324,2325],{},"print(score)\n",[72,2327,2328],{"class":74,"line":87},[72,2329,103],{"emptyLinePlaceholder":102},[72,2331,2332],{"class":74,"line":93},[72,2333,2334],{},"score = 95\n",[72,2336,2337],{"class":74,"line":99},[72,2338,2325],{},[10,2340,153],{},[63,2342,2345],{"className":2343,"code":2344,"language":159,"meta":68},[157],"90\n95\n",[43,2346,2344],{"__ignoreMap":68},[10,2348,164],{},[14,2350,167],{"id":167},[169,2352,2353,2362],{},[40,2354,984,2355,2358,2359,2361],{},[43,2356,2357],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[43,2360,2291],{}," 再绑定到它。",[40,2363,984,2364,2367,2368,2371,2372,408],{},[43,2365,2366],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[43,2369,2370],{},"90"," 没有被改造成 ",[43,2373,2374],{},"95",[14,2376,220],{"id":220},[37,2378,2379,2382],{},[40,2380,2381],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[40,2383,2384,2385,2302,2387,2302,2389,2392],{},"使用 ",[43,2386,2301],{},[43,2388,2305],{},[43,2390,2391],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2394,234],{"id":234},[169,2396,2397,2407],{},[40,2398,2399,2400,213,2403,2406],{},"创建 ",[43,2401,2402],{},"course_name",[43,2404,2405],{},"lesson_count"," 两个变量并输出。",[40,2408,2409],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2411,249],{},[14,2413,252],{"id":252},[10,2415,2416],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,2418,259],{},{"title":68,"searchDepth":81,"depth":81,"links":2420},[2421,2422,2423,2424,2425,2426,2427,2428],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2257,"description":2262},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[272,2436,2437],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2440,"title":2441,"body":2442,"category":272,"cover":273,"description":2446,"extension":274,"meta":2610,"navigation":102,"path":2611,"pinned":277,"publishedAt":278,"seo":2612,"slug":2613,"stem":2614,"summary":2615,"tags":2616,"updatedAt":278,"visible":102,"__hash__":2619},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2443,"toc":2600},[2444,2447,2449,2452,2454,2460,2463,2465,2494,2496,2498,2542,2544,2550,2552,2554,2568,2570,2581,2583,2591,2593,2595,2598],[10,2445,2446],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2448,16],{"id":16},[10,2450,2451],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2453,22],{"id":22},[10,2455,2456],{},[26,2457],{"alt":2458,"src":2459},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2461,2462],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2464,35],{"id":35},[37,2466,2467,2477,2491],{},[40,2468,2469,2472,2473,2476],{},[43,2470,2471],{},"int"," 表示整数，",[43,2474,2475],{},"float"," 表示浮点数。",[40,2478,2479,2482,2483,2486,2487,2490],{},[43,2480,2481],{},"\u002F"," 总是进行真除法；",[43,2484,2485],{},"\u002F\u002F"," 是向下取整除法，",[43,2488,2489],{},"%"," 得到余数。",[40,2492,2493],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2495,58],{"id":58},[10,2497,61],{},[63,2499,2501],{"className":65,"code":2500,"language":67,"meta":68,"style":68},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[43,2502,2503,2508,2513,2518,2522,2527,2532,2537],{"__ignoreMap":68},[72,2504,2505],{"class":74,"line":75},[72,2506,2507],{},"price = 25\n",[72,2509,2510],{"class":74,"line":81},[72,2511,2512],{},"count = 4\n",[72,2514,2515],{"class":74,"line":87},[72,2516,2517],{},"discount = 0.9\n",[72,2519,2520],{"class":74,"line":93},[72,2521,103],{"emptyLinePlaceholder":102},[72,2523,2524],{"class":74,"line":99},[72,2525,2526],{},"total = price * count * discount\n",[72,2528,2529],{"class":74,"line":106},[72,2530,2531],{},"average = total \u002F count\n",[72,2533,2534],{"class":74,"line":112},[72,2535,2536],{},"print(total)\n",[72,2538,2539],{"class":74,"line":118},[72,2540,2541],{},"print(average)\n",[10,2543,153],{},[63,2545,2548],{"className":2546,"code":2547,"language":159,"meta":68},[157],"90.0\n22.5\n",[43,2549,2547],{"__ignoreMap":68},[10,2551,164],{},[14,2553,167],{"id":167},[169,2555,2556,2562],{},[40,2557,2558,2561],{},[43,2559,2560],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[40,2563,2564,2567],{},[43,2565,2566],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2569,220],{"id":220},[37,2571,2572,2578],{},[40,2573,2574,2575,408],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[43,2576,2577],{},"decimal.Decimal",[40,2579,2580],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2582,234],{"id":234},[169,2584,2585,2588],{},[40,2586,2587],{},"计算 137 除以 10 的商和余数。",[40,2589,2590],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2592,249],{},[14,2594,252],{"id":252},[10,2596,2597],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,2599,259],{},{"title":68,"searchDepth":81,"depth":81,"links":2601},[2602,2603,2604,2605,2606,2607,2608,2609],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2441,"description":2446},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[272,2617,2618],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2621,"title":2622,"body":2623,"category":272,"cover":273,"description":2627,"extension":274,"meta":2802,"navigation":102,"path":2803,"pinned":277,"publishedAt":278,"seo":2804,"slug":2805,"stem":2806,"summary":2807,"tags":2808,"updatedAt":278,"visible":102,"__hash__":2811},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2624,"toc":2790},[2625,2628,2630,2633,2635,2641,2651,2653,2664,2666,2668,2698,2700,2706,2708,2710,2740,2742,2745,2751,2754,2756,2764,2766,2781,2783,2785,2788],[10,2626,2627],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2629,16],{"id":16},[10,2631,2632],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2634,22],{"id":22},[10,2636,2637],{},[26,2638],{"alt":2639,"src":2640},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2642,2643,2644,2647,2648,408],{},"切片 ",[43,2645,2646],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[43,2649,2650],{},"stop - start",[14,2652,35],{"id":35},[37,2654,2655,2658,2661],{},[40,2656,2657],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[40,2659,2660],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[40,2662,2663],{},"切片会创建新的字符串，不会修改原字符串。",[14,2665,58],{"id":58},[10,2667,61],{},[63,2669,2671],{"className":65,"code":2670,"language":67,"meta":68,"style":68},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[43,2672,2673,2678,2683,2688,2693],{"__ignoreMap":68},[72,2674,2675],{"class":74,"line":75},[72,2676,2677],{},"language = \"Python\"\n",[72,2679,2680],{"class":74,"line":81},[72,2681,2682],{},"print(language[0])\n",[72,2684,2685],{"class":74,"line":87},[72,2686,2687],{},"print(language[-1])\n",[72,2689,2690],{"class":74,"line":93},[72,2691,2692],{},"print(language[0:3])\n",[72,2694,2695],{"class":74,"line":99},[72,2696,2697],{},"print(language + \" 3.14\")\n",[10,2699,153],{},[63,2701,2704],{"className":2702,"code":2703,"language":159,"meta":68},[157],"P\nn\nPyt\nPython 3.14\n",[43,2705,2703],{"__ignoreMap":68},[10,2707,164],{},[14,2709,167],{"id":167},[169,2711,2712,2726],{},[40,2713,2714,2715,2717,2718,2721,2722,2725],{},"字符串 ",[43,2716,272],{}," 的正索引从 ",[43,2719,2720],{},"P"," 的 0 开始，负索引从末尾 ",[43,2723,2724],{},"n"," 的 -1 开始。",[40,2727,2728,2731,2732,2735,2736,2739],{},[43,2729,2730],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[43,2733,2734],{},"Pyt","；索引 3 的 ",[43,2737,2738],{},"h"," 不在结果中。",[195,2741,197],{"id":197},[10,2743,2744],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2746,2747],{},[26,2748],{"alt":2749,"src":2750},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2752,2753],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2755,220],{"id":220},[37,2757,2758,2761],{},[40,2759,2760],{},"把第一个字符写成索引 1，造成整体偏移一位。",[40,2762,2763],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2765,234],{"id":234},[169,2767,2768,2778],{},[40,2769,2770,2771,2774,2775,408],{},"从 ",[43,2772,2773],{},"\"programming\""," 中切出 ",[43,2776,2777],{},"\"gram\"",[40,2779,2780],{},"使用负索引取得字符串倒数第二个字符。",[10,2782,249],{},[14,2784,252],{"id":252},[10,2786,2787],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,2789,259],{},{"title":68,"searchDepth":81,"depth":81,"links":2791},[2792,2793,2794,2795,2796,2799,2800,2801],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":2797},[2798],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2622,"description":2627},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[272,2809,2810],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2813,"title":2814,"body":2815,"category":272,"cover":273,"description":2819,"extension":274,"meta":3033,"navigation":102,"path":3034,"pinned":277,"publishedAt":278,"seo":3035,"slug":3036,"stem":3037,"summary":3038,"tags":3039,"updatedAt":278,"visible":102,"__hash__":3042},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2816,"toc":3021},[2817,2820,2822,2825,2827,2833,2843,2845,2878,2880,2882,2926,2928,2934,2936,2938,2959,2961,2964,2970,2978,2980,2994,2996,3012,3014,3016,3019],[10,2818,2819],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2821,16],{"id":16},[10,2823,2824],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2826,22],{"id":22},[10,2828,2829],{},[26,2830],{"alt":2831,"src":2832},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2834,2835,2836,1055,2839,2842],{},"比较表达式先产生 ",[43,2837,2838],{},"True",[43,2840,2841],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2844,35],{"id":35},[37,2846,2847,2861,2875],{},[40,2848,2849,2852,2853,2856,2857,2860],{},[43,2850,2851],{},"=="," 判断是否相等，",[43,2854,2855],{},"!="," 判断是否不等；单个 ",[43,2858,2859],{},"="," 是赋值。",[40,2862,2863,2866,2867,2870,2871,2874],{},[43,2864,2865],{},"and"," 要求两侧都为真，",[43,2868,2869],{},"or"," 只需一侧为真，",[43,2872,2873],{},"not"," 取反。",[40,2876,2877],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2879,58],{"id":58},[10,2881,61],{},[63,2883,2885],{"className":65,"code":2884,"language":67,"meta":68,"style":68},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[43,2886,2887,2892,2897,2901,2906,2911,2916,2921],{"__ignoreMap":68},[72,2888,2889],{"class":74,"line":75},[72,2890,2891],{},"age = 20\n",[72,2893,2894],{"class":74,"line":81},[72,2895,2896],{},"has_ticket = True\n",[72,2898,2899],{"class":74,"line":87},[72,2900,103],{"emptyLinePlaceholder":102},[72,2902,2903],{"class":74,"line":93},[72,2904,2905],{},"is_adult = age >= 18\n",[72,2907,2908],{"class":74,"line":99},[72,2909,2910],{},"can_enter = is_adult and has_ticket\n",[72,2912,2913],{"class":74,"line":106},[72,2914,2915],{},"print(is_adult)\n",[72,2917,2918],{"class":74,"line":112},[72,2919,2920],{},"print(can_enter)\n",[72,2922,2923],{"class":74,"line":118},[72,2924,2925],{},"print(not has_ticket)\n",[10,2927,153],{},[63,2929,2932],{"className":2930,"code":2931,"language":159,"meta":68},[157],"True\nTrue\nFalse\n",[43,2933,2931],{"__ignoreMap":68},[10,2935,164],{},[14,2937,167],{"id":167},[169,2939,2940,2950],{},[40,2941,2942,2945,2946,2949],{},[43,2943,2944],{},"age >= 18"," 先产生布尔值并绑定给 ",[43,2947,2948],{},"is_adult","，这一步没有任何分支跳转。",[40,2951,2952,2955,2956,2958],{},[43,2953,2954],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[43,2957,2873],{}," 只对紧随其后的值取反。",[195,2960,197],{"id":197},[10,2962,2963],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2965,2966],{},[26,2967],{"alt":2968,"src":2969},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2971,2972,2974,2975,2977],{},[43,2973,2865],{}," 只有“真、真”得到真；",[43,2976,2869],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2979,220],{"id":220},[37,2981,2982,2991],{},[40,2983,2984,2985,2987,2988,2990],{},"用单个等号判断相等。",[43,2986,2859],{}," 是赋值，",[43,2989,2851],{}," 才是相等比较。",[40,2992,2993],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2995,234],{"id":234},[169,2997,2998,3005],{},[40,2999,3000,3001,3004],{},"判断数字 ",[43,3002,3003],{},"15"," 是否同时大于 10 且小于 20。",[40,3006,3007,3008,3011],{},"分别修改年龄和票据状态，记录 ",[43,3009,3010],{},"can_enter"," 的四种组合结果。",[10,3013,249],{},[14,3015,252],{"id":252},[10,3017,3018],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3020,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3022},[3023,3024,3025,3026,3027,3030,3031,3032],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":3028},[3029],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2814,"description":2819},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[272,3040,3041],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3044,"title":3045,"body":3046,"category":272,"cover":273,"description":3050,"extension":274,"meta":3218,"navigation":102,"path":3219,"pinned":277,"publishedAt":278,"seo":3220,"slug":3221,"stem":3222,"summary":3223,"tags":3224,"updatedAt":278,"visible":102,"__hash__":3226},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3047,"toc":3208},[3048,3051,3053,3056,3058,3064,3082,3084,3097,3099,3101,3135,3137,3143,3145,3147,3169,3171,3183,3185,3199,3201,3203,3206],[10,3049,3050],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3052,16],{"id":16},[10,3054,3055],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3057,22],{"id":22},[10,3059,3060],{},[26,3061],{"alt":3062,"src":3063},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3065,3066,3069,3070,3073,3074,3077,3078,3081],{},[43,3067,3068],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[43,3071,3072],{},"18","，程序首先得到的也是 ",[43,3075,3076],{},"\"18\"","，需要 ",[43,3079,3080],{},"int()"," 后才能按整数参与计算。",[14,3083,35],{"id":35},[37,3085,3086,3089,3094],{},[40,3087,3088],{},"提示文字应告诉用户需要输入什么。",[40,3090,3091,3093],{},[43,3092,3080],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[40,3095,3096],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3098,58],{"id":58},[10,3100,61],{},[63,3102,3104],{"className":65,"code":3103,"language":67,"meta":68,"style":68},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[43,3105,3106,3111,3116,3121,3125,3130],{"__ignoreMap":68},[72,3107,3108],{"class":74,"line":75},[72,3109,3110],{},"name = input(\"请输入姓名：\")\n",[72,3112,3113],{"class":74,"line":81},[72,3114,3115],{},"age_text = input(\"请输入年龄：\")\n",[72,3117,3118],{"class":74,"line":87},[72,3119,3120],{},"age = int(age_text)\n",[72,3122,3123],{"class":74,"line":93},[72,3124,103],{"emptyLinePlaceholder":102},[72,3126,3127],{"class":74,"line":99},[72,3128,3129],{},"print(\"你好，\" + name)\n",[72,3131,3132],{"class":74,"line":106},[72,3133,3134],{},"print(age + 1)\n",[10,3136,153],{},[63,3138,3141],{"className":3139,"code":3140,"language":159,"meta":68},[157],"根据输入显示姓名，并输出下一年的年龄\n",[43,3142,3140],{"__ignoreMap":68},[10,3144,164],{},[14,3146,167],{"id":167},[169,3148,3149,3159],{},[40,3150,3151,3152,3154,3155,3158],{},"两次 ",[43,3153,3068],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[43,3156,3157],{},"age_text"," 用来提醒这仍是文本。",[40,3160,3161,3164,3165,3168],{},[43,3162,3163],{},"int(age_text)"," 创建整数对象，后面的 ",[43,3166,3167],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3170,220],{"id":220},[37,3172,3173,3180],{},[40,3174,3175,3176,3179],{},"直接计算 ",[43,3177,3178],{},"input(...) + 1","，忽略输入结果是字符串。",[40,3181,3182],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3184,234],{"id":234},[169,3186,3187,3190],{},[40,3188,3189],{},"接收两个整数并输出它们的和。",[40,3191,1765,3192,3195,3196,3198],{},[43,3193,3194],{},"18.5"," 给 ",[43,3197,3080],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3200,249],{},[14,3202,252],{"id":252},[10,3204,3205],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3207,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3209},[3210,3211,3212,3213,3214,3215,3216,3217],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3045,"description":3050},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[272,2391,3225],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3228,"title":3229,"body":3230,"category":272,"cover":273,"description":3234,"extension":274,"meta":3394,"navigation":102,"path":3395,"pinned":277,"publishedAt":278,"seo":3396,"slug":3397,"stem":3398,"summary":3399,"tags":3400,"updatedAt":278,"visible":102,"__hash__":3403},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3231,"toc":3384},[3232,3235,3237,3240,3242,3248,3255,3257,3271,3273,3275,3314,3316,3322,3324,3326,3345,3347,3362,3364,3375,3377,3379,3382],[10,3233,3234],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3236,16],{"id":16},[10,3238,3239],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3241,22],{"id":22},[10,3243,3244],{},[26,3245],{"alt":3246,"src":3247},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3249,3250,3251,3254],{},"列表为元素维护从 0 开始的位置索引。修改 ",[43,3252,3253],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3256,35],{"id":35},[37,3258,3259,3262,3265],{},[40,3260,3261],{},"列表使用方括号，元素之间用逗号分隔。",[40,3263,3264],{},"列表可变，可以替换、追加和删除元素。",[40,3266,3267,3268,408],{},"访问不存在的索引会产生 ",[43,3269,3270],{},"IndexError",[14,3272,58],{"id":58},[10,3274,61],{},[63,3276,3278],{"className":65,"code":3277,"language":67,"meta":68,"style":68},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[43,3279,3280,3285,3290,3294,3299,3304,3309],{"__ignoreMap":68},[72,3281,3282],{"class":74,"line":75},[72,3283,3284],{},"scores = [82, 90, 76]\n",[72,3286,3287],{"class":74,"line":81},[72,3288,3289],{},"print(scores[0])\n",[72,3291,3292],{"class":74,"line":87},[72,3293,103],{"emptyLinePlaceholder":102},[72,3295,3296],{"class":74,"line":93},[72,3297,3298],{},"scores[1] = 95\n",[72,3300,3301],{"class":74,"line":99},[72,3302,3303],{},"scores.append(88)\n",[72,3305,3306],{"class":74,"line":106},[72,3307,3308],{},"print(scores)\n",[72,3310,3311],{"class":74,"line":112},[72,3312,3313],{},"print(len(scores))\n",[10,3315,153],{},[63,3317,3320],{"className":3318,"code":3319,"language":159,"meta":68},[157],"82\n[82, 95, 76, 88]\n4\n",[43,3321,3319],{"__ignoreMap":68},[10,3323,164],{},[14,3325,167],{"id":167},[169,3327,3328,3331],{},[40,3329,3330],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[40,3332,3333,3336,3337,3340,3341,3344],{},[43,3334,3335],{},"scores[1] = 95"," 替换第二个位置，",[43,3338,3339],{},"append(88)"," 在末尾增加新位置，",[43,3342,3343],{},"len()"," 因而从 3 变为 4。",[14,3346,220],{"id":220},[37,3348,3349,3359],{},[40,3350,3351,3352,3355,3356,408],{},"访问 ",[43,3353,3354],{},"scores[len(scores)]","。最后一个合法正索引是 ",[43,3357,3358],{},"len(scores) - 1",[40,3360,3361],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3363,234],{"id":234},[169,3365,3366,3369],{},[40,3367,3368],{},"建立三项学习任务列表，再追加第四项。",[40,3370,3371,3372,3374],{},"修改第二项，并用 ",[43,3373,3343],{}," 检查元素数量。",[10,3376,249],{},[14,3378,252],{"id":252},[10,3380,3381],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3383,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3385},[3386,3387,3388,3389,3390,3391,3392,3393],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3229,"description":3234},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[272,3401,3402],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3405,"title":3406,"body":3407,"category":272,"cover":273,"description":3411,"extension":274,"meta":3552,"navigation":102,"path":3553,"pinned":277,"publishedAt":278,"seo":3554,"slug":3555,"stem":3556,"summary":3557,"tags":3558,"updatedAt":278,"visible":102,"__hash__":3560},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3408,"toc":3542},[3409,3412,3414,3417,3419,3425,3428,3430,3441,3443,3445,3479,3481,3487,3489,3491,3505,3507,3519,3521,3533,3535,3537,3540],[10,3410,3411],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3413,16],{"id":16},[10,3415,3416],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3418,22],{"id":22},[10,3420,3421],{},[26,3422],{"alt":3423,"src":3424},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3426,3427],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3429,35],{"id":35},[37,3431,3432,3435,3438],{},[40,3433,3434],{},"元组常用来表达固定数量、固定含义的一组值。",[40,3436,3437],{},"只有一个元素的元组必须保留尾随逗号。",[40,3439,3440],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3442,58],{"id":58},[10,3444,61],{},[63,3446,3448],{"className":65,"code":3447,"language":67,"meta":68,"style":68},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[43,3449,3450,3455,3460,3465,3469,3474],{"__ignoreMap":68},[72,3451,3452],{"class":74,"line":75},[72,3453,3454],{},"point = (120, 80)\n",[72,3456,3457],{"class":74,"line":81},[72,3458,3459],{},"print(point[0])\n",[72,3461,3462],{"class":74,"line":87},[72,3463,3464],{},"print(point[1])\n",[72,3466,3467],{"class":74,"line":93},[72,3468,103],{"emptyLinePlaceholder":102},[72,3470,3471],{"class":74,"line":99},[72,3472,3473],{},"single = (5,)\n",[72,3475,3476],{"class":74,"line":106},[72,3477,3478],{},"print(single)\n",[10,3480,153],{},[63,3482,3485],{"className":3483,"code":3484,"language":159,"meta":68},[157],"120\n80\n(5,)\n",[43,3486,3484],{"__ignoreMap":68},[10,3488,164],{},[14,3490,167],{"id":167},[169,3492,3493,3499],{},[40,3494,3495,3498],{},[43,3496,3497],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[40,3500,3501,3504],{},[43,3502,3503],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3506,220],{"id":220},[37,3508,3509,3516],{},[40,3510,3511,3512,3515],{},"把 ",[43,3513,3514],{},"(5)"," 当作元组，实际它仍是整数。",[40,3517,3518],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3520,234],{"id":234},[169,3522,3523,3526],{},[40,3524,3525],{},"用元组表示宽度和高度。",[40,3527,2218,3528,2221,3530,3532],{},[43,3529,3514],{},[43,3531,3503],{}," 的类型。",[10,3534,249],{},[14,3536,252],{"id":252},[10,3538,3539],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3541,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3543},[3544,3545,3546,3547,3548,3549,3550,3551],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3406,"description":3411},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[272,3559,3402],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3562,"title":3563,"body":3564,"category":272,"cover":273,"description":3568,"extension":274,"meta":3723,"navigation":102,"path":3724,"pinned":277,"publishedAt":278,"seo":3725,"slug":3726,"stem":3727,"summary":3728,"tags":3729,"updatedAt":278,"visible":102,"__hash__":3731},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3565,"toc":3713},[3566,3569,3571,3574,3576,3582,3592,3594,3608,3610,3612,3646,3648,3654,3656,3658,3673,3675,3694,3696,3704,3706,3708,3711],[10,3567,3568],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3570,16],{"id":16},[10,3572,3573],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3575,22],{"id":22},[10,3577,3578],{},[26,3579],{"alt":3580,"src":3581},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3583,3584,3585,3588,3589,3591],{},"字典通过键定位值，不使用连续位置表达含义。",[43,3586,3587],{},"student[\"score\"]"," 读取的是键 ",[43,3590,2291],{}," 对应的值，而不是“第几个元素”。",[14,3593,35],{"id":35},[37,3595,3596,3599,3605],{},[40,3597,3598],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[40,3600,2384,3601,3604],{},[43,3602,3603],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[40,3606,3607],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3609,58],{"id":58},[10,3611,61],{},[63,3613,3615],{"className":65,"code":3614,"language":67,"meta":68,"style":68},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[43,3616,3617,3622,3627,3631,3636,3641],{"__ignoreMap":68},[72,3618,3619],{"class":74,"line":75},[72,3620,3621],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[72,3623,3624],{"class":74,"line":81},[72,3625,3626],{},"print(student[\"name\"])\n",[72,3628,3629],{"class":74,"line":87},[72,3630,103],{"emptyLinePlaceholder":102},[72,3632,3633],{"class":74,"line":93},[72,3634,3635],{},"student[\"score\"] = 95\n",[72,3637,3638],{"class":74,"line":99},[72,3639,3640],{},"student[\"city\"] = \"郑州\"\n",[72,3642,3643],{"class":74,"line":106},[72,3644,3645],{},"print(student)\n",[10,3647,153],{},[63,3649,3652],{"className":3650,"code":3651,"language":159,"meta":68},[157],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[43,3653,3651],{"__ignoreMap":68},[10,3655,164],{},[14,3657,167],{"id":167},[169,3659,3660,3663],{},[40,3661,3662],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[40,3664,3665,3666,3668,3669,3672],{},"给已有键 ",[43,3667,2291],{}," 赋值会更新映射，给新键 ",[43,3670,3671],{},"city"," 赋值会增加映射。",[14,3674,220],{"id":220},[37,3676,3677,3684],{},[40,3678,3679,3680,3683],{},"按位置理解字典并尝试 ",[43,3681,3682],{},"student[0]","，而实际键是字符串。",[40,3685,3686,3687,3690,3691,408],{},"直接读取不确定存在的键并忽略 ",[43,3688,3689],{},"KeyError","；后续可根据场景使用成员检查或 ",[43,3692,3693],{},"get()",[14,3695,234],{"id":234},[169,3697,3698,3701],{},[40,3699,3700],{},"建立一本书的标题、作者和页数字典。",[40,3702,3703],{},"添加分类键，再修改页数。",[10,3705,249],{},[14,3707,252],{"id":252},[10,3709,3710],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3712,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3714},[3715,3716,3717,3718,3719,3720,3721,3722],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3563,"description":3568},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[272,3730,3402],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3733,"title":3734,"body":3735,"category":272,"cover":273,"description":3739,"extension":274,"meta":3888,"navigation":102,"path":3889,"pinned":277,"publishedAt":278,"seo":3890,"slug":3891,"stem":3892,"summary":3893,"tags":3894,"updatedAt":278,"visible":102,"__hash__":3896},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3736,"toc":3878},[3737,3740,3742,3745,3747,3753,3756,3758,3777,3779,3781,3815,3817,3823,3825,3827,3842,3844,3856,3858,3869,3871,3873,3876],[10,3738,3739],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3741,16],{"id":16},[10,3743,3744],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3746,22],{"id":22},[10,3748,3749],{},[26,3750],{"alt":3751,"src":3752},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3754,3755],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3757,35],{"id":35},[37,3759,3760,3763,3766],{},[40,3761,3762],{},"集合中的元素不重复。",[40,3764,3765],{},"集合是无序容器，不要依赖打印顺序或索引。",[40,3767,3768,3769,3772,3773,3776],{},"创建空集合必须写 ",[43,3770,3771],{},"set()","；",[43,3774,3775],{},"{}"," 创建的是空字典。",[14,3778,58],{"id":58},[10,3780,61],{},[63,3782,3784],{"className":65,"code":3783,"language":67,"meta":68,"style":68},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[43,3785,3786,3791,3796,3800,3805,3810],{"__ignoreMap":68},[72,3787,3788],{"class":74,"line":75},[72,3789,3790],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[72,3792,3793],{"class":74,"line":81},[72,3794,3795],{},"right = {\"Python\", \"Docker\"}\n",[72,3797,3798],{"class":74,"line":87},[72,3799,103],{"emptyLinePlaceholder":102},[72,3801,3802],{"class":74,"line":93},[72,3803,3804],{},"print(left & right)\n",[72,3806,3807],{"class":74,"line":99},[72,3808,3809],{},"print(left | right)\n",[72,3811,3812],{"class":74,"line":106},[72,3813,3814],{},"print(\"Git\" in left)\n",[10,3816,153],{},[63,3818,3821],{"className":3819,"code":3820,"language":159,"meta":68},[157],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[43,3822,3820],{"__ignoreMap":68},[10,3824,164],{},[14,3826,167],{"id":167},[169,3828,3829,3832],{},[40,3830,3831],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[40,3833,3834,3837,3838,3841],{},[43,3835,3836],{},"&"," 计算交集，",[43,3839,3840],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3843,220],{"id":220},[37,3845,3846,3853],{},[40,3847,2384,3848,3850,3851,408],{},[43,3849,3775],{}," 创建空集合，实际得到空字典；空集合应写 ",[43,3852,3771],{},[40,3854,3855],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3857,234],{"id":234},[169,3859,3860,3866],{},[40,3861,3862,3863,3865],{},"把包含重复标签的列表交给 ",[43,3864,3771],{}," 去重。",[40,3867,3868],{},"计算两组课程标签的交集和差集。",[10,3870,249],{},[14,3872,252],{"id":252},[10,3874,3875],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,3877,259],{},{"title":68,"searchDepth":81,"depth":81,"links":3879},[3880,3881,3882,3883,3884,3885,3886,3887],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3734,"description":3739},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[272,3895,3402],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3898,"title":3899,"body":3900,"category":272,"cover":273,"description":3904,"extension":274,"meta":4101,"navigation":102,"path":4102,"pinned":277,"publishedAt":278,"seo":4103,"slug":4104,"stem":4105,"summary":4106,"tags":4107,"updatedAt":278,"visible":102,"__hash__":4110},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3901,"toc":4089},[3902,3905,3907,3910,3912,3918,3928,3930,3947,3949,3951,4000,4002,4008,4010,4012,4034,4036,4039,4045,4048,4050,4063,4065,4080,4082,4084,4087],[10,3903,3904],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3906,16],{"id":16},[10,3908,3909],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3911,22],{"id":22},[10,3913,3914],{},[26,3915],{"alt":3916,"src":3917},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3919,3920,3923,3924,3927],{},[43,3921,3922],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[43,3925,3926],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3929,35],{"id":35},[37,3931,3932,3941,3944],{},[40,3933,3934,3936,3937,3940],{},[43,3935,2851],{}," 比较内容是否相等，",[43,3938,3939],{},"is"," 比较是否为同一个对象。",[40,3942,3943],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[40,3945,3946],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3948,58],{"id":58},[10,3950,61],{},[63,3952,3954],{"className":65,"code":3953,"language":67,"meta":68,"style":68},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[43,3955,3956,3961,3966,3971,3975,3980,3985,3990,3995],{"__ignoreMap":68},[72,3957,3958],{"class":74,"line":75},[72,3959,3960],{},"tasks = [\"变量\", \"字符串\"]\n",[72,3962,3963],{"class":74,"line":81},[72,3964,3965],{},"shared = tasks\n",[72,3967,3968],{"class":74,"line":87},[72,3969,3970],{},"backup = tasks.copy()\n",[72,3972,3973],{"class":74,"line":93},[72,3974,103],{"emptyLinePlaceholder":102},[72,3976,3977],{"class":74,"line":99},[72,3978,3979],{},"tasks.append(\"列表\")\n",[72,3981,3982],{"class":74,"line":106},[72,3983,3984],{},"print(shared)\n",[72,3986,3987],{"class":74,"line":112},[72,3988,3989],{},"print(backup)\n",[72,3991,3992],{"class":74,"line":118},[72,3993,3994],{},"print(tasks is shared)\n",[72,3996,3997],{"class":74,"line":124},[72,3998,3999],{},"print(tasks is backup)\n",[10,4001,153],{},[63,4003,4006],{"className":4004,"code":4005,"language":159,"meta":68},[157],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[43,4007,4005],{"__ignoreMap":68},[10,4009,164],{},[14,4011,167],{"id":167},[169,4013,4014,4020],{},[40,4015,4016,4019],{},[43,4017,4018],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[40,4021,4022,4025,4026,4029,4030,4033],{},[43,4023,4024],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[43,4027,4028],{},"shared"," 能观察到变化，",[43,4031,4032],{},"backup"," 不会。",[195,4035,197],{"id":197},[10,4037,4038],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4040,4041],{},[26,4042],{"alt":4043,"src":4044},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4046,4047],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4049,220],{"id":220},[37,4051,4052,4060],{},[40,4053,4054,4055,4057,4058,408],{},"用 ",[43,4056,2851],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[43,4059,3939],{},[40,4061,4062],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4064,234],{"id":234},[169,4066,4067,4070],{},[40,4068,4069],{},"让两个变量引用同一个字典并修改其中一个。",[40,4071,2384,4072,4075,4076,213,4078,408],{},[43,4073,4074],{},"copy()"," 创建外层副本，再比较 ",[43,4077,3939],{},[43,4079,2851],{},[10,4081,249],{},[14,4083,252],{"id":252},[10,4085,4086],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,4088,259],{},{"title":68,"searchDepth":81,"depth":81,"links":4090},[4091,4092,4093,4094,4095,4098,4099,4100],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":4096},[4097],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3899,"description":3904},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[272,4108,4109],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4112,"title":4113,"body":4114,"category":272,"cover":273,"description":4118,"extension":274,"meta":4330,"navigation":102,"path":4331,"pinned":277,"publishedAt":278,"seo":4332,"slug":4333,"stem":4334,"summary":4335,"tags":4336,"updatedAt":278,"visible":102,"__hash__":4338},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4115,"toc":4317},[4116,4119,4121,4124,4126,4132,4142,4144,4155,4157,4159,4211,4213,4219,4221,4223,4241,4243,4246,4252,4260,4263,4266,4272,4278,4280,4298,4300,4308,4310,4312,4315],[10,4117,4118],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4120,16],{"id":16},[10,4122,4123],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4125,22],{"id":22},[10,4127,4128],{},[26,4129],{"alt":4130,"src":4131},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4133,4134,2302,4136,2302,4139,4141],{},[43,4135,1202],{},[43,4137,4138],{},"elif",[43,4140,1205],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4143,35],{"id":35},[37,4145,4146,4149,4152],{},[40,4147,4148],{},"冒号表示接下来开始一个代码块。",[40,4150,4151],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[40,4153,4154],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4156,58],{"id":58},[10,4158,61],{},[63,4160,4162],{"className":65,"code":4161,"language":67,"meta":68,"style":68},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[43,4163,4164,4169,4173,4178,4183,4188,4193,4197,4202,4206],{"__ignoreMap":68},[72,4165,4166],{"class":74,"line":75},[72,4167,4168],{},"score = int(input(\"请输入分数：\"))\n",[72,4170,4171],{"class":74,"line":81},[72,4172,103],{"emptyLinePlaceholder":102},[72,4174,4175],{"class":74,"line":87},[72,4176,4177],{},"if score >= 90:\n",[72,4179,4180],{"class":74,"line":93},[72,4181,4182],{},"    level = \"优秀\"\n",[72,4184,4185],{"class":74,"line":99},[72,4186,4187],{},"elif score >= 60:\n",[72,4189,4190],{"class":74,"line":106},[72,4191,4192],{},"    level = \"合格\"\n",[72,4194,4195],{"class":74,"line":112},[72,4196,1192],{},[72,4198,4199],{"class":74,"line":118},[72,4200,4201],{},"    level = \"需要继续学习\"\n",[72,4203,4204],{"class":74,"line":124},[72,4205,103],{"emptyLinePlaceholder":102},[72,4207,4208],{"class":74,"line":130},[72,4209,4210],{},"print(level)\n",[10,4212,153],{},[63,4214,4217],{"className":4215,"code":4216,"language":159,"meta":68},[157],"输入 85 时输出：合格\n",[43,4218,4216],{"__ignoreMap":68},[10,4220,164],{},[14,4222,167],{"id":167},[169,4224,4225,4232],{},[40,4226,4227,4228,4231],{},"输入先转换为整数，程序从 ",[43,4229,4230],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[40,4233,4234,4237,4238,4240],{},[43,4235,4236],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[43,4239,1205],{}," 被跳过；最终三个分支只会选择一个。",[195,4242,197],{"id":197},[10,4244,4245],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4247,4248],{},[26,4249],{"alt":4250,"src":4251},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4253,4254,4256,4257,4259],{},[43,4255,4230],{}," 必须放在 ",[43,4258,4236],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[195,4261,197],{"id":4262},"再看一个具体细节-1",[10,4264,4265],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4267,4268],{},[26,4269],{"alt":4270,"src":4271},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4273,4274,4275,4277],{},"同一缩进层级属于同一个代码块；回到 ",[43,4276,1202],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4279,220],{"id":220},[37,4281,4282,4288],{},[40,4283,4284,4285,4287],{},"先写 ",[43,4286,4236],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[40,4289,4290,4291,4293,4294,4297],{},"混用多个独立 ",[43,4292,1202],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[43,4295,4296],{},"if\u002Felif\u002Felse"," 链。",[14,4299,234],{"id":234},[169,4301,4302,4305],{},[40,4303,4304],{},"根据温度输出“冷、适中、热”三个等级。",[40,4306,4307],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4309,249],{},[14,4311,252],{"id":252},[10,4313,4314],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,4316,259],{},{"title":68,"searchDepth":81,"depth":81,"links":4318},[4319,4320,4321,4322,4323,4327,4328,4329],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":4324},[4325,4326],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4113,"description":4118},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[272,1202,4337],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4340,"title":4341,"body":4342,"category":272,"cover":273,"description":4346,"extension":274,"meta":4512,"navigation":102,"path":4513,"pinned":277,"publishedAt":278,"seo":4514,"slug":4515,"stem":4516,"summary":4517,"tags":4518,"updatedAt":278,"visible":102,"__hash__":4520},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4343,"toc":4500},[4344,4347,4349,4352,4354,4360,4366,4368,4383,4385,4387,4425,4427,4433,4435,4437,4452,4454,4457,4463,4469,4471,4479,4481,4491,4493,4495,4498],[10,4345,4346],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4348,16],{"id":16},[10,4350,4351],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4353,22],{"id":22},[10,4355,4356],{},[26,4357],{"alt":4358,"src":4359},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4361,4362,4365],{},[43,4363,4364],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4367,35],{"id":35},[37,4369,4370,4373,4376],{},[40,4371,4372],{},"进入循环前先准备参与条件判断的状态。",[40,4374,4375],{},"循环体中必须有机会让条件变为假。",[40,4377,4378,4379,4382],{},"能够预先确定遍历对象时，后续介绍的 ",[43,4380,4381],{},"for"," 通常更直接。",[14,4384,58],{"id":58},[10,4386,61],{},[63,4388,4390],{"className":65,"code":4389,"language":67,"meta":68,"style":68},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[43,4391,4392,4397,4401,4406,4411,4416,4420],{"__ignoreMap":68},[72,4393,4394],{"class":74,"line":75},[72,4395,4396],{},"count = 1\n",[72,4398,4399],{"class":74,"line":81},[72,4400,103],{"emptyLinePlaceholder":102},[72,4402,4403],{"class":74,"line":87},[72,4404,4405],{},"while count \u003C= 3:\n",[72,4407,4408],{"class":74,"line":93},[72,4409,4410],{},"    print(\"第\", count, \"次练习\")\n",[72,4412,4413],{"class":74,"line":99},[72,4414,4415],{},"    count = count + 1\n",[72,4417,4418],{"class":74,"line":106},[72,4419,103],{"emptyLinePlaceholder":102},[72,4421,4422],{"class":74,"line":112},[72,4423,4424],{},"print(\"练习结束\")\n",[10,4426,153],{},[63,4428,4431],{"className":4429,"code":4430,"language":159,"meta":68},[157],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[43,4432,4430],{"__ignoreMap":68},[10,4434,164],{},[14,4436,167],{"id":167},[169,4438,4439,4446],{},[40,4440,4441,4442,4445],{},"进入循环前 ",[43,4443,4444],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[40,4447,4448,4449,4451],{},"循环体末尾把 ",[43,4450,4444],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[195,4453,197],{"id":197},[10,4455,4456],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4458,4459],{},[26,4460],{"alt":4461,"src":4462},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4464,4465,4466,4468],{},"第4次检查时 ",[43,4467,4444],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4470,220],{"id":220},[37,4472,4473,4476],{},[40,4474,4475],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[40,4477,4478],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4480,234],{"id":234},[169,4482,4483,4488],{},[40,4484,2384,4485,4487],{},[43,4486,4364],{}," 输出 1 到 5。",[40,4489,4490],{},"计算 1 到 10 的累加和。",[10,4492,249],{},[14,4494,252],{"id":252},[10,4496,4497],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,4499,259],{},{"title":68,"searchDepth":81,"depth":81,"links":4501},[4502,4503,4504,4505,4506,4509,4510,4511],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":4507},[4508],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4341,"description":4346},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[272,4364,4519],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4522,"title":4523,"body":4524,"category":272,"cover":273,"description":4528,"extension":274,"meta":4675,"navigation":102,"path":4676,"pinned":277,"publishedAt":278,"seo":4677,"slug":4678,"stem":4679,"summary":4680,"tags":4681,"updatedAt":278,"visible":102,"__hash__":4683},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4525,"toc":4665},[4526,4529,4531,4534,4536,4542,4547,4549,4563,4565,4567,4605,4607,4613,4615,4617,4633,4635,4643,4645,4656,4658,4660,4663],[10,4527,4528],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4530,16],{"id":16},[10,4532,4533],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4535,22],{"id":22},[10,4537,4538],{},[26,4539],{"alt":4540,"src":4541},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4543,4544,4546],{},[43,4545,4381],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4548,35],{"id":35},[37,4550,4551,4557,4560],{},[40,4552,4553,4556],{},[43,4554,4555],{},"range(1, 4)"," 包含 1，不包含 4。",[40,4558,4559],{},"只需要元素时直接遍历元素，不必手工维护索引。",[40,4561,4562],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4564,58],{"id":58},[10,4566,61],{},[63,4568,4570],{"className":65,"code":4569,"language":67,"meta":68,"style":68},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[43,4571,4572,4577,4581,4586,4591,4595,4600],{"__ignoreMap":68},[72,4573,4574],{"class":74,"line":75},[72,4575,4576],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[72,4578,4579],{"class":74,"line":81},[72,4580,103],{"emptyLinePlaceholder":102},[72,4582,4583],{"class":74,"line":87},[72,4584,4585],{},"for course in courses:\n",[72,4587,4588],{"class":74,"line":93},[72,4589,4590],{},"    print(course)\n",[72,4592,4593],{"class":74,"line":99},[72,4594,103],{"emptyLinePlaceholder":102},[72,4596,4597],{"class":74,"line":106},[72,4598,4599],{},"for number in range(1, 4):\n",[72,4601,4602],{"class":74,"line":112},[72,4603,4604],{},"    print(number)\n",[10,4606,153],{},[63,4608,4611],{"className":4609,"code":4610,"language":159,"meta":68},[157],"变量\n字符串\n列表\n1\n2\n3\n",[43,4612,4610],{"__ignoreMap":68},[10,4614,164],{},[14,4616,167],{"id":167},[169,4618,4619,4628],{},[40,4620,4621,4622,4624,4625,4627],{},"第一个 ",[43,4623,4381],{}," 依次从列表取得字符串，循环变量 ",[43,4626,212],{}," 每轮重新绑定。",[40,4629,4630,4632],{},[43,4631,4555],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4634,220],{"id":220},[37,4636,4637,4640],{},[40,4638,4639],{},"只需要元素却手工维护索引，增加越界风险。",[40,4641,4642],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4644,234],{"id":234},[169,4646,4647,4650],{},[40,4648,4649],{},"逐项输出一个字符串中的字符。",[40,4651,2384,4652,4655],{},[43,4653,4654],{},"range()"," 输出 2、4、6、8。",[10,4657,249],{},[14,4659,252],{"id":252},[10,4661,4662],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,4664,259],{},{"title":68,"searchDepth":81,"depth":81,"links":4666},[4667,4668,4669,4670,4671,4672,4673,4674],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4523,"description":4528},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[272,4381,4682],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4685,"title":4686,"body":4687,"category":272,"cover":273,"description":4691,"extension":274,"meta":4865,"navigation":102,"path":4866,"pinned":277,"publishedAt":278,"seo":4867,"slug":4868,"stem":4869,"summary":4870,"tags":4871,"updatedAt":278,"visible":102,"__hash__":4872},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4688,"toc":4855},[4689,4692,4694,4697,4699,4705,4715,4717,4736,4738,4740,4792,4794,4800,4802,4804,4818,4820,4836,4838,4846,4848,4850,4853],[10,4690,4691],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4693,16],{"id":16},[10,4695,4696],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4698,22],{"id":22},[10,4700,4701],{},[26,4702],{"alt":4703,"src":4704},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4706,4707,4710,4711,4714],{},[43,4708,4709],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[43,4712,4713],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4716,35],{"id":35},[37,4718,4719,4722,4730],{},[40,4720,4721],{},"先写普通循环，再在确有需要时加入流程控制语句。",[40,4723,4724,4726,4727,4729],{},[43,4725,4709],{}," 前要确认不会跳过 ",[43,4728,4364],{}," 循环中的状态更新。",[40,4731,4732,4733,4735],{},"多层嵌套中 ",[43,4734,4713],{}," 只结束它所在的最内层循环。",[14,4737,58],{"id":58},[10,4739,61],{},[63,4741,4743],{"className":65,"code":4742,"language":67,"meta":68,"style":68},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[43,4744,4745,4750,4754,4759,4764,4769,4774,4779,4783,4787],{"__ignoreMap":68},[72,4746,4747],{"class":74,"line":75},[72,4748,4749],{},"numbers = [3, -1, 0, 8, 12]\n",[72,4751,4752],{"class":74,"line":81},[72,4753,103],{"emptyLinePlaceholder":102},[72,4755,4756],{"class":74,"line":87},[72,4757,4758],{},"for number in numbers:\n",[72,4760,4761],{"class":74,"line":93},[72,4762,4763],{},"    if number \u003C 0:\n",[72,4765,4766],{"class":74,"line":99},[72,4767,4768],{},"        continue\n",[72,4770,4771],{"class":74,"line":106},[72,4772,4773],{},"    if number == 0:\n",[72,4775,4776],{"class":74,"line":112},[72,4777,4778],{},"        break\n",[72,4780,4781],{"class":74,"line":118},[72,4782,4604],{},[72,4784,4785],{"class":74,"line":124},[72,4786,103],{"emptyLinePlaceholder":102},[72,4788,4789],{"class":74,"line":130},[72,4790,4791],{},"print(\"循环结束\")\n",[10,4793,153],{},[63,4795,4798],{"className":4796,"code":4797,"language":159,"meta":68},[157],"3\n循环结束\n",[43,4799,4797],{"__ignoreMap":68},[10,4801,164],{},[14,4803,167],{"id":167},[169,4805,4806,4812],{},[40,4807,4808,4809,4811],{},"遇到 -1 时 ",[43,4810,4709],{}," 立即结束本轮，后面的判断和输出都不执行。",[40,4813,4814,4815,4817],{},"遇到 0 时 ",[43,4816,4713],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4819,220],{"id":220},[37,4821,4822,4827],{},[40,4823,3511,4824,4826],{},[43,4825,4709],{}," 当作结束循环，实际它只跳到下一轮。",[40,4828,4829,4830,4832,4833,4835],{},"在 ",[43,4831,4364],{}," 中把状态更新放在可能被 ",[43,4834,4709],{}," 跳过的位置，造成无限循环。",[14,4837,234],{"id":234},[169,4839,4840,4843],{},[40,4841,4842],{},"跳过列表中的空字符串并输出其他内容。",[40,4844,4845],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4847,249],{},[14,4849,252],{"id":252},[10,4851,4852],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,4854,259],{},{"title":68,"searchDepth":81,"depth":81,"links":4856},[4857,4858,4859,4860,4861,4862,4863,4864],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4686,"description":4691},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[272,4713,4709],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4874,"title":4875,"body":4876,"category":272,"cover":273,"description":4880,"extension":274,"meta":5051,"navigation":102,"path":5052,"pinned":277,"publishedAt":278,"seo":5053,"slug":5054,"stem":5055,"summary":5056,"tags":5057,"updatedAt":278,"visible":102,"__hash__":5060},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4877,"toc":5039},[4878,4881,4883,4886,4888,4894,4897,4899,4923,4925,4927,4961,4963,4969,4971,4973,4990,4992,4995,5001,5004,5006,5020,5022,5030,5032,5034,5037],[10,4879,4880],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4882,16],{"id":16},[10,4884,4885],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4887,22],{"id":22},[10,4889,4890],{},[26,4891],{"alt":4892,"src":4893},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4895,4896],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4898,35],{"id":35},[37,4900,4901,4904,4907],{},[40,4902,4903],{},"每增加一层嵌套，阅读成本都会上升。",[40,4905,4906],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[40,4908,4909,4910,2302,4913,4916,4917,2302,4920,408],{},"变量名使用 ",[43,4911,4912],{},"row",[43,4914,4915],{},"cell"," 等层级含义，避免全部写成 ",[43,4918,4919],{},"i",[43,4921,4922],{},"j",[14,4924,58],{"id":58},[10,4926,61],{},[63,4928,4930],{"className":65,"code":4929,"language":67,"meta":68,"style":68},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[43,4931,4932,4937,4941,4946,4951,4956],{"__ignoreMap":68},[72,4933,4934],{"class":74,"line":75},[72,4935,4936],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[72,4938,4939],{"class":74,"line":81},[72,4940,103],{"emptyLinePlaceholder":102},[72,4942,4943],{"class":74,"line":87},[72,4944,4945],{},"for row in table:\n",[72,4947,4948],{"class":74,"line":93},[72,4949,4950],{},"    for cell in row:\n",[72,4952,4953],{"class":74,"line":99},[72,4954,4955],{},"        print(cell)\n",[72,4957,4958],{"class":74,"line":106},[72,4959,4960],{},"    print(\"一行结束\")\n",[10,4962,153],{},[63,4964,4967],{"className":4965,"code":4966,"language":159,"meta":68},[157],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[43,4968,4966],{"__ignoreMap":68},[10,4970,164],{},[14,4972,167],{"id":167},[169,4974,4975,4987],{},[40,4976,4977,4978,4980,4981,213,4984,408],{},"外层变量 ",[43,4979,4912],{}," 先引用第一行列表，内层才依次处理 ",[43,4982,4983],{},"A1",[43,4985,4986],{},"A2",[40,4988,4989],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[195,4991,197],{"id":197},[10,4993,4994],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4996,4997],{},[26,4998],{"alt":4999,"src":5000},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,5002,5003],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,5005,220],{"id":220},[37,5007,5008,5017],{},[40,5009,5010,5011,1055,5014,5016],{},"把两层循环变量都叫 ",[43,5012,5013],{},"item",[43,5015,4919],{},"，难以确认当前层级。",[40,5018,5019],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,5021,234],{"id":234},[169,5023,5024,5027],{},[40,5025,5026],{},"打印一个 2×3 数字表。",[40,5028,5029],{},"在内层增加条件，只输出大于 3 的元素。",[10,5031,249],{},[14,5033,252],{"id":252},[10,5035,5036],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5038,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5040},[5041,5042,5043,5044,5045,5048,5049,5050],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":5046},[5047],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4875,"description":4880},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[272,5058,5059],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5062,"title":5063,"body":5064,"category":272,"cover":273,"description":5068,"extension":274,"meta":5206,"navigation":102,"path":5207,"pinned":277,"publishedAt":278,"seo":5208,"slug":5209,"stem":5210,"summary":5211,"tags":5212,"updatedAt":278,"visible":102,"__hash__":5215},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5065,"toc":5196},[5066,5069,5071,5074,5076,5082,5085,5087,5098,5100,5102,5140,5142,5148,5150,5152,5164,5166,5177,5179,5187,5189,5191,5194],[10,5067,5068],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5070,16],{"id":16},[10,5072,5073],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5075,22],{"id":22},[10,5077,5078],{},[26,5079],{"alt":5080,"src":5081},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5083,5084],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5086,35],{"id":35},[37,5088,5089,5092,5095],{},[40,5090,5091],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[40,5093,5094],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[40,5096,5097],{},"推导式创建新列表，不修改输入列表。",[14,5099,58],{"id":58},[10,5101,61],{},[63,5103,5105],{"className":65,"code":5104,"language":67,"meta":68,"style":68},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[43,5106,5107,5112,5116,5121,5126,5130,5135],{"__ignoreMap":68},[72,5108,5109],{"class":74,"line":75},[72,5110,5111],{},"numbers = [1, 2, 3, 4, 5]\n",[72,5113,5114],{"class":74,"line":81},[72,5115,103],{"emptyLinePlaceholder":102},[72,5117,5118],{"class":74,"line":87},[72,5119,5120],{},"squares = [number * number for number in numbers]\n",[72,5122,5123],{"class":74,"line":93},[72,5124,5125],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[72,5127,5128],{"class":74,"line":99},[72,5129,103],{"emptyLinePlaceholder":102},[72,5131,5132],{"class":74,"line":106},[72,5133,5134],{},"print(squares)\n",[72,5136,5137],{"class":74,"line":112},[72,5138,5139],{},"print(even_squares)\n",[10,5141,153],{},[63,5143,5146],{"className":5144,"code":5145,"language":159,"meta":68},[157],"[1, 4, 9, 16, 25]\n[4, 16]\n",[43,5147,5145],{"__ignoreMap":68},[10,5149,164],{},[14,5151,167],{"id":167},[169,5153,5154,5157],{},[40,5155,5156],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[40,5158,5159,5160,5163],{},"第二条先用 ",[43,5161,5162],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5165,220],{"id":220},[37,5167,5168,5174],{},[40,5169,5170,5171,5173],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[43,5172,4381],{}," 开始找输入。",[40,5175,5176],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5178,234],{"id":234},[169,5180,5181,5184],{},[40,5182,5183],{},"把字符串列表转换为长度列表。",[40,5185,5186],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5188,249],{},[14,5190,252],{"id":252},[10,5192,5193],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5195,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5197},[5198,5199,5200,5201,5202,5203,5204,5205],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5063,"description":5068},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[272,5213,5214],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5217,"title":5218,"body":5219,"category":272,"cover":273,"description":5223,"extension":274,"meta":5365,"navigation":102,"path":5366,"pinned":277,"publishedAt":278,"seo":5367,"slug":5368,"stem":5369,"summary":5370,"tags":5371,"updatedAt":278,"visible":102,"__hash__":5374},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5220,"toc":5355},[5221,5224,5226,5229,5231,5237,5240,5242,5253,5255,5257,5296,5298,5304,5306,5308,5323,5325,5333,5335,5346,5348,5350,5353],[10,5222,5223],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5225,16],{"id":16},[10,5227,5228],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5230,22],{"id":22},[10,5232,5233],{},[26,5234],{"alt":5235,"src":5236},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5238,5239],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5241,35],{"id":35},[37,5243,5244,5247,5250],{},[40,5245,5246],{},"函数名描述动作，使用小写字母和下划线。",[40,5248,5249],{},"函数定义要先执行，之后才能调用。",[40,5251,5252],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5254,58],{"id":58},[10,5256,61],{},[63,5258,5260],{"className":65,"code":5259,"language":67,"meta":68,"style":68},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[43,5261,5262,5267,5272,5277,5281,5286,5291],{"__ignoreMap":68},[72,5263,5264],{"class":74,"line":75},[72,5265,5266],{},"def show_progress():\n",[72,5268,5269],{"class":74,"line":81},[72,5270,5271],{},"    print(\"正在学习函数\")\n",[72,5273,5274],{"class":74,"line":87},[72,5275,5276],{},"    print(\"本节完成 50%\")\n",[72,5278,5279],{"class":74,"line":93},[72,5280,103],{"emptyLinePlaceholder":102},[72,5282,5283],{"class":74,"line":99},[72,5284,5285],{},"print(\"调用前\")\n",[72,5287,5288],{"class":74,"line":106},[72,5289,5290],{},"show_progress()\n",[72,5292,5293],{"class":74,"line":112},[72,5294,5295],{},"print(\"调用后\")\n",[10,5297,153],{},[63,5299,5302],{"className":5300,"code":5301,"language":159,"meta":68},[157],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[43,5303,5301],{"__ignoreMap":68},[10,5305,164],{},[14,5307,167],{"id":167},[169,5309,5310,5316],{},[40,5311,984,5312,5315],{},[43,5313,5314],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[40,5317,5318,5319,5322],{},"运行到 ",[43,5320,5321],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5324,220],{"id":220},[37,5326,5327,5330],{},[40,5328,5329],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[40,5331,5332],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5334,234],{"id":234},[169,5336,5337,5343],{},[40,5338,239,5339,5342],{},[43,5340,5341],{},"show_plan()"," 输出两行学习计划。",[40,5344,5345],{},"连续调用同一个函数两次，观察执行顺序。",[10,5347,249],{},[14,5349,252],{"id":252},[10,5351,5352],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5354,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5356},[5357,5358,5359,5360,5361,5362,5363,5364],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5218,"description":5223},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[272,5372,5373],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5376,"title":5377,"body":5378,"category":272,"cover":273,"description":5382,"extension":274,"meta":5562,"navigation":102,"path":5563,"pinned":277,"publishedAt":278,"seo":5564,"slug":5565,"stem":5566,"summary":5567,"tags":5568,"updatedAt":278,"visible":102,"__hash__":5571},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5379,"toc":5550},[5380,5383,5385,5388,5390,5396,5403,5405,5422,5424,5426,5460,5462,5468,5470,5472,5493,5495,5498,5504,5514,5516,5531,5533,5541,5543,5545,5548],[10,5381,5382],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5384,16],{"id":16},[10,5386,5387],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5389,22],{"id":22},[10,5391,5392],{},[26,5393],{"alt":5394,"src":5395},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5397,5398,5399,5402],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[43,5400,5401],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5404,35],{"id":35},[37,5406,5407,5410,5413],{},[40,5408,5409],{},"形参出现在函数定义中，实参出现在函数调用中。",[40,5411,5412],{},"局部变量默认只在函数内部可见。",[40,5414,5415,5416,5418,5419,408],{},"没有显式 ",[43,5417,5401],{}," 的函数会返回 ",[43,5420,5421],{},"None",[14,5423,58],{"id":58},[10,5425,61],{},[63,5427,5429],{"className":65,"code":5428,"language":67,"meta":68,"style":68},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[43,5430,5431,5436,5441,5446,5450,5455],{"__ignoreMap":68},[72,5432,5433],{"class":74,"line":75},[72,5434,5435],{},"def calculate_total(price, count):\n",[72,5437,5438],{"class":74,"line":81},[72,5439,5440],{},"    total = price * count\n",[72,5442,5443],{"class":74,"line":87},[72,5444,5445],{},"    return total\n",[72,5447,5448],{"class":74,"line":93},[72,5449,103],{"emptyLinePlaceholder":102},[72,5451,5452],{"class":74,"line":99},[72,5453,5454],{},"result = calculate_total(25, 4)\n",[72,5456,5457],{"class":74,"line":106},[72,5458,5459],{},"print(result)\n",[10,5461,153],{},[63,5463,5466],{"className":5464,"code":5465,"language":159,"meta":68},[157],"100\n",[43,5467,5465],{"__ignoreMap":68},[10,5469,164],{},[14,5471,167],{"id":167},[169,5473,5474,5483],{},[40,5475,5476,5477,2302,5480,5482],{},"调用时 25 和 4 分别绑定到 ",[43,5478,5479],{},"price",[43,5481,4444],{},"，它们只在本次函数调用的局部范围中使用。",[40,5484,5485,5488,5489,5492],{},[43,5486,5487],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[43,5490,5491],{},"result"," 并输出。",[195,5494,197],{"id":197},[10,5496,5497],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5499,5500],{},[26,5501],{"alt":5502,"src":5503},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5505,5506,2302,5508,213,5510,5513],{},[43,5507,5479],{},[43,5509,4444],{},[43,5511,5512],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5515,220],{"id":220},[37,5517,5518,5525],{},[40,5519,5520,5521,5524],{},"在函数内部只 ",[43,5522,5523],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[40,5526,5527,5528,5530],{},"试图在函数外直接访问局部变量 ",[43,5529,5512],{},"，它的名字只在调用期间的局部作用域存在。",[14,5532,234],{"id":234},[169,5534,5535,5538],{},[40,5536,5537],{},"编写计算长方形面积的函数。",[40,5539,5540],{},"让函数返回结果后在调用方加上单位再输出。",[10,5542,249],{},[14,5544,252],{"id":252},[10,5546,5547],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5549,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5551},[5552,5553,5554,5555,5556,5559,5560,5561],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":5557},[5558],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5377,"description":5382},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[272,5569,5570],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5573,"title":5574,"body":5575,"category":272,"cover":273,"description":5579,"extension":274,"meta":5759,"navigation":102,"path":5760,"pinned":277,"publishedAt":278,"seo":5761,"slug":5762,"stem":5763,"summary":5764,"tags":5765,"updatedAt":278,"visible":102,"__hash__":5768},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5576,"toc":5747},[5577,5580,5582,5585,5587,5593,5596,5598,5615,5617,5619,5671,5673,5679,5681,5683,5701,5703,5706,5712,5715,5717,5728,5730,5738,5740,5742,5745],[10,5578,5579],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5581,16],{"id":16},[10,5583,5584],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5586,22],{"id":22},[10,5588,5589],{},[26,5590],{"alt":5591,"src":5592},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5594,5595],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5597,35],{"id":35},[37,5599,5600,5603,5609],{},[40,5601,5602],{},"必需参数应放在有默认值的参数之前。",[40,5604,5605,5608],{},[43,5606,5607],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[40,5610,5611,5614],{},[43,5612,5613],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5616,58],{"id":58},[10,5618,61],{},[63,5620,5622],{"className":65,"code":5621,"language":67,"meta":68,"style":68},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[43,5623,5624,5629,5634,5638,5643,5648,5652,5657,5662,5666],{"__ignoreMap":68},[72,5625,5626],{"class":74,"line":75},[72,5627,5628],{},"def build_title(name, level=\"基础\"):\n",[72,5630,5631],{"class":74,"line":81},[72,5632,5633],{},"    return name + \"｜\" + level\n",[72,5635,5636],{"class":74,"line":87},[72,5637,103],{"emptyLinePlaceholder":102},[72,5639,5640],{"class":74,"line":93},[72,5641,5642],{},"print(build_title(\"Python\"))\n",[72,5644,5645],{"class":74,"line":99},[72,5646,5647],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[72,5649,5650],{"class":74,"line":106},[72,5651,103],{"emptyLinePlaceholder":102},[72,5653,5654],{"class":74,"line":112},[72,5655,5656],{},"def total(*numbers):\n",[72,5658,5659],{"class":74,"line":118},[72,5660,5661],{},"    return sum(numbers)\n",[72,5663,5664],{"class":74,"line":124},[72,5665,103],{"emptyLinePlaceholder":102},[72,5667,5668],{"class":74,"line":130},[72,5669,5670],{},"print(total(10, 20, 30))\n",[10,5672,153],{},[63,5674,5677],{"className":5675,"code":5676,"language":159,"meta":68},[157],"Python｜基础\n异常处理｜进阶\n60\n",[43,5678,5676],{"__ignoreMap":68},[10,5680,164],{},[14,5682,167],{"id":167},[169,5684,5685,5692],{},[40,5686,5687,5688,5691],{},"第一次调用只提供必需参数，",[43,5689,5690],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[40,5693,5694,5697,5698,408],{},[43,5695,5696],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[43,5699,5700],{},"sum()",[195,5702,197],{"id":197},[10,5704,5705],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5707,5708],{},[26,5709],{"alt":5710,"src":5711},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5713,5714],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5716,220],{"id":220},[37,5718,5719,5725],{},[40,5720,5721,5722,5724],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[43,5723,5421],{}," 再在函数内创建。",[40,5726,5727],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5729,234],{"id":234},[169,5731,5732,5735],{},[40,5733,5734],{},"给问候函数增加默认称呼。",[40,5736,5737],{},"编写接收任意数量分数并返回总分的函数。",[10,5739,249],{},[14,5741,252],{"id":252},[10,5743,5744],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5746,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5748},[5749,5750,5751,5752,5753,5756,5757,5758],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":5754},[5755],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5574,"description":5579},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[272,5766,5767],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5770,"title":5771,"body":5772,"category":272,"cover":273,"description":5776,"extension":274,"meta":5971,"navigation":102,"path":5972,"pinned":277,"publishedAt":278,"seo":5973,"slug":5974,"stem":5975,"summary":5976,"tags":5977,"updatedAt":278,"visible":102,"__hash__":5980},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5773,"toc":5959},[5774,5777,5779,5782,5784,5790,5793,5795,5812,5814,5816,5877,5879,5885,5887,5889,5916,5918,5921,5927,5930,5932,5940,5942,5950,5952,5954,5957],[10,5775,5776],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5778,16],{"id":16},[10,5780,5781],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5783,22],{"id":22},[10,5785,5786],{},[26,5787],{"alt":5788,"src":5789},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5791,5792],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5794,35],{"id":35},[37,5796,5797,5800,5803],{},[40,5798,5799],{},"函数内部赋值默认创建局部变量。",[40,5801,5802],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[40,5804,5805,2221,5808,5811],{},[43,5806,5807],{},"global",[43,5809,5810],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5813,58],{"id":58},[10,5815,61],{},[63,5817,5819],{"className":65,"code":5818,"language":67,"meta":68,"style":68},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[43,5820,5821,5826,5830,5835,5840,5844,5849,5854,5859,5863,5868,5872],{"__ignoreMap":68},[72,5822,5823],{"class":74,"line":75},[72,5824,5825],{},"course = \"Python\"\n",[72,5827,5828],{"class":74,"line":81},[72,5829,103],{"emptyLinePlaceholder":102},[72,5831,5832],{"class":74,"line":87},[72,5833,5834],{},"def outer():\n",[72,5836,5837],{"class":74,"line":93},[72,5838,5839],{},"    level = \"基础\"\n",[72,5841,5842],{"class":74,"line":99},[72,5843,103],{"emptyLinePlaceholder":102},[72,5845,5846],{"class":74,"line":106},[72,5847,5848],{},"    def show():\n",[72,5850,5851],{"class":74,"line":112},[72,5852,5853],{},"        lesson = \"作用域\"\n",[72,5855,5856],{"class":74,"line":118},[72,5857,5858],{},"        print(course, level, lesson)\n",[72,5860,5861],{"class":74,"line":124},[72,5862,103],{"emptyLinePlaceholder":102},[72,5864,5865],{"class":74,"line":130},[72,5866,5867],{},"    show()\n",[72,5869,5870],{"class":74,"line":135},[72,5871,103],{"emptyLinePlaceholder":102},[72,5873,5874],{"class":74,"line":141},[72,5875,5876],{},"outer()\n",[10,5878,153],{},[63,5880,5883],{"className":5881,"code":5882,"language":159,"meta":68},[157],"Python 基础 作用域\n",[43,5884,5882],{"__ignoreMap":68},[10,5886,164],{},[14,5888,167],{"id":167},[169,5890,5891,5908],{},[40,5892,5893,5896,5897,5900,5901,5903,5904,5907],{},[43,5894,5895],{},"show()"," 中查找 ",[43,5898,5899],{},"lesson"," 时先在局部找到，查找 ",[43,5902,5690],{}," 时到外层 ",[43,5905,5906],{},"outer()"," 找到。",[40,5909,5910,5912,5913,5915],{},[43,5911,212],{}," 在局部和外层都不存在，继续到模块全局找到；",[43,5914,2253],{}," 最后在内置作用域找到。",[195,5917,197],{"id":197},[10,5919,5920],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5922,5923],{},[26,5924],{"alt":5925,"src":5926},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5928,5929],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5931,220],{"id":220},[37,5933,5934,5937],{},[40,5935,5936],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[40,5938,5939],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5941,234],{"id":234},[169,5943,5944,5947],{},[40,5945,5946],{},"在内外层定义同名变量，观察最近作用域优先。",[40,5948,5949],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5951,249],{},[14,5953,252],{"id":252},[10,5955,5956],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,5958,259],{},{"title":68,"searchDepth":81,"depth":81,"links":5960},[5961,5962,5963,5964,5965,5968,5969,5970],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":5966},[5967],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5771,"description":5776},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[272,5978,5979],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5982,"title":5983,"body":5984,"category":272,"cover":273,"description":5988,"extension":274,"meta":6138,"navigation":102,"path":6139,"pinned":277,"publishedAt":278,"seo":6140,"slug":6141,"stem":6142,"summary":6143,"tags":6144,"updatedAt":278,"visible":102,"__hash__":6147},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5985,"toc":6128},[5986,5989,5991,5994,5996,6002,6005,6007,6026,6028,6030,6064,6066,6072,6074,6076,6091,6093,6105,6107,6119,6121,6123,6126],[10,5987,5988],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5990,16],{"id":16},[10,5992,5993],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5995,22],{"id":22},[10,5997,5998],{},[26,5999],{"alt":6000,"src":6001},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,6003,6004],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,6006,35],{"id":35},[37,6008,6009,6012,6015],{},[40,6010,6011],{},"文档字符串紧跟在函数定义后的第一条语句。",[40,6013,6014],{},"注解表达接口意图，不代替输入校验和测试。",[40,6016,6017,6018,2302,6020,2302,6022,6025],{},"基础注解优先使用 ",[43,6019,2305],{},[43,6021,2471],{},[43,6023,6024],{},"list[str]"," 等直接写法。",[14,6027,58],{"id":58},[10,6029,61],{},[63,6031,6033],{"className":65,"code":6032,"language":67,"meta":68,"style":68},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[43,6034,6035,6040,6045,6050,6054,6059],{"__ignoreMap":68},[72,6036,6037],{"class":74,"line":75},[72,6038,6039],{},"def format_score(name: str, score: int) -> str:\n",[72,6041,6042],{"class":74,"line":81},[72,6043,6044],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[72,6046,6047],{"class":74,"line":87},[72,6048,6049],{},"    return name + \"：\" + str(score)\n",[72,6051,6052],{"class":74,"line":93},[72,6053,103],{"emptyLinePlaceholder":102},[72,6055,6056],{"class":74,"line":99},[72,6057,6058],{},"print(format_score(\"小郑\", 95))\n",[72,6060,6061],{"class":74,"line":106},[72,6062,6063],{},"print(format_score.__doc__)\n",[10,6065,153],{},[63,6067,6070],{"className":6068,"code":6069,"language":159,"meta":68},[157],"小郑：95\n返回带姓名的分数文本。\n",[43,6071,6069],{"__ignoreMap":68},[10,6073,164],{},[14,6075,167],{"id":167},[169,6077,6078,6088],{},[40,6079,6080,6081,6084,6085,6087],{},"函数签名说明 ",[43,6082,6083],{},"name"," 预期为字符串、",[43,6086,2291],{}," 预期为整数，返回值预期为字符串。",[40,6089,6090],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6092,220],{"id":220},[37,6094,6095,6102],{},[40,6096,6097,6098,6101],{},"认为加了 ",[43,6099,6100],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[40,6103,6104],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6106,234],{"id":234},[169,6108,6109,6112],{},[40,6110,6111],{},"为面积函数补充参数和返回值注解。",[40,6113,6114,6115,6118],{},"通过 ",[43,6116,6117],{},"函数名.__doc__"," 查看文档字符串。",[10,6120,249],{},[14,6122,252],{"id":252},[10,6124,6125],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,6127,259],{},{"title":68,"searchDepth":81,"depth":81,"links":6129},[6130,6131,6132,6133,6134,6135,6136,6137],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5983,"description":5988},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[272,6145,6146],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6149,"title":6150,"body":6151,"category":272,"cover":273,"description":6155,"extension":274,"meta":6382,"navigation":102,"path":6383,"pinned":277,"publishedAt":278,"seo":6384,"slug":6385,"stem":6386,"summary":6387,"tags":6388,"updatedAt":278,"visible":102,"__hash__":6391},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6152,"toc":6370},[6153,6156,6158,6164,6166,6172,6183,6185,6203,6205,6212,6241,6248,6267,6276,6278,6284,6286,6288,6311,6313,6316,6322,6328,6330,6346,6348,6361,6363,6365,6368],[10,6154,6155],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6157,16],{"id":16},[10,6159,6160,6161,6163],{},"本篇只处理“模块、import 与 ",[341,6162,6083],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6165,22],{"id":22},[10,6167,6168],{},[26,6169],{"alt":6170,"src":6171},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6173,6174,6175,6178,6179,6182],{},"同一个文件直接运行时 ",[43,6176,6177],{},"__name__"," 等于 ",[43,6180,6181],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6184,35],{"id":35},[37,6186,6187,6193,6196],{},[40,6188,6189,6190,6192],{},"一个 ",[43,6191,1216],{}," 文件就是一个模块。",[40,6194,6195],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[40,6197,6198,6199,6202],{},"避免使用 ",[43,6200,6201],{},"from module import *","，它会让名字来源不清楚。",[14,6204,58],{"id":58},[10,6206,6207,6208,6211],{},"先在同一个目录中创建两个文件。把函数放进 ",[43,6209,6210],{},"calculator.py","：",[63,6213,6215],{"className":65,"code":6214,"language":67,"meta":68,"style":68},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[43,6216,6217,6222,6227,6231,6236],{"__ignoreMap":68},[72,6218,6219],{"class":74,"line":75},[72,6220,6221],{},"def add(left, right):\n",[72,6223,6224],{"class":74,"line":81},[72,6225,6226],{},"    return left + right\n",[72,6228,6229],{"class":74,"line":87},[72,6230,103],{"emptyLinePlaceholder":102},[72,6232,6233],{"class":74,"line":93},[72,6234,6235],{},"if __name__ == \"__main__\":\n",[72,6237,6238],{"class":74,"line":99},[72,6239,6240],{},"    print(add(2, 3))\n",[10,6242,6243,6244,6247],{},"再创建 ",[43,6245,6246],{},"app.py","，从模块中导入函数：",[63,6249,6251],{"className":65,"code":6250,"language":67,"meta":68,"style":68},"from calculator import add\n\nprint(add(10, 20))\n",[43,6252,6253,6258,6262],{"__ignoreMap":68},[72,6254,6255],{"class":74,"line":75},[72,6256,6257],{},"from calculator import add\n",[72,6259,6260],{"class":74,"line":81},[72,6261,103],{"emptyLinePlaceholder":102},[72,6263,6264],{"class":74,"line":87},[72,6265,6266],{},"print(add(10, 20))\n",[10,6268,6269,6270,213,6273,408],{},"分别执行 ",[43,6271,6272],{},"python3 calculator.py",[43,6274,6275],{},"python3 app.py",[10,6277,153],{},[63,6279,6282],{"className":6280,"code":6281,"language":159,"meta":68},[157],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[43,6283,6281],{"__ignoreMap":68},[10,6285,164],{},[14,6287,167],{"id":167},[169,6289,6290,6300],{},[40,6291,6292,6293,6295,6296,6299],{},"直接运行 ",[43,6294,6210],{}," 时，模块名是 ",[43,6297,6298],{},"__main__","，入口代码输出 5。",[40,6301,6302,6304,6305,6307,6308,6310],{},[43,6303,6246],{}," 导入模块时，",[43,6306,6210],{}," 的函数定义会执行，但入口判断为假；随后 ",[43,6309,6246],{}," 调用函数输出 30。",[195,6312,197],{"id":197},[10,6314,6315],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6317,6318],{},[26,6319],{"alt":6320,"src":6321},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6323,6324,6325,6327],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[43,6326,6298],{}," 保护下的演示代码。",[14,6329,220],{"id":220},[37,6331,6332,6339],{},[40,6333,6334,6335,213,6337,408],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[43,6336,6210],{},[43,6338,6246],{},[40,6340,6341,6342,6345],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[43,6343,6344],{},"json.py","，导致导入目标被遮蔽。",[14,6347,234],{"id":234},[169,6349,6350,6356],{},[40,6351,2399,6352,6355],{},[43,6353,6354],{},"text_tools.py"," 并导出一个格式化函数。",[40,6357,6358,6359,408],{},"分别直接运行模块和从另一个脚本导入，输出 ",[43,6360,6177],{},[10,6362,249],{},[14,6364,252],{"id":252},[10,6366,6367],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,6369,259],{},{"title":68,"searchDepth":81,"depth":81,"links":6371},[6372,6373,6374,6375,6376,6379,6380,6381],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":6377},[6378],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6150,"description":6155},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[272,6389,6390],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6393,"title":6394,"body":6395,"category":272,"cover":273,"description":6399,"extension":274,"meta":6564,"navigation":102,"path":6565,"pinned":277,"publishedAt":278,"seo":6566,"slug":6567,"stem":6568,"summary":6569,"tags":6570,"updatedAt":278,"visible":102,"__hash__":6572},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6396,"toc":6554},[6397,6400,6402,6405,6407,6413,6416,6418,6432,6434,6436,6482,6484,6490,6492,6494,6520,6522,6532,6534,6545,6547,6549,6552],[10,6398,6399],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6401,16],{"id":16},[10,6403,6404],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6406,22],{"id":22},[10,6408,6409],{},[26,6410],{"alt":6411,"src":6412},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6414,6415],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6417,35],{"id":35},[37,6419,6420,6426,6429],{},[40,6421,6422,6425],{},[43,6423,6424],{},".venv"," 是常见目录名，不应提交到 Git。",[40,6427,6428],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[40,6430,6431],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6433,58],{"id":58},[10,6435,1619],{},[63,6437,6439],{"className":637,"code":6438,"language":639,"meta":68,"style":68},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[43,6440,6441,6453,6461,6467,6477],{"__ignoreMap":68},[72,6442,6443,6445,6447,6450],{"class":74,"line":75},[72,6444,737],{"class":646},[72,6446,679],{"class":649},[72,6448,6449],{"class":682}," venv",[72,6451,6452],{"class":682}," .venv\n",[72,6454,6455,6458],{"class":74,"line":81},[72,6456,6457],{"class":649},"source",[72,6459,6460],{"class":682}," .venv\u002Fbin\u002Factivate\n",[72,6462,6463,6465],{"class":74,"line":87},[72,6464,67],{"class":646},[72,6466,650],{"class":649},[72,6468,6469,6471,6473,6475],{"class":74,"line":93},[72,6470,67],{"class":646},[72,6472,679],{"class":649},[72,6474,683],{"class":682},[72,6476,650],{"class":649},[72,6478,6479],{"class":74,"line":99},[72,6480,6481],{"class":646},"deactivate\n",[10,6483,153],{},[63,6485,6488],{"className":6486,"code":6487,"language":159,"meta":68},[157],"Python 和 pip 的路径应指向当前项目的 .venv\n",[43,6489,6487],{"__ignoreMap":68},[10,6491,164],{},[14,6493,167],{"id":167},[169,6495,6496,6505],{},[40,6497,6498,6501,6502,6504],{},[43,6499,6500],{},"venv"," 根据当前 ",[43,6503,737],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[40,6506,6507,6508,2221,6510,6513,6514,3772,6516,6519],{},"激活后 ",[43,6509,67],{},[43,6511,6512],{},"python -m pip"," 优先指向 ",[43,6515,6424],{},[43,6517,6518],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6521,220],{"id":220},[37,6523,6524,6527],{},[40,6525,6526],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[40,6528,3511,6529,6531],{},[43,6530,6424],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6533,234],{"id":234},[169,6535,6536,6542],{},[40,6537,6538,6539,408],{},"创建虚拟环境并记录激活前后的 ",[43,6540,6541],{},"which python",[40,6543,6544],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6546,249],{},[14,6548,252],{"id":252},[10,6550,6551],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,6553,1703],{},{"title":68,"searchDepth":81,"depth":81,"links":6555},[6556,6557,6558,6559,6560,6561,6562,6563],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6394,"description":6399},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[272,6571,307],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6574,"title":6575,"body":6576,"category":272,"cover":273,"description":6580,"extension":274,"meta":6768,"navigation":102,"path":6769,"pinned":277,"publishedAt":278,"seo":6770,"slug":6771,"stem":6772,"summary":6773,"tags":6774,"updatedAt":278,"visible":102,"__hash__":6777},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6577,"toc":6758},[6578,6581,6583,6586,6588,6594,6603,6605,6629,6631,6633,6686,6688,6694,6696,6698,6714,6716,6735,6737,6749,6751,6753,6756],[10,6579,6580],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6582,16],{"id":16},[10,6584,6585],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6587,22],{"id":22},[10,6589,6590],{},[26,6591],{"alt":6592,"src":6593},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6595,6596,6599,6600,6602],{},[43,6597,6598],{},"Path"," 使用 ",[43,6601,2481],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6604,35],{"id":35},[37,6606,6607,6610,6622],{},[40,6608,6609],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[40,6611,6612,2302,6615,2302,6618,6621],{},[43,6613,6614],{},"exists()",[43,6616,6617],{},"is_file()",[43,6619,6620],{},"is_dir()"," 检查真实文件系统状态。",[40,6623,6624,6625,6628],{},"创建目录前明确目标；",[43,6626,6627],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6630,58],{"id":58},[10,6632,61],{},[63,6634,6636],{"className":65,"code":6635,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[43,6637,6638,6643,6647,6652,6657,6662,6666,6671,6676,6681],{"__ignoreMap":68},[72,6639,6640],{"class":74,"line":75},[72,6641,6642],{},"from pathlib import Path\n",[72,6644,6645],{"class":74,"line":81},[72,6646,103],{"emptyLinePlaceholder":102},[72,6648,6649],{"class":74,"line":87},[72,6650,6651],{},"project = Path.cwd()\n",[72,6653,6654],{"class":74,"line":93},[72,6655,6656],{},"data_dir = project \u002F \"data\"\n",[72,6658,6659],{"class":74,"line":99},[72,6660,6661],{},"file_path = data_dir \u002F \"records.json\"\n",[72,6663,6664],{"class":74,"line":106},[72,6665,103],{"emptyLinePlaceholder":102},[72,6667,6668],{"class":74,"line":112},[72,6669,6670],{},"print(project)\n",[72,6672,6673],{"class":74,"line":118},[72,6674,6675],{},"print(file_path.name)\n",[72,6677,6678],{"class":74,"line":124},[72,6679,6680],{},"print(file_path.suffix)\n",[72,6682,6683],{"class":74,"line":130},[72,6684,6685],{},"print(file_path.exists())\n",[10,6687,153],{},[63,6689,6692],{"className":6690,"code":6691,"language":159,"meta":68},[157],"显示当前项目路径、records.json、.json 和存在状态\n",[43,6693,6691],{"__ignoreMap":68},[10,6695,164],{},[14,6697,167],{"id":167},[169,6699,6700,6706],{},[40,6701,6702,6705],{},[43,6703,6704],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[40,6707,2384,6708,6710,6711,6713],{},[43,6709,2481],{}," 组合路径片段只创建新的 ",[43,6712,6598],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6715,220],{"id":220},[37,6717,6718,6726],{},[40,6719,3511,6720,6722,6723,6725],{},[43,6721,6598],{}," 对象存在当成真实文件存在，仍需调用 ",[43,6724,6614],{}," 等方法确认。",[40,6727,6728,6729,1055,6731,6734],{},"手工拼接 ",[43,6730,2481],{},[43,6732,6733],{},"\\"," 分隔符，降低跨平台可读性。",[14,6736,234],{"id":234},[169,6738,6739,6746],{},[40,6740,6741,6742,6745],{},"组合 ",[43,6743,6744],{},"output\u002Freport.txt"," 路径但先不创建文件。",[40,6747,6748],{},"输出路径的父目录、文件名和扩展名。",[10,6750,249],{},[14,6752,252],{"id":252},[10,6754,6755],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,6757,259],{},{"title":68,"searchDepth":81,"depth":81,"links":6759},[6760,6761,6762,6763,6764,6765,6766,6767],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6575,"description":6580},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[272,6775,6776],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6779,"title":6780,"body":6781,"category":272,"cover":273,"description":6785,"extension":274,"meta":6963,"navigation":102,"path":6964,"pinned":277,"publishedAt":278,"seo":6965,"slug":6966,"stem":6967,"summary":6968,"tags":6969,"updatedAt":278,"visible":102,"__hash__":6972},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6782,"toc":6953},[6783,6786,6788,6791,6793,6799,6802,6804,6832,6834,6836,6893,6895,6901,6903,6905,6916,6918,6931,6933,6944,6946,6948,6951],[10,6784,6785],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6787,16],{"id":16},[10,6789,6790],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6792,22],{"id":22},[10,6794,6795],{},[26,6796],{"alt":6797,"src":6798},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6800,6801],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6803,35],{"id":35},[37,6805,6806,6812,6821],{},[40,6807,6808,6811],{},[43,6809,6810],{},"w"," 模式会截断原文件，写入前必须确认目标。",[40,6813,6814,6817,6818,408],{},[43,6815,6816],{},"r"," 模式读取不存在文件会产生 ",[43,6819,6820],{},"FileNotFoundError",[40,6822,6823,6824,6827,6828,6831],{},"本篇显式调用 ",[43,6825,6826],{},"close()","；第 34 篇会用 ",[43,6829,6830],{},"with"," 更可靠地管理关闭动作。",[14,6833,58],{"id":58},[10,6835,61],{},[63,6837,6839],{"className":65,"code":6838,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[43,6840,6841,6845,6849,6854,6859,6864,6869,6873,6878,6883,6888],{"__ignoreMap":68},[72,6842,6843],{"class":74,"line":75},[72,6844,6642],{},[72,6846,6847],{"class":74,"line":81},[72,6848,103],{"emptyLinePlaceholder":102},[72,6850,6851],{"class":74,"line":87},[72,6852,6853],{},"file_path = Path(\"notes.txt\")\n",[72,6855,6856],{"class":74,"line":93},[72,6857,6858],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[72,6860,6861],{"class":74,"line":99},[72,6862,6863],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[72,6865,6866],{"class":74,"line":106},[72,6867,6868],{},"writer.close()\n",[72,6870,6871],{"class":74,"line":112},[72,6872,103],{"emptyLinePlaceholder":102},[72,6874,6875],{"class":74,"line":118},[72,6876,6877],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[72,6879,6880],{"class":74,"line":124},[72,6881,6882],{},"content = reader.read()\n",[72,6884,6885],{"class":74,"line":130},[72,6886,6887],{},"reader.close()\n",[72,6889,6890],{"class":74,"line":135},[72,6891,6892],{},"print(content)\n",[10,6894,153],{},[63,6896,6899],{"className":6897,"code":6898,"language":159,"meta":68},[157],"变量\n循环\n函数\n",[43,6900,6898],{"__ignoreMap":68},[10,6902,164],{},[14,6904,167],{"id":167},[169,6906,6907,6913],{},[40,6908,6909,6910,6912],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[43,6911,6826],{}," 确保缓冲内容交给文件系统。",[40,6914,6915],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6917,220],{"id":220},[37,6919,6920,6925],{},[40,6921,2384,6922,6924],{},[43,6923,6810],{}," 模式打开重要文件却未确认覆盖风险。",[40,6926,6927,6928,408],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[43,6929,6930],{},"encoding=\"utf-8\"",[14,6932,234],{"id":234},[169,6934,6935,6938],{},[40,6936,6937],{},"写入三行学习记录并读取。",[40,6939,6940,6941,6943],{},"改用 ",[43,6942,382],{}," 模式追加一行，确认原内容仍保留。",[10,6945,249],{},[14,6947,252],{"id":252},[10,6949,6950],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,6952,259],{},{"title":68,"searchDepth":81,"depth":81,"links":6954},[6955,6956,6957,6958,6959,6960,6961,6962],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6780,"description":6785},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[272,6970,6971],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6974,"title":6975,"body":6976,"category":272,"cover":273,"description":6980,"extension":274,"meta":7147,"navigation":102,"path":7148,"pinned":277,"publishedAt":278,"seo":7149,"slug":7150,"stem":7151,"summary":7152,"tags":7153,"updatedAt":278,"visible":102,"__hash__":7156},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6977,"toc":7137},[6978,6981,6983,6986,6988,6994,7004,7006,7020,7022,7024,7084,7086,7092,7094,7096,7108,7110,7118,7120,7128,7130,7132,7135],[10,6979,6980],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6982,16],{"id":16},[10,6984,6985],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6987,22],{"id":22},[10,6989,6990],{},[26,6991],{"alt":6992,"src":6993},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6995,6996,6999,7000,7003],{},[43,6997,6998],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[43,7001,7002],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,7005,35],{"id":35},[37,7007,7008,7011,7017],{},[40,7009,7010],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[40,7012,7013,7016],{},[43,7014,7015],{},"ensure_ascii=False"," 让中文以可读字符写入。",[40,7018,7019],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,7021,58],{"id":58},[10,7023,61],{},[63,7025,7027],{"className":65,"code":7026,"language":67,"meta":68,"style":68},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[43,7028,7029,7034,7038,7043,7047,7052,7057,7061,7065,7070,7075,7079],{"__ignoreMap":68},[72,7030,7031],{"class":74,"line":75},[72,7032,7033],{},"import json\n",[72,7035,7036],{"class":74,"line":81},[72,7037,103],{"emptyLinePlaceholder":102},[72,7039,7040],{"class":74,"line":87},[72,7041,7042],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[72,7044,7045],{"class":74,"line":93},[72,7046,103],{"emptyLinePlaceholder":102},[72,7048,7049],{"class":74,"line":99},[72,7050,7051],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[72,7053,7054],{"class":74,"line":106},[72,7055,7056],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[72,7058,7059],{"class":74,"line":112},[72,7060,6868],{},[72,7062,7063],{"class":74,"line":118},[72,7064,103],{"emptyLinePlaceholder":102},[72,7066,7067],{"class":74,"line":124},[72,7068,7069],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[72,7071,7072],{"class":74,"line":130},[72,7073,7074],{},"loaded = json.load(reader)\n",[72,7076,7077],{"class":74,"line":135},[72,7078,6887],{},[72,7080,7081],{"class":74,"line":141},[72,7082,7083],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7085,153],{},[63,7087,7090],{"className":7088,"code":7089,"language":159,"meta":68},[157],"Python 60\n",[43,7091,7089],{"__ignoreMap":68},[10,7093,164],{},[14,7095,167],{"id":167},[169,7097,7098,7103],{},[40,7099,7100,7102],{},[43,7101,6998],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[40,7104,7105,7107],{},[43,7106,7002],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7109,220],{"id":220},[37,7111,7112,7115],{},[40,7113,7114],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[40,7116,7117],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7119,234],{"id":234},[169,7121,7122,7125],{},[40,7123,7124],{},"保存包含两条学习记录的列表。",[40,7126,7127],{},"读取后修改进度，再重新写回文件。",[10,7129,249],{},[14,7131,252],{"id":252},[10,7133,7134],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,7136,259],{},{"title":68,"searchDepth":81,"depth":81,"links":7138},[7139,7140,7141,7142,7143,7144,7145,7146],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6975,"description":6980},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[272,7154,7155],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7158,"title":7159,"body":7160,"category":272,"cover":273,"description":7164,"extension":274,"meta":7348,"navigation":102,"path":7349,"pinned":277,"publishedAt":278,"seo":7350,"slug":7351,"stem":7352,"summary":7353,"tags":7354,"updatedAt":278,"visible":102,"__hash__":7357},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7161,"toc":7338},[7162,7165,7167,7170,7172,7178,7184,7186,7208,7210,7212,7275,7277,7283,7285,7287,7303,7305,7319,7321,7329,7331,7333,7336],[10,7163,7164],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7166,16],{"id":16},[10,7168,7169],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7171,22],{"id":22},[10,7173,7174],{},[26,7175],{"alt":7176,"src":7177},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7179,7180,7183],{},[43,7181,7182],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7185,35],{"id":35},[37,7187,7188,7198,7205],{},[40,7189,2384,7190,7193,7194,7197],{},[43,7191,7192],{},"newline=\"\""," 让 ",[43,7195,7196],{},"csv"," 模块正确处理换行。",[40,7199,7200,7201,7204],{},"字段顺序由 ",[43,7202,7203],{},"fieldnames"," 决定，字典键需要与字段名一致。",[40,7206,7207],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7209,58],{"id":58},[10,7211,61],{},[63,7213,7215],{"className":65,"code":7214,"language":67,"meta":68,"style":68},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[43,7216,7217,7222,7226,7231,7236,7241,7246,7251,7255,7260,7265,7270],{"__ignoreMap":68},[72,7218,7219],{"class":74,"line":75},[72,7220,7221],{},"import csv\n",[72,7223,7224],{"class":74,"line":81},[72,7225,103],{"emptyLinePlaceholder":102},[72,7227,7228],{"class":74,"line":87},[72,7229,7230],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[72,7232,7233],{"class":74,"line":93},[72,7234,7235],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[72,7237,7238],{"class":74,"line":99},[72,7239,7240],{},"writer.writeheader()\n",[72,7242,7243],{"class":74,"line":106},[72,7244,7245],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[72,7247,7248],{"class":74,"line":112},[72,7249,7250],{},"writer_file.close()\n",[72,7252,7253],{"class":74,"line":118},[72,7254,103],{"emptyLinePlaceholder":102},[72,7256,7257],{"class":74,"line":124},[72,7258,7259],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[72,7261,7262],{"class":74,"line":130},[72,7263,7264],{},"for row in csv.DictReader(reader_file):\n",[72,7266,7267],{"class":74,"line":135},[72,7268,7269],{},"    print(row[\"name\"], row[\"score\"])\n",[72,7271,7272],{"class":74,"line":141},[72,7273,7274],{},"reader_file.close()\n",[10,7276,153],{},[63,7278,7281],{"className":7279,"code":7280,"language":159,"meta":68},[157],"小郑 95\n",[43,7282,7280],{"__ignoreMap":68},[10,7284,164],{},[14,7286,167],{"id":167},[169,7288,7289,7298],{},[40,7290,7291,7294,7295,7297],{},[43,7292,7293],{},"DictWriter"," 按 ",[43,7296,7203],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[40,7299,7300,7302],{},[43,7301,7182],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7304,220],{"id":220},[37,7306,7307,7310],{},[40,7308,7309],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[40,7311,7312,7313,7315,7316,7318],{},"在 macOS 以外环境忽略 ",[43,7314,7192],{}," 可能出现额外空行；统一交给 ",[43,7317,7196],{}," 模块管理换行。",[14,7320,234],{"id":234},[169,7322,7323,7326],{},[40,7324,7325],{},"写入三名学习者的课程和分数。",[40,7327,7328],{},"读取 CSV 后把分数字符串转换为整数。",[10,7330,249],{},[14,7332,252],{"id":252},[10,7334,7335],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,7337,259],{},{"title":68,"searchDepth":81,"depth":81,"links":7339},[7340,7341,7342,7343,7344,7345,7346,7347],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7159,"description":7164},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[272,7355,7356],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7359,"title":7360,"body":7361,"category":272,"cover":273,"description":7365,"extension":274,"meta":7637,"navigation":102,"path":7638,"pinned":277,"publishedAt":278,"seo":7639,"slug":7640,"stem":7641,"summary":7642,"tags":7643,"updatedAt":278,"visible":102,"__hash__":7646},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7362,"toc":7624},[7363,7366,7368,7371,7373,7379,7390,7392,7409,7411,7413,7487,7489,7495,7497,7499,7524,7526,7535,7541,7552,7554,7560,7566,7575,7577,7592,7594,7615,7617,7619,7622],[10,7364,7365],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7367,16],{"id":16},[10,7369,7370],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7372,22],{"id":22},[10,7374,7375],{},[26,7376],{"alt":7377,"src":7378},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7380,7381,7382,7385,7386,7389],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[43,7383,7384],{},"except","；无论是否异常，",[43,7387,7388],{},"finally"," 都会在离开结构前执行。",[14,7391,35],{"id":35},[37,7393,7394,7400,7406],{},[40,7395,7396,7397,7399],{},"只捕获能够处理的具体异常，不使用空的 ",[43,7398,7384],{}," 吞掉全部错误。",[40,7401,7402,7405],{},[43,7403,7404],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[40,7407,7408],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7410,58],{"id":58},[10,7412,61],{},[63,7414,7416],{"className":65,"code":7415,"language":67,"meta":68,"style":68},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[43,7417,7418,7423,7428,7433,7438,7443,7447,7452,7457,7462,7467,7471,7476,7481],{"__ignoreMap":68},[72,7419,7420],{"class":74,"line":75},[72,7421,7422],{},"def parse_age(text):\n",[72,7424,7425],{"class":74,"line":81},[72,7426,7427],{},"    age = int(text)\n",[72,7429,7430],{"class":74,"line":87},[72,7431,7432],{},"    if age \u003C 0:\n",[72,7434,7435],{"class":74,"line":93},[72,7436,7437],{},"        raise ValueError(\"年龄不能为负数\")\n",[72,7439,7440],{"class":74,"line":99},[72,7441,7442],{},"    return age\n",[72,7444,7445],{"class":74,"line":106},[72,7446,103],{"emptyLinePlaceholder":102},[72,7448,7449],{"class":74,"line":112},[72,7450,7451],{},"try:\n",[72,7453,7454],{"class":74,"line":118},[72,7455,7456],{},"    age = parse_age(\"18\")\n",[72,7458,7459],{"class":74,"line":124},[72,7460,7461],{},"except ValueError as error:\n",[72,7463,7464],{"class":74,"line":130},[72,7465,7466],{},"    print(\"输入错误：\", error)\n",[72,7468,7469],{"class":74,"line":135},[72,7470,1192],{},[72,7472,7473],{"class":74,"line":141},[72,7474,7475],{},"    print(\"年龄：\", age)\n",[72,7477,7478],{"class":74,"line":147},[72,7479,7480],{},"finally:\n",[72,7482,7484],{"class":74,"line":7483},14,[72,7485,7486],{},"    print(\"处理结束\")\n",[10,7488,153],{},[63,7490,7493],{"className":7491,"code":7492,"language":159,"meta":68},[157],"年龄： 18\n处理结束\n",[43,7494,7492],{"__ignoreMap":68},[10,7496,164],{},[14,7498,167],{"id":167},[169,7500,7501,7513],{},[40,7502,7503,7505,7506,7508,7509,7512],{},[43,7504,3080],{}," 或主动 ",[43,7507,7404],{}," 都可能产生 ",[43,7510,7511],{},"ValueError","，控制流立即离开当前正常路径。",[40,7514,7515,7516,7518,7519,7521,7522,408],{},"有异常时进入匹配的 ",[43,7517,7384],{},"；没有异常时执行 ",[43,7520,1205],{},"；两种情况最后都会执行 ",[43,7523,7388],{},[195,7525,197],{"id":197},[10,7527,7528,2302,7530,213,7532,7534],{},[43,7529,7384],{},[43,7531,1205],{},[43,7533,7388],{}," 的职责不同，不能只看它们出现的顺序。",[10,7536,7537],{},[26,7538],{"alt":7539,"src":7540},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7542,7543,7545,7546,7548,7549,7551],{},[43,7544,7384],{}," 处理匹配异常，",[43,7547,1205],{}," 只在无异常时运行，",[43,7550,7388],{}," 负责两条路径都需要的清理动作。",[195,7553,197],{"id":4262},[10,7555,7556,7559],{},[43,7557,7558],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7561,7562],{},[26,7563],{"alt":7564,"src":7565},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7567,7568,7569,7571,7572,7574],{},"只把可能产生预期异常的操作放进 ",[43,7570,7558],{},"，后续正常业务放进 ",[43,7573,1205],{},"，错误边界会更清楚。",[14,7576,220],{"id":220},[37,7578,7579,7586],{},[40,7580,7581,7582,7585],{},"使用裸 ",[43,7583,7584],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[40,7587,7588,7589,7591],{},"把整个程序包在一个巨大 ",[43,7590,7558],{}," 中，无法判断究竟哪一步允许失败。",[14,7593,234],{"id":234},[169,7595,7596,7609],{},[40,7597,7598,7599,7602,7603,213,7606,408],{},"让 ",[43,7600,7601],{},"parse_age"," 分别处理 ",[43,7604,7605],{},"\"abc\"",[43,7607,7608],{},"\"-1\"",[40,7610,7611,7612,7614],{},"为文件读取捕获 ",[43,7613,6820],{}," 并给出清晰提示。",[10,7616,249],{},[14,7618,252],{"id":252},[10,7620,7621],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,7623,259],{},{"title":68,"searchDepth":81,"depth":81,"links":7625},[7626,7627,7628,7629,7630,7634,7635,7636],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":7631},[7632,7633],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7360,"description":7365},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[272,7644,7645],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7648,"title":7649,"body":7650,"category":272,"cover":273,"description":7654,"extension":274,"meta":7830,"navigation":102,"path":7831,"pinned":277,"publishedAt":278,"seo":7832,"slug":7833,"stem":7834,"summary":7835,"tags":7836,"updatedAt":278,"visible":102,"__hash__":7838},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7651,"toc":7820},[7652,7655,7657,7660,7662,7668,7674,7676,7692,7694,7696,7750,7752,7758,7760,7762,7775,7777,7790,7792,7811,7813,7815,7818],[10,7653,7654],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7656,16],{"id":16},[10,7658,7659],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7661,22],{"id":22},[10,7663,7664],{},[26,7665],{"alt":7666,"src":7667},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7669,7670,7671,7673],{},"进入 ",[43,7672,6830],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7675,35],{"id":35},[37,7677,7678,7683,7689],{},[40,7679,7680,7682],{},[43,7681,6830],{}," 把资源获取和释放配成一个清晰边界。",[40,7684,7685,7688],{},[43,7686,7687],{},"as file"," 得到的是上下文返回的资源对象。",[40,7690,7691],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7693,58],{"id":58},[10,7695,61],{},[63,7697,7699],{"className":65,"code":7698,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[43,7700,7701,7705,7709,7713,7717,7722,7727,7731,7736,7741,7745],{"__ignoreMap":68},[72,7702,7703],{"class":74,"line":75},[72,7704,6642],{},[72,7706,7707],{"class":74,"line":81},[72,7708,103],{"emptyLinePlaceholder":102},[72,7710,7711],{"class":74,"line":87},[72,7712,6853],{},[72,7714,7715],{"class":74,"line":93},[72,7716,103],{"emptyLinePlaceholder":102},[72,7718,7719],{"class":74,"line":99},[72,7720,7721],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,7723,7724],{"class":74,"line":106},[72,7725,7726],{},"    file.write(\"上下文管理器\\n\")\n",[72,7728,7729],{"class":74,"line":112},[72,7730,103],{"emptyLinePlaceholder":102},[72,7732,7733],{"class":74,"line":118},[72,7734,7735],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[72,7737,7738],{"class":74,"line":124},[72,7739,7740],{},"    print(file.read())\n",[72,7742,7743],{"class":74,"line":130},[72,7744,103],{"emptyLinePlaceholder":102},[72,7746,7747],{"class":74,"line":135},[72,7748,7749],{},"print(file.closed)\n",[10,7751,153],{},[63,7753,7756],{"className":7754,"code":7755,"language":159,"meta":68},[157],"上下文管理器\n\nTrue\n",[43,7757,7755],{"__ignoreMap":68},[10,7759,164],{},[14,7761,167],{"id":167},[169,7763,7764,7772],{},[40,7765,7670,7766,7768,7769,408],{},[43,7767,6830],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[43,7770,7771],{},"file",[40,7773,7774],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7776,220],{"id":220},[37,7778,7779,7784],{},[40,7780,4829,7781,7783],{},[43,7782,6830],{}," 代码块外继续读写已经关闭的文件对象。",[40,7785,7786,7787,7789],{},"误以为 ",[43,7788,6830],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7791,234],{"id":234},[169,7793,7794,7803],{},[40,7795,7796,7797,7800,7801,408],{},"把第 30 篇的手动 ",[43,7798,7799],{},"open\u002Fclose"," 改写为 ",[43,7802,6830],{},[40,7804,4829,7805,7807,7808,408],{},[43,7806,6830],{}," 块后检查 ",[43,7809,7810],{},"file.closed",[10,7812,249],{},[14,7814,252],{"id":252},[10,7816,7817],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,7819,259],{},{"title":68,"searchDepth":81,"depth":81,"links":7821},[7822,7823,7824,7825,7826,7827,7828,7829],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7649,"description":7654},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[272,6830,7837],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":4,"title":5,"body":7840,"category":272,"cover":273,"description":12,"extension":274,"meta":8011,"navigation":102,"path":276,"pinned":277,"publishedAt":278,"seo":8012,"slug":280,"stem":281,"summary":282,"tags":8013,"updatedAt":278,"visible":102,"__hash__":286},{"type":7,"value":7841,"toc":7999},[7842,7844,7846,7848,7850,7854,7856,7858,7870,7872,7874,7930,7932,7937,7939,7941,7957,7959,7961,7965,7971,7973,7981,7983,7991,7993,7995,7997],[10,7843,12],{},[14,7845,16],{"id":16},[10,7847,19],{},[14,7849,22],{"id":22},[10,7851,7852],{},[26,7853],{"alt":28,"src":29},[10,7855,32],{},[14,7857,35],{"id":35},[37,7859,7860,7864,7868],{},[40,7861,7862,46],{},[43,7863,45],{},[40,7865,7866,52],{},[43,7867,51],{},[40,7869,55],{},[14,7871,58],{"id":58},[10,7873,61],{},[63,7875,7876],{"className":65,"code":66,"language":67,"meta":68,"style":68},[43,7877,7878,7882,7886,7890,7894,7898,7902,7906,7910,7914,7918,7922,7926],{"__ignoreMap":68},[72,7879,7880],{"class":74,"line":75},[72,7881,78],{},[72,7883,7884],{"class":74,"line":81},[72,7885,84],{},[72,7887,7888],{"class":74,"line":87},[72,7889,90],{},[72,7891,7892],{"class":74,"line":93},[72,7893,96],{},[72,7895,7896],{"class":74,"line":99},[72,7897,103],{"emptyLinePlaceholder":102},[72,7899,7900],{"class":74,"line":106},[72,7901,109],{},[72,7903,7904],{"class":74,"line":112},[72,7905,115],{},[72,7907,7908],{"class":74,"line":118},[72,7909,121],{},[72,7911,7912],{"class":74,"line":124},[72,7913,127],{},[72,7915,7916],{"class":74,"line":130},[72,7917,103],{"emptyLinePlaceholder":102},[72,7919,7920],{"class":74,"line":135},[72,7921,138],{},[72,7923,7924],{"class":74,"line":141},[72,7925,144],{},[72,7927,7928],{"class":74,"line":147},[72,7929,150],{},[10,7931,153],{},[63,7933,7935],{"className":7934,"code":158,"language":159,"meta":68},[157],[43,7936,158],{"__ignoreMap":68},[10,7938,164],{},[14,7940,167],{"id":167},[169,7942,7943,7949],{},[40,7944,173,7945,177,7947,180],{},[43,7946,176],{},[43,7948,51],{},[40,7950,7951,186,7953,190,7955,193],{},[43,7952,185],{},[43,7954,189],{},[43,7956,45],{},[195,7958,197],{"id":197},[10,7960,200],{},[10,7962,7963],{},[26,7964],{"alt":205,"src":206},[10,7966,209,7967,213,7969,217],{},[43,7968,212],{},[43,7970,216],{},[14,7972,220],{"id":220},[37,7974,7975,7979],{},[40,7976,225,7977,228],{},[43,7978,45],{},[40,7980,231],{},[14,7982,234],{"id":234},[169,7984,7985,7989],{},[40,7986,239,7987,243],{},[43,7988,242],{},[40,7990,246],{},[10,7992,249],{},[14,7994,252],{"id":252},[10,7996,255],{},[257,7998,259],{},{"title":68,"searchDepth":81,"depth":81,"links":8000},[8001,8002,8003,8004,8005,8008,8009,8010],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":8006},[8007],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5,"description":12},[272,284,285],{"id":8015,"title":8016,"body":8017,"category":272,"cover":273,"description":8021,"extension":274,"meta":8199,"navigation":102,"path":8200,"pinned":277,"publishedAt":278,"seo":8201,"slug":8202,"stem":8203,"summary":8204,"tags":8205,"updatedAt":278,"visible":102,"__hash__":8208},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":8018,"toc":8189},[8019,8022,8024,8027,8029,8035,8038,8040,8051,8053,8055,8122,8124,8130,8132,8134,8153,8155,8163,8165,8180,8182,8184,8187],[10,8020,8021],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8023,16],{"id":16},[10,8025,8026],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8028,22],{"id":22},[10,8030,8031],{},[26,8032],{"alt":8033,"src":8034},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8036,8037],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8039,35],{"id":35},[37,8041,8042,8045,8048],{},[40,8043,8044],{},"封装让对象通过方法维护自己的有效状态。",[40,8046,8047],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[40,8049,8050],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8052,58],{"id":58},[10,8054,61],{},[63,8056,8058],{"className":65,"code":8057,"language":67,"meta":68,"style":68},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[43,8059,8060,8065,8070,8075,8079,8084,8089,8094,8098,8103,8108,8112,8117],{"__ignoreMap":68},[72,8061,8062],{"class":74,"line":75},[72,8063,8064],{},"class Storage:\n",[72,8066,8067],{"class":74,"line":81},[72,8068,8069],{},"    def save(self, text):\n",[72,8071,8072],{"class":74,"line":87},[72,8073,8074],{},"        print(\"保存：\", text)\n",[72,8076,8077],{"class":74,"line":93},[72,8078,103],{"emptyLinePlaceholder":102},[72,8080,8081],{"class":74,"line":99},[72,8082,8083],{},"class LearningService:\n",[72,8085,8086],{"class":74,"line":106},[72,8087,8088],{},"    def __init__(self, storage):\n",[72,8090,8091],{"class":74,"line":112},[72,8092,8093],{},"        self.storage = storage\n",[72,8095,8096],{"class":74,"line":118},[72,8097,103],{"emptyLinePlaceholder":102},[72,8099,8100],{"class":74,"line":124},[72,8101,8102],{},"    def finish_lesson(self, title):\n",[72,8104,8105],{"class":74,"line":130},[72,8106,8107],{},"        self.storage.save(title)\n",[72,8109,8110],{"class":74,"line":135},[72,8111,103],{"emptyLinePlaceholder":102},[72,8113,8114],{"class":74,"line":141},[72,8115,8116],{},"service = LearningService(Storage())\n",[72,8118,8119],{"class":74,"line":147},[72,8120,8121],{},"service.finish_lesson(\"异常处理\")\n",[10,8123,153],{},[63,8125,8128],{"className":8126,"code":8127,"language":159,"meta":68},[157],"保存： 异常处理\n",[43,8129,8127],{"__ignoreMap":68},[10,8131,164],{},[14,8133,167],{"id":167},[169,8135,8136,8146],{},[40,8137,8138,8141,8142,8145],{},[43,8139,8140],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[43,8143,8144],{},"save()"," 的协作对象。",[40,8147,8148,8149,8152],{},"调用业务方法时，服务把保存动作委托给 ",[43,8150,8151],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8154,220],{"id":220},[37,8156,8157,8160],{},[40,8158,8159],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[40,8161,8162],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8164,234],{"id":234},[169,8166,8167,8177],{},[40,8168,8169,8170,8173,8174,408],{},"用组合让 ",[43,8171,8172],{},"OrderService"," 使用一个 ",[43,8175,8176],{},"Notifier",[40,8178,8179],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8181,249],{},[14,8183,252],{"id":252},[10,8185,8186],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,8188,259],{},{"title":68,"searchDepth":81,"depth":81,"links":8190},[8191,8192,8193,8194,8195,8196,8197,8198],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":8016,"description":8021},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[272,8206,8207],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8210,"title":8211,"body":8212,"category":272,"cover":273,"description":8216,"extension":274,"meta":8419,"navigation":102,"path":8420,"pinned":277,"publishedAt":278,"seo":8421,"slug":8422,"stem":8423,"summary":8424,"tags":8425,"updatedAt":278,"visible":102,"__hash__":8428},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8213,"toc":8407},[8214,8217,8219,8222,8224,8230,8237,8239,8264,8266,8268,8320,8322,8328,8330,8332,8353,8355,8361,8367,8373,8375,8383,8385,8398,8400,8402,8405],[10,8215,8216],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8218,16],{"id":16},[10,8220,8221],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8223,22],{"id":22},[10,8225,8226],{},[26,8227],{"alt":8228,"src":8229},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8231,8232,8233,8236],{},"生成器运行到 ",[43,8234,8235],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8238,35],{"id":35},[37,8240,8241,8251,8261],{},[40,8242,8243,8246,8247,8250],{},[43,8244,8245],{},"iter()"," 从可迭代对象取得迭代器，",[43,8248,8249],{},"next()"," 请求下一个值。",[40,8252,8253,8254,8257,8258,8260],{},"没有更多值时迭代器抛出 ",[43,8255,8256],{},"StopIteration","，",[43,8259,4381],{}," 会自动处理。",[40,8262,8263],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8265,58],{"id":58},[10,8267,61],{},[63,8269,8271],{"className":65,"code":8270,"language":67,"meta":68,"style":68},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[43,8272,8273,8278,8283,8288,8293,8298,8302,8307,8312,8316],{"__ignoreMap":68},[72,8274,8275],{"class":74,"line":75},[72,8276,8277],{},"def countdown(start):\n",[72,8279,8280],{"class":74,"line":81},[72,8281,8282],{},"    current = start\n",[72,8284,8285],{"class":74,"line":87},[72,8286,8287],{},"    while current > 0:\n",[72,8289,8290],{"class":74,"line":93},[72,8291,8292],{},"        yield current\n",[72,8294,8295],{"class":74,"line":99},[72,8296,8297],{},"        current = current - 1\n",[72,8299,8300],{"class":74,"line":106},[72,8301,103],{"emptyLinePlaceholder":102},[72,8303,8304],{"class":74,"line":112},[72,8305,8306],{},"iterator = countdown(3)\n",[72,8308,8309],{"class":74,"line":118},[72,8310,8311],{},"print(next(iterator))\n",[72,8313,8314],{"class":74,"line":124},[72,8315,8311],{},[72,8317,8318],{"class":74,"line":130},[72,8319,8311],{},[10,8321,153],{},[63,8323,8326],{"className":8324,"code":8325,"language":159,"meta":68},[157],"3\n2\n1\n",[43,8327,8325],{"__ignoreMap":68},[10,8329,164],{},[14,8331,167],{"id":167},[169,8333,8334,8340],{},[40,8335,173,8336,8339],{},[43,8337,8338],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[40,8341,8342,8343,8345,8346,8348,8349,8352],{},"每次 ",[43,8344,8249],{}," 运行到下一个 ",[43,8347,8235],{}," 并暂停，局部变量 ",[43,8350,8351],{},"current"," 和执行位置被保留。",[195,8354,197],{"id":197},[10,8356,8357,8358,8360],{},"生成器的暂停位置可以展开成多次 ",[43,8359,8249],{}," 的时间线。",[10,8362,8363],{},[26,8364],{"alt":8365,"src":8366},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8368,8369,8370,8372],{},"每次请求只推进到下一个 ",[43,8371,8235],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8374,220],{"id":220},[37,8376,8377,8380],{},[40,8378,8379],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[40,8381,8382],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8384,234],{"id":234},[169,8386,8387,8390],{},[40,8388,8389],{},"编写产生 1 到指定上限偶数的生成器。",[40,8391,4054,8392,8394,8395,8397],{},[43,8393,4381],{}," 遍历生成器，比较手动 ",[43,8396,8249],{}," 的差异。",[10,8399,249],{},[14,8401,252],{"id":252},[10,8403,8404],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,8406,259],{},{"title":68,"searchDepth":81,"depth":81,"links":8408},[8409,8410,8411,8412,8413,8416,8417,8418],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":8414},[8415],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8211,"description":8216},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[272,8426,8427],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8430,"title":8431,"body":8432,"category":272,"cover":273,"description":8436,"extension":274,"meta":8660,"navigation":102,"path":8661,"pinned":277,"publishedAt":278,"seo":8662,"slug":8663,"stem":8664,"summary":8665,"tags":8666,"updatedAt":278,"visible":102,"__hash__":8668},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8433,"toc":8648},[8434,8437,8439,8442,8444,8450,8453,8455,8475,8477,8479,8561,8563,8569,8571,8573,8595,8597,8600,8606,8613,8615,8625,8627,8639,8641,8643,8646],[10,8435,8436],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8438,16],{"id":16},[10,8440,8441],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8443,22],{"id":22},[10,8445,8446],{},[26,8447],{"alt":8448,"src":8449},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8451,8452],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8454,35],{"id":35},[37,8456,8457,8466,8469],{},[40,8458,8459,8462,8463,408],{},[43,8460,8461],{},"@trace"," 等价于 ",[43,8464,8465],{},"add = trace(add)",[40,8467,8468],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[40,8470,8471,8474],{},[43,8472,8473],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8476,58],{"id":58},[10,8478,61],{},[63,8480,8482],{"className":65,"code":8481,"language":67,"meta":68,"style":68},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[43,8483,8484,8489,8493,8498,8503,8508,8513,8518,8523,8528,8533,8537,8542,8546,8550,8555],{"__ignoreMap":68},[72,8485,8486],{"class":74,"line":75},[72,8487,8488],{},"from functools import wraps\n",[72,8490,8491],{"class":74,"line":81},[72,8492,103],{"emptyLinePlaceholder":102},[72,8494,8495],{"class":74,"line":87},[72,8496,8497],{},"def trace(function):\n",[72,8499,8500],{"class":74,"line":93},[72,8501,8502],{},"    @wraps(function)\n",[72,8504,8505],{"class":74,"line":99},[72,8506,8507],{},"    def wrapper(*args, **kwargs):\n",[72,8509,8510],{"class":74,"line":106},[72,8511,8512],{},"        print(\"开始：\", function.__name__)\n",[72,8514,8515],{"class":74,"line":112},[72,8516,8517],{},"        result = function(*args, **kwargs)\n",[72,8519,8520],{"class":74,"line":118},[72,8521,8522],{},"        print(\"结束：\", function.__name__)\n",[72,8524,8525],{"class":74,"line":124},[72,8526,8527],{},"        return result\n",[72,8529,8530],{"class":74,"line":130},[72,8531,8532],{},"    return wrapper\n",[72,8534,8535],{"class":74,"line":135},[72,8536,103],{"emptyLinePlaceholder":102},[72,8538,8539],{"class":74,"line":141},[72,8540,8541],{},"@trace\n",[72,8543,8544],{"class":74,"line":147},[72,8545,6221],{},[72,8547,8548],{"class":74,"line":7483},[72,8549,6226],{},[72,8551,8553],{"class":74,"line":8552},15,[72,8554,103],{"emptyLinePlaceholder":102},[72,8556,8558],{"class":74,"line":8557},16,[72,8559,8560],{},"print(add(2, 3))\n",[10,8562,153],{},[63,8564,8567],{"className":8565,"code":8566,"language":159,"meta":68},[157],"开始： add\n结束： add\n5\n",[43,8568,8566],{"__ignoreMap":68},[10,8570,164],{},[14,8572,167],{"id":167},[169,8574,8575,8592],{},[40,8576,8577,8578,8581,8582,8585,8586,8589,8590,408],{},"解释器执行定义时，把原 ",[43,8579,8580],{},"add"," 函数交给 ",[43,8583,8584],{},"trace","，返回的 ",[43,8587,8588],{},"wrapper"," 重新绑定到名字 ",[43,8591,8580],{},[40,8593,8594],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[195,8596,197],{"id":197},[10,8598,8599],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8601,8602],{},[26,8603],{"alt":8604,"src":8605},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8607,8608,8610,8611,408],{},[43,8609,8461],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[43,8612,8465],{},[14,8614,220],{"id":220},[37,8616,8617,8622],{},[40,8618,8619,8620,408],{},"包装函数忘记返回原函数结果，调用方得到 ",[43,8621,5421],{},[40,8623,8624],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8626,234],{"id":234},[169,8628,8629,8632],{},[40,8630,8631],{},"编写只记录调用次数的简单装饰器。",[40,8633,8634,8635,8638],{},"删除包装函数的 ",[43,8636,8637],{},"return result","，观察调用方得到什么。",[10,8640,249],{},[14,8642,252],{"id":252},[10,8644,8645],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,8647,259],{},{"title":68,"searchDepth":81,"depth":81,"links":8649},[8650,8651,8652,8653,8654,8657,8658,8659],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":8655},[8656],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8431,"description":8436},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[272,8667,5372],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8670,"title":8671,"body":8672,"category":272,"cover":273,"description":8676,"extension":274,"meta":8863,"navigation":102,"path":8864,"pinned":277,"publishedAt":278,"seo":8865,"slug":8866,"stem":8867,"summary":8868,"tags":8869,"updatedAt":278,"visible":102,"__hash__":8872},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8673,"toc":8851},[8674,8677,8679,8682,8684,8690,8693,8695,8706,8708,8710,8785,8787,8793,8795,8797,8808,8810,8813,8819,8822,8824,8832,8834,8842,8844,8846,8849],[10,8675,8676],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8678,16],{"id":16},[10,8680,8681],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8683,22],{"id":22},[10,8685,8686],{},[26,8687],{"alt":8688,"src":8689},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8691,8692],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8694,35],{"id":35},[37,8696,8697,8700,8703],{},[40,8698,8699],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[40,8701,8702],{},"日志记录运行状态，测试判断结果是否符合约定。",[40,8704,8705],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8707,58],{"id":58},[10,8709,61],{},[63,8711,8713],{"className":65,"code":8712,"language":67,"meta":68,"style":68},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[43,8714,8715,8720,8725,8729,8734,8738,8743,8748,8753,8757,8762,8767,8772,8776,8780],{"__ignoreMap":68},[72,8716,8717],{"class":74,"line":75},[72,8718,8719],{},"import logging\n",[72,8721,8722],{"class":74,"line":81},[72,8723,8724],{},"import unittest\n",[72,8726,8727],{"class":74,"line":87},[72,8728,103],{"emptyLinePlaceholder":102},[72,8730,8731],{"class":74,"line":93},[72,8732,8733],{},"logging.basicConfig(level=logging.INFO)\n",[72,8735,8736],{"class":74,"line":99},[72,8737,103],{"emptyLinePlaceholder":102},[72,8739,8740],{"class":74,"line":106},[72,8741,8742],{},"def clamp_progress(value):\n",[72,8744,8745],{"class":74,"line":112},[72,8746,8747],{},"    logging.info(\"检查进度：%s\", value)\n",[72,8749,8750],{"class":74,"line":118},[72,8751,8752],{},"    return max(0, min(100, value))\n",[72,8754,8755],{"class":74,"line":124},[72,8756,103],{"emptyLinePlaceholder":102},[72,8758,8759],{"class":74,"line":130},[72,8760,8761],{},"class ProgressTest(unittest.TestCase):\n",[72,8763,8764],{"class":74,"line":135},[72,8765,8766],{},"    def test_upper_limit(self):\n",[72,8768,8769],{"class":74,"line":141},[72,8770,8771],{},"        self.assertEqual(clamp_progress(120), 100)\n",[72,8773,8774],{"class":74,"line":147},[72,8775,103],{"emptyLinePlaceholder":102},[72,8777,8778],{"class":74,"line":7483},[72,8779,6235],{},[72,8781,8782],{"class":74,"line":8552},[72,8783,8784],{},"    unittest.main()\n",[10,8786,153],{},[63,8788,8791],{"className":8789,"code":8790,"language":159,"meta":68},[157],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[43,8792,8790],{"__ignoreMap":68},[10,8794,164],{},[14,8796,167],{"id":167},[169,8798,8799,8805],{},[40,8800,8801,8804],{},[43,8802,8803],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[40,8806,8807],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[195,8809,197],{"id":197},[10,8811,8812],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8814,8815],{},[26,8816],{"alt":8817,"src":8818},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8820,8821],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8823,220],{"id":220},[37,8825,8826,8829],{},[40,8827,8828],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[40,8830,8831],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8833,234],{"id":234},[169,8835,8836,8839],{},[40,8837,8838],{},"为负数进度增加测试。",[40,8840,8841],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8843,249],{},[14,8845,252],{"id":252},[10,8847,8848],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,8850,259],{},{"title":68,"searchDepth":81,"depth":81,"links":8852},[8853,8854,8855,8856,8857,8860,8861,8862],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":8858},[8859],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8671,"description":8676},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[272,8870,8871],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8874,"title":8875,"body":8876,"category":272,"cover":273,"description":8880,"extension":274,"meta":9180,"navigation":102,"path":9181,"pinned":277,"publishedAt":278,"seo":9182,"slug":9183,"stem":9184,"summary":9185,"tags":9186,"updatedAt":278,"visible":102,"__hash__":9189},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8877,"toc":9167},[8878,8881,8883,8886,8888,8894,8897,8899,8914,8916,8918,9065,9067,9073,9075,9077,9090,9092,9095,9101,9104,9106,9109,9115,9122,9124,9135,9137,9158,9160,9162,9165],[10,8879,8880],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8882,16],{"id":16},[10,8884,8885],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8887,22],{"id":22},[10,8889,8890],{},[26,8891],{"alt":8892,"src":8893},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8895,8896],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8898,35],{"id":35},[37,8900,8901,8904,8907],{},[40,8902,8903],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[40,8905,8906],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[40,8908,8909,8910,8913],{},"实际扩展前先为 ",[43,8911,8912],{},"add()"," 和存储边界补充测试。",[14,8915,58],{"id":58},[10,8917,61],{},[63,8919,8921],{"className":65,"code":8920,"language":67,"meta":68,"style":68},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[43,8922,8923,8927,8931,8935,8940,8945,8950,8955,8959,8964,8969,8974,8979,8984,8988,8993,8998,9004,9009,9015,9020,9025,9031,9037,9043,9048,9054,9059],{"__ignoreMap":68},[72,8924,8925],{"class":74,"line":75},[72,8926,7033],{},[72,8928,8929],{"class":74,"line":81},[72,8930,6642],{},[72,8932,8933],{"class":74,"line":87},[72,8934,103],{"emptyLinePlaceholder":102},[72,8936,8937],{"class":74,"line":93},[72,8938,8939],{},"class LearningRecords:\n",[72,8941,8942],{"class":74,"line":99},[72,8943,8944],{},"    def __init__(self, file_path):\n",[72,8946,8947],{"class":74,"line":106},[72,8948,8949],{},"        self.file_path = Path(file_path)\n",[72,8951,8952],{"class":74,"line":112},[72,8953,8954],{},"        self.items = []\n",[72,8956,8957],{"class":74,"line":118},[72,8958,103],{"emptyLinePlaceholder":102},[72,8960,8961],{"class":74,"line":124},[72,8962,8963],{},"    def add(self, title):\n",[72,8965,8966],{"class":74,"line":130},[72,8967,8968],{},"        title = title.strip()\n",[72,8970,8971],{"class":74,"line":135},[72,8972,8973],{},"        if not title:\n",[72,8975,8976],{"class":74,"line":141},[72,8977,8978],{},"            raise ValueError(\"课程名称不能为空\")\n",[72,8980,8981],{"class":74,"line":147},[72,8982,8983],{},"        self.items.append({\"title\": title, \"done\": False})\n",[72,8985,8986],{"class":74,"line":7483},[72,8987,103],{"emptyLinePlaceholder":102},[72,8989,8990],{"class":74,"line":8552},[72,8991,8992],{},"    def save(self):\n",[72,8994,8995],{"class":74,"line":8557},[72,8996,8997],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,8999,9001],{"class":74,"line":9000},17,[72,9002,9003],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[72,9005,9007],{"class":74,"line":9006},18,[72,9008,103],{"emptyLinePlaceholder":102},[72,9010,9012],{"class":74,"line":9011},19,[72,9013,9014],{},"records = LearningRecords(\"learning-records.json\")\n",[72,9016,9018],{"class":74,"line":9017},20,[72,9019,103],{"emptyLinePlaceholder":102},[72,9021,9023],{"class":74,"line":9022},21,[72,9024,7451],{},[72,9026,9028],{"class":74,"line":9027},22,[72,9029,9030],{},"    title = input(\"输入已学习课程：\")\n",[72,9032,9034],{"class":74,"line":9033},23,[72,9035,9036],{},"    records.add(title)\n",[72,9038,9040],{"class":74,"line":9039},24,[72,9041,9042],{},"    records.save()\n",[72,9044,9046],{"class":74,"line":9045},25,[72,9047,7461],{},[72,9049,9051],{"class":74,"line":9050},26,[72,9052,9053],{},"    print(\"无法保存：\", error)\n",[72,9055,9057],{"class":74,"line":9056},27,[72,9058,1192],{},[72,9060,9062],{"class":74,"line":9061},28,[72,9063,9064],{},"    print(\"已保存 1 条学习记录\")\n",[10,9066,153],{},[63,9068,9071],{"className":9069,"code":9070,"language":159,"meta":68},[157],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[43,9072,9070],{"__ignoreMap":68},[10,9074,164],{},[14,9076,167],{"id":167},[169,9078,9079,9085],{},[40,9080,9081,9082,9084],{},"输入层取得课程名后，",[43,9083,8912],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[40,9086,9087,9089],{},[43,9088,8144],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[195,9091,197],{"id":197},[10,9093,9094],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9096,9097],{},[26,9098],{"alt":9099,"src":9100},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9102,9103],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[195,9105,197],{"id":4262},[10,9107,9108],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9110,9111],{},[26,9112],{"alt":9113,"src":9114},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9116,9117,9118,9121],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[43,9119,9120],{},"load()"," 把文件状态恢复到内存。",[14,9123,220],{"id":220},[37,9125,9126,9129],{},[40,9127,9128],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[40,9130,9131,9132,9134],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[43,9133,9120],{}," 是下一项必要扩展。",[14,9136,234],{"id":234},[169,9138,9139,9145,9148],{},[40,9140,9141,9142,9144],{},"增加 ",[43,9143,9120],{},"，文件不存在时从空列表开始。",[40,9146,9147],{},"增加按序号标记完成的功能，并校验序号范围。",[40,9149,9150,9151,9154,9155,9157],{},"把输入循环放进 ",[43,9152,9153],{},"main()","，通过 ",[43,9156,6177],{}," 控制程序入口。",[10,9159,249],{},[14,9161,252],{"id":252},[10,9163,9164],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[257,9166,259],{},{"title":68,"searchDepth":81,"depth":81,"links":9168},[9169,9170,9171,9172,9173,9177,9178,9179],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":9174},[9175,9176],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8875,"description":8880},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[272,9187,9188],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9191,9294,9413,9544,9687,9812,9949,10086,10227,10396,10533,10666,10789,10918,11045,11208,11384,11525,11654,11803,11946,12067,12190,12339,12492,12657,12784,12965,13108,13265,13416,13563,13718,13936,14091,14266,14417,14584,14771,14934,15176,15416],{"id":1438,"title":1439,"body":9192,"category":272,"cover":273,"description":1444,"extension":274,"meta":9291,"navigation":102,"path":1563,"pinned":277,"publishedAt":278,"seo":9292,"slug":1565,"stem":1566,"summary":1567,"tags":9293,"updatedAt":278,"visible":102,"__hash__":1570},{"type":7,"value":9193,"toc":9281},[9194,9196,9198,9200,9202,9206,9210,9212,9222,9224,9226,9234,9236,9241,9243,9245,9255,9257,9265,9267,9273,9275,9277,9279],[10,9195,1444],{},[14,9197,16],{"id":16},[10,9199,1449],{},[14,9201,22],{"id":22},[10,9203,9204],{},[26,9205],{"alt":1456,"src":1457},[10,9207,9208,1462],{},[43,9209,1216],{},[14,9211,35],{"id":35},[37,9213,9214,9218,9220],{},[40,9215,1469,9216,1472],{},[43,9217,1216],{},[40,9219,1475],{},[40,9221,1478],{},[14,9223,58],{"id":58},[10,9225,61],{},[63,9227,9228],{"className":65,"code":1485,"language":67,"meta":68,"style":68},[43,9229,9230],{"__ignoreMap":68},[72,9231,9232],{"class":74,"line":75},[72,9233,1485],{},[10,9235,153],{},[63,9237,9239],{"className":9238,"code":1497,"language":159,"meta":68},[157],[43,9240,1497],{"__ignoreMap":68},[10,9242,164],{},[14,9244,167],{"id":167},[169,9246,9247,9251],{},[40,9248,1508,9249,1512],{},[43,9250,1511],{},[40,9252,1515,9253,1519],{},[43,9254,1518],{},[14,9256,220],{"id":220},[37,9258,9259,9261],{},[40,9260,1526],{},[40,9262,1529,9263,1532],{},[43,9264,1216],{},[14,9266,234],{"id":234},[169,9268,9269,9271],{},[40,9270,1539],{},[40,9272,1542],{},[10,9274,249],{},[14,9276,252],{"id":252},[10,9278,1549],{},[257,9280,259],{},{"title":68,"searchDepth":81,"depth":81,"links":9282},[9283,9284,9285,9286,9287,9288,9289,9290],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":1439,"description":1444},[272,1434,1569],{"id":1572,"title":1573,"body":9295,"category":272,"cover":273,"description":1578,"extension":274,"meta":9410,"navigation":102,"path":1715,"pinned":277,"publishedAt":278,"seo":9411,"slug":1717,"stem":1718,"summary":1719,"tags":9412,"updatedAt":278,"visible":102,"__hash__":1722},{"type":7,"value":9296,"toc":9400},[9297,9299,9301,9303,9305,9309,9313,9315,9325,9327,9329,9349,9351,9356,9358,9360,9370,9372,9382,9384,9392,9394,9396,9398],[10,9298,1578],{},[14,9300,16],{"id":16},[10,9302,1583],{},[14,9304,22],{"id":22},[10,9306,9307],{},[26,9308],{"alt":1590,"src":1591},[10,9310,1594,9311,1597],{},[43,9312,737],{},[14,9314,35],{"id":35},[37,9316,9317,9319,9321],{},[40,9318,1604],{},[40,9320,1607],{},[40,9322,1610,9323,1614],{},[43,9324,1613],{},[14,9326,58],{"id":58},[10,9328,1619],{},[63,9330,9331],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,9332,9333,9339],{"__ignoreMap":68},[72,9334,9335,9337],{"class":74,"line":75},[72,9336,737],{"class":646},[72,9338,650],{"class":649},[72,9340,9341,9343,9345,9347],{"class":74,"line":81},[72,9342,737],{"class":646},[72,9344,679],{"class":649},[72,9346,683],{"class":682},[72,9348,650],{"class":649},[10,9350,153],{},[63,9352,9354],{"className":9353,"code":1645,"language":159,"meta":68},[157],[43,9355,1645],{"__ignoreMap":68},[10,9357,164],{},[14,9359,167],{"id":167},[169,9361,9362,9366],{},[40,9363,9364,1659],{},[43,9365,1658],{},[40,9367,9368,1664],{},[43,9369,745],{},[14,9371,220],{"id":220},[37,9373,9374,9378],{},[40,9375,1671,9376,1674],{},[43,9377,737],{},[40,9379,1677,9380,1680],{},[43,9381,737],{},[14,9383,234],{"id":234},[169,9385,9386,9390],{},[40,9387,984,9388,1690],{},[43,9389,1689],{},[40,9391,1693],{},[10,9393,249],{},[14,9395,252],{"id":252},[10,9397,1700],{},[257,9399,1703],{},{"title":68,"searchDepth":81,"depth":81,"links":9401},[9402,9403,9404,9405,9406,9407,9408,9409],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":1573,"description":1578},[272,1721,1098],{"id":1724,"title":1725,"body":9414,"category":272,"cover":273,"description":1891,"extension":274,"meta":9541,"navigation":102,"path":1893,"pinned":277,"publishedAt":278,"seo":9542,"slug":1895,"stem":1896,"summary":1897,"tags":9543,"updatedAt":278,"visible":102,"__hash__":1901},{"type":7,"value":9415,"toc":9531},[9416,9420,9422,9424,9426,9430,9432,9434,9450,9452,9454,9474,9476,9481,9483,9485,9497,9499,9509,9511,9521,9523,9525,9529],[10,9417,1730,9418,1733],{},[43,9419,1216],{},[14,9421,16],{"id":16},[10,9423,1738],{},[14,9425,22],{"id":22},[10,9427,9428],{},[26,9429],{"alt":1745,"src":1746},[10,9431,1749],{},[14,9433,35],{"id":35},[37,9435,9436,9442,9446],{},[40,9437,1756,9438,1759,9440,408],{},[43,9439,737],{},[43,9441,1762],{},[40,9443,1765,9444,1769],{},[43,9445,1768],{},[40,9447,1772,9448,1775],{},[43,9449,1216],{},[14,9451,58],{"id":58},[10,9453,61],{},[63,9455,9456],{"className":1782,"code":1783,"language":1784,"meta":68,"style":68},[43,9457,9458,9462,9466,9470],{"__ignoreMap":68},[72,9459,9460],{"class":74,"line":75},[72,9461,1791],{},[72,9463,9464],{"class":74,"line":81},[72,9465,1796],{},[72,9467,9468],{"class":74,"line":87},[72,9469,1801],{},[72,9471,9472],{"class":74,"line":93},[72,9473,1806],{},[10,9475,153],{},[63,9477,9479],{"className":9478,"code":1812,"language":159,"meta":68},[157],[43,9480,1812],{"__ignoreMap":68},[10,9482,164],{},[14,9484,167],{"id":167},[169,9486,9487,9493],{},[40,9488,1823,9489,1827,9491,408],{},[43,9490,1826],{},[43,9492,1830],{},[40,9494,1833,9495,1836],{},[43,9496,1518],{},[14,9498,220],{"id":220},[37,9500,9501,9507],{},[40,9502,1843,9503,1846,9505,1849],{},[43,9504,1762],{},[43,9506,1216],{},[40,9508,1852],{},[14,9510,234],{"id":234},[169,9512,9513,9517],{},[40,9514,1859,9515,408],{},[43,9516,1862],{},[40,9518,1865,9519,1868],{},[43,9520,1518],{},[10,9522,249],{},[14,9524,252],{"id":252},[10,9526,1875,9527,1878],{},[43,9528,1216],{},[257,9530,259],{},{"title":68,"searchDepth":81,"depth":81,"links":9532},[9533,9534,9535,9536,9537,9538,9539,9540],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":1725,"description":1891},[272,1899,1900],{"id":1903,"title":1904,"body":9545,"category":272,"cover":273,"description":1909,"extension":274,"meta":9684,"navigation":102,"path":2081,"pinned":277,"publishedAt":278,"seo":9685,"slug":2083,"stem":2084,"summary":2085,"tags":9686,"updatedAt":278,"visible":102,"__hash__":2089},{"type":7,"value":9546,"toc":9674},[9547,9549,9551,9553,9555,9559,9563,9565,9577,9579,9581,9617,9619,9624,9626,9628,9644,9646,9656,9658,9666,9668,9670,9672],[10,9548,1909],{},[14,9550,16],{"id":16},[10,9552,1914],{},[14,9554,22],{"id":22},[10,9556,9557],{},[26,9558],{"alt":1921,"src":1922},[10,9560,9561,1928],{},[43,9562,1927],{},[14,9564,35],{"id":35},[37,9566,9567,9569,9575],{},[40,9568,1935],{},[40,9570,9571,1941,9573,1945],{},[43,9572,1940],{},[43,9574,1944],{},[40,9576,1948],{},[14,9578,58],{"id":58},[10,9580,1619],{},[63,9582,9583],{"className":637,"code":1955,"language":639,"meta":68,"style":68},[43,9584,9585,9591,9597,9601,9611],{"__ignoreMap":68},[72,9586,9587,9589],{"class":74,"line":75},[72,9588,1962],{"class":646},[72,9590,1965],{"class":682},[72,9592,9593,9595],{"class":74,"line":81},[72,9594,1970],{"class":649},[72,9596,1965],{"class":682},[72,9598,9599],{"class":74,"line":87},[72,9600,1977],{"class":649},[72,9602,9603,9605,9607,9609],{"class":74,"line":93},[72,9604,1982],{"class":649},[72,9606,1985],{"class":682},[72,9608,1989],{"class":1988},[72,9610,1260],{"class":682},[72,9612,9613,9615],{"class":74,"line":99},[72,9614,737],{"class":646},[72,9616,1260],{"class":682},[10,9618,153],{},[63,9620,9622],{"className":9621,"code":2003,"language":159,"meta":68},[157],[43,9623,2003],{"__ignoreMap":68},[10,9625,164],{},[14,9627,167],{"id":167},[169,9629,9630,9638],{},[40,9631,9632,2016,9634,2019,9636,2022],{},[43,9633,1962],{},[43,9635,1970],{},[43,9637,1940],{},[40,9639,9640,2027,9642,2031],{},[43,9641,1927],{},[43,9643,2030],{},[14,9645,220],{"id":220},[37,9647,9648,9654],{},[40,9649,2038,9650,213,9652,408],{},[43,9651,1940],{},[43,9653,1944],{},[40,9655,2045],{},[14,9657,234],{"id":234},[169,9659,9660,9664],{},[40,9661,2052,9662,2056],{},[43,9663,2055],{},[40,9665,2059],{},[10,9667,249],{},[14,9669,252],{"id":252},[10,9671,2066],{},[257,9673,2069],{},{"title":68,"searchDepth":81,"depth":81,"links":9675},[9676,9677,9678,9679,9680,9681,9682,9683],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":1904,"description":1909},[272,2087,2088],{"id":2091,"title":2092,"body":9688,"category":272,"cover":273,"description":2097,"extension":274,"meta":9809,"navigation":102,"path":2246,"pinned":277,"publishedAt":278,"seo":9810,"slug":2248,"stem":2249,"summary":2250,"tags":9811,"updatedAt":278,"visible":102,"__hash__":2254},{"type":7,"value":9689,"toc":9799},[9690,9692,9694,9696,9698,9702,9710,9712,9726,9728,9730,9746,9748,9753,9755,9757,9771,9773,9779,9781,9791,9793,9795,9797],[10,9691,2097],{},[14,9693,16],{"id":16},[10,9695,2102],{},[14,9697,22],{"id":22},[10,9699,9700],{},[26,9701],{"alt":2109,"src":2110},[10,9703,2113,9704,408,9706,2119,9708,408],{},[43,9705,1518],{},[43,9707,2118],{},[43,9709,1826],{},[14,9711,35],{"id":35},[37,9713,9714,9718,9724],{},[40,9715,9716,2131],{},[43,9717,2130],{},[40,9719,9720,2137,9722,408],{},[43,9721,2136],{},[43,9723,2140],{},[40,9725,2143],{},[14,9727,58],{"id":58},[10,9729,61],{},[63,9731,9732],{"className":65,"code":2150,"language":67,"meta":68,"style":68},[43,9733,9734,9738,9742],{"__ignoreMap":68},[72,9735,9736],{"class":74,"line":75},[72,9737,2157],{},[72,9739,9740],{"class":74,"line":81},[72,9741,2162],{},[72,9743,9744],{"class":74,"line":87},[72,9745,2167],{},[10,9747,153],{},[63,9749,9751],{"className":9750,"code":2173,"language":159,"meta":68},[157],[43,9752,2173],{"__ignoreMap":68},[10,9754,164],{},[14,9756,167],{"id":167},[169,9758,9759,9765],{},[40,9760,9761,2187,9763,408],{},[43,9762,2186],{},[43,9764,2140],{},[40,9766,9767,2194,9769,2198],{},[43,9768,1518],{},[43,9770,2197],{},[14,9772,220],{"id":220},[37,9774,9775,9777],{},[40,9776,2205],{},[40,9778,2208],{},[14,9780,234],{"id":234},[169,9782,9783,9785],{},[40,9784,2215],{},[40,9786,2218,9787,2221,9789,2225],{},[43,9788,2118],{},[43,9790,2224],{},[10,9792,249],{},[14,9794,252],{"id":252},[10,9796,2232],{},[257,9798,259],{},{"title":68,"searchDepth":81,"depth":81,"links":9800},[9801,9802,9803,9804,9805,9806,9807,9808],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":2092,"description":2097},[272,2252,2253],{"id":2256,"title":2257,"body":9813,"category":272,"cover":273,"description":2262,"extension":274,"meta":9946,"navigation":102,"path":2430,"pinned":277,"publishedAt":278,"seo":9947,"slug":2432,"stem":2433,"summary":2434,"tags":9948,"updatedAt":278,"visible":102,"__hash__":2438},{"type":7,"value":9814,"toc":9936},[9815,9817,9819,9821,9823,9827,9829,9831,9847,9849,9851,9875,9877,9882,9884,9886,9902,9904,9916,9918,9928,9930,9932,9934],[10,9816,2262],{},[14,9818,16],{"id":16},[10,9820,2267],{},[14,9822,22],{"id":22},[10,9824,9825],{},[26,9826],{"alt":2274,"src":2275},[10,9828,2278],{},[14,9830,35],{"id":35},[37,9832,9833,9835,9841],{},[40,9834,2285],{},[40,9836,2288,9837,2221,9839,2295],{},[43,9838,2291],{},[43,9840,2294],{},[40,9842,2298,9843,2302,9845,2306],{},[43,9844,2301],{},[43,9846,2305],{},[14,9848,58],{"id":58},[10,9850,61],{},[63,9852,9853],{"className":65,"code":2313,"language":67,"meta":68,"style":68},[43,9854,9855,9859,9863,9867,9871],{"__ignoreMap":68},[72,9856,9857],{"class":74,"line":75},[72,9858,2320],{},[72,9860,9861],{"class":74,"line":81},[72,9862,2325],{},[72,9864,9865],{"class":74,"line":87},[72,9866,103],{"emptyLinePlaceholder":102},[72,9868,9869],{"class":74,"line":93},[72,9870,2334],{},[72,9872,9873],{"class":74,"line":99},[72,9874,2325],{},[10,9876,153],{},[63,9878,9880],{"className":9879,"code":2344,"language":159,"meta":68},[157],[43,9881,2344],{"__ignoreMap":68},[10,9883,164],{},[14,9885,167],{"id":167},[169,9887,9888,9894],{},[40,9889,984,9890,2358,9892,2361],{},[43,9891,2357],{},[43,9893,2291],{},[40,9895,984,9896,2367,9898,2371,9900,408],{},[43,9897,2366],{},[43,9899,2370],{},[43,9901,2374],{},[14,9903,220],{"id":220},[37,9905,9906,9908],{},[40,9907,2381],{},[40,9909,2384,9910,2302,9912,2302,9914,2392],{},[43,9911,2301],{},[43,9913,2305],{},[43,9915,2391],{},[14,9917,234],{"id":234},[169,9919,9920,9926],{},[40,9921,2399,9922,213,9924,2406],{},[43,9923,2402],{},[43,9925,2405],{},[40,9927,2409],{},[10,9929,249],{},[14,9931,252],{"id":252},[10,9933,2416],{},[257,9935,259],{},{"title":68,"searchDepth":81,"depth":81,"links":9937},[9938,9939,9940,9941,9942,9943,9944,9945],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":2257,"description":2262},[272,2436,2437],{"id":2440,"title":2441,"body":9950,"category":272,"cover":273,"description":2446,"extension":274,"meta":10083,"navigation":102,"path":2611,"pinned":277,"publishedAt":278,"seo":10084,"slug":2613,"stem":2614,"summary":2615,"tags":10085,"updatedAt":278,"visible":102,"__hash__":2619},{"type":7,"value":9951,"toc":10073},[9952,9954,9956,9958,9960,9964,9966,9968,9986,9988,9990,10026,10028,10033,10035,10037,10047,10049,10057,10059,10065,10067,10069,10071],[10,9953,2446],{},[14,9955,16],{"id":16},[10,9957,2451],{},[14,9959,22],{"id":22},[10,9961,9962],{},[26,9963],{"alt":2458,"src":2459},[10,9965,2462],{},[14,9967,35],{"id":35},[37,9969,9970,9976,9984],{},[40,9971,9972,2472,9974,2476],{},[43,9973,2471],{},[43,9975,2475],{},[40,9977,9978,2482,9980,2486,9982,2490],{},[43,9979,2481],{},[43,9981,2485],{},[43,9983,2489],{},[40,9985,2493],{},[14,9987,58],{"id":58},[10,9989,61],{},[63,9991,9992],{"className":65,"code":2500,"language":67,"meta":68,"style":68},[43,9993,9994,9998,10002,10006,10010,10014,10018,10022],{"__ignoreMap":68},[72,9995,9996],{"class":74,"line":75},[72,9997,2507],{},[72,9999,10000],{"class":74,"line":81},[72,10001,2512],{},[72,10003,10004],{"class":74,"line":87},[72,10005,2517],{},[72,10007,10008],{"class":74,"line":93},[72,10009,103],{"emptyLinePlaceholder":102},[72,10011,10012],{"class":74,"line":99},[72,10013,2526],{},[72,10015,10016],{"class":74,"line":106},[72,10017,2531],{},[72,10019,10020],{"class":74,"line":112},[72,10021,2536],{},[72,10023,10024],{"class":74,"line":118},[72,10025,2541],{},[10,10027,153],{},[63,10029,10031],{"className":10030,"code":2547,"language":159,"meta":68},[157],[43,10032,2547],{"__ignoreMap":68},[10,10034,164],{},[14,10036,167],{"id":167},[169,10038,10039,10043],{},[40,10040,10041,2561],{},[43,10042,2560],{},[40,10044,10045,2567],{},[43,10046,2566],{},[14,10048,220],{"id":220},[37,10050,10051,10055],{},[40,10052,2574,10053,408],{},[43,10054,2577],{},[40,10056,2580],{},[14,10058,234],{"id":234},[169,10060,10061,10063],{},[40,10062,2587],{},[40,10064,2590],{},[10,10066,249],{},[14,10068,252],{"id":252},[10,10070,2597],{},[257,10072,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10074},[10075,10076,10077,10078,10079,10080,10081,10082],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":2441,"description":2446},[272,2617,2618],{"id":2621,"title":2622,"body":10087,"category":272,"cover":273,"description":2627,"extension":274,"meta":10224,"navigation":102,"path":2803,"pinned":277,"publishedAt":278,"seo":10225,"slug":2805,"stem":2806,"summary":2807,"tags":10226,"updatedAt":278,"visible":102,"__hash__":2811},{"type":7,"value":10088,"toc":10212},[10089,10091,10093,10095,10097,10101,10107,10109,10117,10119,10121,10145,10147,10152,10154,10156,10174,10176,10178,10182,10184,10186,10192,10194,10204,10206,10208,10210],[10,10090,2627],{},[14,10092,16],{"id":16},[10,10094,2632],{},[14,10096,22],{"id":22},[10,10098,10099],{},[26,10100],{"alt":2639,"src":2640},[10,10102,2643,10103,2647,10105,408],{},[43,10104,2646],{},[43,10106,2650],{},[14,10108,35],{"id":35},[37,10110,10111,10113,10115],{},[40,10112,2657],{},[40,10114,2660],{},[40,10116,2663],{},[14,10118,58],{"id":58},[10,10120,61],{},[63,10122,10123],{"className":65,"code":2670,"language":67,"meta":68,"style":68},[43,10124,10125,10129,10133,10137,10141],{"__ignoreMap":68},[72,10126,10127],{"class":74,"line":75},[72,10128,2677],{},[72,10130,10131],{"class":74,"line":81},[72,10132,2682],{},[72,10134,10135],{"class":74,"line":87},[72,10136,2687],{},[72,10138,10139],{"class":74,"line":93},[72,10140,2692],{},[72,10142,10143],{"class":74,"line":99},[72,10144,2697],{},[10,10146,153],{},[63,10148,10150],{"className":10149,"code":2703,"language":159,"meta":68},[157],[43,10151,2703],{"__ignoreMap":68},[10,10153,164],{},[14,10155,167],{"id":167},[169,10157,10158,10166],{},[40,10159,2714,10160,2717,10162,2721,10164,2725],{},[43,10161,272],{},[43,10163,2720],{},[43,10165,2724],{},[40,10167,10168,2731,10170,2735,10172,2739],{},[43,10169,2730],{},[43,10171,2734],{},[43,10173,2738],{},[195,10175,197],{"id":197},[10,10177,2744],{},[10,10179,10180],{},[26,10181],{"alt":2749,"src":2750},[10,10183,2753],{},[14,10185,220],{"id":220},[37,10187,10188,10190],{},[40,10189,2760],{},[40,10191,2763],{},[14,10193,234],{"id":234},[169,10195,10196,10202],{},[40,10197,2770,10198,2774,10200,408],{},[43,10199,2773],{},[43,10201,2777],{},[40,10203,2780],{},[10,10205,249],{},[14,10207,252],{"id":252},[10,10209,2787],{},[257,10211,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10213},[10214,10215,10216,10217,10218,10221,10222,10223],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":10219},[10220],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":2622,"description":2627},[272,2809,2810],{"id":2813,"title":2814,"body":10228,"category":272,"cover":273,"description":2819,"extension":274,"meta":10393,"navigation":102,"path":3034,"pinned":277,"publishedAt":278,"seo":10394,"slug":3036,"stem":3037,"summary":3038,"tags":10395,"updatedAt":278,"visible":102,"__hash__":3042},{"type":7,"value":10229,"toc":10381},[10230,10232,10234,10236,10238,10242,10248,10250,10270,10272,10274,10310,10312,10317,10319,10321,10335,10337,10339,10343,10349,10351,10361,10363,10373,10375,10377,10379],[10,10231,2819],{},[14,10233,16],{"id":16},[10,10235,2824],{},[14,10237,22],{"id":22},[10,10239,10240],{},[26,10241],{"alt":2831,"src":2832},[10,10243,2835,10244,1055,10246,2842],{},[43,10245,2838],{},[43,10247,2841],{},[14,10249,35],{"id":35},[37,10251,10252,10260,10268],{},[40,10253,10254,2852,10256,2856,10258,2860],{},[43,10255,2851],{},[43,10257,2855],{},[43,10259,2859],{},[40,10261,10262,2866,10264,2870,10266,2874],{},[43,10263,2865],{},[43,10265,2869],{},[43,10267,2873],{},[40,10269,2877],{},[14,10271,58],{"id":58},[10,10273,61],{},[63,10275,10276],{"className":65,"code":2884,"language":67,"meta":68,"style":68},[43,10277,10278,10282,10286,10290,10294,10298,10302,10306],{"__ignoreMap":68},[72,10279,10280],{"class":74,"line":75},[72,10281,2891],{},[72,10283,10284],{"class":74,"line":81},[72,10285,2896],{},[72,10287,10288],{"class":74,"line":87},[72,10289,103],{"emptyLinePlaceholder":102},[72,10291,10292],{"class":74,"line":93},[72,10293,2905],{},[72,10295,10296],{"class":74,"line":99},[72,10297,2910],{},[72,10299,10300],{"class":74,"line":106},[72,10301,2915],{},[72,10303,10304],{"class":74,"line":112},[72,10305,2920],{},[72,10307,10308],{"class":74,"line":118},[72,10309,2925],{},[10,10311,153],{},[63,10313,10315],{"className":10314,"code":2931,"language":159,"meta":68},[157],[43,10316,2931],{"__ignoreMap":68},[10,10318,164],{},[14,10320,167],{"id":167},[169,10322,10323,10329],{},[40,10324,10325,2945,10327,2949],{},[43,10326,2944],{},[43,10328,2948],{},[40,10330,10331,2955,10333,2958],{},[43,10332,2954],{},[43,10334,2873],{},[195,10336,197],{"id":197},[10,10338,2963],{},[10,10340,10341],{},[26,10342],{"alt":2968,"src":2969},[10,10344,10345,2974,10347,2977],{},[43,10346,2865],{},[43,10348,2869],{},[14,10350,220],{"id":220},[37,10352,10353,10359],{},[40,10354,2984,10355,2987,10357,2990],{},[43,10356,2859],{},[43,10358,2851],{},[40,10360,2993],{},[14,10362,234],{"id":234},[169,10364,10365,10369],{},[40,10366,3000,10367,3004],{},[43,10368,3003],{},[40,10370,3007,10371,3011],{},[43,10372,3010],{},[10,10374,249],{},[14,10376,252],{"id":252},[10,10378,3018],{},[257,10380,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10382},[10383,10384,10385,10386,10387,10390,10391,10392],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":10388},[10389],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":2814,"description":2819},[272,3040,3041],{"id":3044,"title":3045,"body":10397,"category":272,"cover":273,"description":3050,"extension":274,"meta":10530,"navigation":102,"path":3219,"pinned":277,"publishedAt":278,"seo":10531,"slug":3221,"stem":3222,"summary":3223,"tags":10532,"updatedAt":278,"visible":102,"__hash__":3226},{"type":7,"value":10398,"toc":10520},[10399,10401,10403,10405,10407,10411,10421,10423,10433,10435,10437,10465,10467,10472,10474,10476,10490,10492,10500,10502,10512,10514,10516,10518],[10,10400,3050],{},[14,10402,16],{"id":16},[10,10404,3055],{},[14,10406,22],{"id":22},[10,10408,10409],{},[26,10410],{"alt":3062,"src":3063},[10,10412,10413,3069,10415,3073,10417,3077,10419,3081],{},[43,10414,3068],{},[43,10416,3072],{},[43,10418,3076],{},[43,10420,3080],{},[14,10422,35],{"id":35},[37,10424,10425,10427,10431],{},[40,10426,3088],{},[40,10428,10429,3093],{},[43,10430,3080],{},[40,10432,3096],{},[14,10434,58],{"id":58},[10,10436,61],{},[63,10438,10439],{"className":65,"code":3103,"language":67,"meta":68,"style":68},[43,10440,10441,10445,10449,10453,10457,10461],{"__ignoreMap":68},[72,10442,10443],{"class":74,"line":75},[72,10444,3110],{},[72,10446,10447],{"class":74,"line":81},[72,10448,3115],{},[72,10450,10451],{"class":74,"line":87},[72,10452,3120],{},[72,10454,10455],{"class":74,"line":93},[72,10456,103],{"emptyLinePlaceholder":102},[72,10458,10459],{"class":74,"line":99},[72,10460,3129],{},[72,10462,10463],{"class":74,"line":106},[72,10464,3134],{},[10,10466,153],{},[63,10468,10470],{"className":10469,"code":3140,"language":159,"meta":68},[157],[43,10471,3140],{"__ignoreMap":68},[10,10473,164],{},[14,10475,167],{"id":167},[169,10477,10478,10484],{},[40,10479,3151,10480,3154,10482,3158],{},[43,10481,3068],{},[43,10483,3157],{},[40,10485,10486,3164,10488,3168],{},[43,10487,3163],{},[43,10489,3167],{},[14,10491,220],{"id":220},[37,10493,10494,10498],{},[40,10495,3175,10496,3179],{},[43,10497,3178],{},[40,10499,3182],{},[14,10501,234],{"id":234},[169,10503,10504,10506],{},[40,10505,3189],{},[40,10507,1765,10508,3195,10510,3198],{},[43,10509,3194],{},[43,10511,3080],{},[10,10513,249],{},[14,10515,252],{"id":252},[10,10517,3205],{},[257,10519,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10521},[10522,10523,10524,10525,10526,10527,10528,10529],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3045,"description":3050},[272,2391,3225],{"id":3228,"title":3229,"body":10534,"category":272,"cover":273,"description":3234,"extension":274,"meta":10663,"navigation":102,"path":3395,"pinned":277,"publishedAt":278,"seo":10664,"slug":3397,"stem":3398,"summary":3399,"tags":10665,"updatedAt":278,"visible":102,"__hash__":3403},{"type":7,"value":10535,"toc":10653},[10536,10538,10540,10542,10544,10548,10552,10554,10564,10566,10568,10600,10602,10607,10609,10611,10623,10625,10635,10637,10645,10647,10649,10651],[10,10537,3234],{},[14,10539,16],{"id":16},[10,10541,3239],{},[14,10543,22],{"id":22},[10,10545,10546],{},[26,10547],{"alt":3246,"src":3247},[10,10549,3250,10550,3254],{},[43,10551,3253],{},[14,10553,35],{"id":35},[37,10555,10556,10558,10560],{},[40,10557,3261],{},[40,10559,3264],{},[40,10561,3267,10562,408],{},[43,10563,3270],{},[14,10565,58],{"id":58},[10,10567,61],{},[63,10569,10570],{"className":65,"code":3277,"language":67,"meta":68,"style":68},[43,10571,10572,10576,10580,10584,10588,10592,10596],{"__ignoreMap":68},[72,10573,10574],{"class":74,"line":75},[72,10575,3284],{},[72,10577,10578],{"class":74,"line":81},[72,10579,3289],{},[72,10581,10582],{"class":74,"line":87},[72,10583,103],{"emptyLinePlaceholder":102},[72,10585,10586],{"class":74,"line":93},[72,10587,3298],{},[72,10589,10590],{"class":74,"line":99},[72,10591,3303],{},[72,10593,10594],{"class":74,"line":106},[72,10595,3308],{},[72,10597,10598],{"class":74,"line":112},[72,10599,3313],{},[10,10601,153],{},[63,10603,10605],{"className":10604,"code":3319,"language":159,"meta":68},[157],[43,10606,3319],{"__ignoreMap":68},[10,10608,164],{},[14,10610,167],{"id":167},[169,10612,10613,10615],{},[40,10614,3330],{},[40,10616,10617,3336,10619,3340,10621,3344],{},[43,10618,3335],{},[43,10620,3339],{},[43,10622,3343],{},[14,10624,220],{"id":220},[37,10626,10627,10633],{},[40,10628,3351,10629,3355,10631,408],{},[43,10630,3354],{},[43,10632,3358],{},[40,10634,3361],{},[14,10636,234],{"id":234},[169,10638,10639,10641],{},[40,10640,3368],{},[40,10642,3371,10643,3374],{},[43,10644,3343],{},[10,10646,249],{},[14,10648,252],{"id":252},[10,10650,3381],{},[257,10652,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10654},[10655,10656,10657,10658,10659,10660,10661,10662],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3229,"description":3234},[272,3401,3402],{"id":3405,"title":3406,"body":10667,"category":272,"cover":273,"description":3411,"extension":274,"meta":10786,"navigation":102,"path":3553,"pinned":277,"publishedAt":278,"seo":10787,"slug":3555,"stem":3556,"summary":3557,"tags":10788,"updatedAt":278,"visible":102,"__hash__":3560},{"type":7,"value":10668,"toc":10776},[10669,10671,10673,10675,10677,10681,10683,10685,10693,10695,10697,10725,10727,10732,10734,10736,10746,10748,10756,10758,10768,10770,10772,10774],[10,10670,3411],{},[14,10672,16],{"id":16},[10,10674,3416],{},[14,10676,22],{"id":22},[10,10678,10679],{},[26,10680],{"alt":3423,"src":3424},[10,10682,3427],{},[14,10684,35],{"id":35},[37,10686,10687,10689,10691],{},[40,10688,3434],{},[40,10690,3437],{},[40,10692,3440],{},[14,10694,58],{"id":58},[10,10696,61],{},[63,10698,10699],{"className":65,"code":3447,"language":67,"meta":68,"style":68},[43,10700,10701,10705,10709,10713,10717,10721],{"__ignoreMap":68},[72,10702,10703],{"class":74,"line":75},[72,10704,3454],{},[72,10706,10707],{"class":74,"line":81},[72,10708,3459],{},[72,10710,10711],{"class":74,"line":87},[72,10712,3464],{},[72,10714,10715],{"class":74,"line":93},[72,10716,103],{"emptyLinePlaceholder":102},[72,10718,10719],{"class":74,"line":99},[72,10720,3473],{},[72,10722,10723],{"class":74,"line":106},[72,10724,3478],{},[10,10726,153],{},[63,10728,10730],{"className":10729,"code":3484,"language":159,"meta":68},[157],[43,10731,3484],{"__ignoreMap":68},[10,10733,164],{},[14,10735,167],{"id":167},[169,10737,10738,10742],{},[40,10739,10740,3498],{},[43,10741,3497],{},[40,10743,10744,3504],{},[43,10745,3503],{},[14,10747,220],{"id":220},[37,10749,10750,10754],{},[40,10751,3511,10752,3515],{},[43,10753,3514],{},[40,10755,3518],{},[14,10757,234],{"id":234},[169,10759,10760,10762],{},[40,10761,3525],{},[40,10763,2218,10764,2221,10766,3532],{},[43,10765,3514],{},[43,10767,3503],{},[10,10769,249],{},[14,10771,252],{"id":252},[10,10773,3539],{},[257,10775,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10777},[10778,10779,10780,10781,10782,10783,10784,10785],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3406,"description":3411},[272,3559,3402],{"id":3562,"title":3563,"body":10790,"category":272,"cover":273,"description":3568,"extension":274,"meta":10915,"navigation":102,"path":3724,"pinned":277,"publishedAt":278,"seo":10916,"slug":3726,"stem":3727,"summary":3728,"tags":10917,"updatedAt":278,"visible":102,"__hash__":3731},{"type":7,"value":10791,"toc":10905},[10792,10794,10796,10798,10800,10804,10810,10812,10822,10824,10826,10854,10856,10861,10863,10865,10875,10877,10889,10891,10897,10899,10901,10903],[10,10793,3568],{},[14,10795,16],{"id":16},[10,10797,3573],{},[14,10799,22],{"id":22},[10,10801,10802],{},[26,10803],{"alt":3580,"src":3581},[10,10805,3584,10806,3588,10808,3591],{},[43,10807,3587],{},[43,10809,2291],{},[14,10811,35],{"id":35},[37,10813,10814,10816,10820],{},[40,10815,3598],{},[40,10817,2384,10818,3604],{},[43,10819,3603],{},[40,10821,3607],{},[14,10823,58],{"id":58},[10,10825,61],{},[63,10827,10828],{"className":65,"code":3614,"language":67,"meta":68,"style":68},[43,10829,10830,10834,10838,10842,10846,10850],{"__ignoreMap":68},[72,10831,10832],{"class":74,"line":75},[72,10833,3621],{},[72,10835,10836],{"class":74,"line":81},[72,10837,3626],{},[72,10839,10840],{"class":74,"line":87},[72,10841,103],{"emptyLinePlaceholder":102},[72,10843,10844],{"class":74,"line":93},[72,10845,3635],{},[72,10847,10848],{"class":74,"line":99},[72,10849,3640],{},[72,10851,10852],{"class":74,"line":106},[72,10853,3645],{},[10,10855,153],{},[63,10857,10859],{"className":10858,"code":3651,"language":159,"meta":68},[157],[43,10860,3651],{"__ignoreMap":68},[10,10862,164],{},[14,10864,167],{"id":167},[169,10866,10867,10869],{},[40,10868,3662],{},[40,10870,3665,10871,3668,10873,3672],{},[43,10872,2291],{},[43,10874,3671],{},[14,10876,220],{"id":220},[37,10878,10879,10883],{},[40,10880,3679,10881,3683],{},[43,10882,3682],{},[40,10884,3686,10885,3690,10887,408],{},[43,10886,3689],{},[43,10888,3693],{},[14,10890,234],{"id":234},[169,10892,10893,10895],{},[40,10894,3700],{},[40,10896,3703],{},[10,10898,249],{},[14,10900,252],{"id":252},[10,10902,3710],{},[257,10904,259],{},{"title":68,"searchDepth":81,"depth":81,"links":10906},[10907,10908,10909,10910,10911,10912,10913,10914],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3563,"description":3568},[272,3730,3402],{"id":3733,"title":3734,"body":10919,"category":272,"cover":273,"description":3739,"extension":274,"meta":11042,"navigation":102,"path":3889,"pinned":277,"publishedAt":278,"seo":11043,"slug":3891,"stem":3892,"summary":3893,"tags":11044,"updatedAt":278,"visible":102,"__hash__":3896},{"type":7,"value":10920,"toc":11032},[10921,10923,10925,10927,10929,10933,10935,10937,10949,10951,10953,10981,10983,10988,10990,10992,11002,11004,11014,11016,11024,11026,11028,11030],[10,10922,3739],{},[14,10924,16],{"id":16},[10,10926,3744],{},[14,10928,22],{"id":22},[10,10930,10931],{},[26,10932],{"alt":3751,"src":3752},[10,10934,3755],{},[14,10936,35],{"id":35},[37,10938,10939,10941,10943],{},[40,10940,3762],{},[40,10942,3765],{},[40,10944,3768,10945,3772,10947,3776],{},[43,10946,3771],{},[43,10948,3775],{},[14,10950,58],{"id":58},[10,10952,61],{},[63,10954,10955],{"className":65,"code":3783,"language":67,"meta":68,"style":68},[43,10956,10957,10961,10965,10969,10973,10977],{"__ignoreMap":68},[72,10958,10959],{"class":74,"line":75},[72,10960,3790],{},[72,10962,10963],{"class":74,"line":81},[72,10964,3795],{},[72,10966,10967],{"class":74,"line":87},[72,10968,103],{"emptyLinePlaceholder":102},[72,10970,10971],{"class":74,"line":93},[72,10972,3804],{},[72,10974,10975],{"class":74,"line":99},[72,10976,3809],{},[72,10978,10979],{"class":74,"line":106},[72,10980,3814],{},[10,10982,153],{},[63,10984,10986],{"className":10985,"code":3820,"language":159,"meta":68},[157],[43,10987,3820],{"__ignoreMap":68},[10,10989,164],{},[14,10991,167],{"id":167},[169,10993,10994,10996],{},[40,10995,3831],{},[40,10997,10998,3837,11000,3841],{},[43,10999,3836],{},[43,11001,3840],{},[14,11003,220],{"id":220},[37,11005,11006,11012],{},[40,11007,2384,11008,3850,11010,408],{},[43,11009,3775],{},[43,11011,3771],{},[40,11013,3855],{},[14,11015,234],{"id":234},[169,11017,11018,11022],{},[40,11019,3862,11020,3865],{},[43,11021,3771],{},[40,11023,3868],{},[10,11025,249],{},[14,11027,252],{"id":252},[10,11029,3875],{},[257,11031,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11033},[11034,11035,11036,11037,11038,11039,11040,11041],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3734,"description":3739},[272,3895,3402],{"id":3898,"title":3899,"body":11046,"category":272,"cover":273,"description":3904,"extension":274,"meta":11205,"navigation":102,"path":4102,"pinned":277,"publishedAt":278,"seo":11206,"slug":4104,"stem":4105,"summary":4106,"tags":11207,"updatedAt":278,"visible":102,"__hash__":4110},{"type":7,"value":11047,"toc":11193},[11048,11050,11052,11054,11056,11060,11066,11068,11080,11082,11084,11124,11126,11131,11133,11135,11149,11151,11153,11157,11159,11161,11171,11173,11185,11187,11189,11191],[10,11049,3904],{},[14,11051,16],{"id":16},[10,11053,3909],{},[14,11055,22],{"id":22},[10,11057,11058],{},[26,11059],{"alt":3916,"src":3917},[10,11061,11062,3923,11064,3927],{},[43,11063,3922],{},[43,11065,3926],{},[14,11067,35],{"id":35},[37,11069,11070,11076,11078],{},[40,11071,11072,3936,11074,3940],{},[43,11073,2851],{},[43,11075,3939],{},[40,11077,3943],{},[40,11079,3946],{},[14,11081,58],{"id":58},[10,11083,61],{},[63,11085,11086],{"className":65,"code":3953,"language":67,"meta":68,"style":68},[43,11087,11088,11092,11096,11100,11104,11108,11112,11116,11120],{"__ignoreMap":68},[72,11089,11090],{"class":74,"line":75},[72,11091,3960],{},[72,11093,11094],{"class":74,"line":81},[72,11095,3965],{},[72,11097,11098],{"class":74,"line":87},[72,11099,3970],{},[72,11101,11102],{"class":74,"line":93},[72,11103,103],{"emptyLinePlaceholder":102},[72,11105,11106],{"class":74,"line":99},[72,11107,3979],{},[72,11109,11110],{"class":74,"line":106},[72,11111,3984],{},[72,11113,11114],{"class":74,"line":112},[72,11115,3989],{},[72,11117,11118],{"class":74,"line":118},[72,11119,3994],{},[72,11121,11122],{"class":74,"line":124},[72,11123,3999],{},[10,11125,153],{},[63,11127,11129],{"className":11128,"code":4005,"language":159,"meta":68},[157],[43,11130,4005],{"__ignoreMap":68},[10,11132,164],{},[14,11134,167],{"id":167},[169,11136,11137,11141],{},[40,11138,11139,4019],{},[43,11140,4018],{},[40,11142,11143,4025,11145,4029,11147,4033],{},[43,11144,4024],{},[43,11146,4028],{},[43,11148,4032],{},[195,11150,197],{"id":197},[10,11152,4038],{},[10,11154,11155],{},[26,11156],{"alt":4043,"src":4044},[10,11158,4047],{},[14,11160,220],{"id":220},[37,11162,11163,11169],{},[40,11164,4054,11165,4057,11167,408],{},[43,11166,2851],{},[43,11168,3939],{},[40,11170,4062],{},[14,11172,234],{"id":234},[169,11174,11175,11177],{},[40,11176,4069],{},[40,11178,2384,11179,4075,11181,213,11183,408],{},[43,11180,4074],{},[43,11182,3939],{},[43,11184,2851],{},[10,11186,249],{},[14,11188,252],{"id":252},[10,11190,4086],{},[257,11192,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11194},[11195,11196,11197,11198,11199,11202,11203,11204],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":11200},[11201],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":3899,"description":3904},[272,4108,4109],{"id":4112,"title":4113,"body":11209,"category":272,"cover":273,"description":4118,"extension":274,"meta":11381,"navigation":102,"path":4331,"pinned":277,"publishedAt":278,"seo":11382,"slug":4333,"stem":4334,"summary":4335,"tags":11383,"updatedAt":278,"visible":102,"__hash__":4338},{"type":7,"value":11210,"toc":11368},[11211,11213,11215,11217,11219,11223,11231,11233,11241,11243,11245,11289,11291,11296,11298,11300,11312,11314,11316,11320,11326,11328,11330,11334,11338,11340,11352,11354,11360,11362,11364,11366],[10,11212,4118],{},[14,11214,16],{"id":16},[10,11216,4123],{},[14,11218,22],{"id":22},[10,11220,11221],{},[26,11222],{"alt":4130,"src":4131},[10,11224,11225,2302,11227,2302,11229,4141],{},[43,11226,1202],{},[43,11228,4138],{},[43,11230,1205],{},[14,11232,35],{"id":35},[37,11234,11235,11237,11239],{},[40,11236,4148],{},[40,11238,4151],{},[40,11240,4154],{},[14,11242,58],{"id":58},[10,11244,61],{},[63,11246,11247],{"className":65,"code":4161,"language":67,"meta":68,"style":68},[43,11248,11249,11253,11257,11261,11265,11269,11273,11277,11281,11285],{"__ignoreMap":68},[72,11250,11251],{"class":74,"line":75},[72,11252,4168],{},[72,11254,11255],{"class":74,"line":81},[72,11256,103],{"emptyLinePlaceholder":102},[72,11258,11259],{"class":74,"line":87},[72,11260,4177],{},[72,11262,11263],{"class":74,"line":93},[72,11264,4182],{},[72,11266,11267],{"class":74,"line":99},[72,11268,4187],{},[72,11270,11271],{"class":74,"line":106},[72,11272,4192],{},[72,11274,11275],{"class":74,"line":112},[72,11276,1192],{},[72,11278,11279],{"class":74,"line":118},[72,11280,4201],{},[72,11282,11283],{"class":74,"line":124},[72,11284,103],{"emptyLinePlaceholder":102},[72,11286,11287],{"class":74,"line":130},[72,11288,4210],{},[10,11290,153],{},[63,11292,11294],{"className":11293,"code":4216,"language":159,"meta":68},[157],[43,11295,4216],{"__ignoreMap":68},[10,11297,164],{},[14,11299,167],{"id":167},[169,11301,11302,11306],{},[40,11303,4227,11304,4231],{},[43,11305,4230],{},[40,11307,11308,4237,11310,4240],{},[43,11309,4236],{},[43,11311,1205],{},[195,11313,197],{"id":197},[10,11315,4245],{},[10,11317,11318],{},[26,11319],{"alt":4250,"src":4251},[10,11321,11322,4256,11324,4259],{},[43,11323,4230],{},[43,11325,4236],{},[195,11327,197],{"id":4262},[10,11329,4265],{},[10,11331,11332],{},[26,11333],{"alt":4270,"src":4271},[10,11335,4274,11336,4277],{},[43,11337,1202],{},[14,11339,220],{"id":220},[37,11341,11342,11346],{},[40,11343,4284,11344,4287],{},[43,11345,4236],{},[40,11347,4290,11348,4293,11350,4297],{},[43,11349,1202],{},[43,11351,4296],{},[14,11353,234],{"id":234},[169,11355,11356,11358],{},[40,11357,4304],{},[40,11359,4307],{},[10,11361,249],{},[14,11363,252],{"id":252},[10,11365,4314],{},[257,11367,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11369},[11370,11371,11372,11373,11374,11378,11379,11380],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":11375},[11376,11377],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":4113,"description":4118},[272,1202,4337],{"id":4340,"title":4341,"body":11385,"category":272,"cover":273,"description":4346,"extension":274,"meta":11522,"navigation":102,"path":4513,"pinned":277,"publishedAt":278,"seo":11523,"slug":4515,"stem":4516,"summary":4517,"tags":11524,"updatedAt":278,"visible":102,"__hash__":4520},{"type":7,"value":11386,"toc":11510},[11387,11389,11391,11393,11395,11399,11403,11405,11415,11417,11419,11451,11453,11458,11460,11462,11472,11474,11476,11480,11484,11486,11492,11494,11502,11504,11506,11508],[10,11388,4346],{},[14,11390,16],{"id":16},[10,11392,4351],{},[14,11394,22],{"id":22},[10,11396,11397],{},[26,11398],{"alt":4358,"src":4359},[10,11400,11401,4365],{},[43,11402,4364],{},[14,11404,35],{"id":35},[37,11406,11407,11409,11411],{},[40,11408,4372],{},[40,11410,4375],{},[40,11412,4378,11413,4382],{},[43,11414,4381],{},[14,11416,58],{"id":58},[10,11418,61],{},[63,11420,11421],{"className":65,"code":4389,"language":67,"meta":68,"style":68},[43,11422,11423,11427,11431,11435,11439,11443,11447],{"__ignoreMap":68},[72,11424,11425],{"class":74,"line":75},[72,11426,4396],{},[72,11428,11429],{"class":74,"line":81},[72,11430,103],{"emptyLinePlaceholder":102},[72,11432,11433],{"class":74,"line":87},[72,11434,4405],{},[72,11436,11437],{"class":74,"line":93},[72,11438,4410],{},[72,11440,11441],{"class":74,"line":99},[72,11442,4415],{},[72,11444,11445],{"class":74,"line":106},[72,11446,103],{"emptyLinePlaceholder":102},[72,11448,11449],{"class":74,"line":112},[72,11450,4424],{},[10,11452,153],{},[63,11454,11456],{"className":11455,"code":4430,"language":159,"meta":68},[157],[43,11457,4430],{"__ignoreMap":68},[10,11459,164],{},[14,11461,167],{"id":167},[169,11463,11464,11468],{},[40,11465,4441,11466,4445],{},[43,11467,4444],{},[40,11469,4448,11470,4451],{},[43,11471,4444],{},[195,11473,197],{"id":197},[10,11475,4456],{},[10,11477,11478],{},[26,11479],{"alt":4461,"src":4462},[10,11481,4465,11482,4468],{},[43,11483,4444],{},[14,11485,220],{"id":220},[37,11487,11488,11490],{},[40,11489,4475],{},[40,11491,4478],{},[14,11493,234],{"id":234},[169,11495,11496,11500],{},[40,11497,2384,11498,4487],{},[43,11499,4364],{},[40,11501,4490],{},[10,11503,249],{},[14,11505,252],{"id":252},[10,11507,4497],{},[257,11509,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11511},[11512,11513,11514,11515,11516,11519,11520,11521],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":11517},[11518],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":4341,"description":4346},[272,4364,4519],{"id":4522,"title":4523,"body":11526,"category":272,"cover":273,"description":4528,"extension":274,"meta":11651,"navigation":102,"path":4676,"pinned":277,"publishedAt":278,"seo":11652,"slug":4678,"stem":4679,"summary":4680,"tags":11653,"updatedAt":278,"visible":102,"__hash__":4683},{"type":7,"value":11527,"toc":11641},[11528,11530,11532,11534,11536,11540,11544,11546,11556,11558,11560,11592,11594,11599,11601,11603,11615,11617,11623,11625,11633,11635,11637,11639],[10,11529,4528],{},[14,11531,16],{"id":16},[10,11533,4533],{},[14,11535,22],{"id":22},[10,11537,11538],{},[26,11539],{"alt":4540,"src":4541},[10,11541,11542,4546],{},[43,11543,4381],{},[14,11545,35],{"id":35},[37,11547,11548,11552,11554],{},[40,11549,11550,4556],{},[43,11551,4555],{},[40,11553,4559],{},[40,11555,4562],{},[14,11557,58],{"id":58},[10,11559,61],{},[63,11561,11562],{"className":65,"code":4569,"language":67,"meta":68,"style":68},[43,11563,11564,11568,11572,11576,11580,11584,11588],{"__ignoreMap":68},[72,11565,11566],{"class":74,"line":75},[72,11567,4576],{},[72,11569,11570],{"class":74,"line":81},[72,11571,103],{"emptyLinePlaceholder":102},[72,11573,11574],{"class":74,"line":87},[72,11575,4585],{},[72,11577,11578],{"class":74,"line":93},[72,11579,4590],{},[72,11581,11582],{"class":74,"line":99},[72,11583,103],{"emptyLinePlaceholder":102},[72,11585,11586],{"class":74,"line":106},[72,11587,4599],{},[72,11589,11590],{"class":74,"line":112},[72,11591,4604],{},[10,11593,153],{},[63,11595,11597],{"className":11596,"code":4610,"language":159,"meta":68},[157],[43,11598,4610],{"__ignoreMap":68},[10,11600,164],{},[14,11602,167],{"id":167},[169,11604,11605,11611],{},[40,11606,4621,11607,4624,11609,4627],{},[43,11608,4381],{},[43,11610,212],{},[40,11612,11613,4632],{},[43,11614,4555],{},[14,11616,220],{"id":220},[37,11618,11619,11621],{},[40,11620,4639],{},[40,11622,4642],{},[14,11624,234],{"id":234},[169,11626,11627,11629],{},[40,11628,4649],{},[40,11630,2384,11631,4655],{},[43,11632,4654],{},[10,11634,249],{},[14,11636,252],{"id":252},[10,11638,4662],{},[257,11640,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11642},[11643,11644,11645,11646,11647,11648,11649,11650],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":4523,"description":4528},[272,4381,4682],{"id":4685,"title":4686,"body":11655,"category":272,"cover":273,"description":4691,"extension":274,"meta":11800,"navigation":102,"path":4866,"pinned":277,"publishedAt":278,"seo":11801,"slug":4868,"stem":4869,"summary":4870,"tags":11802,"updatedAt":278,"visible":102,"__hash__":4872},{"type":7,"value":11656,"toc":11790},[11657,11659,11661,11663,11665,11669,11675,11677,11691,11693,11695,11739,11741,11746,11748,11750,11760,11762,11774,11776,11782,11784,11786,11788],[10,11658,4691],{},[14,11660,16],{"id":16},[10,11662,4696],{},[14,11664,22],{"id":22},[10,11666,11667],{},[26,11668],{"alt":4703,"src":4704},[10,11670,11671,4710,11673,4714],{},[43,11672,4709],{},[43,11674,4713],{},[14,11676,35],{"id":35},[37,11678,11679,11681,11687],{},[40,11680,4721],{},[40,11682,11683,4726,11685,4729],{},[43,11684,4709],{},[43,11686,4364],{},[40,11688,4732,11689,4735],{},[43,11690,4713],{},[14,11692,58],{"id":58},[10,11694,61],{},[63,11696,11697],{"className":65,"code":4742,"language":67,"meta":68,"style":68},[43,11698,11699,11703,11707,11711,11715,11719,11723,11727,11731,11735],{"__ignoreMap":68},[72,11700,11701],{"class":74,"line":75},[72,11702,4749],{},[72,11704,11705],{"class":74,"line":81},[72,11706,103],{"emptyLinePlaceholder":102},[72,11708,11709],{"class":74,"line":87},[72,11710,4758],{},[72,11712,11713],{"class":74,"line":93},[72,11714,4763],{},[72,11716,11717],{"class":74,"line":99},[72,11718,4768],{},[72,11720,11721],{"class":74,"line":106},[72,11722,4773],{},[72,11724,11725],{"class":74,"line":112},[72,11726,4778],{},[72,11728,11729],{"class":74,"line":118},[72,11730,4604],{},[72,11732,11733],{"class":74,"line":124},[72,11734,103],{"emptyLinePlaceholder":102},[72,11736,11737],{"class":74,"line":130},[72,11738,4791],{},[10,11740,153],{},[63,11742,11744],{"className":11743,"code":4797,"language":159,"meta":68},[157],[43,11745,4797],{"__ignoreMap":68},[10,11747,164],{},[14,11749,167],{"id":167},[169,11751,11752,11756],{},[40,11753,4808,11754,4811],{},[43,11755,4709],{},[40,11757,4814,11758,4817],{},[43,11759,4713],{},[14,11761,220],{"id":220},[37,11763,11764,11768],{},[40,11765,3511,11766,4826],{},[43,11767,4709],{},[40,11769,4829,11770,4832,11772,4835],{},[43,11771,4364],{},[43,11773,4709],{},[14,11775,234],{"id":234},[169,11777,11778,11780],{},[40,11779,4842],{},[40,11781,4845],{},[10,11783,249],{},[14,11785,252],{"id":252},[10,11787,4852],{},[257,11789,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11791},[11792,11793,11794,11795,11796,11797,11798,11799],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":4686,"description":4691},[272,4713,4709],{"id":4874,"title":4875,"body":11804,"category":272,"cover":273,"description":4880,"extension":274,"meta":11943,"navigation":102,"path":5052,"pinned":277,"publishedAt":278,"seo":11944,"slug":5054,"stem":5055,"summary":5056,"tags":11945,"updatedAt":278,"visible":102,"__hash__":5060},{"type":7,"value":11805,"toc":11931},[11806,11808,11810,11812,11814,11818,11820,11822,11838,11840,11842,11870,11872,11877,11879,11881,11893,11895,11897,11901,11903,11905,11915,11917,11923,11925,11927,11929],[10,11807,4880],{},[14,11809,16],{"id":16},[10,11811,4885],{},[14,11813,22],{"id":22},[10,11815,11816],{},[26,11817],{"alt":4892,"src":4893},[10,11819,4896],{},[14,11821,35],{"id":35},[37,11823,11824,11826,11828],{},[40,11825,4903],{},[40,11827,4906],{},[40,11829,4909,11830,2302,11832,4916,11834,2302,11836,408],{},[43,11831,4912],{},[43,11833,4915],{},[43,11835,4919],{},[43,11837,4922],{},[14,11839,58],{"id":58},[10,11841,61],{},[63,11843,11844],{"className":65,"code":4929,"language":67,"meta":68,"style":68},[43,11845,11846,11850,11854,11858,11862,11866],{"__ignoreMap":68},[72,11847,11848],{"class":74,"line":75},[72,11849,4936],{},[72,11851,11852],{"class":74,"line":81},[72,11853,103],{"emptyLinePlaceholder":102},[72,11855,11856],{"class":74,"line":87},[72,11857,4945],{},[72,11859,11860],{"class":74,"line":93},[72,11861,4950],{},[72,11863,11864],{"class":74,"line":99},[72,11865,4955],{},[72,11867,11868],{"class":74,"line":106},[72,11869,4960],{},[10,11871,153],{},[63,11873,11875],{"className":11874,"code":4966,"language":159,"meta":68},[157],[43,11876,4966],{"__ignoreMap":68},[10,11878,164],{},[14,11880,167],{"id":167},[169,11882,11883,11891],{},[40,11884,4977,11885,4980,11887,213,11889,408],{},[43,11886,4912],{},[43,11888,4983],{},[43,11890,4986],{},[40,11892,4989],{},[195,11894,197],{"id":197},[10,11896,4994],{},[10,11898,11899],{},[26,11900],{"alt":4999,"src":5000},[10,11902,5003],{},[14,11904,220],{"id":220},[37,11906,11907,11913],{},[40,11908,5010,11909,1055,11911,5016],{},[43,11910,5013],{},[43,11912,4919],{},[40,11914,5019],{},[14,11916,234],{"id":234},[169,11918,11919,11921],{},[40,11920,5026],{},[40,11922,5029],{},[10,11924,249],{},[14,11926,252],{"id":252},[10,11928,5036],{},[257,11930,259],{},{"title":68,"searchDepth":81,"depth":81,"links":11932},[11933,11934,11935,11936,11937,11940,11941,11942],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":11938},[11939],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":4875,"description":4880},[272,5058,5059],{"id":5062,"title":5063,"body":11947,"category":272,"cover":273,"description":5068,"extension":274,"meta":12064,"navigation":102,"path":5207,"pinned":277,"publishedAt":278,"seo":12065,"slug":5209,"stem":5210,"summary":5211,"tags":12066,"updatedAt":278,"visible":102,"__hash__":5215},{"type":7,"value":11948,"toc":12054},[11949,11951,11953,11955,11957,11961,11963,11965,11973,11975,11977,12009,12011,12016,12018,12020,12028,12030,12038,12040,12046,12048,12050,12052],[10,11950,5068],{},[14,11952,16],{"id":16},[10,11954,5073],{},[14,11956,22],{"id":22},[10,11958,11959],{},[26,11960],{"alt":5080,"src":5081},[10,11962,5084],{},[14,11964,35],{"id":35},[37,11966,11967,11969,11971],{},[40,11968,5091],{},[40,11970,5094],{},[40,11972,5097],{},[14,11974,58],{"id":58},[10,11976,61],{},[63,11978,11979],{"className":65,"code":5104,"language":67,"meta":68,"style":68},[43,11980,11981,11985,11989,11993,11997,12001,12005],{"__ignoreMap":68},[72,11982,11983],{"class":74,"line":75},[72,11984,5111],{},[72,11986,11987],{"class":74,"line":81},[72,11988,103],{"emptyLinePlaceholder":102},[72,11990,11991],{"class":74,"line":87},[72,11992,5120],{},[72,11994,11995],{"class":74,"line":93},[72,11996,5125],{},[72,11998,11999],{"class":74,"line":99},[72,12000,103],{"emptyLinePlaceholder":102},[72,12002,12003],{"class":74,"line":106},[72,12004,5134],{},[72,12006,12007],{"class":74,"line":112},[72,12008,5139],{},[10,12010,153],{},[63,12012,12014],{"className":12013,"code":5145,"language":159,"meta":68},[157],[43,12015,5145],{"__ignoreMap":68},[10,12017,164],{},[14,12019,167],{"id":167},[169,12021,12022,12024],{},[40,12023,5156],{},[40,12025,5159,12026,5163],{},[43,12027,5162],{},[14,12029,220],{"id":220},[37,12031,12032,12036],{},[40,12033,5170,12034,5173],{},[43,12035,4381],{},[40,12037,5176],{},[14,12039,234],{"id":234},[169,12041,12042,12044],{},[40,12043,5183],{},[40,12045,5186],{},[10,12047,249],{},[14,12049,252],{"id":252},[10,12051,5193],{},[257,12053,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12055},[12056,12057,12058,12059,12060,12061,12062,12063],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5063,"description":5068},[272,5213,5214],{"id":5217,"title":5218,"body":12068,"category":272,"cover":273,"description":5223,"extension":274,"meta":12187,"navigation":102,"path":5366,"pinned":277,"publishedAt":278,"seo":12188,"slug":5368,"stem":5369,"summary":5370,"tags":12189,"updatedAt":278,"visible":102,"__hash__":5374},{"type":7,"value":12069,"toc":12177},[12070,12072,12074,12076,12078,12082,12084,12086,12094,12096,12098,12130,12132,12137,12139,12141,12151,12153,12159,12161,12169,12171,12173,12175],[10,12071,5223],{},[14,12073,16],{"id":16},[10,12075,5228],{},[14,12077,22],{"id":22},[10,12079,12080],{},[26,12081],{"alt":5235,"src":5236},[10,12083,5239],{},[14,12085,35],{"id":35},[37,12087,12088,12090,12092],{},[40,12089,5246],{},[40,12091,5249],{},[40,12093,5252],{},[14,12095,58],{"id":58},[10,12097,61],{},[63,12099,12100],{"className":65,"code":5259,"language":67,"meta":68,"style":68},[43,12101,12102,12106,12110,12114,12118,12122,12126],{"__ignoreMap":68},[72,12103,12104],{"class":74,"line":75},[72,12105,5266],{},[72,12107,12108],{"class":74,"line":81},[72,12109,5271],{},[72,12111,12112],{"class":74,"line":87},[72,12113,5276],{},[72,12115,12116],{"class":74,"line":93},[72,12117,103],{"emptyLinePlaceholder":102},[72,12119,12120],{"class":74,"line":99},[72,12121,5285],{},[72,12123,12124],{"class":74,"line":106},[72,12125,5290],{},[72,12127,12128],{"class":74,"line":112},[72,12129,5295],{},[10,12131,153],{},[63,12133,12135],{"className":12134,"code":5301,"language":159,"meta":68},[157],[43,12136,5301],{"__ignoreMap":68},[10,12138,164],{},[14,12140,167],{"id":167},[169,12142,12143,12147],{},[40,12144,984,12145,5315],{},[43,12146,5314],{},[40,12148,5318,12149,5322],{},[43,12150,5321],{},[14,12152,220],{"id":220},[37,12154,12155,12157],{},[40,12156,5329],{},[40,12158,5332],{},[14,12160,234],{"id":234},[169,12162,12163,12167],{},[40,12164,239,12165,5342],{},[43,12166,5341],{},[40,12168,5345],{},[10,12170,249],{},[14,12172,252],{"id":252},[10,12174,5352],{},[257,12176,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12178},[12179,12180,12181,12182,12183,12184,12185,12186],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5218,"description":5223},[272,5372,5373],{"id":5376,"title":5377,"body":12191,"category":272,"cover":273,"description":5382,"extension":274,"meta":12336,"navigation":102,"path":5563,"pinned":277,"publishedAt":278,"seo":12337,"slug":5565,"stem":5566,"summary":5567,"tags":12338,"updatedAt":278,"visible":102,"__hash__":5571},{"type":7,"value":12192,"toc":12324},[12193,12195,12197,12199,12201,12205,12209,12211,12223,12225,12227,12255,12257,12262,12264,12266,12280,12282,12284,12288,12296,12298,12308,12310,12316,12318,12320,12322],[10,12194,5382],{},[14,12196,16],{"id":16},[10,12198,5387],{},[14,12200,22],{"id":22},[10,12202,12203],{},[26,12204],{"alt":5394,"src":5395},[10,12206,5398,12207,5402],{},[43,12208,5401],{},[14,12210,35],{"id":35},[37,12212,12213,12215,12217],{},[40,12214,5409],{},[40,12216,5412],{},[40,12218,5415,12219,5418,12221,408],{},[43,12220,5401],{},[43,12222,5421],{},[14,12224,58],{"id":58},[10,12226,61],{},[63,12228,12229],{"className":65,"code":5428,"language":67,"meta":68,"style":68},[43,12230,12231,12235,12239,12243,12247,12251],{"__ignoreMap":68},[72,12232,12233],{"class":74,"line":75},[72,12234,5435],{},[72,12236,12237],{"class":74,"line":81},[72,12238,5440],{},[72,12240,12241],{"class":74,"line":87},[72,12242,5445],{},[72,12244,12245],{"class":74,"line":93},[72,12246,103],{"emptyLinePlaceholder":102},[72,12248,12249],{"class":74,"line":99},[72,12250,5454],{},[72,12252,12253],{"class":74,"line":106},[72,12254,5459],{},[10,12256,153],{},[63,12258,12260],{"className":12259,"code":5465,"language":159,"meta":68},[157],[43,12261,5465],{"__ignoreMap":68},[10,12263,164],{},[14,12265,167],{"id":167},[169,12267,12268,12274],{},[40,12269,5476,12270,2302,12272,5482],{},[43,12271,5479],{},[43,12273,4444],{},[40,12275,12276,5488,12278,5492],{},[43,12277,5487],{},[43,12279,5491],{},[195,12281,197],{"id":197},[10,12283,5497],{},[10,12285,12286],{},[26,12287],{"alt":5502,"src":5503},[10,12289,12290,2302,12292,213,12294,5513],{},[43,12291,5479],{},[43,12293,4444],{},[43,12295,5512],{},[14,12297,220],{"id":220},[37,12299,12300,12304],{},[40,12301,5520,12302,5524],{},[43,12303,5523],{},[40,12305,5527,12306,5530],{},[43,12307,5512],{},[14,12309,234],{"id":234},[169,12311,12312,12314],{},[40,12313,5537],{},[40,12315,5540],{},[10,12317,249],{},[14,12319,252],{"id":252},[10,12321,5547],{},[257,12323,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12325},[12326,12327,12328,12329,12330,12333,12334,12335],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":12331},[12332],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5377,"description":5382},[272,5569,5570],{"id":5573,"title":5574,"body":12340,"category":272,"cover":273,"description":5579,"extension":274,"meta":12489,"navigation":102,"path":5760,"pinned":277,"publishedAt":278,"seo":12490,"slug":5762,"stem":5763,"summary":5764,"tags":12491,"updatedAt":278,"visible":102,"__hash__":5768},{"type":7,"value":12341,"toc":12477},[12342,12344,12346,12348,12350,12354,12356,12358,12370,12372,12374,12418,12420,12425,12427,12429,12441,12443,12445,12449,12451,12453,12461,12463,12469,12471,12473,12475],[10,12343,5579],{},[14,12345,16],{"id":16},[10,12347,5584],{},[14,12349,22],{"id":22},[10,12351,12352],{},[26,12353],{"alt":5591,"src":5592},[10,12355,5595],{},[14,12357,35],{"id":35},[37,12359,12360,12362,12366],{},[40,12361,5602],{},[40,12363,12364,5608],{},[43,12365,5607],{},[40,12367,12368,5614],{},[43,12369,5613],{},[14,12371,58],{"id":58},[10,12373,61],{},[63,12375,12376],{"className":65,"code":5621,"language":67,"meta":68,"style":68},[43,12377,12378,12382,12386,12390,12394,12398,12402,12406,12410,12414],{"__ignoreMap":68},[72,12379,12380],{"class":74,"line":75},[72,12381,5628],{},[72,12383,12384],{"class":74,"line":81},[72,12385,5633],{},[72,12387,12388],{"class":74,"line":87},[72,12389,103],{"emptyLinePlaceholder":102},[72,12391,12392],{"class":74,"line":93},[72,12393,5642],{},[72,12395,12396],{"class":74,"line":99},[72,12397,5647],{},[72,12399,12400],{"class":74,"line":106},[72,12401,103],{"emptyLinePlaceholder":102},[72,12403,12404],{"class":74,"line":112},[72,12405,5656],{},[72,12407,12408],{"class":74,"line":118},[72,12409,5661],{},[72,12411,12412],{"class":74,"line":124},[72,12413,103],{"emptyLinePlaceholder":102},[72,12415,12416],{"class":74,"line":130},[72,12417,5670],{},[10,12419,153],{},[63,12421,12423],{"className":12422,"code":5676,"language":159,"meta":68},[157],[43,12424,5676],{"__ignoreMap":68},[10,12426,164],{},[14,12428,167],{"id":167},[169,12430,12431,12435],{},[40,12432,5687,12433,5691],{},[43,12434,5690],{},[40,12436,12437,5697,12439,408],{},[43,12438,5696],{},[43,12440,5700],{},[195,12442,197],{"id":197},[10,12444,5705],{},[10,12446,12447],{},[26,12448],{"alt":5710,"src":5711},[10,12450,5714],{},[14,12452,220],{"id":220},[37,12454,12455,12459],{},[40,12456,5721,12457,5724],{},[43,12458,5421],{},[40,12460,5727],{},[14,12462,234],{"id":234},[169,12464,12465,12467],{},[40,12466,5734],{},[40,12468,5737],{},[10,12470,249],{},[14,12472,252],{"id":252},[10,12474,5744],{},[257,12476,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12478},[12479,12480,12481,12482,12483,12486,12487,12488],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":12484},[12485],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5574,"description":5579},[272,5766,5767],{"id":5770,"title":5771,"body":12493,"category":272,"cover":273,"description":5776,"extension":274,"meta":12654,"navigation":102,"path":5972,"pinned":277,"publishedAt":278,"seo":12655,"slug":5974,"stem":5975,"summary":5976,"tags":12656,"updatedAt":278,"visible":102,"__hash__":5980},{"type":7,"value":12494,"toc":12642},[12495,12497,12499,12501,12503,12507,12509,12511,12523,12525,12527,12579,12581,12586,12588,12590,12608,12610,12612,12616,12618,12620,12626,12628,12634,12636,12638,12640],[10,12496,5776],{},[14,12498,16],{"id":16},[10,12500,5781],{},[14,12502,22],{"id":22},[10,12504,12505],{},[26,12506],{"alt":5788,"src":5789},[10,12508,5792],{},[14,12510,35],{"id":35},[37,12512,12513,12515,12517],{},[40,12514,5799],{},[40,12516,5802],{},[40,12518,12519,2221,12521,5811],{},[43,12520,5807],{},[43,12522,5810],{},[14,12524,58],{"id":58},[10,12526,61],{},[63,12528,12529],{"className":65,"code":5818,"language":67,"meta":68,"style":68},[43,12530,12531,12535,12539,12543,12547,12551,12555,12559,12563,12567,12571,12575],{"__ignoreMap":68},[72,12532,12533],{"class":74,"line":75},[72,12534,5825],{},[72,12536,12537],{"class":74,"line":81},[72,12538,103],{"emptyLinePlaceholder":102},[72,12540,12541],{"class":74,"line":87},[72,12542,5834],{},[72,12544,12545],{"class":74,"line":93},[72,12546,5839],{},[72,12548,12549],{"class":74,"line":99},[72,12550,103],{"emptyLinePlaceholder":102},[72,12552,12553],{"class":74,"line":106},[72,12554,5848],{},[72,12556,12557],{"class":74,"line":112},[72,12558,5853],{},[72,12560,12561],{"class":74,"line":118},[72,12562,5858],{},[72,12564,12565],{"class":74,"line":124},[72,12566,103],{"emptyLinePlaceholder":102},[72,12568,12569],{"class":74,"line":130},[72,12570,5867],{},[72,12572,12573],{"class":74,"line":135},[72,12574,103],{"emptyLinePlaceholder":102},[72,12576,12577],{"class":74,"line":141},[72,12578,5876],{},[10,12580,153],{},[63,12582,12584],{"className":12583,"code":5882,"language":159,"meta":68},[157],[43,12585,5882],{"__ignoreMap":68},[10,12587,164],{},[14,12589,167],{"id":167},[169,12591,12592,12602],{},[40,12593,12594,5896,12596,5900,12598,5903,12600,5907],{},[43,12595,5895],{},[43,12597,5899],{},[43,12599,5690],{},[43,12601,5906],{},[40,12603,12604,5912,12606,5915],{},[43,12605,212],{},[43,12607,2253],{},[195,12609,197],{"id":197},[10,12611,5920],{},[10,12613,12614],{},[26,12615],{"alt":5925,"src":5926},[10,12617,5929],{},[14,12619,220],{"id":220},[37,12621,12622,12624],{},[40,12623,5936],{},[40,12625,5939],{},[14,12627,234],{"id":234},[169,12629,12630,12632],{},[40,12631,5946],{},[40,12633,5949],{},[10,12635,249],{},[14,12637,252],{"id":252},[10,12639,5956],{},[257,12641,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12643},[12644,12645,12646,12647,12648,12651,12652,12653],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":12649},[12650],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5771,"description":5776},[272,5978,5979],{"id":5982,"title":5983,"body":12658,"category":272,"cover":273,"description":5988,"extension":274,"meta":12781,"navigation":102,"path":6139,"pinned":277,"publishedAt":278,"seo":12782,"slug":6141,"stem":6142,"summary":6143,"tags":12783,"updatedAt":278,"visible":102,"__hash__":6147},{"type":7,"value":12659,"toc":12771},[12660,12662,12664,12666,12668,12672,12674,12676,12690,12692,12694,12722,12724,12729,12731,12733,12743,12745,12753,12755,12763,12765,12767,12769],[10,12661,5988],{},[14,12663,16],{"id":16},[10,12665,5993],{},[14,12667,22],{"id":22},[10,12669,12670],{},[26,12671],{"alt":6000,"src":6001},[10,12673,6004],{},[14,12675,35],{"id":35},[37,12677,12678,12680,12682],{},[40,12679,6011],{},[40,12681,6014],{},[40,12683,6017,12684,2302,12686,2302,12688,6025],{},[43,12685,2305],{},[43,12687,2471],{},[43,12689,6024],{},[14,12691,58],{"id":58},[10,12693,61],{},[63,12695,12696],{"className":65,"code":6032,"language":67,"meta":68,"style":68},[43,12697,12698,12702,12706,12710,12714,12718],{"__ignoreMap":68},[72,12699,12700],{"class":74,"line":75},[72,12701,6039],{},[72,12703,12704],{"class":74,"line":81},[72,12705,6044],{},[72,12707,12708],{"class":74,"line":87},[72,12709,6049],{},[72,12711,12712],{"class":74,"line":93},[72,12713,103],{"emptyLinePlaceholder":102},[72,12715,12716],{"class":74,"line":99},[72,12717,6058],{},[72,12719,12720],{"class":74,"line":106},[72,12721,6063],{},[10,12723,153],{},[63,12725,12727],{"className":12726,"code":6069,"language":159,"meta":68},[157],[43,12728,6069],{"__ignoreMap":68},[10,12730,164],{},[14,12732,167],{"id":167},[169,12734,12735,12741],{},[40,12736,6080,12737,6084,12739,6087],{},[43,12738,6083],{},[43,12740,2291],{},[40,12742,6090],{},[14,12744,220],{"id":220},[37,12746,12747,12751],{},[40,12748,6097,12749,6101],{},[43,12750,6100],{},[40,12752,6104],{},[14,12754,234],{"id":234},[169,12756,12757,12759],{},[40,12758,6111],{},[40,12760,6114,12761,6118],{},[43,12762,6117],{},[10,12764,249],{},[14,12766,252],{"id":252},[10,12768,6125],{},[257,12770,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12772},[12773,12774,12775,12776,12777,12778,12779,12780],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5983,"description":5988},[272,6145,6146],{"id":6149,"title":6150,"body":12785,"category":272,"cover":273,"description":6155,"extension":274,"meta":12962,"navigation":102,"path":6383,"pinned":277,"publishedAt":278,"seo":12963,"slug":6385,"stem":6386,"summary":6387,"tags":12964,"updatedAt":278,"visible":102,"__hash__":6391},{"type":7,"value":12786,"toc":12950},[12787,12789,12791,12795,12797,12801,12807,12809,12821,12823,12827,12851,12855,12871,12877,12879,12884,12886,12888,12904,12906,12908,12912,12916,12918,12930,12932,12942,12944,12946,12948],[10,12788,6155],{},[14,12790,16],{"id":16},[10,12792,6160,12793,6163],{},[341,12794,6083],{},[14,12796,22],{"id":22},[10,12798,12799],{},[26,12800],{"alt":6170,"src":6171},[10,12802,6174,12803,6178,12805,6182],{},[43,12804,6177],{},[43,12806,6181],{},[14,12808,35],{"id":35},[37,12810,12811,12815,12817],{},[40,12812,6189,12813,6192],{},[43,12814,1216],{},[40,12816,6195],{},[40,12818,6198,12819,6202],{},[43,12820,6201],{},[14,12822,58],{"id":58},[10,12824,6207,12825,6211],{},[43,12826,6210],{},[63,12828,12829],{"className":65,"code":6214,"language":67,"meta":68,"style":68},[43,12830,12831,12835,12839,12843,12847],{"__ignoreMap":68},[72,12832,12833],{"class":74,"line":75},[72,12834,6221],{},[72,12836,12837],{"class":74,"line":81},[72,12838,6226],{},[72,12840,12841],{"class":74,"line":87},[72,12842,103],{"emptyLinePlaceholder":102},[72,12844,12845],{"class":74,"line":93},[72,12846,6235],{},[72,12848,12849],{"class":74,"line":99},[72,12850,6240],{},[10,12852,6243,12853,6247],{},[43,12854,6246],{},[63,12856,12857],{"className":65,"code":6250,"language":67,"meta":68,"style":68},[43,12858,12859,12863,12867],{"__ignoreMap":68},[72,12860,12861],{"class":74,"line":75},[72,12862,6257],{},[72,12864,12865],{"class":74,"line":81},[72,12866,103],{"emptyLinePlaceholder":102},[72,12868,12869],{"class":74,"line":87},[72,12870,6266],{},[10,12872,6269,12873,213,12875,408],{},[43,12874,6272],{},[43,12876,6275],{},[10,12878,153],{},[63,12880,12882],{"className":12881,"code":6281,"language":159,"meta":68},[157],[43,12883,6281],{"__ignoreMap":68},[10,12885,164],{},[14,12887,167],{"id":167},[169,12889,12890,12896],{},[40,12891,6292,12892,6295,12894,6299],{},[43,12893,6210],{},[43,12895,6298],{},[40,12897,12898,6304,12900,6307,12902,6310],{},[43,12899,6246],{},[43,12901,6210],{},[43,12903,6246],{},[195,12905,197],{"id":197},[10,12907,6315],{},[10,12909,12910],{},[26,12911],{"alt":6320,"src":6321},[10,12913,6324,12914,6327],{},[43,12915,6298],{},[14,12917,220],{"id":220},[37,12919,12920,12926],{},[40,12921,6334,12922,213,12924,408],{},[43,12923,6210],{},[43,12925,6246],{},[40,12927,6341,12928,6345],{},[43,12929,6344],{},[14,12931,234],{"id":234},[169,12933,12934,12938],{},[40,12935,2399,12936,6355],{},[43,12937,6354],{},[40,12939,6358,12940,408],{},[43,12941,6177],{},[10,12943,249],{},[14,12945,252],{"id":252},[10,12947,6367],{},[257,12949,259],{},{"title":68,"searchDepth":81,"depth":81,"links":12951},[12952,12953,12954,12955,12956,12959,12960,12961],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":12957},[12958],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":6150,"description":6155},[272,6389,6390],{"id":6393,"title":6394,"body":12966,"category":272,"cover":273,"description":6399,"extension":274,"meta":13105,"navigation":102,"path":6565,"pinned":277,"publishedAt":278,"seo":13106,"slug":6567,"stem":6568,"summary":6569,"tags":13107,"updatedAt":278,"visible":102,"__hash__":6572},{"type":7,"value":12967,"toc":13095},[12968,12970,12972,12974,12976,12980,12982,12984,12994,12996,12998,13038,13040,13045,13047,13049,13067,13069,13077,13079,13087,13089,13091,13093],[10,12969,6399],{},[14,12971,16],{"id":16},[10,12973,6404],{},[14,12975,22],{"id":22},[10,12977,12978],{},[26,12979],{"alt":6411,"src":6412},[10,12981,6415],{},[14,12983,35],{"id":35},[37,12985,12986,12990,12992],{},[40,12987,12988,6425],{},[43,12989,6424],{},[40,12991,6428],{},[40,12993,6431],{},[14,12995,58],{"id":58},[10,12997,1619],{},[63,12999,13000],{"className":637,"code":6438,"language":639,"meta":68,"style":68},[43,13001,13002,13012,13018,13024,13034],{"__ignoreMap":68},[72,13003,13004,13006,13008,13010],{"class":74,"line":75},[72,13005,737],{"class":646},[72,13007,679],{"class":649},[72,13009,6449],{"class":682},[72,13011,6452],{"class":682},[72,13013,13014,13016],{"class":74,"line":81},[72,13015,6457],{"class":649},[72,13017,6460],{"class":682},[72,13019,13020,13022],{"class":74,"line":87},[72,13021,67],{"class":646},[72,13023,650],{"class":649},[72,13025,13026,13028,13030,13032],{"class":74,"line":93},[72,13027,67],{"class":646},[72,13029,679],{"class":649},[72,13031,683],{"class":682},[72,13033,650],{"class":649},[72,13035,13036],{"class":74,"line":99},[72,13037,6481],{"class":646},[10,13039,153],{},[63,13041,13043],{"className":13042,"code":6487,"language":159,"meta":68},[157],[43,13044,6487],{"__ignoreMap":68},[10,13046,164],{},[14,13048,167],{"id":167},[169,13050,13051,13057],{},[40,13052,13053,6501,13055,6504],{},[43,13054,6500],{},[43,13056,737],{},[40,13058,6507,13059,2221,13061,6513,13063,3772,13065,6519],{},[43,13060,67],{},[43,13062,6512],{},[43,13064,6424],{},[43,13066,6518],{},[14,13068,220],{"id":220},[37,13070,13071,13073],{},[40,13072,6526],{},[40,13074,3511,13075,6531],{},[43,13076,6424],{},[14,13078,234],{"id":234},[169,13080,13081,13085],{},[40,13082,6538,13083,408],{},[43,13084,6541],{},[40,13086,6544],{},[10,13088,249],{},[14,13090,252],{"id":252},[10,13092,6551],{},[257,13094,1703],{},{"title":68,"searchDepth":81,"depth":81,"links":13096},[13097,13098,13099,13100,13101,13102,13103,13104],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":6394,"description":6399},[272,6571,307],{"id":6574,"title":6575,"body":13109,"category":272,"cover":273,"description":6580,"extension":274,"meta":13262,"navigation":102,"path":6769,"pinned":277,"publishedAt":278,"seo":13263,"slug":6771,"stem":6772,"summary":6773,"tags":13264,"updatedAt":278,"visible":102,"__hash__":6777},{"type":7,"value":13110,"toc":13252},[13111,13113,13115,13117,13119,13123,13129,13131,13147,13149,13151,13195,13197,13202,13204,13206,13218,13220,13234,13236,13244,13246,13248,13250],[10,13112,6580],{},[14,13114,16],{"id":16},[10,13116,6585],{},[14,13118,22],{"id":22},[10,13120,13121],{},[26,13122],{"alt":6592,"src":6593},[10,13124,13125,6599,13127,6602],{},[43,13126,6598],{},[43,13128,2481],{},[14,13130,35],{"id":35},[37,13132,13133,13135,13143],{},[40,13134,6609],{},[40,13136,13137,2302,13139,2302,13141,6621],{},[43,13138,6614],{},[43,13140,6617],{},[43,13142,6620],{},[40,13144,6624,13145,6628],{},[43,13146,6627],{},[14,13148,58],{"id":58},[10,13150,61],{},[63,13152,13153],{"className":65,"code":6635,"language":67,"meta":68,"style":68},[43,13154,13155,13159,13163,13167,13171,13175,13179,13183,13187,13191],{"__ignoreMap":68},[72,13156,13157],{"class":74,"line":75},[72,13158,6642],{},[72,13160,13161],{"class":74,"line":81},[72,13162,103],{"emptyLinePlaceholder":102},[72,13164,13165],{"class":74,"line":87},[72,13166,6651],{},[72,13168,13169],{"class":74,"line":93},[72,13170,6656],{},[72,13172,13173],{"class":74,"line":99},[72,13174,6661],{},[72,13176,13177],{"class":74,"line":106},[72,13178,103],{"emptyLinePlaceholder":102},[72,13180,13181],{"class":74,"line":112},[72,13182,6670],{},[72,13184,13185],{"class":74,"line":118},[72,13186,6675],{},[72,13188,13189],{"class":74,"line":124},[72,13190,6680],{},[72,13192,13193],{"class":74,"line":130},[72,13194,6685],{},[10,13196,153],{},[63,13198,13200],{"className":13199,"code":6691,"language":159,"meta":68},[157],[43,13201,6691],{"__ignoreMap":68},[10,13203,164],{},[14,13205,167],{"id":167},[169,13207,13208,13212],{},[40,13209,13210,6705],{},[43,13211,6704],{},[40,13213,2384,13214,6710,13216,6713],{},[43,13215,2481],{},[43,13217,6598],{},[14,13219,220],{"id":220},[37,13221,13222,13228],{},[40,13223,3511,13224,6722,13226,6725],{},[43,13225,6598],{},[43,13227,6614],{},[40,13229,6728,13230,1055,13232,6734],{},[43,13231,2481],{},[43,13233,6733],{},[14,13235,234],{"id":234},[169,13237,13238,13242],{},[40,13239,6741,13240,6745],{},[43,13241,6744],{},[40,13243,6748],{},[10,13245,249],{},[14,13247,252],{"id":252},[10,13249,6755],{},[257,13251,259],{},{"title":68,"searchDepth":81,"depth":81,"links":13253},[13254,13255,13256,13257,13258,13259,13260,13261],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":6575,"description":6580},[272,6775,6776],{"id":6779,"title":6780,"body":13266,"category":272,"cover":273,"description":6785,"extension":274,"meta":13413,"navigation":102,"path":6964,"pinned":277,"publishedAt":278,"seo":13414,"slug":6966,"stem":6967,"summary":6968,"tags":13415,"updatedAt":278,"visible":102,"__hash__":6972},{"type":7,"value":13267,"toc":13403},[13268,13270,13272,13274,13276,13280,13282,13284,13302,13304,13306,13354,13356,13361,13363,13365,13373,13375,13385,13387,13395,13397,13399,13401],[10,13269,6785],{},[14,13271,16],{"id":16},[10,13273,6790],{},[14,13275,22],{"id":22},[10,13277,13278],{},[26,13279],{"alt":6797,"src":6798},[10,13281,6801],{},[14,13283,35],{"id":35},[37,13285,13286,13290,13296],{},[40,13287,13288,6811],{},[43,13289,6810],{},[40,13291,13292,6817,13294,408],{},[43,13293,6816],{},[43,13295,6820],{},[40,13297,6823,13298,6827,13300,6831],{},[43,13299,6826],{},[43,13301,6830],{},[14,13303,58],{"id":58},[10,13305,61],{},[63,13307,13308],{"className":65,"code":6838,"language":67,"meta":68,"style":68},[43,13309,13310,13314,13318,13322,13326,13330,13334,13338,13342,13346,13350],{"__ignoreMap":68},[72,13311,13312],{"class":74,"line":75},[72,13313,6642],{},[72,13315,13316],{"class":74,"line":81},[72,13317,103],{"emptyLinePlaceholder":102},[72,13319,13320],{"class":74,"line":87},[72,13321,6853],{},[72,13323,13324],{"class":74,"line":93},[72,13325,6858],{},[72,13327,13328],{"class":74,"line":99},[72,13329,6863],{},[72,13331,13332],{"class":74,"line":106},[72,13333,6868],{},[72,13335,13336],{"class":74,"line":112},[72,13337,103],{"emptyLinePlaceholder":102},[72,13339,13340],{"class":74,"line":118},[72,13341,6877],{},[72,13343,13344],{"class":74,"line":124},[72,13345,6882],{},[72,13347,13348],{"class":74,"line":130},[72,13349,6887],{},[72,13351,13352],{"class":74,"line":135},[72,13353,6892],{},[10,13355,153],{},[63,13357,13359],{"className":13358,"code":6898,"language":159,"meta":68},[157],[43,13360,6898],{"__ignoreMap":68},[10,13362,164],{},[14,13364,167],{"id":167},[169,13366,13367,13371],{},[40,13368,6909,13369,6912],{},[43,13370,6826],{},[40,13372,6915],{},[14,13374,220],{"id":220},[37,13376,13377,13381],{},[40,13378,2384,13379,6924],{},[43,13380,6810],{},[40,13382,6927,13383,408],{},[43,13384,6930],{},[14,13386,234],{"id":234},[169,13388,13389,13391],{},[40,13390,6937],{},[40,13392,6940,13393,6943],{},[43,13394,382],{},[10,13396,249],{},[14,13398,252],{"id":252},[10,13400,6950],{},[257,13402,259],{},{"title":68,"searchDepth":81,"depth":81,"links":13404},[13405,13406,13407,13408,13409,13410,13411,13412],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":6780,"description":6785},[272,6970,6971],{"id":6974,"title":6975,"body":13417,"category":272,"cover":273,"description":6980,"extension":274,"meta":13560,"navigation":102,"path":7148,"pinned":277,"publishedAt":278,"seo":13561,"slug":7150,"stem":7151,"summary":7152,"tags":13562,"updatedAt":278,"visible":102,"__hash__":7156},{"type":7,"value":13418,"toc":13550},[13419,13421,13423,13425,13427,13431,13437,13439,13449,13451,13453,13505,13507,13512,13514,13516,13526,13528,13534,13536,13542,13544,13546,13548],[10,13420,6980],{},[14,13422,16],{"id":16},[10,13424,6985],{},[14,13426,22],{"id":22},[10,13428,13429],{},[26,13430],{"alt":6992,"src":6993},[10,13432,13433,6999,13435,7003],{},[43,13434,6998],{},[43,13436,7002],{},[14,13438,35],{"id":35},[37,13440,13441,13443,13447],{},[40,13442,7010],{},[40,13444,13445,7016],{},[43,13446,7015],{},[40,13448,7019],{},[14,13450,58],{"id":58},[10,13452,61],{},[63,13454,13455],{"className":65,"code":7026,"language":67,"meta":68,"style":68},[43,13456,13457,13461,13465,13469,13473,13477,13481,13485,13489,13493,13497,13501],{"__ignoreMap":68},[72,13458,13459],{"class":74,"line":75},[72,13460,7033],{},[72,13462,13463],{"class":74,"line":81},[72,13464,103],{"emptyLinePlaceholder":102},[72,13466,13467],{"class":74,"line":87},[72,13468,7042],{},[72,13470,13471],{"class":74,"line":93},[72,13472,103],{"emptyLinePlaceholder":102},[72,13474,13475],{"class":74,"line":99},[72,13476,7051],{},[72,13478,13479],{"class":74,"line":106},[72,13480,7056],{},[72,13482,13483],{"class":74,"line":112},[72,13484,6868],{},[72,13486,13487],{"class":74,"line":118},[72,13488,103],{"emptyLinePlaceholder":102},[72,13490,13491],{"class":74,"line":124},[72,13492,7069],{},[72,13494,13495],{"class":74,"line":130},[72,13496,7074],{},[72,13498,13499],{"class":74,"line":135},[72,13500,6887],{},[72,13502,13503],{"class":74,"line":141},[72,13504,7083],{},[10,13506,153],{},[63,13508,13510],{"className":13509,"code":7089,"language":159,"meta":68},[157],[43,13511,7089],{"__ignoreMap":68},[10,13513,164],{},[14,13515,167],{"id":167},[169,13517,13518,13522],{},[40,13519,13520,7102],{},[43,13521,6998],{},[40,13523,13524,7107],{},[43,13525,7002],{},[14,13527,220],{"id":220},[37,13529,13530,13532],{},[40,13531,7114],{},[40,13533,7117],{},[14,13535,234],{"id":234},[169,13537,13538,13540],{},[40,13539,7124],{},[40,13541,7127],{},[10,13543,249],{},[14,13545,252],{"id":252},[10,13547,7134],{},[257,13549,259],{},{"title":68,"searchDepth":81,"depth":81,"links":13551},[13552,13553,13554,13555,13556,13557,13558,13559],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":6975,"description":6980},[272,7154,7155],{"id":7158,"title":7159,"body":13564,"category":272,"cover":273,"description":7164,"extension":274,"meta":13715,"navigation":102,"path":7349,"pinned":277,"publishedAt":278,"seo":13716,"slug":7351,"stem":7352,"summary":7353,"tags":13717,"updatedAt":278,"visible":102,"__hash__":7357},{"type":7,"value":13565,"toc":13705},[13566,13568,13570,13572,13574,13578,13582,13584,13598,13600,13602,13654,13656,13661,13663,13665,13677,13679,13689,13691,13697,13699,13701,13703],[10,13567,7164],{},[14,13569,16],{"id":16},[10,13571,7169],{},[14,13573,22],{"id":22},[10,13575,13576],{},[26,13577],{"alt":7176,"src":7177},[10,13579,13580,7183],{},[43,13581,7182],{},[14,13583,35],{"id":35},[37,13585,13586,13592,13596],{},[40,13587,2384,13588,7193,13590,7197],{},[43,13589,7192],{},[43,13591,7196],{},[40,13593,7200,13594,7204],{},[43,13595,7203],{},[40,13597,7207],{},[14,13599,58],{"id":58},[10,13601,61],{},[63,13603,13604],{"className":65,"code":7214,"language":67,"meta":68,"style":68},[43,13605,13606,13610,13614,13618,13622,13626,13630,13634,13638,13642,13646,13650],{"__ignoreMap":68},[72,13607,13608],{"class":74,"line":75},[72,13609,7221],{},[72,13611,13612],{"class":74,"line":81},[72,13613,103],{"emptyLinePlaceholder":102},[72,13615,13616],{"class":74,"line":87},[72,13617,7230],{},[72,13619,13620],{"class":74,"line":93},[72,13621,7235],{},[72,13623,13624],{"class":74,"line":99},[72,13625,7240],{},[72,13627,13628],{"class":74,"line":106},[72,13629,7245],{},[72,13631,13632],{"class":74,"line":112},[72,13633,7250],{},[72,13635,13636],{"class":74,"line":118},[72,13637,103],{"emptyLinePlaceholder":102},[72,13639,13640],{"class":74,"line":124},[72,13641,7259],{},[72,13643,13644],{"class":74,"line":130},[72,13645,7264],{},[72,13647,13648],{"class":74,"line":135},[72,13649,7269],{},[72,13651,13652],{"class":74,"line":141},[72,13653,7274],{},[10,13655,153],{},[63,13657,13659],{"className":13658,"code":7280,"language":159,"meta":68},[157],[43,13660,7280],{"__ignoreMap":68},[10,13662,164],{},[14,13664,167],{"id":167},[169,13666,13667,13673],{},[40,13668,13669,7294,13671,7297],{},[43,13670,7293],{},[43,13672,7203],{},[40,13674,13675,7302],{},[43,13676,7182],{},[14,13678,220],{"id":220},[37,13680,13681,13683],{},[40,13682,7309],{},[40,13684,7312,13685,7315,13687,7318],{},[43,13686,7192],{},[43,13688,7196],{},[14,13690,234],{"id":234},[169,13692,13693,13695],{},[40,13694,7325],{},[40,13696,7328],{},[10,13698,249],{},[14,13700,252],{"id":252},[10,13702,7335],{},[257,13704,259],{},{"title":68,"searchDepth":81,"depth":81,"links":13706},[13707,13708,13709,13710,13711,13712,13713,13714],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":7159,"description":7164},[272,7355,7356],{"id":7359,"title":7360,"body":13719,"category":272,"cover":273,"description":7365,"extension":274,"meta":13933,"navigation":102,"path":7638,"pinned":277,"publishedAt":278,"seo":13934,"slug":7640,"stem":7641,"summary":7642,"tags":13935,"updatedAt":278,"visible":102,"__hash__":7646},{"type":7,"value":13720,"toc":13920},[13721,13723,13725,13727,13729,13733,13739,13741,13753,13755,13757,13817,13819,13824,13826,13828,13846,13848,13856,13860,13868,13870,13874,13878,13884,13886,13896,13898,13912,13914,13916,13918],[10,13722,7365],{},[14,13724,16],{"id":16},[10,13726,7370],{},[14,13728,22],{"id":22},[10,13730,13731],{},[26,13732],{"alt":7377,"src":7378},[10,13734,7381,13735,7385,13737,7389],{},[43,13736,7384],{},[43,13738,7388],{},[14,13740,35],{"id":35},[37,13742,13743,13747,13751],{},[40,13744,7396,13745,7399],{},[43,13746,7384],{},[40,13748,13749,7405],{},[43,13750,7404],{},[40,13752,7408],{},[14,13754,58],{"id":58},[10,13756,61],{},[63,13758,13759],{"className":65,"code":7415,"language":67,"meta":68,"style":68},[43,13760,13761,13765,13769,13773,13777,13781,13785,13789,13793,13797,13801,13805,13809,13813],{"__ignoreMap":68},[72,13762,13763],{"class":74,"line":75},[72,13764,7422],{},[72,13766,13767],{"class":74,"line":81},[72,13768,7427],{},[72,13770,13771],{"class":74,"line":87},[72,13772,7432],{},[72,13774,13775],{"class":74,"line":93},[72,13776,7437],{},[72,13778,13779],{"class":74,"line":99},[72,13780,7442],{},[72,13782,13783],{"class":74,"line":106},[72,13784,103],{"emptyLinePlaceholder":102},[72,13786,13787],{"class":74,"line":112},[72,13788,7451],{},[72,13790,13791],{"class":74,"line":118},[72,13792,7456],{},[72,13794,13795],{"class":74,"line":124},[72,13796,7461],{},[72,13798,13799],{"class":74,"line":130},[72,13800,7466],{},[72,13802,13803],{"class":74,"line":135},[72,13804,1192],{},[72,13806,13807],{"class":74,"line":141},[72,13808,7475],{},[72,13810,13811],{"class":74,"line":147},[72,13812,7480],{},[72,13814,13815],{"class":74,"line":7483},[72,13816,7486],{},[10,13818,153],{},[63,13820,13822],{"className":13821,"code":7492,"language":159,"meta":68},[157],[43,13823,7492],{"__ignoreMap":68},[10,13825,164],{},[14,13827,167],{"id":167},[169,13829,13830,13838],{},[40,13831,13832,7505,13834,7508,13836,7512],{},[43,13833,3080],{},[43,13835,7404],{},[43,13837,7511],{},[40,13839,7515,13840,7518,13842,7521,13844,408],{},[43,13841,7384],{},[43,13843,1205],{},[43,13845,7388],{},[195,13847,197],{"id":197},[10,13849,13850,2302,13852,213,13854,7534],{},[43,13851,7384],{},[43,13853,1205],{},[43,13855,7388],{},[10,13857,13858],{},[26,13859],{"alt":7539,"src":7540},[10,13861,13862,7545,13864,7548,13866,7551],{},[43,13863,7384],{},[43,13865,1205],{},[43,13867,7388],{},[195,13869,197],{"id":4262},[10,13871,13872,7559],{},[43,13873,7558],{},[10,13875,13876],{},[26,13877],{"alt":7564,"src":7565},[10,13879,7568,13880,7571,13882,7574],{},[43,13881,7558],{},[43,13883,1205],{},[14,13885,220],{"id":220},[37,13887,13888,13892],{},[40,13889,7581,13890,7585],{},[43,13891,7584],{},[40,13893,7588,13894,7591],{},[43,13895,7558],{},[14,13897,234],{"id":234},[169,13899,13900,13908],{},[40,13901,7598,13902,7602,13904,213,13906,408],{},[43,13903,7601],{},[43,13905,7605],{},[43,13907,7608],{},[40,13909,7611,13910,7614],{},[43,13911,6820],{},[10,13913,249],{},[14,13915,252],{"id":252},[10,13917,7621],{},[257,13919,259],{},{"title":68,"searchDepth":81,"depth":81,"links":13921},[13922,13923,13924,13925,13926,13930,13931,13932],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":13927},[13928,13929],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":7360,"description":7365},[272,7644,7645],{"id":7648,"title":7649,"body":13937,"category":272,"cover":273,"description":7654,"extension":274,"meta":14088,"navigation":102,"path":7831,"pinned":277,"publishedAt":278,"seo":14089,"slug":7833,"stem":7834,"summary":7835,"tags":14090,"updatedAt":278,"visible":102,"__hash__":7838},{"type":7,"value":13938,"toc":14078},[13939,13941,13943,13945,13947,13951,13955,13957,13969,13971,13973,14021,14023,14028,14030,14032,14042,14044,14054,14056,14070,14072,14074,14076],[10,13940,7654],{},[14,13942,16],{"id":16},[10,13944,7659],{},[14,13946,22],{"id":22},[10,13948,13949],{},[26,13950],{"alt":7666,"src":7667},[10,13952,7670,13953,7673],{},[43,13954,6830],{},[14,13956,35],{"id":35},[37,13958,13959,13963,13967],{},[40,13960,13961,7682],{},[43,13962,6830],{},[40,13964,13965,7688],{},[43,13966,7687],{},[40,13968,7691],{},[14,13970,58],{"id":58},[10,13972,61],{},[63,13974,13975],{"className":65,"code":7698,"language":67,"meta":68,"style":68},[43,13976,13977,13981,13985,13989,13993,13997,14001,14005,14009,14013,14017],{"__ignoreMap":68},[72,13978,13979],{"class":74,"line":75},[72,13980,6642],{},[72,13982,13983],{"class":74,"line":81},[72,13984,103],{"emptyLinePlaceholder":102},[72,13986,13987],{"class":74,"line":87},[72,13988,6853],{},[72,13990,13991],{"class":74,"line":93},[72,13992,103],{"emptyLinePlaceholder":102},[72,13994,13995],{"class":74,"line":99},[72,13996,7721],{},[72,13998,13999],{"class":74,"line":106},[72,14000,7726],{},[72,14002,14003],{"class":74,"line":112},[72,14004,103],{"emptyLinePlaceholder":102},[72,14006,14007],{"class":74,"line":118},[72,14008,7735],{},[72,14010,14011],{"class":74,"line":124},[72,14012,7740],{},[72,14014,14015],{"class":74,"line":130},[72,14016,103],{"emptyLinePlaceholder":102},[72,14018,14019],{"class":74,"line":135},[72,14020,7749],{},[10,14022,153],{},[63,14024,14026],{"className":14025,"code":7755,"language":159,"meta":68},[157],[43,14027,7755],{"__ignoreMap":68},[10,14029,164],{},[14,14031,167],{"id":167},[169,14033,14034,14040],{},[40,14035,7670,14036,7768,14038,408],{},[43,14037,6830],{},[43,14039,7771],{},[40,14041,7774],{},[14,14043,220],{"id":220},[37,14045,14046,14050],{},[40,14047,4829,14048,7783],{},[43,14049,6830],{},[40,14051,7786,14052,7789],{},[43,14053,6830],{},[14,14055,234],{"id":234},[169,14057,14058,14064],{},[40,14059,7796,14060,7800,14062,408],{},[43,14061,7799],{},[43,14063,6830],{},[40,14065,4829,14066,7807,14068,408],{},[43,14067,6830],{},[43,14069,7810],{},[10,14071,249],{},[14,14073,252],{"id":252},[10,14075,7817],{},[257,14077,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14079},[14080,14081,14082,14083,14084,14085,14086,14087],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":7649,"description":7654},[272,6830,7837],{"id":4,"title":5,"body":14092,"category":272,"cover":273,"description":12,"extension":274,"meta":14263,"navigation":102,"path":276,"pinned":277,"publishedAt":278,"seo":14264,"slug":280,"stem":281,"summary":282,"tags":14265,"updatedAt":278,"visible":102,"__hash__":286},{"type":7,"value":14093,"toc":14251},[14094,14096,14098,14100,14102,14106,14108,14110,14122,14124,14126,14182,14184,14189,14191,14193,14209,14211,14213,14217,14223,14225,14233,14235,14243,14245,14247,14249],[10,14095,12],{},[14,14097,16],{"id":16},[10,14099,19],{},[14,14101,22],{"id":22},[10,14103,14104],{},[26,14105],{"alt":28,"src":29},[10,14107,32],{},[14,14109,35],{"id":35},[37,14111,14112,14116,14120],{},[40,14113,14114,46],{},[43,14115,45],{},[40,14117,14118,52],{},[43,14119,51],{},[40,14121,55],{},[14,14123,58],{"id":58},[10,14125,61],{},[63,14127,14128],{"className":65,"code":66,"language":67,"meta":68,"style":68},[43,14129,14130,14134,14138,14142,14146,14150,14154,14158,14162,14166,14170,14174,14178],{"__ignoreMap":68},[72,14131,14132],{"class":74,"line":75},[72,14133,78],{},[72,14135,14136],{"class":74,"line":81},[72,14137,84],{},[72,14139,14140],{"class":74,"line":87},[72,14141,90],{},[72,14143,14144],{"class":74,"line":93},[72,14145,96],{},[72,14147,14148],{"class":74,"line":99},[72,14149,103],{"emptyLinePlaceholder":102},[72,14151,14152],{"class":74,"line":106},[72,14153,109],{},[72,14155,14156],{"class":74,"line":112},[72,14157,115],{},[72,14159,14160],{"class":74,"line":118},[72,14161,121],{},[72,14163,14164],{"class":74,"line":124},[72,14165,127],{},[72,14167,14168],{"class":74,"line":130},[72,14169,103],{"emptyLinePlaceholder":102},[72,14171,14172],{"class":74,"line":135},[72,14173,138],{},[72,14175,14176],{"class":74,"line":141},[72,14177,144],{},[72,14179,14180],{"class":74,"line":147},[72,14181,150],{},[10,14183,153],{},[63,14185,14187],{"className":14186,"code":158,"language":159,"meta":68},[157],[43,14188,158],{"__ignoreMap":68},[10,14190,164],{},[14,14192,167],{"id":167},[169,14194,14195,14201],{},[40,14196,173,14197,177,14199,180],{},[43,14198,176],{},[43,14200,51],{},[40,14202,14203,186,14205,190,14207,193],{},[43,14204,185],{},[43,14206,189],{},[43,14208,45],{},[195,14210,197],{"id":197},[10,14212,200],{},[10,14214,14215],{},[26,14216],{"alt":205,"src":206},[10,14218,209,14219,213,14221,217],{},[43,14220,212],{},[43,14222,216],{},[14,14224,220],{"id":220},[37,14226,14227,14231],{},[40,14228,225,14229,228],{},[43,14230,45],{},[40,14232,231],{},[14,14234,234],{"id":234},[169,14236,14237,14241],{},[40,14238,239,14239,243],{},[43,14240,242],{},[40,14242,246],{},[10,14244,249],{},[14,14246,252],{"id":252},[10,14248,255],{},[257,14250,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14252},[14253,14254,14255,14256,14257,14260,14261,14262],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":14258},[14259],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":5,"description":12},[272,284,285],{"id":8015,"title":8016,"body":14267,"category":272,"cover":273,"description":8021,"extension":274,"meta":14414,"navigation":102,"path":8200,"pinned":277,"publishedAt":278,"seo":14415,"slug":8202,"stem":8203,"summary":8204,"tags":14416,"updatedAt":278,"visible":102,"__hash__":8208},{"type":7,"value":14268,"toc":14404},[14269,14271,14273,14275,14277,14281,14283,14285,14293,14295,14297,14353,14355,14360,14362,14364,14376,14378,14384,14386,14396,14398,14400,14402],[10,14270,8021],{},[14,14272,16],{"id":16},[10,14274,8026],{},[14,14276,22],{"id":22},[10,14278,14279],{},[26,14280],{"alt":8033,"src":8034},[10,14282,8037],{},[14,14284,35],{"id":35},[37,14286,14287,14289,14291],{},[40,14288,8044],{},[40,14290,8047],{},[40,14292,8050],{},[14,14294,58],{"id":58},[10,14296,61],{},[63,14298,14299],{"className":65,"code":8057,"language":67,"meta":68,"style":68},[43,14300,14301,14305,14309,14313,14317,14321,14325,14329,14333,14337,14341,14345,14349],{"__ignoreMap":68},[72,14302,14303],{"class":74,"line":75},[72,14304,8064],{},[72,14306,14307],{"class":74,"line":81},[72,14308,8069],{},[72,14310,14311],{"class":74,"line":87},[72,14312,8074],{},[72,14314,14315],{"class":74,"line":93},[72,14316,103],{"emptyLinePlaceholder":102},[72,14318,14319],{"class":74,"line":99},[72,14320,8083],{},[72,14322,14323],{"class":74,"line":106},[72,14324,8088],{},[72,14326,14327],{"class":74,"line":112},[72,14328,8093],{},[72,14330,14331],{"class":74,"line":118},[72,14332,103],{"emptyLinePlaceholder":102},[72,14334,14335],{"class":74,"line":124},[72,14336,8102],{},[72,14338,14339],{"class":74,"line":130},[72,14340,8107],{},[72,14342,14343],{"class":74,"line":135},[72,14344,103],{"emptyLinePlaceholder":102},[72,14346,14347],{"class":74,"line":141},[72,14348,8116],{},[72,14350,14351],{"class":74,"line":147},[72,14352,8121],{},[10,14354,153],{},[63,14356,14358],{"className":14357,"code":8127,"language":159,"meta":68},[157],[43,14359,8127],{"__ignoreMap":68},[10,14361,164],{},[14,14363,167],{"id":167},[169,14365,14366,14372],{},[40,14367,14368,8141,14370,8145],{},[43,14369,8140],{},[43,14371,8144],{},[40,14373,8148,14374,8152],{},[43,14375,8151],{},[14,14377,220],{"id":220},[37,14379,14380,14382],{},[40,14381,8159],{},[40,14383,8162],{},[14,14385,234],{"id":234},[169,14387,14388,14394],{},[40,14389,8169,14390,8173,14392,408],{},[43,14391,8172],{},[43,14393,8176],{},[40,14395,8179],{},[10,14397,249],{},[14,14399,252],{"id":252},[10,14401,8186],{},[257,14403,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14405},[14406,14407,14408,14409,14410,14411,14412,14413],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":8016,"description":8021},[272,8206,8207],{"id":8210,"title":8211,"body":14418,"category":272,"cover":273,"description":8216,"extension":274,"meta":14581,"navigation":102,"path":8420,"pinned":277,"publishedAt":278,"seo":14582,"slug":8422,"stem":8423,"summary":8424,"tags":14583,"updatedAt":278,"visible":102,"__hash__":8428},{"type":7,"value":14419,"toc":14569},[14420,14422,14424,14426,14428,14432,14436,14438,14454,14456,14458,14502,14504,14509,14511,14513,14527,14529,14533,14537,14541,14543,14549,14551,14561,14563,14565,14567],[10,14421,8216],{},[14,14423,16],{"id":16},[10,14425,8221],{},[14,14427,22],{"id":22},[10,14429,14430],{},[26,14431],{"alt":8228,"src":8229},[10,14433,8232,14434,8236],{},[43,14435,8235],{},[14,14437,35],{"id":35},[37,14439,14440,14446,14452],{},[40,14441,14442,8246,14444,8250],{},[43,14443,8245],{},[43,14445,8249],{},[40,14447,8253,14448,8257,14450,8260],{},[43,14449,8256],{},[43,14451,4381],{},[40,14453,8263],{},[14,14455,58],{"id":58},[10,14457,61],{},[63,14459,14460],{"className":65,"code":8270,"language":67,"meta":68,"style":68},[43,14461,14462,14466,14470,14474,14478,14482,14486,14490,14494,14498],{"__ignoreMap":68},[72,14463,14464],{"class":74,"line":75},[72,14465,8277],{},[72,14467,14468],{"class":74,"line":81},[72,14469,8282],{},[72,14471,14472],{"class":74,"line":87},[72,14473,8287],{},[72,14475,14476],{"class":74,"line":93},[72,14477,8292],{},[72,14479,14480],{"class":74,"line":99},[72,14481,8297],{},[72,14483,14484],{"class":74,"line":106},[72,14485,103],{"emptyLinePlaceholder":102},[72,14487,14488],{"class":74,"line":112},[72,14489,8306],{},[72,14491,14492],{"class":74,"line":118},[72,14493,8311],{},[72,14495,14496],{"class":74,"line":124},[72,14497,8311],{},[72,14499,14500],{"class":74,"line":130},[72,14501,8311],{},[10,14503,153],{},[63,14505,14507],{"className":14506,"code":8325,"language":159,"meta":68},[157],[43,14508,8325],{"__ignoreMap":68},[10,14510,164],{},[14,14512,167],{"id":167},[169,14514,14515,14519],{},[40,14516,173,14517,8339],{},[43,14518,8338],{},[40,14520,8342,14521,8345,14523,8348,14525,8352],{},[43,14522,8249],{},[43,14524,8235],{},[43,14526,8351],{},[195,14528,197],{"id":197},[10,14530,8357,14531,8360],{},[43,14532,8249],{},[10,14534,14535],{},[26,14536],{"alt":8365,"src":8366},[10,14538,8369,14539,8372],{},[43,14540,8235],{},[14,14542,220],{"id":220},[37,14544,14545,14547],{},[40,14546,8379],{},[40,14548,8382],{},[14,14550,234],{"id":234},[169,14552,14553,14555],{},[40,14554,8389],{},[40,14556,4054,14557,8394,14559,8397],{},[43,14558,4381],{},[43,14560,8249],{},[10,14562,249],{},[14,14564,252],{"id":252},[10,14566,8404],{},[257,14568,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14570},[14571,14572,14573,14574,14575,14578,14579,14580],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":14576},[14577],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":8211,"description":8216},[272,8426,8427],{"id":8430,"title":8431,"body":14585,"category":272,"cover":273,"description":8436,"extension":274,"meta":14768,"navigation":102,"path":8661,"pinned":277,"publishedAt":278,"seo":14769,"slug":8663,"stem":8664,"summary":8665,"tags":14770,"updatedAt":278,"visible":102,"__hash__":8668},{"type":7,"value":14586,"toc":14756},[14587,14589,14591,14593,14595,14599,14601,14603,14617,14619,14621,14689,14691,14696,14698,14700,14714,14716,14718,14722,14728,14730,14738,14740,14748,14750,14752,14754],[10,14588,8436],{},[14,14590,16],{"id":16},[10,14592,8441],{},[14,14594,22],{"id":22},[10,14596,14597],{},[26,14598],{"alt":8448,"src":8449},[10,14600,8452],{},[14,14602,35],{"id":35},[37,14604,14605,14611,14613],{},[40,14606,14607,8462,14609,408],{},[43,14608,8461],{},[43,14610,8465],{},[40,14612,8468],{},[40,14614,14615,8474],{},[43,14616,8473],{},[14,14618,58],{"id":58},[10,14620,61],{},[63,14622,14623],{"className":65,"code":8481,"language":67,"meta":68,"style":68},[43,14624,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661,14665,14669,14673,14677,14681,14685],{"__ignoreMap":68},[72,14626,14627],{"class":74,"line":75},[72,14628,8488],{},[72,14630,14631],{"class":74,"line":81},[72,14632,103],{"emptyLinePlaceholder":102},[72,14634,14635],{"class":74,"line":87},[72,14636,8497],{},[72,14638,14639],{"class":74,"line":93},[72,14640,8502],{},[72,14642,14643],{"class":74,"line":99},[72,14644,8507],{},[72,14646,14647],{"class":74,"line":106},[72,14648,8512],{},[72,14650,14651],{"class":74,"line":112},[72,14652,8517],{},[72,14654,14655],{"class":74,"line":118},[72,14656,8522],{},[72,14658,14659],{"class":74,"line":124},[72,14660,8527],{},[72,14662,14663],{"class":74,"line":130},[72,14664,8532],{},[72,14666,14667],{"class":74,"line":135},[72,14668,103],{"emptyLinePlaceholder":102},[72,14670,14671],{"class":74,"line":141},[72,14672,8541],{},[72,14674,14675],{"class":74,"line":147},[72,14676,6221],{},[72,14678,14679],{"class":74,"line":7483},[72,14680,6226],{},[72,14682,14683],{"class":74,"line":8552},[72,14684,103],{"emptyLinePlaceholder":102},[72,14686,14687],{"class":74,"line":8557},[72,14688,8560],{},[10,14690,153],{},[63,14692,14694],{"className":14693,"code":8566,"language":159,"meta":68},[157],[43,14695,8566],{"__ignoreMap":68},[10,14697,164],{},[14,14699,167],{"id":167},[169,14701,14702,14712],{},[40,14703,8577,14704,8581,14706,8585,14708,8589,14710,408],{},[43,14705,8580],{},[43,14707,8584],{},[43,14709,8588],{},[43,14711,8580],{},[40,14713,8594],{},[195,14715,197],{"id":197},[10,14717,8599],{},[10,14719,14720],{},[26,14721],{"alt":8604,"src":8605},[10,14723,14724,8610,14726,408],{},[43,14725,8461],{},[43,14727,8465],{},[14,14729,220],{"id":220},[37,14731,14732,14736],{},[40,14733,8619,14734,408],{},[43,14735,5421],{},[40,14737,8624],{},[14,14739,234],{"id":234},[169,14741,14742,14744],{},[40,14743,8631],{},[40,14745,8634,14746,8638],{},[43,14747,8637],{},[10,14749,249],{},[14,14751,252],{"id":252},[10,14753,8645],{},[257,14755,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14757},[14758,14759,14760,14761,14762,14765,14766,14767],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":14763},[14764],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":8431,"description":8436},[272,8667,5372],{"id":8670,"title":8671,"body":14772,"category":272,"cover":273,"description":8676,"extension":274,"meta":14931,"navigation":102,"path":8864,"pinned":277,"publishedAt":278,"seo":14932,"slug":8866,"stem":8867,"summary":8868,"tags":14933,"updatedAt":278,"visible":102,"__hash__":8872},{"type":7,"value":14773,"toc":14919},[14774,14776,14778,14780,14782,14786,14788,14790,14798,14800,14802,14866,14868,14873,14875,14877,14885,14887,14889,14893,14895,14897,14903,14905,14911,14913,14915,14917],[10,14775,8676],{},[14,14777,16],{"id":16},[10,14779,8681],{},[14,14781,22],{"id":22},[10,14783,14784],{},[26,14785],{"alt":8688,"src":8689},[10,14787,8692],{},[14,14789,35],{"id":35},[37,14791,14792,14794,14796],{},[40,14793,8699],{},[40,14795,8702],{},[40,14797,8705],{},[14,14799,58],{"id":58},[10,14801,61],{},[63,14803,14804],{"className":65,"code":8712,"language":67,"meta":68,"style":68},[43,14805,14806,14810,14814,14818,14822,14826,14830,14834,14838,14842,14846,14850,14854,14858,14862],{"__ignoreMap":68},[72,14807,14808],{"class":74,"line":75},[72,14809,8719],{},[72,14811,14812],{"class":74,"line":81},[72,14813,8724],{},[72,14815,14816],{"class":74,"line":87},[72,14817,103],{"emptyLinePlaceholder":102},[72,14819,14820],{"class":74,"line":93},[72,14821,8733],{},[72,14823,14824],{"class":74,"line":99},[72,14825,103],{"emptyLinePlaceholder":102},[72,14827,14828],{"class":74,"line":106},[72,14829,8742],{},[72,14831,14832],{"class":74,"line":112},[72,14833,8747],{},[72,14835,14836],{"class":74,"line":118},[72,14837,8752],{},[72,14839,14840],{"class":74,"line":124},[72,14841,103],{"emptyLinePlaceholder":102},[72,14843,14844],{"class":74,"line":130},[72,14845,8761],{},[72,14847,14848],{"class":74,"line":135},[72,14849,8766],{},[72,14851,14852],{"class":74,"line":141},[72,14853,8771],{},[72,14855,14856],{"class":74,"line":147},[72,14857,103],{"emptyLinePlaceholder":102},[72,14859,14860],{"class":74,"line":7483},[72,14861,6235],{},[72,14863,14864],{"class":74,"line":8552},[72,14865,8784],{},[10,14867,153],{},[63,14869,14871],{"className":14870,"code":8790,"language":159,"meta":68},[157],[43,14872,8790],{"__ignoreMap":68},[10,14874,164],{},[14,14876,167],{"id":167},[169,14878,14879,14883],{},[40,14880,14881,8804],{},[43,14882,8803],{},[40,14884,8807],{},[195,14886,197],{"id":197},[10,14888,8812],{},[10,14890,14891],{},[26,14892],{"alt":8817,"src":8818},[10,14894,8821],{},[14,14896,220],{"id":220},[37,14898,14899,14901],{},[40,14900,8828],{},[40,14902,8831],{},[14,14904,234],{"id":234},[169,14906,14907,14909],{},[40,14908,8838],{},[40,14910,8841],{},[10,14912,249],{},[14,14914,252],{"id":252},[10,14916,8848],{},[257,14918,259],{},{"title":68,"searchDepth":81,"depth":81,"links":14920},[14921,14922,14923,14924,14925,14928,14929,14930],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":14926},[14927],{"id":197,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":8671,"description":8676},[272,8870,8871],{"id":8874,"title":8875,"body":14935,"category":272,"cover":273,"description":8880,"extension":274,"meta":15173,"navigation":102,"path":9181,"pinned":277,"publishedAt":278,"seo":15174,"slug":9183,"stem":9184,"summary":9185,"tags":15175,"updatedAt":278,"visible":102,"__hash__":9189},{"type":7,"value":14936,"toc":15160},[14937,14939,14941,14943,14945,14949,14951,14953,14963,14965,14967,15083,15085,15090,15092,15094,15104,15106,15108,15112,15114,15116,15118,15122,15126,15128,15136,15138,15152,15154,15156,15158],[10,14938,8880],{},[14,14940,16],{"id":16},[10,14942,8885],{},[14,14944,22],{"id":22},[10,14946,14947],{},[26,14948],{"alt":8892,"src":8893},[10,14950,8896],{},[14,14952,35],{"id":35},[37,14954,14955,14957,14959],{},[40,14956,8903],{},[40,14958,8906],{},[40,14960,8909,14961,8913],{},[43,14962,8912],{},[14,14964,58],{"id":58},[10,14966,61],{},[63,14968,14969],{"className":65,"code":8920,"language":67,"meta":68,"style":68},[43,14970,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047,15051,15055,15059,15063,15067,15071,15075,15079],{"__ignoreMap":68},[72,14972,14973],{"class":74,"line":75},[72,14974,7033],{},[72,14976,14977],{"class":74,"line":81},[72,14978,6642],{},[72,14980,14981],{"class":74,"line":87},[72,14982,103],{"emptyLinePlaceholder":102},[72,14984,14985],{"class":74,"line":93},[72,14986,8939],{},[72,14988,14989],{"class":74,"line":99},[72,14990,8944],{},[72,14992,14993],{"class":74,"line":106},[72,14994,8949],{},[72,14996,14997],{"class":74,"line":112},[72,14998,8954],{},[72,15000,15001],{"class":74,"line":118},[72,15002,103],{"emptyLinePlaceholder":102},[72,15004,15005],{"class":74,"line":124},[72,15006,8963],{},[72,15008,15009],{"class":74,"line":130},[72,15010,8968],{},[72,15012,15013],{"class":74,"line":135},[72,15014,8973],{},[72,15016,15017],{"class":74,"line":141},[72,15018,8978],{},[72,15020,15021],{"class":74,"line":147},[72,15022,8983],{},[72,15024,15025],{"class":74,"line":7483},[72,15026,103],{"emptyLinePlaceholder":102},[72,15028,15029],{"class":74,"line":8552},[72,15030,8992],{},[72,15032,15033],{"class":74,"line":8557},[72,15034,8997],{},[72,15036,15037],{"class":74,"line":9000},[72,15038,9003],{},[72,15040,15041],{"class":74,"line":9006},[72,15042,103],{"emptyLinePlaceholder":102},[72,15044,15045],{"class":74,"line":9011},[72,15046,9014],{},[72,15048,15049],{"class":74,"line":9017},[72,15050,103],{"emptyLinePlaceholder":102},[72,15052,15053],{"class":74,"line":9022},[72,15054,7451],{},[72,15056,15057],{"class":74,"line":9027},[72,15058,9030],{},[72,15060,15061],{"class":74,"line":9033},[72,15062,9036],{},[72,15064,15065],{"class":74,"line":9039},[72,15066,9042],{},[72,15068,15069],{"class":74,"line":9045},[72,15070,7461],{},[72,15072,15073],{"class":74,"line":9050},[72,15074,9053],{},[72,15076,15077],{"class":74,"line":9056},[72,15078,1192],{},[72,15080,15081],{"class":74,"line":9061},[72,15082,9064],{},[10,15084,153],{},[63,15086,15088],{"className":15087,"code":9070,"language":159,"meta":68},[157],[43,15089,9070],{"__ignoreMap":68},[10,15091,164],{},[14,15093,167],{"id":167},[169,15095,15096,15100],{},[40,15097,9081,15098,9084],{},[43,15099,8912],{},[40,15101,15102,9089],{},[43,15103,8144],{},[195,15105,197],{"id":197},[10,15107,9094],{},[10,15109,15110],{},[26,15111],{"alt":9099,"src":9100},[10,15113,9103],{},[195,15115,197],{"id":4262},[10,15117,9108],{},[10,15119,15120],{},[26,15121],{"alt":9113,"src":9114},[10,15123,9117,15124,9121],{},[43,15125,9120],{},[14,15127,220],{"id":220},[37,15129,15130,15132],{},[40,15131,9128],{},[40,15133,9131,15134,9134],{},[43,15135,9120],{},[14,15137,234],{"id":234},[169,15139,15140,15144,15146],{},[40,15141,9141,15142,9144],{},[43,15143,9120],{},[40,15145,9147],{},[40,15147,9150,15148,9154,15150,9157],{},[43,15149,9153],{},[43,15151,6177],{},[10,15153,249],{},[14,15155,252],{"id":252},[10,15157,9164],{},[257,15159,259],{},{"title":68,"searchDepth":81,"depth":81,"links":15161},[15162,15163,15164,15165,15166,15170,15171,15172],{"id":16,"depth":81,"text":16},{"id":22,"depth":81,"text":22},{"id":35,"depth":81,"text":35},{"id":58,"depth":81,"text":58},{"id":167,"depth":81,"text":167,"children":15167},[15168,15169],{"id":197,"depth":87,"text":197},{"id":4262,"depth":87,"text":197},{"id":220,"depth":81,"text":220},{"id":234,"depth":81,"text":234},{"id":252,"depth":81,"text":252},{},{"title":8875,"description":8880},[272,9187,9188],{"id":1102,"title":1103,"body":15177,"category":272,"cover":1111,"description":68,"extension":274,"meta":15413,"navigation":102,"path":1427,"pinned":277,"publishedAt":1428,"seo":15414,"slug":1430,"stem":1431,"summary":1432,"tags":15415,"updatedAt":1428,"visible":102,"__hash__":1436},{"type":7,"value":15178,"toc":15398},[15179,15183,15185,15187,15189,15191,15211,15213,15218,15220,15222,15250,15256,15258,15262,15264,15284,15286,15296,15298,15300,15302,15304,15306,15308,15310,15312,15314,15334,15336,15338,15342,15344,15346,15348,15350,15354,15356,15374,15376,15378,15380,15382,15384,15386,15388,15390,15392,15394,15396],[10,15180,15181],{},[26,15182],{"alt":1110,"src":1111},[10,15184,1114],{},[10,15186,1117],{},[14,15188,1121],{"id":1120},[10,15190,1124],{},[63,15192,15193],{"className":65,"code":1127,"language":67,"meta":68,"style":68},[43,15194,15195,15199,15203,15207],{"__ignoreMap":68},[72,15196,15197],{"class":74,"line":75},[72,15198,1134],{},[72,15200,15201],{"class":74,"line":81},[72,15202,1139],{},[72,15204,15205],{"class":74,"line":87},[72,15206,103],{"emptyLinePlaceholder":102},[72,15208,15209],{"class":74,"line":93},[72,15210,1148],{},[10,15212,1151],{},[63,15214,15216],{"className":15215,"code":1155,"language":159,"meta":68},[157],[43,15217,1155],{"__ignoreMap":68},[10,15219,1160],{},[10,15221,1163],{},[63,15223,15224],{"className":65,"code":1166,"language":67,"meta":68,"style":68},[43,15225,15226,15230,15234,15238,15242,15246],{"__ignoreMap":68},[72,15227,15228],{"class":74,"line":75},[72,15229,1173],{},[72,15231,15232],{"class":74,"line":81},[72,15233,103],{"emptyLinePlaceholder":102},[72,15235,15236],{"class":74,"line":87},[72,15237,1182],{},[72,15239,15240],{"class":74,"line":93},[72,15241,1187],{},[72,15243,15244],{"class":74,"line":99},[72,15245,1192],{},[72,15247,15248],{"class":74,"line":106},[72,15249,1197],{},[10,15251,15252,213,15254,1206],{},[43,15253,1202],{},[43,15255,1205],{},[14,15257,1210],{"id":1209},[10,15259,1213,15260,1217],{},[43,15261,1216],{},[10,15263,1220],{},[63,15265,15266],{"className":65,"code":1223,"language":67,"meta":68,"style":68},[43,15267,15268,15272,15276,15280],{"__ignoreMap":68},[72,15269,15270],{"class":74,"line":75},[72,15271,1230],{},[72,15273,15274],{"class":74,"line":81},[72,15275,1235],{},[72,15277,15278],{"class":74,"line":87},[72,15279,1240],{},[72,15281,15282],{"class":74,"line":93},[72,15283,1245],{},[10,15285,1248],{},[63,15287,15288],{"className":637,"code":1251,"language":639,"meta":68,"style":68},[43,15289,15290],{"__ignoreMap":68},[72,15291,15292,15294],{"class":74,"line":75},[72,15293,737],{"class":646},[72,15295,1260],{"class":682},[10,15297,1263],{},[14,15299,1267],{"id":1266},[195,15301,1270],{"id":1270},[10,15303,1273],{},[195,15305,1276],{"id":1276},[10,15307,1279],{},[195,15309,1282],{"id":1282},[10,15311,1285],{},[10,15313,1288],{},[63,15315,15316],{"className":65,"code":1291,"language":67,"meta":68,"style":68},[43,15317,15318,15322,15326,15330],{"__ignoreMap":68},[72,15319,15320],{"class":74,"line":75},[72,15321,1298],{},[72,15323,15324],{"class":74,"line":81},[72,15325,103],{"emptyLinePlaceholder":102},[72,15327,15328],{"class":74,"line":87},[72,15329,1307],{},[72,15331,15332],{"class":74,"line":93},[72,15333,1312],{},[10,15335,1315],{},[195,15337,1318],{"id":1318},[10,15339,1321,15340,1324],{},[43,15341,307],{},[10,15343,1327],{},[195,15345,1330],{"id":1330},[10,15347,1333],{},[14,15349,1337],{"id":1336},[10,15351,15352],{},[26,15353],{"alt":1342,"src":1343},[10,15355,1346],{},[37,15357,15358,15360,15362,15364,15366,15368,15370,15372],{},[40,15359,1351],{},[40,15361,1354],{},[40,15363,1357],{},[40,15365,1360],{},[40,15367,1363],{},[40,15369,1366],{},[40,15371,1369],{},[40,15373,1372],{},[10,15375,1375],{},[14,15377,1379],{"id":1378},[10,15379,1382],{},[10,15381,1385],{},[14,15383,1389],{"id":1388},[10,15385,1392],{},[10,15387,1395],{},[10,15389,1398],{},[14,15391,1401],{"id":1401},[10,15393,1404],{},[10,15395,1407],{},[257,15397,1410],{},{"title":68,"searchDepth":81,"depth":81,"links":15399},[15400,15401,15402,15409,15410,15411,15412],{"id":1120,"depth":81,"text":1121},{"id":1209,"depth":81,"text":1210},{"id":1266,"depth":81,"text":1267,"children":15403},[15404,15405,15406,15407,15408],{"id":1270,"depth":87,"text":1270},{"id":1276,"depth":87,"text":1276},{"id":1282,"depth":87,"text":1282},{"id":1318,"depth":87,"text":1318},{"id":1330,"depth":87,"text":1330},{"id":1336,"depth":81,"text":1337},{"id":1378,"depth":81,"text":1379},{"id":1388,"depth":81,"text":1389},{"id":1401,"depth":81,"text":1401},{},{"title":1103,"description":68},[272,1434,1435],{"id":289,"title":290,"body":15417,"category":272,"cover":273,"description":68,"extension":274,"meta":15996,"navigation":102,"path":1091,"pinned":277,"publishedAt":1092,"seo":15997,"slug":1094,"stem":1095,"summary":1096,"tags":15998,"updatedAt":1092,"visible":102,"__hash__":1100},{"type":7,"value":15418,"toc":15972},[15419,15421,15423,15425,15429,15431,15433,15457,15469,15471,15473,15478,15482,15486,15498,15502,15506,15510,15512,15546,15548,15552,15556,15558,15580,15610,15622,15632,15640,15642,15648,15658,15660,15665,15669,15671,15685,15691,15711,15713,15715,15717,15727,15731,15733,15742,15746,15748,15750,15770,15774,15776,15778,15780,15782,15802,15804,15806,15808,15834,15836,15852,15854,15870,15874,15876,15878,15898,15900,15902,15904,15908,15918,15920,15922,15924,15934,15942,15944,15946,15960,15970],[14,15420,295],{"id":295},[10,15422,298],{},[10,15424,301],{},[10,15426,304,15427,308],{},[43,15428,307],{},[14,15430,311],{"id":311},[10,15432,314],{},[316,15434,15435,15437],{},[10,15436,320],{},[316,15438,15439,15445,15447,15451,15453],{},[10,15440,325,15441,329,15443,333],{},[43,15442,328],{},[43,15444,332],{},[10,15446,336],{},[10,15448,339,15449,344],{},[341,15450,343],{},[10,15452,347],{},[10,15454,15455],{},[26,15456],{"alt":352,"src":353},[316,15458,15459,15461],{},[10,15460,358],{},[316,15462,15463,15465],{},[10,15464,363],{},[10,15466,15467],{},[26,15468],{"alt":368,"src":369},[14,15470,373],{"id":372},[195,15472,377],{"id":376},[10,15474,380,15475,388],{},[382,15476,387],{"href":384,"rel":15477},[386],[316,15479,15480],{},[10,15481,393],{},[10,15483,15484],{},[26,15485],{"alt":398,"src":399},[37,15487,15488,15492,15496],{},[40,15489,404,15490,408],{},[341,15491,407],{},[40,15493,411,15494,408],{},[341,15495,414],{},[40,15497,417],{},[10,15499,15500],{},[26,15501],{"alt":422,"src":423},[316,15503,15504],{},[10,15505,428],{},[10,15507,15508],{},[26,15509],{"alt":433,"src":434},[195,15511,438],{"id":437},[316,15513,15514,15518,15522,15542],{},[316,15515,15516],{},[10,15517,445],{},[10,15519,448,15520,452],{},[341,15521,451],{},[63,15523,15524],{"className":65,"code":455,"language":67,"meta":68,"style":68},[43,15525,15526,15530,15534,15538],{"__ignoreMap":68},[72,15527,15528],{"class":74,"line":75},[72,15529,462],{},[72,15531,15532],{"class":74,"line":81},[72,15533,467],{},[72,15535,15536],{"class":74,"line":87},[72,15537,472],{},[72,15539,15540],{"class":74,"line":93},[72,15541,477],{},[10,15543,480,15544,484],{},[341,15545,483],{},[10,15547,487],{},[10,15549,490,15550,493],{},[43,15551,67],{},[10,15553,15554],{},[26,15555],{"alt":498,"src":499},[10,15557,502],{},[316,15559,15560,15562,15566],{},[10,15561,507],{},[10,15563,15564],{},[341,15565,512],{},[316,15567,15568,15572,15576],{},[10,15569,517,15570,520],{},[43,15571,67],{},[10,15573,523,15574,526],{},[43,15575,67],{},[10,15577,529,15578,533],{},[341,15579,532],{},[316,15581,15582,15584,15588],{},[10,15583,538],{},[10,15585,15586],{},[341,15587,543],{},[316,15589,15590,15596,15604,15606],{},[10,15591,15592,551,15594,555],{},[43,15593,550],{},[43,15595,554],{},[10,15597,558,15598,561,15600,565,15602,569],{},[43,15599,550],{},[341,15601,564],{},[341,15603,568],{},[10,15605,572],{},[10,15607,15608,578],{},[341,15609,577],{},[316,15611,15612,15614],{},[10,15613,583],{},[316,15615,15616,15620],{},[10,15617,588,15618,592],{},[341,15619,591],{},[10,15621,595],{},[316,15623,15624,15628],{},[10,15625,600,15626],{},[341,15627,603],{},[10,15629,15630],{},[26,15631],{"alt":608,"src":609},[316,15633,15634,15636],{},[10,15635,614],{},[10,15637,15638],{},[26,15639],{"alt":608,"src":619},[195,15641,623],{"id":622},[10,15643,626,15644,630,15646,634],{},[43,15645,629],{},[43,15647,633],{},[63,15649,15650],{"className":637,"code":638,"language":639,"meta":68,"style":68},[43,15651,15652],{"__ignoreMap":68},[72,15653,15654,15656],{"class":74,"line":75},[72,15655,67],{"class":646},[72,15657,650],{"class":649},[10,15659,653],{},[63,15661,15663],{"className":15662,"code":657,"language":159,"meta":68},[157],[43,15664,657],{"__ignoreMap":68},[10,15666,15667],{},[26,15668],{"alt":608,"src":664},[10,15670,667],{},[63,15672,15673],{"className":637,"code":670,"language":639,"meta":68,"style":68},[43,15674,15675],{"__ignoreMap":68},[72,15676,15677,15679,15681,15683],{"class":74,"line":75},[72,15678,67],{"class":646},[72,15680,679],{"class":649},[72,15682,683],{"class":682},[72,15684,650],{"class":649},[10,15686,688,15687,691,15689,695],{},[43,15688,67],{},[43,15690,694],{},[63,15692,15693],{"className":637,"code":698,"language":639,"meta":68,"style":68},[43,15694,15695,15701],{"__ignoreMap":68},[72,15696,15697,15699],{"class":74,"line":75},[72,15698,554],{"class":646},[72,15700,650],{"class":649},[72,15702,15703,15705,15707,15709],{"class":74,"line":81},[72,15704,554],{"class":646},[72,15706,679],{"class":649},[72,15708,683],{"class":682},[72,15710,650],{"class":649},[14,15712,720],{"id":719},[195,15714,724],{"id":723},[10,15716,727],{},[63,15718,15719],{"className":637,"code":730,"language":639,"meta":68,"style":68},[43,15720,15721],{"__ignoreMap":68},[72,15722,15723,15725],{"class":74,"line":75},[72,15724,737],{"class":646},[72,15726,650],{"class":649},[10,15728,742,15729,746],{},[43,15730,745],{},[195,15732,750],{"id":749},[10,15734,380,15735,758,15738,408,15740,765],{},[382,15736,757],{"href":755,"rel":15737},[386],[341,15739,761],{},[43,15741,764],{},[10,15743,768,15744,772],{},[43,15745,771],{},[195,15747,776],{"id":775},[10,15749,779],{},[63,15751,15752],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,15753,15754,15760],{"__ignoreMap":68},[72,15755,15756,15758],{"class":74,"line":75},[72,15757,737],{"class":646},[72,15759,650],{"class":649},[72,15761,15762,15764,15766,15768],{"class":74,"line":81},[72,15763,737],{"class":646},[72,15765,679],{"class":649},[72,15767,683],{"class":682},[72,15769,650],{"class":649},[10,15771,803,15772,806],{},[43,15773,737],{},[14,15775,810],{"id":809},[10,15777,813],{},[195,15779,817],{"id":816},[10,15781,820],{},[63,15783,15784],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,15785,15786,15792],{"__ignoreMap":68},[72,15787,15788,15790],{"class":74,"line":75},[72,15789,737],{"class":646},[72,15791,650],{"class":649},[72,15793,15794,15796,15798,15800],{"class":74,"line":81},[72,15795,737],{"class":646},[72,15797,679],{"class":649},[72,15799,683],{"class":682},[72,15801,650],{"class":649},[10,15803,843],{},[195,15805,847],{"id":846},[10,15807,850],{},[63,15809,15810],{"className":637,"code":853,"language":639,"meta":68,"style":68},[43,15811,15812,15820],{"__ignoreMap":68},[72,15813,15814,15816,15818],{"class":74,"line":75},[72,15815,860],{"class":646},[72,15817,863],{"class":682},[72,15819,866],{"class":682},[72,15821,15822,15824,15826,15828,15830,15832],{"class":74,"line":81},[72,15823,860],{"class":646},[72,15825,863],{"class":682},[72,15827,875],{"class":682},[72,15829,878],{"class":682},[72,15831,881],{"class":682},[72,15833,884],{"class":682},[10,15835,887],{},[63,15837,15838],{"className":637,"code":890,"language":639,"meta":68,"style":68},[43,15839,15840],{"__ignoreMap":68},[72,15841,15842,15844,15846,15848,15850],{"class":74,"line":75},[72,15843,860],{"class":646},[72,15845,899],{"class":682},[72,15847,875],{"class":682},[72,15849,878],{"class":682},[72,15851,906],{"class":682},[10,15853,909],{},[63,15855,15856],{"className":637,"code":912,"language":639,"meta":68,"style":68},[43,15857,15858],{"__ignoreMap":68},[72,15859,15860,15862,15864,15866,15868],{"class":74,"line":75},[72,15861,860],{"class":646},[72,15863,921],{"class":682},[72,15865,924],{"class":649},[72,15867,927],{"class":682},[72,15869,930],{"class":682},[10,15871,15872,935],{},[43,15873,860],{},[195,15875,939],{"id":938},[10,15877,942],{},[63,15879,15880],{"className":637,"code":782,"language":639,"meta":68,"style":68},[43,15881,15882,15888],{"__ignoreMap":68},[72,15883,15884,15886],{"class":74,"line":75},[72,15885,737],{"class":646},[72,15887,650],{"class":649},[72,15889,15890,15892,15894,15896],{"class":74,"line":81},[72,15891,737],{"class":646},[72,15893,679],{"class":649},[72,15895,683],{"class":682},[72,15897,650],{"class":649},[10,15899,965],{},[14,15901,968],{"id":968},[195,15903,972],{"id":971},[10,15905,975,15906,979],{},[43,15907,978],{},[169,15909,15910,15914,15916],{},[40,15911,984,15912,987],{},[43,15913,694],{},[40,15915,990],{},[40,15917,993],{},[10,15919,996],{},[195,15921,1000],{"id":999},[10,15923,1003],{},[63,15925,15926],{"className":637,"code":730,"language":639,"meta":68,"style":68},[43,15927,15928],{"__ignoreMap":68},[72,15929,15930,15932],{"class":74,"line":75},[72,15931,737],{"class":646},[72,15933,650],{"class":649},[10,15935,1016,15936,1019,15938,1022,15940,408],{},[43,15937,737],{},[43,15939,67],{},[43,15941,737],{},[195,15943,1028],{"id":1027},[10,15945,1031],{},[63,15947,15948],{"className":637,"code":1034,"language":639,"meta":68,"style":68},[43,15949,15950],{"__ignoreMap":68},[72,15951,15952,15954,15956,15958],{"class":74,"line":75},[72,15953,737],{"class":646},[72,15955,679],{"class":649},[72,15957,683],{"class":682},[72,15959,650],{"class":649},[10,15961,1049,15962,1052,15964,1055,15966,1058,15968,1062],{},[43,15963,737],{},[43,15965,67],{},[43,15967,554],{},[43,15969,1061],{},[257,15971,1065],{},{"title":68,"searchDepth":81,"depth":81,"links":15973},[15974,15975,15976,15981,15986,15991],{"id":295,"depth":81,"text":295},{"id":311,"depth":81,"text":311},{"id":372,"depth":81,"text":373,"children":15977},[15978,15979,15980],{"id":376,"depth":87,"text":377},{"id":437,"depth":87,"text":438},{"id":622,"depth":87,"text":623},{"id":719,"depth":81,"text":720,"children":15982},[15983,15984,15985],{"id":723,"depth":87,"text":724},{"id":749,"depth":87,"text":750},{"id":775,"depth":87,"text":776},{"id":809,"depth":81,"text":810,"children":15987},[15988,15989,15990],{"id":816,"depth":87,"text":817},{"id":846,"depth":87,"text":847},{"id":938,"depth":87,"text":939},{"id":968,"depth":81,"text":968,"children":15992},[15993,15994,15995],{"id":971,"depth":87,"text":972},{"id":999,"depth":87,"text":1000},{"id":1027,"depth":87,"text":1028},{},{"title":290,"description":68},[272,1098,1099],1786973366386]