[{"data":1,"prerenderedAt":15949},["ShallowReactive",2],{"post-python-literals-expressions-print":3,"sidebar-posts":210,"post-related-source":9140},{"id":4,"title":5,"body":6,"category":194,"cover":195,"description":12,"extension":196,"meta":197,"navigation":198,"path":199,"pinned":200,"publishedAt":201,"seo":202,"slug":203,"stem":204,"summary":205,"tags":206,"updatedAt":201,"visible":198,"__hash__":209},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":8,"toc":184},"minimark",[9,13,17,20,23,30,45,48,70,73,76,105,108,116,119,122,142,145,153,156,171,174,177,180],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 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\u002F05-expression-evaluation.svg",[10,31,32,33,37,38,41,42,37],{},"Python 先计算表达式，再把得到的对象交给 ",[34,35,36],"code",{},"print()","。",[34,39,40],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[34,43,44],{},"2 + 3",[14,46,47],{"id":47},"核心概念",[49,50,51,58,67],"ul",{},[52,53,54,57],"li",{},[34,55,56],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[52,59,60,63,64,37],{},[34,61,62],{},"7 + 5"," 是表达式，运行时先求值得到 ",[34,65,66],{},"12",[52,68,69],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,71,72],{"id":72},"跟着示例运行",[10,74,75],{},"把下面代码保存到本课脚本并运行：",[77,78,83],"pre",{"className":79,"code":80,"language":81,"meta":82,"style":82},"language-python shiki shiki-themes github-dark","print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n","python","",[34,84,85,93,99],{"__ignoreMap":82},[86,87,90],"span",{"class":88,"line":89},"line",1,[86,91,92],{},"print(42)\n",[86,94,96],{"class":88,"line":95},2,[86,97,98],{},"print(7 + 5)\n",[86,100,102],{"class":88,"line":101},3,[86,103,104],{},"print(\"Python 基础课\")\n",[10,106,107],{},"预期结果：",[77,109,114],{"className":110,"code":112,"language":113,"meta":82},[111],"language-text","42\n12\nPython 基础课\n","text",[34,115,112],{"__ignoreMap":82},[10,117,118],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,120,121],{"id":121},"按执行顺序拆开看",[123,124,125,133],"ol",{},[52,126,127,130,131,37],{},[34,128,129],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[34,132,66],{},[52,134,135,137,138,141],{},[34,136,36],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[34,139,140],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,143,144],{"id":144},"初学者容易混淆的地方",[49,146,147,150],{},[52,148,149],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[52,151,152],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,154,155],{"id":155},"练习",[123,157,158,161],{},[52,159,160],{},"分别输出一个整数、一个小数和一段文本。",[52,162,163,164,166,167,170],{},"比较 ",[34,165,40],{}," 与 ",[34,168,169],{},"print(\"2 + 3\")"," 的结果。",[10,172,173],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,175,176],{"id":176},"本篇边界",[10,178,179],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,182,183],"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":82,"searchDepth":95,"depth":95,"links":185},[186,187,188,189,190,191,192,193],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},"Python",null,"md",{},true,"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",false,"2026-08-17",{"title":5,"description":12},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[194,207,208],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",[211,1025,1365,1498,1650,1828,2016,2141,2325,2508,2701,2932,3116,3293,3450,3621,3786,4001,4230,4412,4576,4765,4953,5108,5268,5465,5662,5876,6043,6287,6468,6673,6868,7052,7253,7543,7735,7964,8159,8379,8619,8823],{"id":212,"title":213,"body":214,"category":194,"cover":195,"description":82,"extension":196,"meta":1014,"navigation":198,"path":1015,"pinned":200,"publishedAt":1016,"seo":1017,"slug":1018,"stem":1019,"summary":1020,"tags":1021,"updatedAt":1016,"visible":198,"__hash__":1024},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":215,"toc":990},[216,219,222,225,232,235,238,277,293,297,302,313,318,324,341,347,352,358,362,409,412,418,424,427,458,503,520,534,544,548,559,575,578,584,589,592,610,620,641,645,649,652,664,671,675,690,697,701,704,725,731,735,738,742,745,765,768,772,775,809,812,831,834,855,860,864,867,887,890,893,897,904,918,921,925,928,938,949,953,956,971,987],[14,217,218],{"id":218},"引言",[10,220,221],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,223,224],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,226,227,228,231],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[34,229,230],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,233,234],{"id":234},"扫盲",[10,236,237],{},"那么这里有几个概念：",[239,240,241,244],"blockquote",{},[10,242,243],{},"为什么需要安装python解释器？",[239,245,246,257,260,268,271],{},[10,247,248,249,252,253,256],{},"我们写的代码，电脑其实看不懂，电脑只认识",[34,250,251],{},"0","和",[34,254,255],{},"1","组成的机器指令。",[10,258,259],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,261,262,263,267],{},"这样，我们就能用",[264,265,266],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,269,270],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,272,273],{},[26,274],{"alt":275,"src":276},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[239,278,279,282],{},[10,280,281],{},"pip又是什么？",[239,283,284,287],{},[10,285,286],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,288,289],{},[26,290],{"alt":291,"src":292},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,294,296],{"id":295},"windows-安装","Windows 安装",[298,299,301],"h3",{"id":300},"_1-下载官方安装程序","1. 下载官方安装程序",[10,303,304,305,312],{},"打开 ",[306,307,311],"a",{"href":308,"rel":309},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[310],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[239,314,315],{},[10,316,317],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,319,320],{},[26,321],{"alt":322,"src":323},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[49,325,326,332,338],{},[52,327,328,329,37],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[264,330,331],{},"Windows installer (64-bit)",[52,333,334,335,37],{},"搭载 ARM 处理器的 Windows 设备选择 ",[264,336,337],{},"Windows installer (ARM64)",[52,339,340],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,342,343],{},[26,344],{"alt":345,"src":346},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[239,348,349],{},[10,350,351],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,353,354],{},[26,355],{"alt":356,"src":357},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[298,359,361],{"id":360},"_2-安装并加入-path","2. 安装并加入 PATH",[239,363,364,369,376,402],{},[239,365,366],{},[10,367,368],{},"PATH 环境变量",[10,370,371,372,375],{},"Windows 有一个特殊的变量叫 ",[264,373,374],{},"PATH","，它里面存了一串文件夹路径，比如：",[77,377,379],{"className":79,"code":378,"language":81,"meta":82,"style":82},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[34,380,381,386,391,396],{"__ignoreMap":82},[86,382,383],{"class":88,"line":89},[86,384,385],{},"D:\\Python313\\\n",[86,387,388],{"class":88,"line":95},[86,389,390],{},"D:\\Python313\\Scripts\\\n",[86,392,393],{"class":88,"line":101},[86,394,395],{},"C:\\Windows\\System32\\\n",[86,397,399],{"class":88,"line":398},4,[86,400,401],{},"...\n",[10,403,404,405,408],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[264,406,407],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,410,411],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,413,414,415,417],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[34,416,81],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,419,420],{},[26,421],{"alt":422,"src":423},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,425,426],{},"对安装界面最底部的两个勾选项分别解释 :",[239,428,429,432,437],{},[10,430,431],{},"Add python.exe to PATH",[10,433,434],{},[264,435,436],{},"把 Python 添加到系统环境变量",[239,438,439,445,451],{},[10,440,441,442,444],{},"勾选后，你可以在命令行任意位置直接输入 ",[34,443,81],{}," 就能运行",[10,446,447,448,450],{},"不勾选的话，命令行输入 ",[34,449,81],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,452,453,454,457],{},"必须",[264,455,456],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[239,459,460,463,468],{},[10,461,462],{},"Use admin privileges when installing py.exe",[10,464,465],{},[264,466,467],{},"使用管理员权限安装 py.exe（Python 启动器）",[239,469,470,480,494,497],{},[10,471,472,475,476,479],{},[34,473,474],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[34,477,478],{},"py"," 来启动 Python。",[10,481,482,483,485,486,489,490,493],{},"勾选后，",[34,484,474],{}," 会安装到",[264,487,488],{},"系统级目录","，电脑上",[264,491,492],{},"所有用户账户","都能用",[10,495,496],{},"不勾选，只有当前用户能用",[10,498,499,502],{},[264,500,501],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[239,504,505,508],{},[10,506,507],{},"操作建议",[239,509,510,517],{},[10,511,512,513,516],{},"两个都勾上之后，再点 ",[264,514,515],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,518,519],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[239,521,522,528],{},[10,523,524,525],{},"Python 安装的",[264,526,527],{},"可选功能页",[10,529,530],{},[26,531],{"alt":532,"src":533},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[239,535,536,539],{},[10,537,538],{},"高级选项页",[10,540,541],{},[26,542],{"alt":532,"src":543},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[298,545,547],{"id":546},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,549,550,551,554,555,558],{},"按 ",[34,552,553],{},"Win + R","，输入 ",[34,556,557],{},"cmd"," 并回车，然后执行：",[77,560,564],{"className":561,"code":562,"language":563,"meta":82,"style":82},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[34,565,566],{"__ignoreMap":82},[86,567,568,571],{"class":88,"line":89},[86,569,81],{"class":570},"svObZ",[86,572,574],{"class":573},"sDLfK"," --version\n",[10,576,577],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[77,579,582],{"className":580,"code":581,"language":113,"meta":82},[111],"Python 3.x.x\n",[34,583,581],{"__ignoreMap":82},[10,585,586],{},[26,587],{"alt":532,"src":588},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,590,591],{},"继续检查 pip：",[77,593,595],{"className":561,"code":594,"language":563,"meta":82,"style":82},"python -m pip --version\n",[34,596,597],{"__ignoreMap":82},[86,598,599,601,604,608],{"class":88,"line":89},[86,600,81],{"class":570},[86,602,603],{"class":573}," -m",[86,605,607],{"class":606},"sU2Wk"," pip",[86,609,574],{"class":573},[10,611,612,613,615,616,619],{},"如果 ",[34,614,81],{}," 无法识别，但 ",[34,617,618],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[77,621,623],{"className":561,"code":622,"language":563,"meta":82,"style":82},"py --version\npy -m pip --version\n",[34,624,625,631],{"__ignoreMap":82},[86,626,627,629],{"class":88,"line":89},[86,628,478],{"class":570},[86,630,574],{"class":573},[86,632,633,635,637,639],{"class":88,"line":95},[86,634,478],{"class":570},[86,636,603],{"class":573},[86,638,607],{"class":606},[86,640,574],{"class":573},[14,642,644],{"id":643},"macos-安装","macOS 安装",[298,646,648],{"id":647},"_1-先检查现有环境","1. 先检查现有环境",[10,650,651],{},"打开“终端”应用，执行：",[77,653,655],{"className":561,"code":654,"language":563,"meta":82,"style":82},"python3 --version\n",[34,656,657],{"__ignoreMap":82},[86,658,659,662],{"class":88,"line":89},[86,660,661],{"class":570},"python3",[86,663,574],{"class":573},[10,665,666,667,670],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[34,668,669],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[298,672,674],{"id":673},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,676,304,677,682,683,37,686,689],{},[306,678,681],{"href":679,"rel":680},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[310],"Python macOS 下载页","，下载当前稳定版的 ",[264,684,685],{},"macOS 64-bit universal2 installer",[34,687,688],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,691,692,693,696],{},"下载完成后打开 ",[34,694,695],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[298,698,700],{"id":699},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,702,703],{},"安装完成后重新打开终端，执行：",[77,705,707],{"className":561,"code":706,"language":563,"meta":82,"style":82},"python3 --version\npython3 -m pip --version\n",[34,708,709,715],{"__ignoreMap":82},[86,710,711,713],{"class":88,"line":89},[86,712,661],{"class":570},[86,714,574],{"class":573},[86,716,717,719,721,723],{"class":88,"line":95},[86,718,661],{"class":570},[86,720,603],{"class":573},[86,722,607],{"class":606},[86,724,574],{"class":573},[10,726,727,728,730],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[34,729,661],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,732,734],{"id":733},"linux-安装","Linux 安装",[10,736,737],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[298,739,741],{"id":740},"_1-检查是否已经安装","1. 检查是否已经安装",[10,743,744],{},"打开终端，执行：",[77,746,747],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,748,749,755],{"__ignoreMap":82},[86,750,751,753],{"class":88,"line":89},[86,752,661],{"class":570},[86,754,574],{"class":573},[86,756,757,759,761,763],{"class":88,"line":95},[86,758,661],{"class":570},[86,760,603],{"class":573},[86,762,607],{"class":606},[86,764,574],{"class":573},[10,766,767],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[298,769,771],{"id":770},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,773,774],{},"Ubuntu 或 Debian：",[77,776,778],{"className":561,"code":777,"language":563,"meta":82,"style":82},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[34,779,780,791],{"__ignoreMap":82},[86,781,782,785,788],{"class":88,"line":89},[86,783,784],{"class":570},"sudo",[86,786,787],{"class":606}," apt",[86,789,790],{"class":606}," update\n",[86,792,793,795,797,800,803,806],{"class":88,"line":95},[86,794,784],{"class":570},[86,796,787],{"class":606},[86,798,799],{"class":606}," install",[86,801,802],{"class":606}," python3",[86,804,805],{"class":606}," python3-pip",[86,807,808],{"class":606}," python3-venv\n",[10,810,811],{},"Fedora：",[77,813,815],{"className":561,"code":814,"language":563,"meta":82,"style":82},"sudo dnf install python3 python3-pip\n",[34,816,817],{"__ignoreMap":82},[86,818,819,821,824,826,828],{"class":88,"line":89},[86,820,784],{"class":570},[86,822,823],{"class":606}," dnf",[86,825,799],{"class":606},[86,827,802],{"class":606},[86,829,830],{"class":606}," python3-pip\n",[10,832,833],{},"Arch Linux：",[77,835,837],{"className":561,"code":836,"language":563,"meta":82,"style":82},"sudo pacman -S python python-pip\n",[34,838,839],{"__ignoreMap":82},[86,840,841,843,846,849,852],{"class":88,"line":89},[86,842,784],{"class":570},[86,844,845],{"class":606}," pacman",[86,847,848],{"class":573}," -S",[86,850,851],{"class":606}," python",[86,853,854],{"class":606}," python-pip\n",[10,856,857,859],{},[34,858,784],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[298,861,863],{"id":862},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,865,866],{},"安装结束后执行：",[77,868,869],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,870,871,877],{"__ignoreMap":82},[86,872,873,875],{"class":88,"line":89},[86,874,661],{"class":570},[86,876,574],{"class":573},[86,878,879,881,883,885],{"class":88,"line":95},[86,880,661],{"class":570},[86,882,603],{"class":573},[86,884,607],{"class":606},[86,886,574],{"class":573},[10,888,889],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,891,892],{"id":892},"常见问题",[298,894,896],{"id":895},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,898,899,900,903],{},"先关闭当前命令提示符并重新打开，再执行 ",[34,901,902],{},"python --version","。如果仍然失败，按下面的顺序检查：",[123,905,906,912,915],{},[52,907,908,909,911],{},"执行 ",[34,910,618],{},"，确认 Python Launcher 是否可用。",[52,913,914],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[52,916,917],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,919,920],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[298,922,924],{"id":923},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,926,927],{},"先尝试：",[77,929,930],{"className":561,"code":654,"language":563,"meta":82,"style":82},[34,931,932],{"__ignoreMap":82},[86,933,934,936],{"class":88,"line":89},[86,935,661],{"class":570},[86,937,574],{"class":573},[10,939,940,941,943,944,946,947,37],{},"在这两个系统中，只有 ",[34,942,661],{}," 命令而没有 ",[34,945,81],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[34,948,661],{},[298,950,952],{"id":951},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,954,955],{},"先使用模块方式检查：",[77,957,959],{"className":561,"code":958,"language":563,"meta":82,"style":82},"python3 -m pip --version\n",[34,960,961],{"__ignoreMap":82},[86,962,963,965,967,969],{"class":88,"line":89},[86,964,661],{"class":570},[86,966,603],{"class":573},[86,968,607],{"class":606},[86,970,574],{"class":573},[10,972,973,974,976,977,979,980,982,983,986],{},"Windows 用户将命令中的 ",[34,975,661],{}," 换成 ",[34,978,81],{}," 或 ",[34,981,478],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[34,984,985],{},"python3-pip","；不要直接使用其他系统的安装命令。",[181,988,989],{},"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":82,"searchDepth":95,"depth":95,"links":991},[992,993,994,999,1004,1009],{"id":218,"depth":95,"text":218},{"id":234,"depth":95,"text":234},{"id":295,"depth":95,"text":296,"children":995},[996,997,998],{"id":300,"depth":101,"text":301},{"id":360,"depth":101,"text":361},{"id":546,"depth":101,"text":547},{"id":643,"depth":95,"text":644,"children":1000},[1001,1002,1003],{"id":647,"depth":101,"text":648},{"id":673,"depth":101,"text":674},{"id":699,"depth":101,"text":700},{"id":733,"depth":95,"text":734,"children":1005},[1006,1007,1008],{"id":740,"depth":101,"text":741},{"id":770,"depth":101,"text":771},{"id":862,"depth":101,"text":863},{"id":892,"depth":95,"text":892,"children":1010},[1011,1012,1013],{"id":895,"depth":101,"text":896},{"id":923,"depth":101,"text":924},{"id":951,"depth":101,"text":952},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":213,"description":82},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[194,1022,1023],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1026,"title":1027,"body":1028,"category":194,"cover":1035,"description":82,"extension":196,"meta":1354,"navigation":198,"path":1355,"pinned":200,"publishedAt":1356,"seo":1357,"slug":1358,"stem":1359,"summary":1360,"tags":1361,"updatedAt":1356,"visible":198,"__hash__":1364},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1029,"toc":1339},[1030,1036,1039,1042,1046,1049,1074,1077,1083,1086,1089,1125,1135,1139,1146,1149,1174,1177,1189,1192,1196,1199,1202,1205,1208,1211,1214,1217,1241,1244,1247,1253,1256,1259,1262,1266,1272,1275,1301,1304,1308,1311,1314,1318,1321,1324,1327,1330,1333,1336],[10,1031,1032],{},[26,1033],{"alt":1034,"src":1035},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1037,1038],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1040,1041],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1043,1045],{"id":1044},"python-代码是什么样的","Python 代码是什么样的",[10,1047,1048],{},"下面是一段简单的 Python 代码：",[77,1050,1052],{"className":79,"code":1051,"language":81,"meta":82,"style":82},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[34,1053,1054,1059,1064,1069],{"__ignoreMap":82},[86,1055,1056],{"class":88,"line":89},[86,1057,1058],{},"name = \"Python\"\n",[86,1060,1061],{"class":88,"line":95},[86,1062,1063],{},"year = 2026\n",[86,1065,1066],{"class":88,"line":101},[86,1067,1068],{"emptyLinePlaceholder":198},"\n",[86,1070,1071],{"class":88,"line":398},[86,1072,1073],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1075,1076],{},"运行结果：",[77,1078,1081],{"className":1079,"code":1080,"language":113,"meta":82},[111],"正在学习 Python，当前年份是 2026\n",[34,1082,1080],{"__ignoreMap":82},[10,1084,1085],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1087,1088],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[77,1090,1092],{"className":79,"code":1091,"language":81,"meta":82,"style":82},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[34,1093,1094,1099,1103,1108,1113,1119],{"__ignoreMap":82},[86,1095,1096],{"class":88,"line":89},[86,1097,1098],{},"score = 85\n",[86,1100,1101],{"class":88,"line":95},[86,1102,1068],{"emptyLinePlaceholder":198},[86,1104,1105],{"class":88,"line":101},[86,1106,1107],{},"if score >= 60:\n",[86,1109,1110],{"class":88,"line":398},[86,1111,1112],{},"    print(\"成绩合格\")\n",[86,1114,1116],{"class":88,"line":1115},5,[86,1117,1118],{},"else:\n",[86,1120,1122],{"class":88,"line":1121},6,[86,1123,1124],{},"    print(\"需要继续学习\")\n",[10,1126,1127,1130,1131,1134],{},[34,1128,1129],{},"if"," 和 ",[34,1132,1133],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1136,1138],{"id":1137},"python-如何运行代码","Python 如何运行代码",[10,1140,1141,1142,1145],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[34,1143,1144],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1147,1148],{},"交互式环境适合快速验证一个表达式：",[77,1150,1152],{"className":79,"code":1151,"language":81,"meta":82,"style":82},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[34,1153,1154,1159,1164,1169],{"__ignoreMap":82},[86,1155,1156],{"class":88,"line":89},[86,1157,1158],{},">>> 10 + 20\n",[86,1160,1161],{"class":88,"line":95},[86,1162,1163],{},"30\n",[86,1165,1166],{"class":88,"line":101},[86,1167,1168],{},">>> \"Python\".lower()\n",[86,1170,1171],{"class":88,"line":398},[86,1172,1173],{},"'python'\n",[10,1175,1176],{},"需要保存和重复运行的程序，则可以写入文件：",[77,1178,1180],{"className":561,"code":1179,"language":563,"meta":82,"style":82},"python3 hello.py\n",[34,1181,1182],{"__ignoreMap":82},[86,1183,1184,1186],{"class":88,"line":89},[86,1185,661],{"class":570},[86,1187,1188],{"class":606}," hello.py\n",[10,1190,1191],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1193,1195],{"id":1194},"python-的特点","Python 的特点",[298,1197,1198],{"id":1198},"语法相对简洁",[10,1200,1201],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[298,1203,1204],{"id":1204},"支持多种编程方式",[10,1206,1207],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[298,1209,1210],{"id":1210},"标准库比较完整",[10,1212,1213],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1215,1216],{},"例如，获取当前时间：",[77,1218,1220],{"className":79,"code":1219,"language":81,"meta":82,"style":82},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[34,1221,1222,1227,1231,1236],{"__ignoreMap":82},[86,1223,1224],{"class":88,"line":89},[86,1225,1226],{},"from datetime import datetime\n",[86,1228,1229],{"class":88,"line":95},[86,1230,1068],{"emptyLinePlaceholder":198},[86,1232,1233],{"class":88,"line":101},[86,1234,1235],{},"now = datetime.now()\n",[86,1237,1238],{"class":88,"line":398},[86,1239,1240],{},"print(now)\n",[10,1242,1243],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[298,1245,1246],{"id":1246},"第三方工具丰富",[10,1248,1249,1250,1252],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[34,1251,230],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1254,1255],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[298,1257,1258],{"id":1258},"支持多个操作系统",[10,1260,1261],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1263,1265],{"id":1264},"python-可以做什么","Python 可以做什么",[10,1267,1268],{},[26,1269],{"alt":1270,"src":1271},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1273,1274],{},"Python 的应用范围比较广，常见方向包括：",[49,1276,1277,1280,1283,1286,1289,1292,1295,1298],{},[52,1278,1279],{},"编写自动化脚本，批量处理文件和重复任务；",[52,1281,1282],{},"开发网站后端和 API 服务；",[52,1284,1285],{},"进行数据清洗、统计分析和图表展示；",[52,1287,1288],{},"编写网络爬虫和信息采集工具；",[52,1290,1291],{},"开发自动化测试程序；",[52,1293,1294],{},"进行机器学习和人工智能开发；",[52,1296,1297],{},"编写运维、监控和辅助开发工具；",[52,1299,1300],{},"开发部分桌面应用和插件。",[10,1302,1303],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1305,1307],{"id":1306},"python-的发展","Python 的发展",[10,1309,1310],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1312,1313],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1315,1317],{"id":1316},"python-也有局限","Python 也有局限",[10,1319,1320],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1322,1323],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1325,1326],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1328,1329],{"id":1329},"写在最后",[10,1331,1332],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1334,1335],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[181,1337,1338],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":82,"searchDepth":95,"depth":95,"links":1340},[1341,1342,1343,1350,1351,1352,1353],{"id":1044,"depth":95,"text":1045},{"id":1137,"depth":95,"text":1138},{"id":1194,"depth":95,"text":1195,"children":1344},[1345,1346,1347,1348,1349],{"id":1198,"depth":101,"text":1198},{"id":1204,"depth":101,"text":1204},{"id":1210,"depth":101,"text":1210},{"id":1246,"depth":101,"text":1246},{"id":1258,"depth":101,"text":1258},{"id":1264,"depth":95,"text":1265},{"id":1306,"depth":95,"text":1307},{"id":1316,"depth":95,"text":1317},{"id":1329,"depth":95,"text":1329},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1027,"description":82},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[194,1362,1363],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1366,"title":1367,"body":1368,"category":194,"cover":195,"description":1372,"extension":196,"meta":1489,"navigation":198,"path":1490,"pinned":200,"publishedAt":201,"seo":1491,"slug":1492,"stem":1493,"summary":1494,"tags":1495,"updatedAt":201,"visible":198,"__hash__":1497},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1369,"toc":1479},[1370,1373,1375,1378,1380,1386,1391,1393,1407,1409,1411,1420,1422,1428,1430,1432,1447,1449,1460,1462,1470,1472,1474,1477],[10,1371,1372],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1374,16],{"id":16},[10,1376,1377],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1379,22],{"id":22},[10,1381,1382],{},[26,1383],{"alt":1384,"src":1385},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1387,1388,1390],{},[34,1389,1144],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1392,47],{"id":47},[49,1394,1395,1401,1404],{},[52,1396,1397,1398,1400],{},"源代码是人编写的文本，通常保存在 ",[34,1399,1144],{}," 文件中。",[52,1402,1403],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[52,1405,1406],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1408,72],{"id":72},[10,1410,75],{},[77,1412,1414],{"className":79,"code":1413,"language":81,"meta":82,"style":82},"print(\"你好，Python\")\n",[34,1415,1416],{"__ignoreMap":82},[86,1417,1418],{"class":88,"line":89},[86,1419,1413],{},[10,1421,107],{},[77,1423,1426],{"className":1424,"code":1425,"language":113,"meta":82},[111],"你好，Python\n",[34,1427,1425],{"__ignoreMap":82},[10,1429,118],{},[14,1431,121],{"id":121},[123,1433,1434,1441],{},[52,1435,1436,1437,1440],{},"终端启动解释器后，解释器读取 ",[34,1438,1439],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[52,1442,1443,1444,1446],{},"字符串对象先准备好，再交给 ",[34,1445,36],{}," 写到标准输出；终端负责把这段输出显示出来。",[14,1448,144],{"id":144},[49,1450,1451,1454],{},[52,1452,1453],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[52,1455,1456,1457,1459],{},"认为 ",[34,1458,1144],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1461,155],{"id":155},[123,1463,1464,1467],{},[52,1465,1466],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[52,1468,1469],{},"把示例文字改成自己的学习目标并重新运行。",[10,1471,173],{},[14,1473,176],{"id":176},[10,1475,1476],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,1478,183],{},{"title":82,"searchDepth":95,"depth":95,"links":1480},[1481,1482,1483,1484,1485,1486,1487,1488],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1367,"description":1372},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[194,1362,1496],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1499,"title":1500,"body":1501,"category":194,"cover":195,"description":1505,"extension":196,"meta":1641,"navigation":198,"path":1642,"pinned":200,"publishedAt":201,"seo":1643,"slug":1644,"stem":1645,"summary":1646,"tags":1647,"updatedAt":201,"visible":198,"__hash__":1649},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1502,"toc":1631},[1503,1506,1508,1511,1513,1519,1525,1527,1542,1544,1547,1567,1569,1575,1577,1579,1592,1594,1608,1610,1621,1623,1625,1628],[10,1504,1505],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1507,16],{"id":16},[10,1509,1510],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1512,22],{"id":22},[10,1514,1515],{},[26,1516],{"alt":1517,"src":1518},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1520,1521,1522,1524],{},"终端收到 ",[34,1523,661],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1526,47],{"id":47},[49,1528,1529,1532,1535],{},[52,1530,1531],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[52,1533,1534],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[52,1536,1537,1538,1541],{},"检查 pip 时使用 ",[34,1539,1540],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1543,72],{"id":72},[10,1545,1546],{},"在 macOS 终端执行：",[77,1548,1549],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,1550,1551,1557],{"__ignoreMap":82},[86,1552,1553,1555],{"class":88,"line":89},[86,1554,661],{"class":570},[86,1556,574],{"class":573},[86,1558,1559,1561,1563,1565],{"class":88,"line":95},[86,1560,661],{"class":570},[86,1562,603],{"class":573},[86,1564,607],{"class":606},[86,1566,574],{"class":573},[10,1568,107],{},[77,1570,1573],{"className":1571,"code":1572,"language":113,"meta":82},[111],"Python 3.14.x\npip 版本信息与安装路径\n",[34,1574,1572],{"__ignoreMap":82},[10,1576,118],{},[14,1578,121],{"id":121},[123,1580,1581,1587],{},[52,1582,1583,1586],{},[34,1584,1585],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[52,1588,1589,1591],{},[34,1590,669],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1593,144],{"id":144},[49,1595,1596,1602],{},[52,1597,1598,1599,1601],{},"看到系统已有 ",[34,1600,661],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[52,1603,1604,1605,1607],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[34,1606,661],{},"，不修改系统自带工具。",[14,1609,155],{"id":155},[123,1611,1612,1618],{},[52,1613,908,1614,1617],{},[34,1615,1616],{},"which python3","，记录当前解释器路径。",[52,1619,1620],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1622,173],{},[14,1624,176],{"id":176},[10,1626,1627],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,1629,1630],{},"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":82,"searchDepth":95,"depth":95,"links":1632},[1633,1634,1635,1636,1637,1638,1639,1640],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1500,"description":1505},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[194,1648,1022],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1651,"title":1652,"body":1653,"category":194,"cover":195,"description":1817,"extension":196,"meta":1818,"navigation":198,"path":1819,"pinned":200,"publishedAt":201,"seo":1820,"slug":1821,"stem":1822,"summary":1823,"tags":1824,"updatedAt":201,"visible":198,"__hash__":1827},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1654,"toc":1807},[1655,1661,1663,1666,1668,1674,1677,1679,1703,1705,1707,1734,1736,1742,1744,1746,1763,1765,1779,1781,1795,1797,1799,1805],[10,1656,1657,1658,1660],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[34,1659,1144],{}," 脚本。",[14,1662,16],{"id":16},[10,1664,1665],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1667,22],{"id":22},[10,1669,1670],{},[26,1671],{"alt":1672,"src":1673},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1675,1676],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1678,47],{"id":47},[49,1680,1681,1690,1697],{},[52,1682,1683,1684,1686,1687,37],{},"在终端输入 ",[34,1685,661],{}," 进入 REPL，提示符通常是 ",[34,1688,1689],{},">>>",[52,1691,1692,1693,1696],{},"输入 ",[34,1694,1695],{},"exit()"," 或按 Control-D 退出 REPL。",[52,1698,1699,1700,1702],{},"需要保存、复查或多次运行的代码应写入 ",[34,1701,1144],{}," 文件。",[14,1704,72],{"id":72},[10,1706,75],{},[77,1708,1712],{"className":1709,"code":1710,"language":1711,"meta":82,"style":82},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[34,1713,1714,1719,1724,1729],{"__ignoreMap":82},[86,1715,1716],{"class":88,"line":89},[86,1717,1718],{},">>> 2 + 3\n",[86,1720,1721],{"class":88,"line":95},[86,1722,1723],{},"5\n",[86,1725,1726],{"class":88,"line":101},[86,1727,1728],{},">>> \"python\".upper()\n",[86,1730,1731],{"class":88,"line":398},[86,1732,1733],{},"'PYTHON'\n",[10,1735,107],{},[77,1737,1740],{"className":1738,"code":1739,"language":113,"meta":82},[111],"REPL 会直接显示表达式结果\n",[34,1741,1739],{"__ignoreMap":82},[10,1743,118],{},[14,1745,121],{"id":121},[123,1747,1748,1757],{},[52,1749,1750,1751,1753,1754,37],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[34,1752,44],{}," 能直接看到 ",[34,1755,1756],{},"5",[52,1758,1759,1760,1762],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[34,1761,36],{}," 才会写到标准输出。",[14,1764,144],{"id":144},[49,1766,1767,1776],{},[52,1768,1769,1770,1772,1773,1775],{},"把提示符 ",[34,1771,1689],{}," 复制进 ",[34,1774,1144],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[52,1777,1778],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1780,155],{"id":155},[123,1782,1783,1789],{},[52,1784,1785,1786,37],{},"在 REPL 计算 ",[34,1787,1788],{},"12 * 8",[52,1790,1791,1792,1794],{},"把同一表达式写入脚本；观察脚本中不调用 ",[34,1793,36],{}," 时是否显示结果。",[10,1796,173],{},[14,1798,176],{"id":176},[10,1800,1801,1802,1804],{},"本篇目标是根据任务选择 REPL 或 ",[34,1803,1144],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,1806,183],{},{"title":82,"searchDepth":95,"depth":95,"links":1808},[1809,1810,1811,1812,1813,1814,1815,1816],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1652,"description":1817},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[194,1825,1826],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1829,"title":1830,"body":1831,"category":194,"cover":195,"description":1835,"extension":196,"meta":2006,"navigation":198,"path":2007,"pinned":200,"publishedAt":201,"seo":2008,"slug":2009,"stem":2010,"summary":2011,"tags":2012,"updatedAt":201,"visible":198,"__hash__":2015},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1832,"toc":1996},[1833,1836,1838,1841,1843,1849,1855,1857,1875,1877,1879,1924,1926,1932,1934,1936,1958,1960,1972,1974,1986,1988,1990,1993],[10,1834,1835],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1837,16],{"id":16},[10,1839,1840],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1842,22],{"id":22},[10,1844,1845],{},[26,1846],{"alt":1847,"src":1848},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1850,1851,1854],{},[34,1852,1853],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1856,47],{"id":47},[49,1858,1859,1862,1872],{},[52,1860,1861],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[52,1863,1864,1867,1868,1871],{},[34,1865,1866],{},"pwd"," 显示当前目录，",[34,1869,1870],{},"ls"," 显示目录里的文件。",[52,1873,1874],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1876,72],{"id":72},[10,1878,1546],{},[77,1880,1882],{"className":561,"code":1881,"language":563,"meta":82,"style":82},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[34,1883,1884,1892,1899,1904,1918],{"__ignoreMap":82},[86,1885,1886,1889],{"class":88,"line":89},[86,1887,1888],{"class":570},"mkdir",[86,1890,1891],{"class":606}," python-study\n",[86,1893,1894,1897],{"class":88,"line":95},[86,1895,1896],{"class":573},"cd",[86,1898,1891],{"class":606},[86,1900,1901],{"class":88,"line":101},[86,1902,1903],{"class":573},"pwd\n",[86,1905,1906,1909,1912,1916],{"class":88,"line":398},[86,1907,1908],{"class":573},"printf",[86,1910,1911],{"class":606}," 'print(\"项目已经运行\")\\n'",[86,1913,1915],{"class":1914},"snl16"," >",[86,1917,1188],{"class":606},[86,1919,1920,1922],{"class":88,"line":1115},[86,1921,661],{"class":570},[86,1923,1188],{"class":606},[10,1925,107],{},[77,1927,1930],{"className":1928,"code":1929,"language":113,"meta":82},[111],"项目已经运行\n",[34,1931,1929],{"__ignoreMap":82},[10,1933,118],{},[14,1935,121],{"id":121},[123,1937,1938,1949],{},[52,1939,1940,1942,1943,1945,1946,1948],{},[34,1941,1888],{}," 创建目录，",[34,1944,1896],{}," 改变终端当前目录，",[34,1947,1866],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[52,1950,1951,1953,1954,1957],{},[34,1952,1853],{}," 会在当前目录寻找 ",[34,1955,1956],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1959,144],{"id":144},[49,1961,1962,1969],{},[52,1963,1964,1965,1130,1967,37],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[34,1966,1866],{},[34,1968,1870],{},[52,1970,1971],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1973,155],{"id":155},[123,1975,1976,1983],{},[52,1977,1978,1979,1982],{},"新建 ",[34,1980,1981],{},"lesson01.py"," 并输出课程编号。",[52,1984,1985],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1987,173],{},[14,1989,176],{"id":176},[10,1991,1992],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,1994,1995],{},"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":82,"searchDepth":95,"depth":95,"links":1997},[1998,1999,2000,2001,2002,2003,2004,2005],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1830,"description":1835},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[194,2013,2014],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":4,"title":5,"body":2017,"category":194,"cover":195,"description":12,"extension":196,"meta":2138,"navigation":198,"path":199,"pinned":200,"publishedAt":201,"seo":2139,"slug":203,"stem":204,"summary":205,"tags":2140,"updatedAt":201,"visible":198,"__hash__":209},{"type":7,"value":2018,"toc":2128},[2019,2021,2023,2025,2027,2031,2039,2041,2055,2057,2059,2075,2077,2082,2084,2086,2100,2102,2108,2110,2120,2122,2124,2126],[10,2020,12],{},[14,2022,16],{"id":16},[10,2024,19],{},[14,2026,22],{"id":22},[10,2028,2029],{},[26,2030],{"alt":28,"src":29},[10,2032,32,2033,37,2035,41,2037,37],{},[34,2034,36],{},[34,2036,40],{},[34,2038,44],{},[14,2040,47],{"id":47},[49,2042,2043,2047,2053],{},[52,2044,2045,57],{},[34,2046,56],{},[52,2048,2049,63,2051,37],{},[34,2050,62],{},[34,2052,66],{},[52,2054,69],{},[14,2056,72],{"id":72},[10,2058,75],{},[77,2060,2061],{"className":79,"code":80,"language":81,"meta":82,"style":82},[34,2062,2063,2067,2071],{"__ignoreMap":82},[86,2064,2065],{"class":88,"line":89},[86,2066,92],{},[86,2068,2069],{"class":88,"line":95},[86,2070,98],{},[86,2072,2073],{"class":88,"line":101},[86,2074,104],{},[10,2076,107],{},[77,2078,2080],{"className":2079,"code":112,"language":113,"meta":82},[111],[34,2081,112],{"__ignoreMap":82},[10,2083,118],{},[14,2085,121],{"id":121},[123,2087,2088,2094],{},[52,2089,2090,130,2092,37],{},[34,2091,129],{},[34,2093,66],{},[52,2095,2096,137,2098,141],{},[34,2097,36],{},[34,2099,140],{},[14,2101,144],{"id":144},[49,2103,2104,2106],{},[52,2105,149],{},[52,2107,152],{},[14,2109,155],{"id":155},[123,2111,2112,2114],{},[52,2113,160],{},[52,2115,163,2116,166,2118,170],{},[34,2117,40],{},[34,2119,169],{},[10,2121,173],{},[14,2123,176],{"id":176},[10,2125,179],{},[181,2127,183],{},{"title":82,"searchDepth":95,"depth":95,"links":2129},[2130,2131,2132,2133,2134,2135,2136,2137],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5,"description":12},[194,207,208],{"id":2142,"title":2143,"body":2144,"category":194,"cover":195,"description":2148,"extension":196,"meta":2315,"navigation":198,"path":2316,"pinned":200,"publishedAt":201,"seo":2317,"slug":2318,"stem":2319,"summary":2320,"tags":2321,"updatedAt":201,"visible":198,"__hash__":2324},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2145,"toc":2305},[2146,2149,2151,2154,2156,2162,2165,2167,2193,2195,2197,2225,2227,2233,2235,2237,2261,2263,2279,2281,2296,2298,2300,2303],[10,2147,2148],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2150,16],{"id":16},[10,2152,2153],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2155,22],{"id":22},[10,2157,2158],{},[26,2159],{"alt":2160,"src":2161},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2163,2164],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2166,47],{"id":47},[49,2168,2169,2172,2182],{},[52,2170,2171],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[52,2173,2174,2175,166,2178,2181],{},"变量名区分大小写，",[34,2176,2177],{},"score",[34,2179,2180],{},"Score"," 是两个名字。",[52,2183,2184,2185,2188,2189,2192],{},"使用能表达含义的名称；不要用 ",[34,2186,2187],{},"list","、",[34,2190,2191],{},"str"," 等内置名称作为普通变量名。",[14,2194,72],{"id":72},[10,2196,75],{},[77,2198,2200],{"className":79,"code":2199,"language":81,"meta":82,"style":82},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[34,2201,2202,2207,2212,2216,2221],{"__ignoreMap":82},[86,2203,2204],{"class":88,"line":89},[86,2205,2206],{},"score = 90\n",[86,2208,2209],{"class":88,"line":95},[86,2210,2211],{},"print(score)\n",[86,2213,2214],{"class":88,"line":101},[86,2215,1068],{"emptyLinePlaceholder":198},[86,2217,2218],{"class":88,"line":398},[86,2219,2220],{},"score = 95\n",[86,2222,2223],{"class":88,"line":1115},[86,2224,2211],{},[10,2226,107],{},[77,2228,2231],{"className":2229,"code":2230,"language":113,"meta":82},[111],"90\n95\n",[34,2232,2230],{"__ignoreMap":82},[10,2234,118],{},[14,2236,121],{"id":121},[123,2238,2239,2248],{},[52,2240,908,2241,2244,2245,2247],{},[34,2242,2243],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[34,2246,2177],{}," 再绑定到它。",[52,2249,908,2250,2253,2254,2257,2258,37],{},[34,2251,2252],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[34,2255,2256],{},"90"," 没有被改造成 ",[34,2259,2260],{},"95",[14,2262,144],{"id":144},[49,2264,2265,2268],{},[52,2266,2267],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[52,2269,2270,2271,2188,2273,2188,2275,2278],{},"使用 ",[34,2272,2187],{},[34,2274,2191],{},[34,2276,2277],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2280,155],{"id":155},[123,2282,2283,2293],{},[52,2284,2285,2286,1130,2289,2292],{},"创建 ",[34,2287,2288],{},"course_name",[34,2290,2291],{},"lesson_count"," 两个变量并输出。",[52,2294,2295],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2297,173],{},[14,2299,176],{"id":176},[10,2301,2302],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,2304,183],{},{"title":82,"searchDepth":95,"depth":95,"links":2306},[2307,2308,2309,2310,2311,2312,2313,2314],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2143,"description":2148},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[194,2322,2323],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2326,"title":2327,"body":2328,"category":194,"cover":195,"description":2332,"extension":196,"meta":2498,"navigation":198,"path":2499,"pinned":200,"publishedAt":201,"seo":2500,"slug":2501,"stem":2502,"summary":2503,"tags":2504,"updatedAt":201,"visible":198,"__hash__":2507},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2329,"toc":2488},[2330,2333,2335,2338,2340,2346,2349,2351,2380,2382,2384,2430,2432,2438,2440,2442,2456,2458,2469,2471,2479,2481,2483,2486],[10,2331,2332],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2334,16],{"id":16},[10,2336,2337],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2339,22],{"id":22},[10,2341,2342],{},[26,2343],{"alt":2344,"src":2345},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2347,2348],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2350,47],{"id":47},[49,2352,2353,2363,2377],{},[52,2354,2355,2358,2359,2362],{},[34,2356,2357],{},"int"," 表示整数，",[34,2360,2361],{},"float"," 表示浮点数。",[52,2364,2365,2368,2369,2372,2373,2376],{},[34,2366,2367],{},"\u002F"," 总是进行真除法；",[34,2370,2371],{},"\u002F\u002F"," 是向下取整除法，",[34,2374,2375],{},"%"," 得到余数。",[52,2378,2379],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2381,72],{"id":72},[10,2383,75],{},[77,2385,2387],{"className":79,"code":2386,"language":81,"meta":82,"style":82},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[34,2388,2389,2394,2399,2404,2408,2413,2418,2424],{"__ignoreMap":82},[86,2390,2391],{"class":88,"line":89},[86,2392,2393],{},"price = 25\n",[86,2395,2396],{"class":88,"line":95},[86,2397,2398],{},"count = 4\n",[86,2400,2401],{"class":88,"line":101},[86,2402,2403],{},"discount = 0.9\n",[86,2405,2406],{"class":88,"line":398},[86,2407,1068],{"emptyLinePlaceholder":198},[86,2409,2410],{"class":88,"line":1115},[86,2411,2412],{},"total = price * count * discount\n",[86,2414,2415],{"class":88,"line":1121},[86,2416,2417],{},"average = total \u002F count\n",[86,2419,2421],{"class":88,"line":2420},7,[86,2422,2423],{},"print(total)\n",[86,2425,2427],{"class":88,"line":2426},8,[86,2428,2429],{},"print(average)\n",[10,2431,107],{},[77,2433,2436],{"className":2434,"code":2435,"language":113,"meta":82},[111],"90.0\n22.5\n",[34,2437,2435],{"__ignoreMap":82},[10,2439,118],{},[14,2441,121],{"id":121},[123,2443,2444,2450],{},[52,2445,2446,2449],{},[34,2447,2448],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[52,2451,2452,2455],{},[34,2453,2454],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2457,144],{"id":144},[49,2459,2460,2466],{},[52,2461,2462,2463,37],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[34,2464,2465],{},"decimal.Decimal",[52,2467,2468],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2470,155],{"id":155},[123,2472,2473,2476],{},[52,2474,2475],{},"计算 137 除以 10 的商和余数。",[52,2477,2478],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2480,173],{},[14,2482,176],{"id":176},[10,2484,2485],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,2487,183],{},{"title":82,"searchDepth":95,"depth":95,"links":2489},[2490,2491,2492,2493,2494,2495,2496,2497],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2327,"description":2332},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[194,2505,2506],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2509,"title":2510,"body":2511,"category":194,"cover":195,"description":2515,"extension":196,"meta":2691,"navigation":198,"path":2692,"pinned":200,"publishedAt":201,"seo":2693,"slug":2694,"stem":2695,"summary":2696,"tags":2697,"updatedAt":201,"visible":198,"__hash__":2700},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2512,"toc":2679},[2513,2516,2518,2521,2523,2529,2539,2541,2552,2554,2556,2586,2588,2594,2596,2598,2628,2631,2634,2640,2643,2645,2653,2655,2670,2672,2674,2677],[10,2514,2515],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2517,16],{"id":16},[10,2519,2520],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2522,22],{"id":22},[10,2524,2525],{},[26,2526],{"alt":2527,"src":2528},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2530,2531,2532,2535,2536,37],{},"切片 ",[34,2533,2534],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[34,2537,2538],{},"stop - start",[14,2540,47],{"id":47},[49,2542,2543,2546,2549],{},[52,2544,2545],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[52,2547,2548],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[52,2550,2551],{},"切片会创建新的字符串，不会修改原字符串。",[14,2553,72],{"id":72},[10,2555,75],{},[77,2557,2559],{"className":79,"code":2558,"language":81,"meta":82,"style":82},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[34,2560,2561,2566,2571,2576,2581],{"__ignoreMap":82},[86,2562,2563],{"class":88,"line":89},[86,2564,2565],{},"language = \"Python\"\n",[86,2567,2568],{"class":88,"line":95},[86,2569,2570],{},"print(language[0])\n",[86,2572,2573],{"class":88,"line":101},[86,2574,2575],{},"print(language[-1])\n",[86,2577,2578],{"class":88,"line":398},[86,2579,2580],{},"print(language[0:3])\n",[86,2582,2583],{"class":88,"line":1115},[86,2584,2585],{},"print(language + \" 3.14\")\n",[10,2587,107],{},[77,2589,2592],{"className":2590,"code":2591,"language":113,"meta":82},[111],"P\nn\nPyt\nPython 3.14\n",[34,2593,2591],{"__ignoreMap":82},[10,2595,118],{},[14,2597,121],{"id":121},[123,2599,2600,2614],{},[52,2601,2602,2603,2605,2606,2609,2610,2613],{},"字符串 ",[34,2604,194],{}," 的正索引从 ",[34,2607,2608],{},"P"," 的 0 开始，负索引从末尾 ",[34,2611,2612],{},"n"," 的 -1 开始。",[52,2615,2616,2619,2620,2623,2624,2627],{},[34,2617,2618],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[34,2621,2622],{},"Pyt","；索引 3 的 ",[34,2625,2626],{},"h"," 不在结果中。",[298,2629,2630],{"id":2630},"再看一个具体细节",[10,2632,2633],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2635,2636],{},[26,2637],{"alt":2638,"src":2639},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2641,2642],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2644,144],{"id":144},[49,2646,2647,2650],{},[52,2648,2649],{},"把第一个字符写成索引 1，造成整体偏移一位。",[52,2651,2652],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2654,155],{"id":155},[123,2656,2657,2667],{},[52,2658,2659,2660,2663,2664,37],{},"从 ",[34,2661,2662],{},"\"programming\""," 中切出 ",[34,2665,2666],{},"\"gram\"",[52,2668,2669],{},"使用负索引取得字符串倒数第二个字符。",[10,2671,173],{},[14,2673,176],{"id":176},[10,2675,2676],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,2678,183],{},{"title":82,"searchDepth":95,"depth":95,"links":2680},[2681,2682,2683,2684,2685,2688,2689,2690],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":2686},[2687],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2510,"description":2515},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[194,2698,2699],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2702,"title":2703,"body":2704,"category":194,"cover":195,"description":2708,"extension":196,"meta":2922,"navigation":198,"path":2923,"pinned":200,"publishedAt":201,"seo":2924,"slug":2925,"stem":2926,"summary":2927,"tags":2928,"updatedAt":201,"visible":198,"__hash__":2931},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2705,"toc":2910},[2706,2709,2711,2714,2716,2722,2732,2734,2767,2769,2771,2815,2817,2823,2825,2827,2848,2850,2853,2859,2867,2869,2883,2885,2901,2903,2905,2908],[10,2707,2708],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2710,16],{"id":16},[10,2712,2713],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2715,22],{"id":22},[10,2717,2718],{},[26,2719],{"alt":2720,"src":2721},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2723,2724,2725,979,2728,2731],{},"比较表达式先产生 ",[34,2726,2727],{},"True",[34,2729,2730],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2733,47],{"id":47},[49,2735,2736,2750,2764],{},[52,2737,2738,2741,2742,2745,2746,2749],{},[34,2739,2740],{},"=="," 判断是否相等，",[34,2743,2744],{},"!="," 判断是否不等；单个 ",[34,2747,2748],{},"="," 是赋值。",[52,2751,2752,2755,2756,2759,2760,2763],{},[34,2753,2754],{},"and"," 要求两侧都为真，",[34,2757,2758],{},"or"," 只需一侧为真，",[34,2761,2762],{},"not"," 取反。",[52,2765,2766],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2768,72],{"id":72},[10,2770,75],{},[77,2772,2774],{"className":79,"code":2773,"language":81,"meta":82,"style":82},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[34,2775,2776,2781,2786,2790,2795,2800,2805,2810],{"__ignoreMap":82},[86,2777,2778],{"class":88,"line":89},[86,2779,2780],{},"age = 20\n",[86,2782,2783],{"class":88,"line":95},[86,2784,2785],{},"has_ticket = True\n",[86,2787,2788],{"class":88,"line":101},[86,2789,1068],{"emptyLinePlaceholder":198},[86,2791,2792],{"class":88,"line":398},[86,2793,2794],{},"is_adult = age >= 18\n",[86,2796,2797],{"class":88,"line":1115},[86,2798,2799],{},"can_enter = is_adult and has_ticket\n",[86,2801,2802],{"class":88,"line":1121},[86,2803,2804],{},"print(is_adult)\n",[86,2806,2807],{"class":88,"line":2420},[86,2808,2809],{},"print(can_enter)\n",[86,2811,2812],{"class":88,"line":2426},[86,2813,2814],{},"print(not has_ticket)\n",[10,2816,107],{},[77,2818,2821],{"className":2819,"code":2820,"language":113,"meta":82},[111],"True\nTrue\nFalse\n",[34,2822,2820],{"__ignoreMap":82},[10,2824,118],{},[14,2826,121],{"id":121},[123,2828,2829,2839],{},[52,2830,2831,2834,2835,2838],{},[34,2832,2833],{},"age >= 18"," 先产生布尔值并绑定给 ",[34,2836,2837],{},"is_adult","，这一步没有任何分支跳转。",[52,2840,2841,2844,2845,2847],{},[34,2842,2843],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[34,2846,2762],{}," 只对紧随其后的值取反。",[298,2849,2630],{"id":2630},[10,2851,2852],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2854,2855],{},[26,2856],{"alt":2857,"src":2858},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2860,2861,2863,2864,2866],{},[34,2862,2754],{}," 只有“真、真”得到真；",[34,2865,2758],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2868,144],{"id":144},[49,2870,2871,2880],{},[52,2872,2873,2874,2876,2877,2879],{},"用单个等号判断相等。",[34,2875,2748],{}," 是赋值，",[34,2878,2740],{}," 才是相等比较。",[52,2881,2882],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2884,155],{"id":155},[123,2886,2887,2894],{},[52,2888,2889,2890,2893],{},"判断数字 ",[34,2891,2892],{},"15"," 是否同时大于 10 且小于 20。",[52,2895,2896,2897,2900],{},"分别修改年龄和票据状态，记录 ",[34,2898,2899],{},"can_enter"," 的四种组合结果。",[10,2902,173],{},[14,2904,176],{"id":176},[10,2906,2907],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,2909,183],{},{"title":82,"searchDepth":95,"depth":95,"links":2911},[2912,2913,2914,2915,2916,2919,2920,2921],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":2917},[2918],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2703,"description":2708},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[194,2929,2930],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2933,"title":2934,"body":2935,"category":194,"cover":195,"description":2939,"extension":196,"meta":3107,"navigation":198,"path":3108,"pinned":200,"publishedAt":201,"seo":3109,"slug":3110,"stem":3111,"summary":3112,"tags":3113,"updatedAt":201,"visible":198,"__hash__":3115},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2936,"toc":3097},[2937,2940,2942,2945,2947,2953,2971,2973,2986,2988,2990,3024,3026,3032,3034,3036,3058,3060,3072,3074,3088,3090,3092,3095],[10,2938,2939],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2941,16],{"id":16},[10,2943,2944],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2946,22],{"id":22},[10,2948,2949],{},[26,2950],{"alt":2951,"src":2952},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2954,2955,2958,2959,2962,2963,2966,2967,2970],{},[34,2956,2957],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[34,2960,2961],{},"18","，程序首先得到的也是 ",[34,2964,2965],{},"\"18\"","，需要 ",[34,2968,2969],{},"int()"," 后才能按整数参与计算。",[14,2972,47],{"id":47},[49,2974,2975,2978,2983],{},[52,2976,2977],{},"提示文字应告诉用户需要输入什么。",[52,2979,2980,2982],{},[34,2981,2969],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[52,2984,2985],{},"输入转换和业务计算分开写，定位问题更直接。",[14,2987,72],{"id":72},[10,2989,75],{},[77,2991,2993],{"className":79,"code":2992,"language":81,"meta":82,"style":82},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[34,2994,2995,3000,3005,3010,3014,3019],{"__ignoreMap":82},[86,2996,2997],{"class":88,"line":89},[86,2998,2999],{},"name = input(\"请输入姓名：\")\n",[86,3001,3002],{"class":88,"line":95},[86,3003,3004],{},"age_text = input(\"请输入年龄：\")\n",[86,3006,3007],{"class":88,"line":101},[86,3008,3009],{},"age = int(age_text)\n",[86,3011,3012],{"class":88,"line":398},[86,3013,1068],{"emptyLinePlaceholder":198},[86,3015,3016],{"class":88,"line":1115},[86,3017,3018],{},"print(\"你好，\" + name)\n",[86,3020,3021],{"class":88,"line":1121},[86,3022,3023],{},"print(age + 1)\n",[10,3025,107],{},[77,3027,3030],{"className":3028,"code":3029,"language":113,"meta":82},[111],"根据输入显示姓名，并输出下一年的年龄\n",[34,3031,3029],{"__ignoreMap":82},[10,3033,118],{},[14,3035,121],{"id":121},[123,3037,3038,3048],{},[52,3039,3040,3041,3043,3044,3047],{},"两次 ",[34,3042,2957],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[34,3045,3046],{},"age_text"," 用来提醒这仍是文本。",[52,3049,3050,3053,3054,3057],{},[34,3051,3052],{},"int(age_text)"," 创建整数对象，后面的 ",[34,3055,3056],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3059,144],{"id":144},[49,3061,3062,3069],{},[52,3063,3064,3065,3068],{},"直接计算 ",[34,3066,3067],{},"input(...) + 1","，忽略输入结果是字符串。",[52,3070,3071],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3073,155],{"id":155},[123,3075,3076,3079],{},[52,3077,3078],{},"接收两个整数并输出它们的和。",[52,3080,1692,3081,3084,3085,3087],{},[34,3082,3083],{},"18.5"," 给 ",[34,3086,2969],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3089,173],{},[14,3091,176],{"id":176},[10,3093,3094],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3096,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3098},[3099,3100,3101,3102,3103,3104,3105,3106],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2934,"description":2939},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[194,2277,3114],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3117,"title":3118,"body":3119,"category":194,"cover":195,"description":3123,"extension":196,"meta":3283,"navigation":198,"path":3284,"pinned":200,"publishedAt":201,"seo":3285,"slug":3286,"stem":3287,"summary":3288,"tags":3289,"updatedAt":201,"visible":198,"__hash__":3292},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3120,"toc":3273},[3121,3124,3126,3129,3131,3137,3144,3146,3160,3162,3164,3203,3205,3211,3213,3215,3234,3236,3251,3253,3264,3266,3268,3271],[10,3122,3123],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3125,16],{"id":16},[10,3127,3128],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3130,22],{"id":22},[10,3132,3133],{},[26,3134],{"alt":3135,"src":3136},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3138,3139,3140,3143],{},"列表为元素维护从 0 开始的位置索引。修改 ",[34,3141,3142],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3145,47],{"id":47},[49,3147,3148,3151,3154],{},[52,3149,3150],{},"列表使用方括号，元素之间用逗号分隔。",[52,3152,3153],{},"列表可变，可以替换、追加和删除元素。",[52,3155,3156,3157,37],{},"访问不存在的索引会产生 ",[34,3158,3159],{},"IndexError",[14,3161,72],{"id":72},[10,3163,75],{},[77,3165,3167],{"className":79,"code":3166,"language":81,"meta":82,"style":82},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[34,3168,3169,3174,3179,3183,3188,3193,3198],{"__ignoreMap":82},[86,3170,3171],{"class":88,"line":89},[86,3172,3173],{},"scores = [82, 90, 76]\n",[86,3175,3176],{"class":88,"line":95},[86,3177,3178],{},"print(scores[0])\n",[86,3180,3181],{"class":88,"line":101},[86,3182,1068],{"emptyLinePlaceholder":198},[86,3184,3185],{"class":88,"line":398},[86,3186,3187],{},"scores[1] = 95\n",[86,3189,3190],{"class":88,"line":1115},[86,3191,3192],{},"scores.append(88)\n",[86,3194,3195],{"class":88,"line":1121},[86,3196,3197],{},"print(scores)\n",[86,3199,3200],{"class":88,"line":2420},[86,3201,3202],{},"print(len(scores))\n",[10,3204,107],{},[77,3206,3209],{"className":3207,"code":3208,"language":113,"meta":82},[111],"82\n[82, 95, 76, 88]\n4\n",[34,3210,3208],{"__ignoreMap":82},[10,3212,118],{},[14,3214,121],{"id":121},[123,3216,3217,3220],{},[52,3218,3219],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[52,3221,3222,3225,3226,3229,3230,3233],{},[34,3223,3224],{},"scores[1] = 95"," 替换第二个位置，",[34,3227,3228],{},"append(88)"," 在末尾增加新位置，",[34,3231,3232],{},"len()"," 因而从 3 变为 4。",[14,3235,144],{"id":144},[49,3237,3238,3248],{},[52,3239,3240,3241,3244,3245,37],{},"访问 ",[34,3242,3243],{},"scores[len(scores)]","。最后一个合法正索引是 ",[34,3246,3247],{},"len(scores) - 1",[52,3249,3250],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3252,155],{"id":155},[123,3254,3255,3258],{},[52,3256,3257],{},"建立三项学习任务列表，再追加第四项。",[52,3259,3260,3261,3263],{},"修改第二项，并用 ",[34,3262,3232],{}," 检查元素数量。",[10,3265,173],{},[14,3267,176],{"id":176},[10,3269,3270],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3272,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3274},[3275,3276,3277,3278,3279,3280,3281,3282],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3118,"description":3123},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[194,3290,3291],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3294,"title":3295,"body":3296,"category":194,"cover":195,"description":3300,"extension":196,"meta":3441,"navigation":198,"path":3442,"pinned":200,"publishedAt":201,"seo":3443,"slug":3444,"stem":3445,"summary":3446,"tags":3447,"updatedAt":201,"visible":198,"__hash__":3449},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3297,"toc":3431},[3298,3301,3303,3306,3308,3314,3317,3319,3330,3332,3334,3368,3370,3376,3378,3380,3394,3396,3408,3410,3422,3424,3426,3429],[10,3299,3300],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3302,16],{"id":16},[10,3304,3305],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3307,22],{"id":22},[10,3309,3310],{},[26,3311],{"alt":3312,"src":3313},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3315,3316],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3318,47],{"id":47},[49,3320,3321,3324,3327],{},[52,3322,3323],{},"元组常用来表达固定数量、固定含义的一组值。",[52,3325,3326],{},"只有一个元素的元组必须保留尾随逗号。",[52,3328,3329],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3331,72],{"id":72},[10,3333,75],{},[77,3335,3337],{"className":79,"code":3336,"language":81,"meta":82,"style":82},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[34,3338,3339,3344,3349,3354,3358,3363],{"__ignoreMap":82},[86,3340,3341],{"class":88,"line":89},[86,3342,3343],{},"point = (120, 80)\n",[86,3345,3346],{"class":88,"line":95},[86,3347,3348],{},"print(point[0])\n",[86,3350,3351],{"class":88,"line":101},[86,3352,3353],{},"print(point[1])\n",[86,3355,3356],{"class":88,"line":398},[86,3357,1068],{"emptyLinePlaceholder":198},[86,3359,3360],{"class":88,"line":1115},[86,3361,3362],{},"single = (5,)\n",[86,3364,3365],{"class":88,"line":1121},[86,3366,3367],{},"print(single)\n",[10,3369,107],{},[77,3371,3374],{"className":3372,"code":3373,"language":113,"meta":82},[111],"120\n80\n(5,)\n",[34,3375,3373],{"__ignoreMap":82},[10,3377,118],{},[14,3379,121],{"id":121},[123,3381,3382,3388],{},[52,3383,3384,3387],{},[34,3385,3386],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[52,3389,3390,3393],{},[34,3391,3392],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3395,144],{"id":144},[49,3397,3398,3405],{},[52,3399,3400,3401,3404],{},"把 ",[34,3402,3403],{},"(5)"," 当作元组，实际它仍是整数。",[52,3406,3407],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3409,155],{"id":155},[123,3411,3412,3415],{},[52,3413,3414],{},"用元组表示宽度和高度。",[52,3416,163,3417,166,3419,3421],{},[34,3418,3403],{},[34,3420,3392],{}," 的类型。",[10,3423,173],{},[14,3425,176],{"id":176},[10,3427,3428],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3430,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3432},[3433,3434,3435,3436,3437,3438,3439,3440],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3295,"description":3300},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[194,3448,3291],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3451,"title":3452,"body":3453,"category":194,"cover":195,"description":3457,"extension":196,"meta":3612,"navigation":198,"path":3613,"pinned":200,"publishedAt":201,"seo":3614,"slug":3615,"stem":3616,"summary":3617,"tags":3618,"updatedAt":201,"visible":198,"__hash__":3620},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3454,"toc":3602},[3455,3458,3460,3463,3465,3471,3481,3483,3497,3499,3501,3535,3537,3543,3545,3547,3562,3564,3583,3585,3593,3595,3597,3600],[10,3456,3457],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3459,16],{"id":16},[10,3461,3462],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3464,22],{"id":22},[10,3466,3467],{},[26,3468],{"alt":3469,"src":3470},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3472,3473,3474,3477,3478,3480],{},"字典通过键定位值，不使用连续位置表达含义。",[34,3475,3476],{},"student[\"score\"]"," 读取的是键 ",[34,3479,2177],{}," 对应的值，而不是“第几个元素”。",[14,3482,47],{"id":47},[49,3484,3485,3488,3494],{},[52,3486,3487],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[52,3489,2270,3490,3493],{},[34,3491,3492],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[52,3495,3496],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3498,72],{"id":72},[10,3500,75],{},[77,3502,3504],{"className":79,"code":3503,"language":81,"meta":82,"style":82},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[34,3505,3506,3511,3516,3520,3525,3530],{"__ignoreMap":82},[86,3507,3508],{"class":88,"line":89},[86,3509,3510],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[86,3512,3513],{"class":88,"line":95},[86,3514,3515],{},"print(student[\"name\"])\n",[86,3517,3518],{"class":88,"line":101},[86,3519,1068],{"emptyLinePlaceholder":198},[86,3521,3522],{"class":88,"line":398},[86,3523,3524],{},"student[\"score\"] = 95\n",[86,3526,3527],{"class":88,"line":1115},[86,3528,3529],{},"student[\"city\"] = \"郑州\"\n",[86,3531,3532],{"class":88,"line":1121},[86,3533,3534],{},"print(student)\n",[10,3536,107],{},[77,3538,3541],{"className":3539,"code":3540,"language":113,"meta":82},[111],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[34,3542,3540],{"__ignoreMap":82},[10,3544,118],{},[14,3546,121],{"id":121},[123,3548,3549,3552],{},[52,3550,3551],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[52,3553,3554,3555,3557,3558,3561],{},"给已有键 ",[34,3556,2177],{}," 赋值会更新映射，给新键 ",[34,3559,3560],{},"city"," 赋值会增加映射。",[14,3563,144],{"id":144},[49,3565,3566,3573],{},[52,3567,3568,3569,3572],{},"按位置理解字典并尝试 ",[34,3570,3571],{},"student[0]","，而实际键是字符串。",[52,3574,3575,3576,3579,3580,37],{},"直接读取不确定存在的键并忽略 ",[34,3577,3578],{},"KeyError","；后续可根据场景使用成员检查或 ",[34,3581,3582],{},"get()",[14,3584,155],{"id":155},[123,3586,3587,3590],{},[52,3588,3589],{},"建立一本书的标题、作者和页数字典。",[52,3591,3592],{},"添加分类键，再修改页数。",[10,3594,173],{},[14,3596,176],{"id":176},[10,3598,3599],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3601,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3603},[3604,3605,3606,3607,3608,3609,3610,3611],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3452,"description":3457},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[194,3619,3291],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3622,"title":3623,"body":3624,"category":194,"cover":195,"description":3628,"extension":196,"meta":3777,"navigation":198,"path":3778,"pinned":200,"publishedAt":201,"seo":3779,"slug":3780,"stem":3781,"summary":3782,"tags":3783,"updatedAt":201,"visible":198,"__hash__":3785},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3625,"toc":3767},[3626,3629,3631,3634,3636,3642,3645,3647,3666,3668,3670,3704,3706,3712,3714,3716,3731,3733,3745,3747,3758,3760,3762,3765],[10,3627,3628],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3630,16],{"id":16},[10,3632,3633],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3635,22],{"id":22},[10,3637,3638],{},[26,3639],{"alt":3640,"src":3641},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3643,3644],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3646,47],{"id":47},[49,3648,3649,3652,3655],{},[52,3650,3651],{},"集合中的元素不重复。",[52,3653,3654],{},"集合是无序容器，不要依赖打印顺序或索引。",[52,3656,3657,3658,3661,3662,3665],{},"创建空集合必须写 ",[34,3659,3660],{},"set()","；",[34,3663,3664],{},"{}"," 创建的是空字典。",[14,3667,72],{"id":72},[10,3669,75],{},[77,3671,3673],{"className":79,"code":3672,"language":81,"meta":82,"style":82},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[34,3674,3675,3680,3685,3689,3694,3699],{"__ignoreMap":82},[86,3676,3677],{"class":88,"line":89},[86,3678,3679],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[86,3681,3682],{"class":88,"line":95},[86,3683,3684],{},"right = {\"Python\", \"Docker\"}\n",[86,3686,3687],{"class":88,"line":101},[86,3688,1068],{"emptyLinePlaceholder":198},[86,3690,3691],{"class":88,"line":398},[86,3692,3693],{},"print(left & right)\n",[86,3695,3696],{"class":88,"line":1115},[86,3697,3698],{},"print(left | right)\n",[86,3700,3701],{"class":88,"line":1121},[86,3702,3703],{},"print(\"Git\" in left)\n",[10,3705,107],{},[77,3707,3710],{"className":3708,"code":3709,"language":113,"meta":82},[111],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[34,3711,3709],{"__ignoreMap":82},[10,3713,118],{},[14,3715,121],{"id":121},[123,3717,3718,3721],{},[52,3719,3720],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[52,3722,3723,3726,3727,3730],{},[34,3724,3725],{},"&"," 计算交集，",[34,3728,3729],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3732,144],{"id":144},[49,3734,3735,3742],{},[52,3736,2270,3737,3739,3740,37],{},[34,3738,3664],{}," 创建空集合，实际得到空字典；空集合应写 ",[34,3741,3660],{},[52,3743,3744],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3746,155],{"id":155},[123,3748,3749,3755],{},[52,3750,3751,3752,3754],{},"把包含重复标签的列表交给 ",[34,3753,3660],{}," 去重。",[52,3756,3757],{},"计算两组课程标签的交集和差集。",[10,3759,173],{},[14,3761,176],{"id":176},[10,3763,3764],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3766,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3768},[3769,3770,3771,3772,3773,3774,3775,3776],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3623,"description":3628},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[194,3784,3291],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3787,"title":3788,"body":3789,"category":194,"cover":195,"description":3793,"extension":196,"meta":3991,"navigation":198,"path":3992,"pinned":200,"publishedAt":201,"seo":3993,"slug":3994,"stem":3995,"summary":3996,"tags":3997,"updatedAt":201,"visible":198,"__hash__":4000},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3790,"toc":3979},[3791,3794,3796,3799,3801,3807,3817,3819,3836,3838,3840,3890,3892,3898,3900,3902,3924,3926,3929,3935,3938,3940,3953,3955,3970,3972,3974,3977],[10,3792,3793],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3795,16],{"id":16},[10,3797,3798],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3800,22],{"id":22},[10,3802,3803],{},[26,3804],{"alt":3805,"src":3806},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3808,3809,3812,3813,3816],{},[34,3810,3811],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[34,3814,3815],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3818,47],{"id":47},[49,3820,3821,3830,3833],{},[52,3822,3823,3825,3826,3829],{},[34,3824,2740],{}," 比较内容是否相等，",[34,3827,3828],{},"is"," 比较是否为同一个对象。",[52,3831,3832],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[52,3834,3835],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3837,72],{"id":72},[10,3839,75],{},[77,3841,3843],{"className":79,"code":3842,"language":81,"meta":82,"style":82},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[34,3844,3845,3850,3855,3860,3864,3869,3874,3879,3884],{"__ignoreMap":82},[86,3846,3847],{"class":88,"line":89},[86,3848,3849],{},"tasks = [\"变量\", \"字符串\"]\n",[86,3851,3852],{"class":88,"line":95},[86,3853,3854],{},"shared = tasks\n",[86,3856,3857],{"class":88,"line":101},[86,3858,3859],{},"backup = tasks.copy()\n",[86,3861,3862],{"class":88,"line":398},[86,3863,1068],{"emptyLinePlaceholder":198},[86,3865,3866],{"class":88,"line":1115},[86,3867,3868],{},"tasks.append(\"列表\")\n",[86,3870,3871],{"class":88,"line":1121},[86,3872,3873],{},"print(shared)\n",[86,3875,3876],{"class":88,"line":2420},[86,3877,3878],{},"print(backup)\n",[86,3880,3881],{"class":88,"line":2426},[86,3882,3883],{},"print(tasks is shared)\n",[86,3885,3887],{"class":88,"line":3886},9,[86,3888,3889],{},"print(tasks is backup)\n",[10,3891,107],{},[77,3893,3896],{"className":3894,"code":3895,"language":113,"meta":82},[111],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[34,3897,3895],{"__ignoreMap":82},[10,3899,118],{},[14,3901,121],{"id":121},[123,3903,3904,3910],{},[52,3905,3906,3909],{},[34,3907,3908],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[52,3911,3912,3915,3916,3919,3920,3923],{},[34,3913,3914],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[34,3917,3918],{},"shared"," 能观察到变化，",[34,3921,3922],{},"backup"," 不会。",[298,3925,2630],{"id":2630},[10,3927,3928],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3930,3931],{},[26,3932],{"alt":3933,"src":3934},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3936,3937],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3939,144],{"id":144},[49,3941,3942,3950],{},[52,3943,3944,3945,3947,3948,37],{},"用 ",[34,3946,2740],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[34,3949,3828],{},[52,3951,3952],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3954,155],{"id":155},[123,3956,3957,3960],{},[52,3958,3959],{},"让两个变量引用同一个字典并修改其中一个。",[52,3961,2270,3962,3965,3966,1130,3968,37],{},[34,3963,3964],{},"copy()"," 创建外层副本，再比较 ",[34,3967,3828],{},[34,3969,2740],{},[10,3971,173],{},[14,3973,176],{"id":176},[10,3975,3976],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,3978,183],{},{"title":82,"searchDepth":95,"depth":95,"links":3980},[3981,3982,3983,3984,3985,3988,3989,3990],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":3986},[3987],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3788,"description":3793},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[194,3998,3999],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4002,"title":4003,"body":4004,"category":194,"cover":195,"description":4008,"extension":196,"meta":4221,"navigation":198,"path":4222,"pinned":200,"publishedAt":201,"seo":4223,"slug":4224,"stem":4225,"summary":4226,"tags":4227,"updatedAt":201,"visible":198,"__hash__":4229},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4005,"toc":4208},[4006,4009,4011,4014,4016,4022,4032,4034,4045,4047,4049,4102,4104,4110,4112,4114,4132,4134,4137,4143,4151,4154,4157,4163,4169,4171,4189,4191,4199,4201,4203,4206],[10,4007,4008],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4010,16],{"id":16},[10,4012,4013],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4015,22],{"id":22},[10,4017,4018],{},[26,4019],{"alt":4020,"src":4021},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4023,4024,2188,4026,2188,4029,4031],{},[34,4025,1129],{},[34,4027,4028],{},"elif",[34,4030,1133],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4033,47],{"id":47},[49,4035,4036,4039,4042],{},[52,4037,4038],{},"冒号表示接下来开始一个代码块。",[52,4040,4041],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[52,4043,4044],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4046,72],{"id":72},[10,4048,75],{},[77,4050,4052],{"className":79,"code":4051,"language":81,"meta":82,"style":82},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[34,4053,4054,4059,4063,4068,4073,4078,4083,4087,4092,4096],{"__ignoreMap":82},[86,4055,4056],{"class":88,"line":89},[86,4057,4058],{},"score = int(input(\"请输入分数：\"))\n",[86,4060,4061],{"class":88,"line":95},[86,4062,1068],{"emptyLinePlaceholder":198},[86,4064,4065],{"class":88,"line":101},[86,4066,4067],{},"if score >= 90:\n",[86,4069,4070],{"class":88,"line":398},[86,4071,4072],{},"    level = \"优秀\"\n",[86,4074,4075],{"class":88,"line":1115},[86,4076,4077],{},"elif score >= 60:\n",[86,4079,4080],{"class":88,"line":1121},[86,4081,4082],{},"    level = \"合格\"\n",[86,4084,4085],{"class":88,"line":2420},[86,4086,1118],{},[86,4088,4089],{"class":88,"line":2426},[86,4090,4091],{},"    level = \"需要继续学习\"\n",[86,4093,4094],{"class":88,"line":3886},[86,4095,1068],{"emptyLinePlaceholder":198},[86,4097,4099],{"class":88,"line":4098},10,[86,4100,4101],{},"print(level)\n",[10,4103,107],{},[77,4105,4108],{"className":4106,"code":4107,"language":113,"meta":82},[111],"输入 85 时输出：合格\n",[34,4109,4107],{"__ignoreMap":82},[10,4111,118],{},[14,4113,121],{"id":121},[123,4115,4116,4123],{},[52,4117,4118,4119,4122],{},"输入先转换为整数，程序从 ",[34,4120,4121],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[52,4124,4125,4128,4129,4131],{},[34,4126,4127],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[34,4130,1133],{}," 被跳过；最终三个分支只会选择一个。",[298,4133,2630],{"id":2630},[10,4135,4136],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4138,4139],{},[26,4140],{"alt":4141,"src":4142},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4144,4145,4147,4148,4150],{},[34,4146,4121],{}," 必须放在 ",[34,4149,4127],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[298,4152,2630],{"id":4153},"再看一个具体细节-1",[10,4155,4156],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4158,4159],{},[26,4160],{"alt":4161,"src":4162},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4164,4165,4166,4168],{},"同一缩进层级属于同一个代码块；回到 ",[34,4167,1129],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4170,144],{"id":144},[49,4172,4173,4179],{},[52,4174,4175,4176,4178],{},"先写 ",[34,4177,4127],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[52,4180,4181,4182,4184,4185,4188],{},"混用多个独立 ",[34,4183,1129],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[34,4186,4187],{},"if\u002Felif\u002Felse"," 链。",[14,4190,155],{"id":155},[123,4192,4193,4196],{},[52,4194,4195],{},"根据温度输出“冷、适中、热”三个等级。",[52,4197,4198],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4200,173],{},[14,4202,176],{"id":176},[10,4204,4205],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,4207,183],{},{"title":82,"searchDepth":95,"depth":95,"links":4209},[4210,4211,4212,4213,4214,4218,4219,4220],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":4215},[4216,4217],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4003,"description":4008},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[194,1129,4228],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4231,"title":4232,"body":4233,"category":194,"cover":195,"description":4237,"extension":196,"meta":4403,"navigation":198,"path":4404,"pinned":200,"publishedAt":201,"seo":4405,"slug":4406,"stem":4407,"summary":4408,"tags":4409,"updatedAt":201,"visible":198,"__hash__":4411},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4234,"toc":4391},[4235,4238,4240,4243,4245,4251,4257,4259,4274,4276,4278,4316,4318,4324,4326,4328,4343,4345,4348,4354,4360,4362,4370,4372,4382,4384,4386,4389],[10,4236,4237],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4239,16],{"id":16},[10,4241,4242],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4244,22],{"id":22},[10,4246,4247],{},[26,4248],{"alt":4249,"src":4250},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4252,4253,4256],{},[34,4254,4255],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4258,47],{"id":47},[49,4260,4261,4264,4267],{},[52,4262,4263],{},"进入循环前先准备参与条件判断的状态。",[52,4265,4266],{},"循环体中必须有机会让条件变为假。",[52,4268,4269,4270,4273],{},"能够预先确定遍历对象时，后续介绍的 ",[34,4271,4272],{},"for"," 通常更直接。",[14,4275,72],{"id":72},[10,4277,75],{},[77,4279,4281],{"className":79,"code":4280,"language":81,"meta":82,"style":82},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[34,4282,4283,4288,4292,4297,4302,4307,4311],{"__ignoreMap":82},[86,4284,4285],{"class":88,"line":89},[86,4286,4287],{},"count = 1\n",[86,4289,4290],{"class":88,"line":95},[86,4291,1068],{"emptyLinePlaceholder":198},[86,4293,4294],{"class":88,"line":101},[86,4295,4296],{},"while count \u003C= 3:\n",[86,4298,4299],{"class":88,"line":398},[86,4300,4301],{},"    print(\"第\", count, \"次练习\")\n",[86,4303,4304],{"class":88,"line":1115},[86,4305,4306],{},"    count = count + 1\n",[86,4308,4309],{"class":88,"line":1121},[86,4310,1068],{"emptyLinePlaceholder":198},[86,4312,4313],{"class":88,"line":2420},[86,4314,4315],{},"print(\"练习结束\")\n",[10,4317,107],{},[77,4319,4322],{"className":4320,"code":4321,"language":113,"meta":82},[111],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[34,4323,4321],{"__ignoreMap":82},[10,4325,118],{},[14,4327,121],{"id":121},[123,4329,4330,4337],{},[52,4331,4332,4333,4336],{},"进入循环前 ",[34,4334,4335],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[52,4338,4339,4340,4342],{},"循环体末尾把 ",[34,4341,4335],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[298,4344,2630],{"id":2630},[10,4346,4347],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4349,4350],{},[26,4351],{"alt":4352,"src":4353},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4355,4356,4357,4359],{},"第4次检查时 ",[34,4358,4335],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4361,144],{"id":144},[49,4363,4364,4367],{},[52,4365,4366],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[52,4368,4369],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4371,155],{"id":155},[123,4373,4374,4379],{},[52,4375,2270,4376,4378],{},[34,4377,4255],{}," 输出 1 到 5。",[52,4380,4381],{},"计算 1 到 10 的累加和。",[10,4383,173],{},[14,4385,176],{"id":176},[10,4387,4388],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,4390,183],{},{"title":82,"searchDepth":95,"depth":95,"links":4392},[4393,4394,4395,4396,4397,4400,4401,4402],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":4398},[4399],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4232,"description":4237},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[194,4255,4410],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4413,"title":4414,"body":4415,"category":194,"cover":195,"description":4419,"extension":196,"meta":4567,"navigation":198,"path":4568,"pinned":200,"publishedAt":201,"seo":4569,"slug":4570,"stem":4571,"summary":4572,"tags":4573,"updatedAt":201,"visible":198,"__hash__":4575},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4416,"toc":4557},[4417,4420,4422,4425,4427,4433,4438,4440,4454,4456,4458,4496,4498,4504,4506,4508,4525,4527,4535,4537,4548,4550,4552,4555],[10,4418,4419],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4421,16],{"id":16},[10,4423,4424],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4426,22],{"id":22},[10,4428,4429],{},[26,4430],{"alt":4431,"src":4432},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4434,4435,4437],{},[34,4436,4272],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4439,47],{"id":47},[49,4441,4442,4448,4451],{},[52,4443,4444,4447],{},[34,4445,4446],{},"range(1, 4)"," 包含 1，不包含 4。",[52,4449,4450],{},"只需要元素时直接遍历元素，不必手工维护索引。",[52,4452,4453],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4455,72],{"id":72},[10,4457,75],{},[77,4459,4461],{"className":79,"code":4460,"language":81,"meta":82,"style":82},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[34,4462,4463,4468,4472,4477,4482,4486,4491],{"__ignoreMap":82},[86,4464,4465],{"class":88,"line":89},[86,4466,4467],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[86,4469,4470],{"class":88,"line":95},[86,4471,1068],{"emptyLinePlaceholder":198},[86,4473,4474],{"class":88,"line":101},[86,4475,4476],{},"for course in courses:\n",[86,4478,4479],{"class":88,"line":398},[86,4480,4481],{},"    print(course)\n",[86,4483,4484],{"class":88,"line":1115},[86,4485,1068],{"emptyLinePlaceholder":198},[86,4487,4488],{"class":88,"line":1121},[86,4489,4490],{},"for number in range(1, 4):\n",[86,4492,4493],{"class":88,"line":2420},[86,4494,4495],{},"    print(number)\n",[10,4497,107],{},[77,4499,4502],{"className":4500,"code":4501,"language":113,"meta":82},[111],"变量\n字符串\n列表\n1\n2\n3\n",[34,4503,4501],{"__ignoreMap":82},[10,4505,118],{},[14,4507,121],{"id":121},[123,4509,4510,4520],{},[52,4511,4512,4513,4515,4516,4519],{},"第一个 ",[34,4514,4272],{}," 依次从列表取得字符串，循环变量 ",[34,4517,4518],{},"course"," 每轮重新绑定。",[52,4521,4522,4524],{},[34,4523,4446],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4526,144],{"id":144},[49,4528,4529,4532],{},[52,4530,4531],{},"只需要元素却手工维护索引，增加越界风险。",[52,4533,4534],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4536,155],{"id":155},[123,4538,4539,4542],{},[52,4540,4541],{},"逐项输出一个字符串中的字符。",[52,4543,2270,4544,4547],{},[34,4545,4546],{},"range()"," 输出 2、4、6、8。",[10,4549,173],{},[14,4551,176],{"id":176},[10,4553,4554],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,4556,183],{},{"title":82,"searchDepth":95,"depth":95,"links":4558},[4559,4560,4561,4562,4563,4564,4565,4566],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4414,"description":4419},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[194,4272,4574],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4577,"title":4578,"body":4579,"category":194,"cover":195,"description":4583,"extension":196,"meta":4757,"navigation":198,"path":4758,"pinned":200,"publishedAt":201,"seo":4759,"slug":4760,"stem":4761,"summary":4762,"tags":4763,"updatedAt":201,"visible":198,"__hash__":4764},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4580,"toc":4747},[4581,4584,4586,4589,4591,4597,4607,4609,4628,4630,4632,4684,4686,4692,4694,4696,4710,4712,4728,4730,4738,4740,4742,4745],[10,4582,4583],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4585,16],{"id":16},[10,4587,4588],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4590,22],{"id":22},[10,4592,4593],{},[26,4594],{"alt":4595,"src":4596},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4598,4599,4602,4603,4606],{},[34,4600,4601],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[34,4604,4605],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4608,47],{"id":47},[49,4610,4611,4614,4622],{},[52,4612,4613],{},"先写普通循环，再在确有需要时加入流程控制语句。",[52,4615,4616,4618,4619,4621],{},[34,4617,4601],{}," 前要确认不会跳过 ",[34,4620,4255],{}," 循环中的状态更新。",[52,4623,4624,4625,4627],{},"多层嵌套中 ",[34,4626,4605],{}," 只结束它所在的最内层循环。",[14,4629,72],{"id":72},[10,4631,75],{},[77,4633,4635],{"className":79,"code":4634,"language":81,"meta":82,"style":82},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[34,4636,4637,4642,4646,4651,4656,4661,4666,4671,4675,4679],{"__ignoreMap":82},[86,4638,4639],{"class":88,"line":89},[86,4640,4641],{},"numbers = [3, -1, 0, 8, 12]\n",[86,4643,4644],{"class":88,"line":95},[86,4645,1068],{"emptyLinePlaceholder":198},[86,4647,4648],{"class":88,"line":101},[86,4649,4650],{},"for number in numbers:\n",[86,4652,4653],{"class":88,"line":398},[86,4654,4655],{},"    if number \u003C 0:\n",[86,4657,4658],{"class":88,"line":1115},[86,4659,4660],{},"        continue\n",[86,4662,4663],{"class":88,"line":1121},[86,4664,4665],{},"    if number == 0:\n",[86,4667,4668],{"class":88,"line":2420},[86,4669,4670],{},"        break\n",[86,4672,4673],{"class":88,"line":2426},[86,4674,4495],{},[86,4676,4677],{"class":88,"line":3886},[86,4678,1068],{"emptyLinePlaceholder":198},[86,4680,4681],{"class":88,"line":4098},[86,4682,4683],{},"print(\"循环结束\")\n",[10,4685,107],{},[77,4687,4690],{"className":4688,"code":4689,"language":113,"meta":82},[111],"3\n循环结束\n",[34,4691,4689],{"__ignoreMap":82},[10,4693,118],{},[14,4695,121],{"id":121},[123,4697,4698,4704],{},[52,4699,4700,4701,4703],{},"遇到 -1 时 ",[34,4702,4601],{}," 立即结束本轮，后面的判断和输出都不执行。",[52,4705,4706,4707,4709],{},"遇到 0 时 ",[34,4708,4605],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4711,144],{"id":144},[49,4713,4714,4719],{},[52,4715,3400,4716,4718],{},[34,4717,4601],{}," 当作结束循环，实际它只跳到下一轮。",[52,4720,4721,4722,4724,4725,4727],{},"在 ",[34,4723,4255],{}," 中把状态更新放在可能被 ",[34,4726,4601],{}," 跳过的位置，造成无限循环。",[14,4729,155],{"id":155},[123,4731,4732,4735],{},[52,4733,4734],{},"跳过列表中的空字符串并输出其他内容。",[52,4736,4737],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4739,173],{},[14,4741,176],{"id":176},[10,4743,4744],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,4746,183],{},{"title":82,"searchDepth":95,"depth":95,"links":4748},[4749,4750,4751,4752,4753,4754,4755,4756],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4578,"description":4583},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[194,4605,4601],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4766,"title":4767,"body":4768,"category":194,"cover":195,"description":4772,"extension":196,"meta":4943,"navigation":198,"path":4944,"pinned":200,"publishedAt":201,"seo":4945,"slug":4946,"stem":4947,"summary":4948,"tags":4949,"updatedAt":201,"visible":198,"__hash__":4952},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4769,"toc":4931},[4770,4773,4775,4778,4780,4786,4789,4791,4815,4817,4819,4853,4855,4861,4863,4865,4882,4884,4887,4893,4896,4898,4912,4914,4922,4924,4926,4929],[10,4771,4772],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4774,16],{"id":16},[10,4776,4777],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4779,22],{"id":22},[10,4781,4782],{},[26,4783],{"alt":4784,"src":4785},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4787,4788],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4790,47],{"id":47},[49,4792,4793,4796,4799],{},[52,4794,4795],{},"每增加一层嵌套，阅读成本都会上升。",[52,4797,4798],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[52,4800,4801,4802,2188,4805,4808,4809,2188,4812,37],{},"变量名使用 ",[34,4803,4804],{},"row",[34,4806,4807],{},"cell"," 等层级含义，避免全部写成 ",[34,4810,4811],{},"i",[34,4813,4814],{},"j",[14,4816,72],{"id":72},[10,4818,75],{},[77,4820,4822],{"className":79,"code":4821,"language":81,"meta":82,"style":82},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[34,4823,4824,4829,4833,4838,4843,4848],{"__ignoreMap":82},[86,4825,4826],{"class":88,"line":89},[86,4827,4828],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[86,4830,4831],{"class":88,"line":95},[86,4832,1068],{"emptyLinePlaceholder":198},[86,4834,4835],{"class":88,"line":101},[86,4836,4837],{},"for row in table:\n",[86,4839,4840],{"class":88,"line":398},[86,4841,4842],{},"    for cell in row:\n",[86,4844,4845],{"class":88,"line":1115},[86,4846,4847],{},"        print(cell)\n",[86,4849,4850],{"class":88,"line":1121},[86,4851,4852],{},"    print(\"一行结束\")\n",[10,4854,107],{},[77,4856,4859],{"className":4857,"code":4858,"language":113,"meta":82},[111],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[34,4860,4858],{"__ignoreMap":82},[10,4862,118],{},[14,4864,121],{"id":121},[123,4866,4867,4879],{},[52,4868,4869,4870,4872,4873,1130,4876,37],{},"外层变量 ",[34,4871,4804],{}," 先引用第一行列表，内层才依次处理 ",[34,4874,4875],{},"A1",[34,4877,4878],{},"A2",[52,4880,4881],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[298,4883,2630],{"id":2630},[10,4885,4886],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4888,4889],{},[26,4890],{"alt":4891,"src":4892},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4894,4895],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4897,144],{"id":144},[49,4899,4900,4909],{},[52,4901,4902,4903,979,4906,4908],{},"把两层循环变量都叫 ",[34,4904,4905],{},"item",[34,4907,4811],{},"，难以确认当前层级。",[52,4910,4911],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4913,155],{"id":155},[123,4915,4916,4919],{},[52,4917,4918],{},"打印一个 2×3 数字表。",[52,4920,4921],{},"在内层增加条件，只输出大于 3 的元素。",[10,4923,173],{},[14,4925,176],{"id":176},[10,4927,4928],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,4930,183],{},{"title":82,"searchDepth":95,"depth":95,"links":4932},[4933,4934,4935,4936,4937,4940,4941,4942],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":4938},[4939],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4767,"description":4772},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[194,4950,4951],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4954,"title":4955,"body":4956,"category":194,"cover":195,"description":4960,"extension":196,"meta":5098,"navigation":198,"path":5099,"pinned":200,"publishedAt":201,"seo":5100,"slug":5101,"stem":5102,"summary":5103,"tags":5104,"updatedAt":201,"visible":198,"__hash__":5107},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4957,"toc":5088},[4958,4961,4963,4966,4968,4974,4977,4979,4990,4992,4994,5032,5034,5040,5042,5044,5056,5058,5069,5071,5079,5081,5083,5086],[10,4959,4960],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4962,16],{"id":16},[10,4964,4965],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4967,22],{"id":22},[10,4969,4970],{},[26,4971],{"alt":4972,"src":4973},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4975,4976],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4978,47],{"id":47},[49,4980,4981,4984,4987],{},[52,4982,4983],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[52,4985,4986],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[52,4988,4989],{},"推导式创建新列表，不修改输入列表。",[14,4991,72],{"id":72},[10,4993,75],{},[77,4995,4997],{"className":79,"code":4996,"language":81,"meta":82,"style":82},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[34,4998,4999,5004,5008,5013,5018,5022,5027],{"__ignoreMap":82},[86,5000,5001],{"class":88,"line":89},[86,5002,5003],{},"numbers = [1, 2, 3, 4, 5]\n",[86,5005,5006],{"class":88,"line":95},[86,5007,1068],{"emptyLinePlaceholder":198},[86,5009,5010],{"class":88,"line":101},[86,5011,5012],{},"squares = [number * number for number in numbers]\n",[86,5014,5015],{"class":88,"line":398},[86,5016,5017],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[86,5019,5020],{"class":88,"line":1115},[86,5021,1068],{"emptyLinePlaceholder":198},[86,5023,5024],{"class":88,"line":1121},[86,5025,5026],{},"print(squares)\n",[86,5028,5029],{"class":88,"line":2420},[86,5030,5031],{},"print(even_squares)\n",[10,5033,107],{},[77,5035,5038],{"className":5036,"code":5037,"language":113,"meta":82},[111],"[1, 4, 9, 16, 25]\n[4, 16]\n",[34,5039,5037],{"__ignoreMap":82},[10,5041,118],{},[14,5043,121],{"id":121},[123,5045,5046,5049],{},[52,5047,5048],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[52,5050,5051,5052,5055],{},"第二条先用 ",[34,5053,5054],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5057,144],{"id":144},[49,5059,5060,5066],{},[52,5061,5062,5063,5065],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[34,5064,4272],{}," 开始找输入。",[52,5067,5068],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5070,155],{"id":155},[123,5072,5073,5076],{},[52,5074,5075],{},"把字符串列表转换为长度列表。",[52,5077,5078],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5080,173],{},[14,5082,176],{"id":176},[10,5084,5085],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,5087,183],{},{"title":82,"searchDepth":95,"depth":95,"links":5089},[5090,5091,5092,5093,5094,5095,5096,5097],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4955,"description":4960},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[194,5105,5106],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5109,"title":5110,"body":5111,"category":194,"cover":195,"description":5115,"extension":196,"meta":5258,"navigation":198,"path":5259,"pinned":200,"publishedAt":201,"seo":5260,"slug":5261,"stem":5262,"summary":5263,"tags":5264,"updatedAt":201,"visible":198,"__hash__":5267},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5112,"toc":5248},[5113,5116,5118,5121,5123,5129,5132,5134,5145,5147,5149,5188,5190,5196,5198,5200,5215,5217,5225,5227,5239,5241,5243,5246],[10,5114,5115],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5117,16],{"id":16},[10,5119,5120],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5122,22],{"id":22},[10,5124,5125],{},[26,5126],{"alt":5127,"src":5128},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5130,5131],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5133,47],{"id":47},[49,5135,5136,5139,5142],{},[52,5137,5138],{},"函数名描述动作，使用小写字母和下划线。",[52,5140,5141],{},"函数定义要先执行，之后才能调用。",[52,5143,5144],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5146,72],{"id":72},[10,5148,75],{},[77,5150,5152],{"className":79,"code":5151,"language":81,"meta":82,"style":82},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[34,5153,5154,5159,5164,5169,5173,5178,5183],{"__ignoreMap":82},[86,5155,5156],{"class":88,"line":89},[86,5157,5158],{},"def show_progress():\n",[86,5160,5161],{"class":88,"line":95},[86,5162,5163],{},"    print(\"正在学习函数\")\n",[86,5165,5166],{"class":88,"line":101},[86,5167,5168],{},"    print(\"本节完成 50%\")\n",[86,5170,5171],{"class":88,"line":398},[86,5172,1068],{"emptyLinePlaceholder":198},[86,5174,5175],{"class":88,"line":1115},[86,5176,5177],{},"print(\"调用前\")\n",[86,5179,5180],{"class":88,"line":1121},[86,5181,5182],{},"show_progress()\n",[86,5184,5185],{"class":88,"line":2420},[86,5186,5187],{},"print(\"调用后\")\n",[10,5189,107],{},[77,5191,5194],{"className":5192,"code":5193,"language":113,"meta":82},[111],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[34,5195,5193],{"__ignoreMap":82},[10,5197,118],{},[14,5199,121],{"id":121},[123,5201,5202,5208],{},[52,5203,908,5204,5207],{},[34,5205,5206],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[52,5209,5210,5211,5214],{},"运行到 ",[34,5212,5213],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5216,144],{"id":144},[49,5218,5219,5222],{},[52,5220,5221],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[52,5223,5224],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5226,155],{"id":155},[123,5228,5229,5236],{},[52,5230,5231,5232,5235],{},"定义 ",[34,5233,5234],{},"show_plan()"," 输出两行学习计划。",[52,5237,5238],{},"连续调用同一个函数两次，观察执行顺序。",[10,5240,173],{},[14,5242,176],{"id":176},[10,5244,5245],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,5247,183],{},{"title":82,"searchDepth":95,"depth":95,"links":5249},[5250,5251,5252,5253,5254,5255,5256,5257],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5110,"description":5115},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[194,5265,5266],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5269,"title":5270,"body":5271,"category":194,"cover":195,"description":5275,"extension":196,"meta":5455,"navigation":198,"path":5456,"pinned":200,"publishedAt":201,"seo":5457,"slug":5458,"stem":5459,"summary":5460,"tags":5461,"updatedAt":201,"visible":198,"__hash__":5464},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5272,"toc":5443},[5273,5276,5278,5281,5283,5289,5296,5298,5315,5317,5319,5353,5355,5361,5363,5365,5386,5388,5391,5397,5407,5409,5424,5426,5434,5436,5438,5441],[10,5274,5275],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5277,16],{"id":16},[10,5279,5280],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5282,22],{"id":22},[10,5284,5285],{},[26,5286],{"alt":5287,"src":5288},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5290,5291,5292,5295],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[34,5293,5294],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5297,47],{"id":47},[49,5299,5300,5303,5306],{},[52,5301,5302],{},"形参出现在函数定义中，实参出现在函数调用中。",[52,5304,5305],{},"局部变量默认只在函数内部可见。",[52,5307,5308,5309,5311,5312,37],{},"没有显式 ",[34,5310,5294],{}," 的函数会返回 ",[34,5313,5314],{},"None",[14,5316,72],{"id":72},[10,5318,75],{},[77,5320,5322],{"className":79,"code":5321,"language":81,"meta":82,"style":82},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[34,5323,5324,5329,5334,5339,5343,5348],{"__ignoreMap":82},[86,5325,5326],{"class":88,"line":89},[86,5327,5328],{},"def calculate_total(price, count):\n",[86,5330,5331],{"class":88,"line":95},[86,5332,5333],{},"    total = price * count\n",[86,5335,5336],{"class":88,"line":101},[86,5337,5338],{},"    return total\n",[86,5340,5341],{"class":88,"line":398},[86,5342,1068],{"emptyLinePlaceholder":198},[86,5344,5345],{"class":88,"line":1115},[86,5346,5347],{},"result = calculate_total(25, 4)\n",[86,5349,5350],{"class":88,"line":1121},[86,5351,5352],{},"print(result)\n",[10,5354,107],{},[77,5356,5359],{"className":5357,"code":5358,"language":113,"meta":82},[111],"100\n",[34,5360,5358],{"__ignoreMap":82},[10,5362,118],{},[14,5364,121],{"id":121},[123,5366,5367,5376],{},[52,5368,5369,5370,2188,5373,5375],{},"调用时 25 和 4 分别绑定到 ",[34,5371,5372],{},"price",[34,5374,4335],{},"，它们只在本次函数调用的局部范围中使用。",[52,5377,5378,5381,5382,5385],{},[34,5379,5380],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[34,5383,5384],{},"result"," 并输出。",[298,5387,2630],{"id":2630},[10,5389,5390],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5392,5393],{},[26,5394],{"alt":5395,"src":5396},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5398,5399,2188,5401,1130,5403,5406],{},[34,5400,5372],{},[34,5402,4335],{},[34,5404,5405],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5408,144],{"id":144},[49,5410,5411,5418],{},[52,5412,5413,5414,5417],{},"在函数内部只 ",[34,5415,5416],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[52,5419,5420,5421,5423],{},"试图在函数外直接访问局部变量 ",[34,5422,5405],{},"，它的名字只在调用期间的局部作用域存在。",[14,5425,155],{"id":155},[123,5427,5428,5431],{},[52,5429,5430],{},"编写计算长方形面积的函数。",[52,5432,5433],{},"让函数返回结果后在调用方加上单位再输出。",[10,5435,173],{},[14,5437,176],{"id":176},[10,5439,5440],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,5442,183],{},{"title":82,"searchDepth":95,"depth":95,"links":5444},[5445,5446,5447,5448,5449,5452,5453,5454],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":5450},[5451],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5270,"description":5275},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[194,5462,5463],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5466,"title":5467,"body":5468,"category":194,"cover":195,"description":5472,"extension":196,"meta":5652,"navigation":198,"path":5653,"pinned":200,"publishedAt":201,"seo":5654,"slug":5655,"stem":5656,"summary":5657,"tags":5658,"updatedAt":201,"visible":198,"__hash__":5661},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5469,"toc":5640},[5470,5473,5475,5478,5480,5486,5489,5491,5508,5510,5512,5564,5566,5572,5574,5576,5594,5596,5599,5605,5608,5610,5621,5623,5631,5633,5635,5638],[10,5471,5472],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5474,16],{"id":16},[10,5476,5477],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5479,22],{"id":22},[10,5481,5482],{},[26,5483],{"alt":5484,"src":5485},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5487,5488],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5490,47],{"id":47},[49,5492,5493,5496,5502],{},[52,5494,5495],{},"必需参数应放在有默认值的参数之前。",[52,5497,5498,5501],{},[34,5499,5500],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[52,5503,5504,5507],{},[34,5505,5506],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5509,72],{"id":72},[10,5511,75],{},[77,5513,5515],{"className":79,"code":5514,"language":81,"meta":82,"style":82},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[34,5516,5517,5522,5527,5531,5536,5541,5545,5550,5555,5559],{"__ignoreMap":82},[86,5518,5519],{"class":88,"line":89},[86,5520,5521],{},"def build_title(name, level=\"基础\"):\n",[86,5523,5524],{"class":88,"line":95},[86,5525,5526],{},"    return name + \"｜\" + level\n",[86,5528,5529],{"class":88,"line":101},[86,5530,1068],{"emptyLinePlaceholder":198},[86,5532,5533],{"class":88,"line":398},[86,5534,5535],{},"print(build_title(\"Python\"))\n",[86,5537,5538],{"class":88,"line":1115},[86,5539,5540],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[86,5542,5543],{"class":88,"line":1121},[86,5544,1068],{"emptyLinePlaceholder":198},[86,5546,5547],{"class":88,"line":2420},[86,5548,5549],{},"def total(*numbers):\n",[86,5551,5552],{"class":88,"line":2426},[86,5553,5554],{},"    return sum(numbers)\n",[86,5556,5557],{"class":88,"line":3886},[86,5558,1068],{"emptyLinePlaceholder":198},[86,5560,5561],{"class":88,"line":4098},[86,5562,5563],{},"print(total(10, 20, 30))\n",[10,5565,107],{},[77,5567,5570],{"className":5568,"code":5569,"language":113,"meta":82},[111],"Python｜基础\n异常处理｜进阶\n60\n",[34,5571,5569],{"__ignoreMap":82},[10,5573,118],{},[14,5575,121],{"id":121},[123,5577,5578,5585],{},[52,5579,5580,5581,5584],{},"第一次调用只提供必需参数，",[34,5582,5583],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[52,5586,5587,5590,5591,37],{},[34,5588,5589],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[34,5592,5593],{},"sum()",[298,5595,2630],{"id":2630},[10,5597,5598],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5600,5601],{},[26,5602],{"alt":5603,"src":5604},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5606,5607],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5609,144],{"id":144},[49,5611,5612,5618],{},[52,5613,5614,5615,5617],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[34,5616,5314],{}," 再在函数内创建。",[52,5619,5620],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5622,155],{"id":155},[123,5624,5625,5628],{},[52,5626,5627],{},"给问候函数增加默认称呼。",[52,5629,5630],{},"编写接收任意数量分数并返回总分的函数。",[10,5632,173],{},[14,5634,176],{"id":176},[10,5636,5637],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,5639,183],{},{"title":82,"searchDepth":95,"depth":95,"links":5641},[5642,5643,5644,5645,5646,5649,5650,5651],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":5647},[5648],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5467,"description":5472},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[194,5659,5660],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5663,"title":5664,"body":5665,"category":194,"cover":195,"description":5669,"extension":196,"meta":5866,"navigation":198,"path":5867,"pinned":200,"publishedAt":201,"seo":5868,"slug":5869,"stem":5870,"summary":5871,"tags":5872,"updatedAt":201,"visible":198,"__hash__":5875},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5666,"toc":5854},[5667,5670,5672,5675,5677,5683,5686,5688,5705,5707,5709,5772,5774,5780,5782,5784,5811,5813,5816,5822,5825,5827,5835,5837,5845,5847,5849,5852],[10,5668,5669],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5671,16],{"id":16},[10,5673,5674],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5676,22],{"id":22},[10,5678,5679],{},[26,5680],{"alt":5681,"src":5682},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5684,5685],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5687,47],{"id":47},[49,5689,5690,5693,5696],{},[52,5691,5692],{},"函数内部赋值默认创建局部变量。",[52,5694,5695],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[52,5697,5698,166,5701,5704],{},[34,5699,5700],{},"global",[34,5702,5703],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5706,72],{"id":72},[10,5708,75],{},[77,5710,5712],{"className":79,"code":5711,"language":81,"meta":82,"style":82},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[34,5713,5714,5719,5723,5728,5733,5737,5742,5747,5752,5756,5761,5766],{"__ignoreMap":82},[86,5715,5716],{"class":88,"line":89},[86,5717,5718],{},"course = \"Python\"\n",[86,5720,5721],{"class":88,"line":95},[86,5722,1068],{"emptyLinePlaceholder":198},[86,5724,5725],{"class":88,"line":101},[86,5726,5727],{},"def outer():\n",[86,5729,5730],{"class":88,"line":398},[86,5731,5732],{},"    level = \"基础\"\n",[86,5734,5735],{"class":88,"line":1115},[86,5736,1068],{"emptyLinePlaceholder":198},[86,5738,5739],{"class":88,"line":1121},[86,5740,5741],{},"    def show():\n",[86,5743,5744],{"class":88,"line":2420},[86,5745,5746],{},"        lesson = \"作用域\"\n",[86,5748,5749],{"class":88,"line":2426},[86,5750,5751],{},"        print(course, level, lesson)\n",[86,5753,5754],{"class":88,"line":3886},[86,5755,1068],{"emptyLinePlaceholder":198},[86,5757,5758],{"class":88,"line":4098},[86,5759,5760],{},"    show()\n",[86,5762,5764],{"class":88,"line":5763},11,[86,5765,1068],{"emptyLinePlaceholder":198},[86,5767,5769],{"class":88,"line":5768},12,[86,5770,5771],{},"outer()\n",[10,5773,107],{},[77,5775,5778],{"className":5776,"code":5777,"language":113,"meta":82},[111],"Python 基础 作用域\n",[34,5779,5777],{"__ignoreMap":82},[10,5781,118],{},[14,5783,121],{"id":121},[123,5785,5786,5803],{},[52,5787,5788,5791,5792,5795,5796,5798,5799,5802],{},[34,5789,5790],{},"show()"," 中查找 ",[34,5793,5794],{},"lesson"," 时先在局部找到，查找 ",[34,5797,5583],{}," 时到外层 ",[34,5800,5801],{},"outer()"," 找到。",[52,5804,5805,5807,5808,5810],{},[34,5806,4518],{}," 在局部和外层都不存在，继续到模块全局找到；",[34,5809,208],{}," 最后在内置作用域找到。",[298,5812,2630],{"id":2630},[10,5814,5815],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5817,5818],{},[26,5819],{"alt":5820,"src":5821},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5823,5824],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5826,144],{"id":144},[49,5828,5829,5832],{},[52,5830,5831],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[52,5833,5834],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5836,155],{"id":155},[123,5838,5839,5842],{},[52,5840,5841],{},"在内外层定义同名变量，观察最近作用域优先。",[52,5843,5844],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5846,173],{},[14,5848,176],{"id":176},[10,5850,5851],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,5853,183],{},{"title":82,"searchDepth":95,"depth":95,"links":5855},[5856,5857,5858,5859,5860,5863,5864,5865],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":5861},[5862],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5664,"description":5669},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[194,5873,5874],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5877,"title":5878,"body":5879,"category":194,"cover":195,"description":5883,"extension":196,"meta":6033,"navigation":198,"path":6034,"pinned":200,"publishedAt":201,"seo":6035,"slug":6036,"stem":6037,"summary":6038,"tags":6039,"updatedAt":201,"visible":198,"__hash__":6042},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5880,"toc":6023},[5881,5884,5886,5889,5891,5897,5900,5902,5921,5923,5925,5959,5961,5967,5969,5971,5986,5988,6000,6002,6014,6016,6018,6021],[10,5882,5883],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5885,16],{"id":16},[10,5887,5888],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5890,22],{"id":22},[10,5892,5893],{},[26,5894],{"alt":5895,"src":5896},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5898,5899],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5901,47],{"id":47},[49,5903,5904,5907,5910],{},[52,5905,5906],{},"文档字符串紧跟在函数定义后的第一条语句。",[52,5908,5909],{},"注解表达接口意图，不代替输入校验和测试。",[52,5911,5912,5913,2188,5915,2188,5917,5920],{},"基础注解优先使用 ",[34,5914,2191],{},[34,5916,2357],{},[34,5918,5919],{},"list[str]"," 等直接写法。",[14,5922,72],{"id":72},[10,5924,75],{},[77,5926,5928],{"className":79,"code":5927,"language":81,"meta":82,"style":82},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[34,5929,5930,5935,5940,5945,5949,5954],{"__ignoreMap":82},[86,5931,5932],{"class":88,"line":89},[86,5933,5934],{},"def format_score(name: str, score: int) -> str:\n",[86,5936,5937],{"class":88,"line":95},[86,5938,5939],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[86,5941,5942],{"class":88,"line":101},[86,5943,5944],{},"    return name + \"：\" + str(score)\n",[86,5946,5947],{"class":88,"line":398},[86,5948,1068],{"emptyLinePlaceholder":198},[86,5950,5951],{"class":88,"line":1115},[86,5952,5953],{},"print(format_score(\"小郑\", 95))\n",[86,5955,5956],{"class":88,"line":1121},[86,5957,5958],{},"print(format_score.__doc__)\n",[10,5960,107],{},[77,5962,5965],{"className":5963,"code":5964,"language":113,"meta":82},[111],"小郑：95\n返回带姓名的分数文本。\n",[34,5966,5964],{"__ignoreMap":82},[10,5968,118],{},[14,5970,121],{"id":121},[123,5972,5973,5983],{},[52,5974,5975,5976,5979,5980,5982],{},"函数签名说明 ",[34,5977,5978],{},"name"," 预期为字符串、",[34,5981,2177],{}," 预期为整数，返回值预期为字符串。",[52,5984,5985],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5987,144],{"id":144},[49,5989,5990,5997],{},[52,5991,5992,5993,5996],{},"认为加了 ",[34,5994,5995],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[52,5998,5999],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6001,155],{"id":155},[123,6003,6004,6007],{},[52,6005,6006],{},"为面积函数补充参数和返回值注解。",[52,6008,6009,6010,6013],{},"通过 ",[34,6011,6012],{},"函数名.__doc__"," 查看文档字符串。",[10,6015,173],{},[14,6017,176],{"id":176},[10,6019,6020],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,6022,183],{},{"title":82,"searchDepth":95,"depth":95,"links":6024},[6025,6026,6027,6028,6029,6030,6031,6032],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5878,"description":5883},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[194,6040,6041],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6044,"title":6045,"body":6046,"category":194,"cover":195,"description":6050,"extension":196,"meta":6277,"navigation":198,"path":6278,"pinned":200,"publishedAt":201,"seo":6279,"slug":6280,"stem":6281,"summary":6282,"tags":6283,"updatedAt":201,"visible":198,"__hash__":6286},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6047,"toc":6265},[6048,6051,6053,6059,6061,6067,6078,6080,6098,6100,6107,6136,6143,6162,6171,6173,6179,6181,6183,6206,6208,6211,6217,6223,6225,6241,6243,6256,6258,6260,6263],[10,6049,6050],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6052,16],{"id":16},[10,6054,6055,6056,6058],{},"本篇只处理“模块、import 与 ",[264,6057,5978],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6060,22],{"id":22},[10,6062,6063],{},[26,6064],{"alt":6065,"src":6066},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6068,6069,6070,6073,6074,6077],{},"同一个文件直接运行时 ",[34,6071,6072],{},"__name__"," 等于 ",[34,6075,6076],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6079,47],{"id":47},[49,6081,6082,6088,6091],{},[52,6083,6084,6085,6087],{},"一个 ",[34,6086,1144],{}," 文件就是一个模块。",[52,6089,6090],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[52,6092,6093,6094,6097],{},"避免使用 ",[34,6095,6096],{},"from module import *","，它会让名字来源不清楚。",[14,6099,72],{"id":72},[10,6101,6102,6103,6106],{},"先在同一个目录中创建两个文件。把函数放进 ",[34,6104,6105],{},"calculator.py","：",[77,6108,6110],{"className":79,"code":6109,"language":81,"meta":82,"style":82},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[34,6111,6112,6117,6122,6126,6131],{"__ignoreMap":82},[86,6113,6114],{"class":88,"line":89},[86,6115,6116],{},"def add(left, right):\n",[86,6118,6119],{"class":88,"line":95},[86,6120,6121],{},"    return left + right\n",[86,6123,6124],{"class":88,"line":101},[86,6125,1068],{"emptyLinePlaceholder":198},[86,6127,6128],{"class":88,"line":398},[86,6129,6130],{},"if __name__ == \"__main__\":\n",[86,6132,6133],{"class":88,"line":1115},[86,6134,6135],{},"    print(add(2, 3))\n",[10,6137,6138,6139,6142],{},"再创建 ",[34,6140,6141],{},"app.py","，从模块中导入函数：",[77,6144,6146],{"className":79,"code":6145,"language":81,"meta":82,"style":82},"from calculator import add\n\nprint(add(10, 20))\n",[34,6147,6148,6153,6157],{"__ignoreMap":82},[86,6149,6150],{"class":88,"line":89},[86,6151,6152],{},"from calculator import add\n",[86,6154,6155],{"class":88,"line":95},[86,6156,1068],{"emptyLinePlaceholder":198},[86,6158,6159],{"class":88,"line":101},[86,6160,6161],{},"print(add(10, 20))\n",[10,6163,6164,6165,1130,6168,37],{},"分别执行 ",[34,6166,6167],{},"python3 calculator.py",[34,6169,6170],{},"python3 app.py",[10,6172,107],{},[77,6174,6177],{"className":6175,"code":6176,"language":113,"meta":82},[111],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[34,6178,6176],{"__ignoreMap":82},[10,6180,118],{},[14,6182,121],{"id":121},[123,6184,6185,6195],{},[52,6186,6187,6188,6190,6191,6194],{},"直接运行 ",[34,6189,6105],{}," 时，模块名是 ",[34,6192,6193],{},"__main__","，入口代码输出 5。",[52,6196,6197,6199,6200,6202,6203,6205],{},[34,6198,6141],{}," 导入模块时，",[34,6201,6105],{}," 的函数定义会执行，但入口判断为假；随后 ",[34,6204,6141],{}," 调用函数输出 30。",[298,6207,2630],{"id":2630},[10,6209,6210],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6212,6213],{},[26,6214],{"alt":6215,"src":6216},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6218,6219,6220,6222],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[34,6221,6193],{}," 保护下的演示代码。",[14,6224,144],{"id":144},[49,6226,6227,6234],{},[52,6228,6229,6230,1130,6232,37],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[34,6231,6105],{},[34,6233,6141],{},[52,6235,6236,6237,6240],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[34,6238,6239],{},"json.py","，导致导入目标被遮蔽。",[14,6242,155],{"id":155},[123,6244,6245,6251],{},[52,6246,2285,6247,6250],{},[34,6248,6249],{},"text_tools.py"," 并导出一个格式化函数。",[52,6252,6253,6254,37],{},"分别直接运行模块和从另一个脚本导入，输出 ",[34,6255,6072],{},[10,6257,173],{},[14,6259,176],{"id":176},[10,6261,6262],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,6264,183],{},{"title":82,"searchDepth":95,"depth":95,"links":6266},[6267,6268,6269,6270,6271,6274,6275,6276],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":6272},[6273],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6045,"description":6050},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[194,6284,6285],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6288,"title":6289,"body":6290,"category":194,"cover":195,"description":6294,"extension":196,"meta":6459,"navigation":198,"path":6460,"pinned":200,"publishedAt":201,"seo":6461,"slug":6462,"stem":6463,"summary":6464,"tags":6465,"updatedAt":201,"visible":198,"__hash__":6467},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6291,"toc":6449},[6292,6295,6297,6300,6302,6308,6311,6313,6327,6329,6331,6377,6379,6385,6387,6389,6415,6417,6427,6429,6440,6442,6444,6447],[10,6293,6294],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6296,16],{"id":16},[10,6298,6299],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6301,22],{"id":22},[10,6303,6304],{},[26,6305],{"alt":6306,"src":6307},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6309,6310],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6312,47],{"id":47},[49,6314,6315,6321,6324],{},[52,6316,6317,6320],{},[34,6318,6319],{},".venv"," 是常见目录名，不应提交到 Git。",[52,6322,6323],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[52,6325,6326],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6328,72],{"id":72},[10,6330,1546],{},[77,6332,6334],{"className":561,"code":6333,"language":563,"meta":82,"style":82},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[34,6335,6336,6348,6356,6362,6372],{"__ignoreMap":82},[86,6337,6338,6340,6342,6345],{"class":88,"line":89},[86,6339,661],{"class":570},[86,6341,603],{"class":573},[86,6343,6344],{"class":606}," venv",[86,6346,6347],{"class":606}," .venv\n",[86,6349,6350,6353],{"class":88,"line":95},[86,6351,6352],{"class":573},"source",[86,6354,6355],{"class":606}," .venv\u002Fbin\u002Factivate\n",[86,6357,6358,6360],{"class":88,"line":101},[86,6359,81],{"class":570},[86,6361,574],{"class":573},[86,6363,6364,6366,6368,6370],{"class":88,"line":398},[86,6365,81],{"class":570},[86,6367,603],{"class":573},[86,6369,607],{"class":606},[86,6371,574],{"class":573},[86,6373,6374],{"class":88,"line":1115},[86,6375,6376],{"class":570},"deactivate\n",[10,6378,107],{},[77,6380,6383],{"className":6381,"code":6382,"language":113,"meta":82},[111],"Python 和 pip 的路径应指向当前项目的 .venv\n",[34,6384,6382],{"__ignoreMap":82},[10,6386,118],{},[14,6388,121],{"id":121},[123,6390,6391,6400],{},[52,6392,6393,6396,6397,6399],{},[34,6394,6395],{},"venv"," 根据当前 ",[34,6398,661],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[52,6401,6402,6403,166,6405,6408,6409,3661,6411,6414],{},"激活后 ",[34,6404,81],{},[34,6406,6407],{},"python -m pip"," 优先指向 ",[34,6410,6319],{},[34,6412,6413],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6416,144],{"id":144},[49,6418,6419,6422],{},[52,6420,6421],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[52,6423,3400,6424,6426],{},[34,6425,6319],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6428,155],{"id":155},[123,6430,6431,6437],{},[52,6432,6433,6434,37],{},"创建虚拟环境并记录激活前后的 ",[34,6435,6436],{},"which python",[52,6438,6439],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6441,173],{},[14,6443,176],{"id":176},[10,6445,6446],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,6448,1630],{},{"title":82,"searchDepth":95,"depth":95,"links":6450},[6451,6452,6453,6454,6455,6456,6457,6458],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6289,"description":6294},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[194,6466,230],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6469,"title":6470,"body":6471,"category":194,"cover":195,"description":6475,"extension":196,"meta":6663,"navigation":198,"path":6664,"pinned":200,"publishedAt":201,"seo":6665,"slug":6666,"stem":6667,"summary":6668,"tags":6669,"updatedAt":201,"visible":198,"__hash__":6672},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6472,"toc":6653},[6473,6476,6478,6481,6483,6489,6498,6500,6524,6526,6528,6581,6583,6589,6591,6593,6609,6611,6630,6632,6644,6646,6648,6651],[10,6474,6475],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6477,16],{"id":16},[10,6479,6480],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6482,22],{"id":22},[10,6484,6485],{},[26,6486],{"alt":6487,"src":6488},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6490,6491,6494,6495,6497],{},[34,6492,6493],{},"Path"," 使用 ",[34,6496,2367],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6499,47],{"id":47},[49,6501,6502,6505,6517],{},[52,6503,6504],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[52,6506,6507,2188,6510,2188,6513,6516],{},[34,6508,6509],{},"exists()",[34,6511,6512],{},"is_file()",[34,6514,6515],{},"is_dir()"," 检查真实文件系统状态。",[52,6518,6519,6520,6523],{},"创建目录前明确目标；",[34,6521,6522],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6525,72],{"id":72},[10,6527,75],{},[77,6529,6531],{"className":79,"code":6530,"language":81,"meta":82,"style":82},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[34,6532,6533,6538,6542,6547,6552,6557,6561,6566,6571,6576],{"__ignoreMap":82},[86,6534,6535],{"class":88,"line":89},[86,6536,6537],{},"from pathlib import Path\n",[86,6539,6540],{"class":88,"line":95},[86,6541,1068],{"emptyLinePlaceholder":198},[86,6543,6544],{"class":88,"line":101},[86,6545,6546],{},"project = Path.cwd()\n",[86,6548,6549],{"class":88,"line":398},[86,6550,6551],{},"data_dir = project \u002F \"data\"\n",[86,6553,6554],{"class":88,"line":1115},[86,6555,6556],{},"file_path = data_dir \u002F \"records.json\"\n",[86,6558,6559],{"class":88,"line":1121},[86,6560,1068],{"emptyLinePlaceholder":198},[86,6562,6563],{"class":88,"line":2420},[86,6564,6565],{},"print(project)\n",[86,6567,6568],{"class":88,"line":2426},[86,6569,6570],{},"print(file_path.name)\n",[86,6572,6573],{"class":88,"line":3886},[86,6574,6575],{},"print(file_path.suffix)\n",[86,6577,6578],{"class":88,"line":4098},[86,6579,6580],{},"print(file_path.exists())\n",[10,6582,107],{},[77,6584,6587],{"className":6585,"code":6586,"language":113,"meta":82},[111],"显示当前项目路径、records.json、.json 和存在状态\n",[34,6588,6586],{"__ignoreMap":82},[10,6590,118],{},[14,6592,121],{"id":121},[123,6594,6595,6601],{},[52,6596,6597,6600],{},[34,6598,6599],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[52,6602,2270,6603,6605,6606,6608],{},[34,6604,2367],{}," 组合路径片段只创建新的 ",[34,6607,6493],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6610,144],{"id":144},[49,6612,6613,6621],{},[52,6614,3400,6615,6617,6618,6620],{},[34,6616,6493],{}," 对象存在当成真实文件存在，仍需调用 ",[34,6619,6509],{}," 等方法确认。",[52,6622,6623,6624,979,6626,6629],{},"手工拼接 ",[34,6625,2367],{},[34,6627,6628],{},"\\"," 分隔符，降低跨平台可读性。",[14,6631,155],{"id":155},[123,6633,6634,6641],{},[52,6635,6636,6637,6640],{},"组合 ",[34,6638,6639],{},"output\u002Freport.txt"," 路径但先不创建文件。",[52,6642,6643],{},"输出路径的父目录、文件名和扩展名。",[10,6645,173],{},[14,6647,176],{"id":176},[10,6649,6650],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,6652,183],{},{"title":82,"searchDepth":95,"depth":95,"links":6654},[6655,6656,6657,6658,6659,6660,6661,6662],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6470,"description":6475},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[194,6670,6671],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6674,"title":6675,"body":6676,"category":194,"cover":195,"description":6680,"extension":196,"meta":6858,"navigation":198,"path":6859,"pinned":200,"publishedAt":201,"seo":6860,"slug":6861,"stem":6862,"summary":6863,"tags":6864,"updatedAt":201,"visible":198,"__hash__":6867},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6677,"toc":6848},[6678,6681,6683,6686,6688,6694,6697,6699,6727,6729,6731,6788,6790,6796,6798,6800,6811,6813,6826,6828,6839,6841,6843,6846],[10,6679,6680],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6682,16],{"id":16},[10,6684,6685],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6687,22],{"id":22},[10,6689,6690],{},[26,6691],{"alt":6692,"src":6693},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6695,6696],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6698,47],{"id":47},[49,6700,6701,6707,6716],{},[52,6702,6703,6706],{},[34,6704,6705],{},"w"," 模式会截断原文件，写入前必须确认目标。",[52,6708,6709,6712,6713,37],{},[34,6710,6711],{},"r"," 模式读取不存在文件会产生 ",[34,6714,6715],{},"FileNotFoundError",[52,6717,6718,6719,6722,6723,6726],{},"本篇显式调用 ",[34,6720,6721],{},"close()","；第 34 篇会用 ",[34,6724,6725],{},"with"," 更可靠地管理关闭动作。",[14,6728,72],{"id":72},[10,6730,75],{},[77,6732,6734],{"className":79,"code":6733,"language":81,"meta":82,"style":82},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[34,6735,6736,6740,6744,6749,6754,6759,6764,6768,6773,6778,6783],{"__ignoreMap":82},[86,6737,6738],{"class":88,"line":89},[86,6739,6537],{},[86,6741,6742],{"class":88,"line":95},[86,6743,1068],{"emptyLinePlaceholder":198},[86,6745,6746],{"class":88,"line":101},[86,6747,6748],{},"file_path = Path(\"notes.txt\")\n",[86,6750,6751],{"class":88,"line":398},[86,6752,6753],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[86,6755,6756],{"class":88,"line":1115},[86,6757,6758],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[86,6760,6761],{"class":88,"line":1121},[86,6762,6763],{},"writer.close()\n",[86,6765,6766],{"class":88,"line":2420},[86,6767,1068],{"emptyLinePlaceholder":198},[86,6769,6770],{"class":88,"line":2426},[86,6771,6772],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[86,6774,6775],{"class":88,"line":3886},[86,6776,6777],{},"content = reader.read()\n",[86,6779,6780],{"class":88,"line":4098},[86,6781,6782],{},"reader.close()\n",[86,6784,6785],{"class":88,"line":5763},[86,6786,6787],{},"print(content)\n",[10,6789,107],{},[77,6791,6794],{"className":6792,"code":6793,"language":113,"meta":82},[111],"变量\n循环\n函数\n",[34,6795,6793],{"__ignoreMap":82},[10,6797,118],{},[14,6799,121],{"id":121},[123,6801,6802,6808],{},[52,6803,6804,6805,6807],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[34,6806,6721],{}," 确保缓冲内容交给文件系统。",[52,6809,6810],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6812,144],{"id":144},[49,6814,6815,6820],{},[52,6816,2270,6817,6819],{},[34,6818,6705],{}," 模式打开重要文件却未确认覆盖风险。",[52,6821,6822,6823,37],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[34,6824,6825],{},"encoding=\"utf-8\"",[14,6827,155],{"id":155},[123,6829,6830,6833],{},[52,6831,6832],{},"写入三行学习记录并读取。",[52,6834,6835,6836,6838],{},"改用 ",[34,6837,306],{}," 模式追加一行，确认原内容仍保留。",[10,6840,173],{},[14,6842,176],{"id":176},[10,6844,6845],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,6847,183],{},{"title":82,"searchDepth":95,"depth":95,"links":6849},[6850,6851,6852,6853,6854,6855,6856,6857],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6675,"description":6680},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[194,6865,6866],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6869,"title":6870,"body":6871,"category":194,"cover":195,"description":6875,"extension":196,"meta":7042,"navigation":198,"path":7043,"pinned":200,"publishedAt":201,"seo":7044,"slug":7045,"stem":7046,"summary":7047,"tags":7048,"updatedAt":201,"visible":198,"__hash__":7051},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6872,"toc":7032},[6873,6876,6878,6881,6883,6889,6899,6901,6915,6917,6919,6979,6981,6987,6989,6991,7003,7005,7013,7015,7023,7025,7027,7030],[10,6874,6875],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6877,16],{"id":16},[10,6879,6880],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6882,22],{"id":22},[10,6884,6885],{},[26,6886],{"alt":6887,"src":6888},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6890,6891,6894,6895,6898],{},[34,6892,6893],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[34,6896,6897],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6900,47],{"id":47},[49,6902,6903,6906,6912],{},[52,6904,6905],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[52,6907,6908,6911],{},[34,6909,6910],{},"ensure_ascii=False"," 让中文以可读字符写入。",[52,6913,6914],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6916,72],{"id":72},[10,6918,75],{},[77,6920,6922],{"className":79,"code":6921,"language":81,"meta":82,"style":82},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[34,6923,6924,6929,6933,6938,6942,6947,6952,6956,6960,6965,6970,6974],{"__ignoreMap":82},[86,6925,6926],{"class":88,"line":89},[86,6927,6928],{},"import json\n",[86,6930,6931],{"class":88,"line":95},[86,6932,1068],{"emptyLinePlaceholder":198},[86,6934,6935],{"class":88,"line":101},[86,6936,6937],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[86,6939,6940],{"class":88,"line":398},[86,6941,1068],{"emptyLinePlaceholder":198},[86,6943,6944],{"class":88,"line":1115},[86,6945,6946],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[86,6948,6949],{"class":88,"line":1121},[86,6950,6951],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[86,6953,6954],{"class":88,"line":2420},[86,6955,6763],{},[86,6957,6958],{"class":88,"line":2426},[86,6959,1068],{"emptyLinePlaceholder":198},[86,6961,6962],{"class":88,"line":3886},[86,6963,6964],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[86,6966,6967],{"class":88,"line":4098},[86,6968,6969],{},"loaded = json.load(reader)\n",[86,6971,6972],{"class":88,"line":5763},[86,6973,6782],{},[86,6975,6976],{"class":88,"line":5768},[86,6977,6978],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6980,107],{},[77,6982,6985],{"className":6983,"code":6984,"language":113,"meta":82},[111],"Python 60\n",[34,6986,6984],{"__ignoreMap":82},[10,6988,118],{},[14,6990,121],{"id":121},[123,6992,6993,6998],{},[52,6994,6995,6997],{},[34,6996,6893],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[52,6999,7000,7002],{},[34,7001,6897],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7004,144],{"id":144},[49,7006,7007,7010],{},[52,7008,7009],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[52,7011,7012],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7014,155],{"id":155},[123,7016,7017,7020],{},[52,7018,7019],{},"保存包含两条学习记录的列表。",[52,7021,7022],{},"读取后修改进度，再重新写回文件。",[10,7024,173],{},[14,7026,176],{"id":176},[10,7028,7029],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,7031,183],{},{"title":82,"searchDepth":95,"depth":95,"links":7033},[7034,7035,7036,7037,7038,7039,7040,7041],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6870,"description":6875},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[194,7049,7050],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7053,"title":7054,"body":7055,"category":194,"cover":195,"description":7059,"extension":196,"meta":7243,"navigation":198,"path":7244,"pinned":200,"publishedAt":201,"seo":7245,"slug":7246,"stem":7247,"summary":7248,"tags":7249,"updatedAt":201,"visible":198,"__hash__":7252},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7056,"toc":7233},[7057,7060,7062,7065,7067,7073,7079,7081,7103,7105,7107,7170,7172,7178,7180,7182,7198,7200,7214,7216,7224,7226,7228,7231],[10,7058,7059],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7061,16],{"id":16},[10,7063,7064],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7066,22],{"id":22},[10,7068,7069],{},[26,7070],{"alt":7071,"src":7072},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7074,7075,7078],{},[34,7076,7077],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7080,47],{"id":47},[49,7082,7083,7093,7100],{},[52,7084,2270,7085,7088,7089,7092],{},[34,7086,7087],{},"newline=\"\""," 让 ",[34,7090,7091],{},"csv"," 模块正确处理换行。",[52,7094,7095,7096,7099],{},"字段顺序由 ",[34,7097,7098],{},"fieldnames"," 决定，字典键需要与字段名一致。",[52,7101,7102],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7104,72],{"id":72},[10,7106,75],{},[77,7108,7110],{"className":79,"code":7109,"language":81,"meta":82,"style":82},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[34,7111,7112,7117,7121,7126,7131,7136,7141,7146,7150,7155,7160,7165],{"__ignoreMap":82},[86,7113,7114],{"class":88,"line":89},[86,7115,7116],{},"import csv\n",[86,7118,7119],{"class":88,"line":95},[86,7120,1068],{"emptyLinePlaceholder":198},[86,7122,7123],{"class":88,"line":101},[86,7124,7125],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[86,7127,7128],{"class":88,"line":398},[86,7129,7130],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[86,7132,7133],{"class":88,"line":1115},[86,7134,7135],{},"writer.writeheader()\n",[86,7137,7138],{"class":88,"line":1121},[86,7139,7140],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[86,7142,7143],{"class":88,"line":2420},[86,7144,7145],{},"writer_file.close()\n",[86,7147,7148],{"class":88,"line":2426},[86,7149,1068],{"emptyLinePlaceholder":198},[86,7151,7152],{"class":88,"line":3886},[86,7153,7154],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[86,7156,7157],{"class":88,"line":4098},[86,7158,7159],{},"for row in csv.DictReader(reader_file):\n",[86,7161,7162],{"class":88,"line":5763},[86,7163,7164],{},"    print(row[\"name\"], row[\"score\"])\n",[86,7166,7167],{"class":88,"line":5768},[86,7168,7169],{},"reader_file.close()\n",[10,7171,107],{},[77,7173,7176],{"className":7174,"code":7175,"language":113,"meta":82},[111],"小郑 95\n",[34,7177,7175],{"__ignoreMap":82},[10,7179,118],{},[14,7181,121],{"id":121},[123,7183,7184,7193],{},[52,7185,7186,7189,7190,7192],{},[34,7187,7188],{},"DictWriter"," 按 ",[34,7191,7098],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[52,7194,7195,7197],{},[34,7196,7077],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7199,144],{"id":144},[49,7201,7202,7205],{},[52,7203,7204],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[52,7206,7207,7208,7210,7211,7213],{},"在 macOS 以外环境忽略 ",[34,7209,7087],{}," 可能出现额外空行；统一交给 ",[34,7212,7091],{}," 模块管理换行。",[14,7215,155],{"id":155},[123,7217,7218,7221],{},[52,7219,7220],{},"写入三名学习者的课程和分数。",[52,7222,7223],{},"读取 CSV 后把分数字符串转换为整数。",[10,7225,173],{},[14,7227,176],{"id":176},[10,7229,7230],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,7232,183],{},{"title":82,"searchDepth":95,"depth":95,"links":7234},[7235,7236,7237,7238,7239,7240,7241,7242],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7054,"description":7059},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[194,7250,7251],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7254,"title":7255,"body":7256,"category":194,"cover":195,"description":7260,"extension":196,"meta":7533,"navigation":198,"path":7534,"pinned":200,"publishedAt":201,"seo":7535,"slug":7536,"stem":7537,"summary":7538,"tags":7539,"updatedAt":201,"visible":198,"__hash__":7542},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7257,"toc":7520},[7258,7261,7263,7266,7268,7274,7285,7287,7304,7306,7308,7383,7385,7391,7393,7395,7420,7422,7431,7437,7448,7450,7456,7462,7471,7473,7488,7490,7511,7513,7515,7518],[10,7259,7260],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7262,16],{"id":16},[10,7264,7265],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7267,22],{"id":22},[10,7269,7270],{},[26,7271],{"alt":7272,"src":7273},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7275,7276,7277,7280,7281,7284],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[34,7278,7279],{},"except","；无论是否异常，",[34,7282,7283],{},"finally"," 都会在离开结构前执行。",[14,7286,47],{"id":47},[49,7288,7289,7295,7301],{},[52,7290,7291,7292,7294],{},"只捕获能够处理的具体异常，不使用空的 ",[34,7293,7279],{}," 吞掉全部错误。",[52,7296,7297,7300],{},[34,7298,7299],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[52,7302,7303],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7305,72],{"id":72},[10,7307,75],{},[77,7309,7311],{"className":79,"code":7310,"language":81,"meta":82,"style":82},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[34,7312,7313,7318,7323,7328,7333,7338,7342,7347,7352,7357,7362,7366,7371,7377],{"__ignoreMap":82},[86,7314,7315],{"class":88,"line":89},[86,7316,7317],{},"def parse_age(text):\n",[86,7319,7320],{"class":88,"line":95},[86,7321,7322],{},"    age = int(text)\n",[86,7324,7325],{"class":88,"line":101},[86,7326,7327],{},"    if age \u003C 0:\n",[86,7329,7330],{"class":88,"line":398},[86,7331,7332],{},"        raise ValueError(\"年龄不能为负数\")\n",[86,7334,7335],{"class":88,"line":1115},[86,7336,7337],{},"    return age\n",[86,7339,7340],{"class":88,"line":1121},[86,7341,1068],{"emptyLinePlaceholder":198},[86,7343,7344],{"class":88,"line":2420},[86,7345,7346],{},"try:\n",[86,7348,7349],{"class":88,"line":2426},[86,7350,7351],{},"    age = parse_age(\"18\")\n",[86,7353,7354],{"class":88,"line":3886},[86,7355,7356],{},"except ValueError as error:\n",[86,7358,7359],{"class":88,"line":4098},[86,7360,7361],{},"    print(\"输入错误：\", error)\n",[86,7363,7364],{"class":88,"line":5763},[86,7365,1118],{},[86,7367,7368],{"class":88,"line":5768},[86,7369,7370],{},"    print(\"年龄：\", age)\n",[86,7372,7374],{"class":88,"line":7373},13,[86,7375,7376],{},"finally:\n",[86,7378,7380],{"class":88,"line":7379},14,[86,7381,7382],{},"    print(\"处理结束\")\n",[10,7384,107],{},[77,7386,7389],{"className":7387,"code":7388,"language":113,"meta":82},[111],"年龄： 18\n处理结束\n",[34,7390,7388],{"__ignoreMap":82},[10,7392,118],{},[14,7394,121],{"id":121},[123,7396,7397,7409],{},[52,7398,7399,7401,7402,7404,7405,7408],{},[34,7400,2969],{}," 或主动 ",[34,7403,7299],{}," 都可能产生 ",[34,7406,7407],{},"ValueError","，控制流立即离开当前正常路径。",[52,7410,7411,7412,7414,7415,7417,7418,37],{},"有异常时进入匹配的 ",[34,7413,7279],{},"；没有异常时执行 ",[34,7416,1133],{},"；两种情况最后都会执行 ",[34,7419,7283],{},[298,7421,2630],{"id":2630},[10,7423,7424,2188,7426,1130,7428,7430],{},[34,7425,7279],{},[34,7427,1133],{},[34,7429,7283],{}," 的职责不同，不能只看它们出现的顺序。",[10,7432,7433],{},[26,7434],{"alt":7435,"src":7436},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7438,7439,7441,7442,7444,7445,7447],{},[34,7440,7279],{}," 处理匹配异常，",[34,7443,1133],{}," 只在无异常时运行，",[34,7446,7283],{}," 负责两条路径都需要的清理动作。",[298,7449,2630],{"id":4153},[10,7451,7452,7455],{},[34,7453,7454],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7457,7458],{},[26,7459],{"alt":7460,"src":7461},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7463,7464,7465,7467,7468,7470],{},"只把可能产生预期异常的操作放进 ",[34,7466,7454],{},"，后续正常业务放进 ",[34,7469,1133],{},"，错误边界会更清楚。",[14,7472,144],{"id":144},[49,7474,7475,7482],{},[52,7476,7477,7478,7481],{},"使用裸 ",[34,7479,7480],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[52,7483,7484,7485,7487],{},"把整个程序包在一个巨大 ",[34,7486,7454],{}," 中，无法判断究竟哪一步允许失败。",[14,7489,155],{"id":155},[123,7491,7492,7505],{},[52,7493,7494,7495,7498,7499,1130,7502,37],{},"让 ",[34,7496,7497],{},"parse_age"," 分别处理 ",[34,7500,7501],{},"\"abc\"",[34,7503,7504],{},"\"-1\"",[52,7506,7507,7508,7510],{},"为文件读取捕获 ",[34,7509,6715],{}," 并给出清晰提示。",[10,7512,173],{},[14,7514,176],{"id":176},[10,7516,7517],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,7519,183],{},{"title":82,"searchDepth":95,"depth":95,"links":7521},[7522,7523,7524,7525,7526,7530,7531,7532],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":7527},[7528,7529],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7255,"description":7260},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[194,7540,7541],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7544,"title":7545,"body":7546,"category":194,"cover":195,"description":7550,"extension":196,"meta":7726,"navigation":198,"path":7727,"pinned":200,"publishedAt":201,"seo":7728,"slug":7729,"stem":7730,"summary":7731,"tags":7732,"updatedAt":201,"visible":198,"__hash__":7734},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7547,"toc":7716},[7548,7551,7553,7556,7558,7564,7570,7572,7588,7590,7592,7646,7648,7654,7656,7658,7671,7673,7686,7688,7707,7709,7711,7714],[10,7549,7550],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7552,16],{"id":16},[10,7554,7555],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7557,22],{"id":22},[10,7559,7560],{},[26,7561],{"alt":7562,"src":7563},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7565,7566,7567,7569],{},"进入 ",[34,7568,6725],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7571,47],{"id":47},[49,7573,7574,7579,7585],{},[52,7575,7576,7578],{},[34,7577,6725],{}," 把资源获取和释放配成一个清晰边界。",[52,7580,7581,7584],{},[34,7582,7583],{},"as file"," 得到的是上下文返回的资源对象。",[52,7586,7587],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7589,72],{"id":72},[10,7591,75],{},[77,7593,7595],{"className":79,"code":7594,"language":81,"meta":82,"style":82},"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",[34,7596,7597,7601,7605,7609,7613,7618,7623,7627,7632,7637,7641],{"__ignoreMap":82},[86,7598,7599],{"class":88,"line":89},[86,7600,6537],{},[86,7602,7603],{"class":88,"line":95},[86,7604,1068],{"emptyLinePlaceholder":198},[86,7606,7607],{"class":88,"line":101},[86,7608,6748],{},[86,7610,7611],{"class":88,"line":398},[86,7612,1068],{"emptyLinePlaceholder":198},[86,7614,7615],{"class":88,"line":1115},[86,7616,7617],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[86,7619,7620],{"class":88,"line":1121},[86,7621,7622],{},"    file.write(\"上下文管理器\\n\")\n",[86,7624,7625],{"class":88,"line":2420},[86,7626,1068],{"emptyLinePlaceholder":198},[86,7628,7629],{"class":88,"line":2426},[86,7630,7631],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[86,7633,7634],{"class":88,"line":3886},[86,7635,7636],{},"    print(file.read())\n",[86,7638,7639],{"class":88,"line":4098},[86,7640,1068],{"emptyLinePlaceholder":198},[86,7642,7643],{"class":88,"line":5763},[86,7644,7645],{},"print(file.closed)\n",[10,7647,107],{},[77,7649,7652],{"className":7650,"code":7651,"language":113,"meta":82},[111],"上下文管理器\n\nTrue\n",[34,7653,7651],{"__ignoreMap":82},[10,7655,118],{},[14,7657,121],{"id":121},[123,7659,7660,7668],{},[52,7661,7566,7662,7664,7665,37],{},[34,7663,6725],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[34,7666,7667],{},"file",[52,7669,7670],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7672,144],{"id":144},[49,7674,7675,7680],{},[52,7676,4721,7677,7679],{},[34,7678,6725],{}," 代码块外继续读写已经关闭的文件对象。",[52,7681,7682,7683,7685],{},"误以为 ",[34,7684,6725],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7687,155],{"id":155},[123,7689,7690,7699],{},[52,7691,7692,7693,7696,7697,37],{},"把第 30 篇的手动 ",[34,7694,7695],{},"open\u002Fclose"," 改写为 ",[34,7698,6725],{},[52,7700,4721,7701,7703,7704,37],{},[34,7702,6725],{}," 块后检查 ",[34,7705,7706],{},"file.closed",[10,7708,173],{},[14,7710,176],{"id":176},[10,7712,7713],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,7715,183],{},{"title":82,"searchDepth":95,"depth":95,"links":7717},[7718,7719,7720,7721,7722,7723,7724,7725],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7545,"description":7550},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[194,6725,7733],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7736,"title":7737,"body":7738,"category":194,"cover":195,"description":7742,"extension":196,"meta":7954,"navigation":198,"path":7955,"pinned":200,"publishedAt":201,"seo":7956,"slug":7957,"stem":7958,"summary":7959,"tags":7960,"updatedAt":201,"visible":198,"__hash__":7963},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7739,"toc":7942},[7740,7743,7745,7748,7750,7756,7759,7761,7778,7780,7782,7850,7852,7858,7860,7862,7887,7889,7892,7898,7907,7909,7920,7922,7933,7935,7937,7940],[10,7741,7742],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7744,16],{"id":16},[10,7746,7747],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7749,22],{"id":22},[10,7751,7752],{},[26,7753],{"alt":7754,"src":7755},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7757,7758],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7760,47],{"id":47},[49,7762,7763,7769,7775],{},[52,7764,7765,7768],{},[34,7766,7767],{},"self"," 表示当前实例，由方法调用自动传入。",[52,7770,7771,7774],{},[34,7772,7773],{},"__init__"," 在实例创建过程中初始化属性。",[52,7776,7777],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7779,72],{"id":72},[10,7781,75],{},[77,7783,7785],{"className":79,"code":7784,"language":81,"meta":82,"style":82},"class LearningRecord:\n    def __init__(self, course, progress=0):\n        self.course = course\n        self.progress = progress\n\n    def advance(self, amount):\n        self.progress = self.progress + amount\n        if self.progress > 100:\n            self.progress = 100\n\nrecord = LearningRecord(\"Python\", 40)\nrecord.advance(15)\nprint(record.course, record.progress)\n",[34,7786,7787,7792,7797,7802,7807,7811,7816,7821,7826,7831,7835,7840,7845],{"__ignoreMap":82},[86,7788,7789],{"class":88,"line":89},[86,7790,7791],{},"class LearningRecord:\n",[86,7793,7794],{"class":88,"line":95},[86,7795,7796],{},"    def __init__(self, course, progress=0):\n",[86,7798,7799],{"class":88,"line":101},[86,7800,7801],{},"        self.course = course\n",[86,7803,7804],{"class":88,"line":398},[86,7805,7806],{},"        self.progress = progress\n",[86,7808,7809],{"class":88,"line":1115},[86,7810,1068],{"emptyLinePlaceholder":198},[86,7812,7813],{"class":88,"line":1121},[86,7814,7815],{},"    def advance(self, amount):\n",[86,7817,7818],{"class":88,"line":2420},[86,7819,7820],{},"        self.progress = self.progress + amount\n",[86,7822,7823],{"class":88,"line":2426},[86,7824,7825],{},"        if self.progress > 100:\n",[86,7827,7828],{"class":88,"line":3886},[86,7829,7830],{},"            self.progress = 100\n",[86,7832,7833],{"class":88,"line":4098},[86,7834,1068],{"emptyLinePlaceholder":198},[86,7836,7837],{"class":88,"line":5763},[86,7838,7839],{},"record = LearningRecord(\"Python\", 40)\n",[86,7841,7842],{"class":88,"line":5768},[86,7843,7844],{},"record.advance(15)\n",[86,7846,7847],{"class":88,"line":7373},[86,7848,7849],{},"print(record.course, record.progress)\n",[10,7851,107],{},[77,7853,7856],{"className":7854,"code":7855,"language":113,"meta":82},[111],"Python 55\n",[34,7857,7855],{"__ignoreMap":82},[10,7859,118],{},[14,7861,121],{"id":121},[123,7863,7864,7874],{},[52,7865,7866,7867,7870,7871,7873],{},"调用 ",[34,7868,7869],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[34,7872,7773],{}," 把课程和进度保存在该实例属性中。",[52,7875,7876,7879,7880,7883,7884,7886],{},[34,7877,7878],{},"record.advance(15)"," 自动把 ",[34,7881,7882],{},"record"," 作为 ",[34,7885,7767],{},"，方法更新同一实例的进度并限制上限。",[298,7888,2630],{"id":2630},[10,7890,7891],{},"类是共同定义，实例则各自保存状态。",[10,7893,7894],{},[26,7895],{"alt":7896,"src":7897},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7899,7900,7901,1130,7903,7906],{},"两个实例共享同一套方法定义，但 ",[34,7902,4518],{},[34,7904,7905],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7908,144],{"id":144},[49,7910,7911,7917],{},[52,7912,7913,7914,7916],{},"调用实例方法时手工再传一次 ",[34,7915,7767],{},"。通过实例调用时 Python 会自动绑定。",[52,7918,7919],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7921,155],{"id":155},[123,7923,7924,7930],{},[52,7925,5231,7926,7929],{},[34,7927,7928],{},"Book"," 类，保存标题和阅读页数。",[52,7931,7932],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7934,173],{},[14,7936,176],{"id":176},[10,7938,7939],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,7941,183],{},{"title":82,"searchDepth":95,"depth":95,"links":7943},[7944,7945,7946,7947,7948,7951,7952,7953],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":7949},[7950],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7737,"description":7742},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[194,7961,7962],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7965,"title":7966,"body":7967,"category":194,"cover":195,"description":7971,"extension":196,"meta":8149,"navigation":198,"path":8150,"pinned":200,"publishedAt":201,"seo":8151,"slug":8152,"stem":8153,"summary":8154,"tags":8155,"updatedAt":201,"visible":198,"__hash__":8158},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7968,"toc":8139},[7969,7972,7974,7977,7979,7985,7988,7990,8001,8003,8005,8072,8074,8080,8082,8084,8103,8105,8113,8115,8130,8132,8134,8137],[10,7970,7971],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7973,16],{"id":16},[10,7975,7976],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7978,22],{"id":22},[10,7980,7981],{},[26,7982],{"alt":7983,"src":7984},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7986,7987],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7989,47],{"id":47},[49,7991,7992,7995,7998],{},[52,7993,7994],{},"封装让对象通过方法维护自己的有效状态。",[52,7996,7997],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[52,7999,8000],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8002,72],{"id":72},[10,8004,75],{},[77,8006,8008],{"className":79,"code":8007,"language":81,"meta":82,"style":82},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[34,8009,8010,8015,8020,8025,8029,8034,8039,8044,8048,8053,8058,8062,8067],{"__ignoreMap":82},[86,8011,8012],{"class":88,"line":89},[86,8013,8014],{},"class Storage:\n",[86,8016,8017],{"class":88,"line":95},[86,8018,8019],{},"    def save(self, text):\n",[86,8021,8022],{"class":88,"line":101},[86,8023,8024],{},"        print(\"保存：\", text)\n",[86,8026,8027],{"class":88,"line":398},[86,8028,1068],{"emptyLinePlaceholder":198},[86,8030,8031],{"class":88,"line":1115},[86,8032,8033],{},"class LearningService:\n",[86,8035,8036],{"class":88,"line":1121},[86,8037,8038],{},"    def __init__(self, storage):\n",[86,8040,8041],{"class":88,"line":2420},[86,8042,8043],{},"        self.storage = storage\n",[86,8045,8046],{"class":88,"line":2426},[86,8047,1068],{"emptyLinePlaceholder":198},[86,8049,8050],{"class":88,"line":3886},[86,8051,8052],{},"    def finish_lesson(self, title):\n",[86,8054,8055],{"class":88,"line":4098},[86,8056,8057],{},"        self.storage.save(title)\n",[86,8059,8060],{"class":88,"line":5763},[86,8061,1068],{"emptyLinePlaceholder":198},[86,8063,8064],{"class":88,"line":5768},[86,8065,8066],{},"service = LearningService(Storage())\n",[86,8068,8069],{"class":88,"line":7373},[86,8070,8071],{},"service.finish_lesson(\"异常处理\")\n",[10,8073,107],{},[77,8075,8078],{"className":8076,"code":8077,"language":113,"meta":82},[111],"保存： 异常处理\n",[34,8079,8077],{"__ignoreMap":82},[10,8081,118],{},[14,8083,121],{"id":121},[123,8085,8086,8096],{},[52,8087,8088,8091,8092,8095],{},[34,8089,8090],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[34,8093,8094],{},"save()"," 的协作对象。",[52,8097,8098,8099,8102],{},"调用业务方法时，服务把保存动作委托给 ",[34,8100,8101],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8104,144],{"id":144},[49,8106,8107,8110],{},[52,8108,8109],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[52,8111,8112],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8114,155],{"id":155},[123,8116,8117,8127],{},[52,8118,8119,8120,8123,8124,37],{},"用组合让 ",[34,8121,8122],{},"OrderService"," 使用一个 ",[34,8125,8126],{},"Notifier",[52,8128,8129],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8131,173],{},[14,8133,176],{"id":176},[10,8135,8136],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,8138,183],{},{"title":82,"searchDepth":95,"depth":95,"links":8140},[8141,8142,8143,8144,8145,8146,8147,8148],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7966,"description":7971},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[194,8156,8157],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8160,"title":8161,"body":8162,"category":194,"cover":195,"description":8166,"extension":196,"meta":8369,"navigation":198,"path":8370,"pinned":200,"publishedAt":201,"seo":8371,"slug":8372,"stem":8373,"summary":8374,"tags":8375,"updatedAt":201,"visible":198,"__hash__":8378},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8163,"toc":8357},[8164,8167,8169,8172,8174,8180,8187,8189,8214,8216,8218,8270,8272,8278,8280,8282,8303,8305,8311,8317,8323,8325,8333,8335,8348,8350,8352,8355],[10,8165,8166],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8168,16],{"id":16},[10,8170,8171],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8173,22],{"id":22},[10,8175,8176],{},[26,8177],{"alt":8178,"src":8179},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8181,8182,8183,8186],{},"生成器运行到 ",[34,8184,8185],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8188,47],{"id":47},[49,8190,8191,8201,8211],{},[52,8192,8193,8196,8197,8200],{},[34,8194,8195],{},"iter()"," 从可迭代对象取得迭代器，",[34,8198,8199],{},"next()"," 请求下一个值。",[52,8202,8203,8204,8207,8208,8210],{},"没有更多值时迭代器抛出 ",[34,8205,8206],{},"StopIteration","，",[34,8209,4272],{}," 会自动处理。",[52,8212,8213],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8215,72],{"id":72},[10,8217,75],{},[77,8219,8221],{"className":79,"code":8220,"language":81,"meta":82,"style":82},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[34,8222,8223,8228,8233,8238,8243,8248,8252,8257,8262,8266],{"__ignoreMap":82},[86,8224,8225],{"class":88,"line":89},[86,8226,8227],{},"def countdown(start):\n",[86,8229,8230],{"class":88,"line":95},[86,8231,8232],{},"    current = start\n",[86,8234,8235],{"class":88,"line":101},[86,8236,8237],{},"    while current > 0:\n",[86,8239,8240],{"class":88,"line":398},[86,8241,8242],{},"        yield current\n",[86,8244,8245],{"class":88,"line":1115},[86,8246,8247],{},"        current = current - 1\n",[86,8249,8250],{"class":88,"line":1121},[86,8251,1068],{"emptyLinePlaceholder":198},[86,8253,8254],{"class":88,"line":2420},[86,8255,8256],{},"iterator = countdown(3)\n",[86,8258,8259],{"class":88,"line":2426},[86,8260,8261],{},"print(next(iterator))\n",[86,8263,8264],{"class":88,"line":3886},[86,8265,8261],{},[86,8267,8268],{"class":88,"line":4098},[86,8269,8261],{},[10,8271,107],{},[77,8273,8276],{"className":8274,"code":8275,"language":113,"meta":82},[111],"3\n2\n1\n",[34,8277,8275],{"__ignoreMap":82},[10,8279,118],{},[14,8281,121],{"id":121},[123,8283,8284,8290],{},[52,8285,7866,8286,8289],{},[34,8287,8288],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[52,8291,8292,8293,8295,8296,8298,8299,8302],{},"每次 ",[34,8294,8199],{}," 运行到下一个 ",[34,8297,8185],{}," 并暂停，局部变量 ",[34,8300,8301],{},"current"," 和执行位置被保留。",[298,8304,2630],{"id":2630},[10,8306,8307,8308,8310],{},"生成器的暂停位置可以展开成多次 ",[34,8309,8199],{}," 的时间线。",[10,8312,8313],{},[26,8314],{"alt":8315,"src":8316},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8318,8319,8320,8322],{},"每次请求只推进到下一个 ",[34,8321,8185],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8324,144],{"id":144},[49,8326,8327,8330],{},[52,8328,8329],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[52,8331,8332],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8334,155],{"id":155},[123,8336,8337,8340],{},[52,8338,8339],{},"编写产生 1 到指定上限偶数的生成器。",[52,8341,3944,8342,8344,8345,8347],{},[34,8343,4272],{}," 遍历生成器，比较手动 ",[34,8346,8199],{}," 的差异。",[10,8349,173],{},[14,8351,176],{"id":176},[10,8353,8354],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,8356,183],{},{"title":82,"searchDepth":95,"depth":95,"links":8358},[8359,8360,8361,8362,8363,8366,8367,8368],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":8364},[8365],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8161,"description":8166},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[194,8376,8377],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8380,"title":8381,"body":8382,"category":194,"cover":195,"description":8386,"extension":196,"meta":8610,"navigation":198,"path":8611,"pinned":200,"publishedAt":201,"seo":8612,"slug":8613,"stem":8614,"summary":8615,"tags":8616,"updatedAt":201,"visible":198,"__hash__":8618},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8383,"toc":8598},[8384,8387,8389,8392,8394,8400,8403,8405,8425,8427,8429,8511,8513,8519,8521,8523,8545,8547,8550,8556,8563,8565,8575,8577,8589,8591,8593,8596],[10,8385,8386],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8388,16],{"id":16},[10,8390,8391],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8393,22],{"id":22},[10,8395,8396],{},[26,8397],{"alt":8398,"src":8399},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8401,8402],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8404,47],{"id":47},[49,8406,8407,8416,8419],{},[52,8408,8409,8412,8413,37],{},[34,8410,8411],{},"@trace"," 等价于 ",[34,8414,8415],{},"add = trace(add)",[52,8417,8418],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[52,8420,8421,8424],{},[34,8422,8423],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8426,72],{"id":72},[10,8428,75],{},[77,8430,8432],{"className":79,"code":8431,"language":81,"meta":82,"style":82},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[34,8433,8434,8439,8443,8448,8453,8458,8463,8468,8473,8478,8483,8487,8492,8496,8500,8505],{"__ignoreMap":82},[86,8435,8436],{"class":88,"line":89},[86,8437,8438],{},"from functools import wraps\n",[86,8440,8441],{"class":88,"line":95},[86,8442,1068],{"emptyLinePlaceholder":198},[86,8444,8445],{"class":88,"line":101},[86,8446,8447],{},"def trace(function):\n",[86,8449,8450],{"class":88,"line":398},[86,8451,8452],{},"    @wraps(function)\n",[86,8454,8455],{"class":88,"line":1115},[86,8456,8457],{},"    def wrapper(*args, **kwargs):\n",[86,8459,8460],{"class":88,"line":1121},[86,8461,8462],{},"        print(\"开始：\", function.__name__)\n",[86,8464,8465],{"class":88,"line":2420},[86,8466,8467],{},"        result = function(*args, **kwargs)\n",[86,8469,8470],{"class":88,"line":2426},[86,8471,8472],{},"        print(\"结束：\", function.__name__)\n",[86,8474,8475],{"class":88,"line":3886},[86,8476,8477],{},"        return result\n",[86,8479,8480],{"class":88,"line":4098},[86,8481,8482],{},"    return wrapper\n",[86,8484,8485],{"class":88,"line":5763},[86,8486,1068],{"emptyLinePlaceholder":198},[86,8488,8489],{"class":88,"line":5768},[86,8490,8491],{},"@trace\n",[86,8493,8494],{"class":88,"line":7373},[86,8495,6116],{},[86,8497,8498],{"class":88,"line":7379},[86,8499,6121],{},[86,8501,8503],{"class":88,"line":8502},15,[86,8504,1068],{"emptyLinePlaceholder":198},[86,8506,8508],{"class":88,"line":8507},16,[86,8509,8510],{},"print(add(2, 3))\n",[10,8512,107],{},[77,8514,8517],{"className":8515,"code":8516,"language":113,"meta":82},[111],"开始： add\n结束： add\n5\n",[34,8518,8516],{"__ignoreMap":82},[10,8520,118],{},[14,8522,121],{"id":121},[123,8524,8525,8542],{},[52,8526,8527,8528,8531,8532,8535,8536,8539,8540,37],{},"解释器执行定义时，把原 ",[34,8529,8530],{},"add"," 函数交给 ",[34,8533,8534],{},"trace","，返回的 ",[34,8537,8538],{},"wrapper"," 重新绑定到名字 ",[34,8541,8530],{},[52,8543,8544],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[298,8546,2630],{"id":2630},[10,8548,8549],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8551,8552],{},[26,8553],{"alt":8554,"src":8555},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8557,8558,8560,8561,37],{},[34,8559,8411],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[34,8562,8415],{},[14,8564,144],{"id":144},[49,8566,8567,8572],{},[52,8568,8569,8570,37],{},"包装函数忘记返回原函数结果，调用方得到 ",[34,8571,5314],{},[52,8573,8574],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8576,155],{"id":155},[123,8578,8579,8582],{},[52,8580,8581],{},"编写只记录调用次数的简单装饰器。",[52,8583,8584,8585,8588],{},"删除包装函数的 ",[34,8586,8587],{},"return result","，观察调用方得到什么。",[10,8590,173],{},[14,8592,176],{"id":176},[10,8594,8595],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,8597,183],{},{"title":82,"searchDepth":95,"depth":95,"links":8599},[8600,8601,8602,8603,8604,8607,8608,8609],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":8605},[8606],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8381,"description":8386},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[194,8617,5265],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8620,"title":8621,"body":8622,"category":194,"cover":195,"description":8626,"extension":196,"meta":8813,"navigation":198,"path":8814,"pinned":200,"publishedAt":201,"seo":8815,"slug":8816,"stem":8817,"summary":8818,"tags":8819,"updatedAt":201,"visible":198,"__hash__":8822},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8623,"toc":8801},[8624,8627,8629,8632,8634,8640,8643,8645,8656,8658,8660,8735,8737,8743,8745,8747,8758,8760,8763,8769,8772,8774,8782,8784,8792,8794,8796,8799],[10,8625,8626],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8628,16],{"id":16},[10,8630,8631],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8633,22],{"id":22},[10,8635,8636],{},[26,8637],{"alt":8638,"src":8639},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8641,8642],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8644,47],{"id":47},[49,8646,8647,8650,8653],{},[52,8648,8649],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[52,8651,8652],{},"日志记录运行状态，测试判断结果是否符合约定。",[52,8654,8655],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8657,72],{"id":72},[10,8659,75],{},[77,8661,8663],{"className":79,"code":8662,"language":81,"meta":82,"style":82},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[34,8664,8665,8670,8675,8679,8684,8688,8693,8698,8703,8707,8712,8717,8722,8726,8730],{"__ignoreMap":82},[86,8666,8667],{"class":88,"line":89},[86,8668,8669],{},"import logging\n",[86,8671,8672],{"class":88,"line":95},[86,8673,8674],{},"import unittest\n",[86,8676,8677],{"class":88,"line":101},[86,8678,1068],{"emptyLinePlaceholder":198},[86,8680,8681],{"class":88,"line":398},[86,8682,8683],{},"logging.basicConfig(level=logging.INFO)\n",[86,8685,8686],{"class":88,"line":1115},[86,8687,1068],{"emptyLinePlaceholder":198},[86,8689,8690],{"class":88,"line":1121},[86,8691,8692],{},"def clamp_progress(value):\n",[86,8694,8695],{"class":88,"line":2420},[86,8696,8697],{},"    logging.info(\"检查进度：%s\", value)\n",[86,8699,8700],{"class":88,"line":2426},[86,8701,8702],{},"    return max(0, min(100, value))\n",[86,8704,8705],{"class":88,"line":3886},[86,8706,1068],{"emptyLinePlaceholder":198},[86,8708,8709],{"class":88,"line":4098},[86,8710,8711],{},"class ProgressTest(unittest.TestCase):\n",[86,8713,8714],{"class":88,"line":5763},[86,8715,8716],{},"    def test_upper_limit(self):\n",[86,8718,8719],{"class":88,"line":5768},[86,8720,8721],{},"        self.assertEqual(clamp_progress(120), 100)\n",[86,8723,8724],{"class":88,"line":7373},[86,8725,1068],{"emptyLinePlaceholder":198},[86,8727,8728],{"class":88,"line":7379},[86,8729,6130],{},[86,8731,8732],{"class":88,"line":8502},[86,8733,8734],{},"    unittest.main()\n",[10,8736,107],{},[77,8738,8741],{"className":8739,"code":8740,"language":113,"meta":82},[111],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[34,8742,8740],{"__ignoreMap":82},[10,8744,118],{},[14,8746,121],{"id":121},[123,8748,8749,8755],{},[52,8750,8751,8754],{},[34,8752,8753],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[52,8756,8757],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[298,8759,2630],{"id":2630},[10,8761,8762],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8764,8765],{},[26,8766],{"alt":8767,"src":8768},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8770,8771],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8773,144],{"id":144},[49,8775,8776,8779],{},[52,8777,8778],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[52,8780,8781],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8783,155],{"id":155},[123,8785,8786,8789],{},[52,8787,8788],{},"为负数进度增加测试。",[52,8790,8791],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8793,173],{},[14,8795,176],{"id":176},[10,8797,8798],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,8800,183],{},{"title":82,"searchDepth":95,"depth":95,"links":8802},[8803,8804,8805,8806,8807,8810,8811,8812],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":8808},[8809],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8621,"description":8626},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[194,8820,8821],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8824,"title":8825,"body":8826,"category":194,"cover":195,"description":8830,"extension":196,"meta":9130,"navigation":198,"path":9131,"pinned":200,"publishedAt":201,"seo":9132,"slug":9133,"stem":9134,"summary":9135,"tags":9136,"updatedAt":201,"visible":198,"__hash__":9139},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8827,"toc":9117},[8828,8831,8833,8836,8838,8844,8847,8849,8864,8866,8868,9015,9017,9023,9025,9027,9040,9042,9045,9051,9054,9056,9059,9065,9072,9074,9085,9087,9108,9110,9112,9115],[10,8829,8830],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8832,16],{"id":16},[10,8834,8835],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8837,22],{"id":22},[10,8839,8840],{},[26,8841],{"alt":8842,"src":8843},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8845,8846],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8848,47],{"id":47},[49,8850,8851,8854,8857],{},[52,8852,8853],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[52,8855,8856],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[52,8858,8859,8860,8863],{},"实际扩展前先为 ",[34,8861,8862],{},"add()"," 和存储边界补充测试。",[14,8865,72],{"id":72},[10,8867,75],{},[77,8869,8871],{"className":79,"code":8870,"language":81,"meta":82,"style":82},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[34,8872,8873,8877,8881,8885,8890,8895,8900,8905,8909,8914,8919,8924,8929,8934,8938,8943,8948,8954,8959,8965,8970,8975,8981,8987,8993,8998,9004,9009],{"__ignoreMap":82},[86,8874,8875],{"class":88,"line":89},[86,8876,6928],{},[86,8878,8879],{"class":88,"line":95},[86,8880,6537],{},[86,8882,8883],{"class":88,"line":101},[86,8884,1068],{"emptyLinePlaceholder":198},[86,8886,8887],{"class":88,"line":398},[86,8888,8889],{},"class LearningRecords:\n",[86,8891,8892],{"class":88,"line":1115},[86,8893,8894],{},"    def __init__(self, file_path):\n",[86,8896,8897],{"class":88,"line":1121},[86,8898,8899],{},"        self.file_path = Path(file_path)\n",[86,8901,8902],{"class":88,"line":2420},[86,8903,8904],{},"        self.items = []\n",[86,8906,8907],{"class":88,"line":2426},[86,8908,1068],{"emptyLinePlaceholder":198},[86,8910,8911],{"class":88,"line":3886},[86,8912,8913],{},"    def add(self, title):\n",[86,8915,8916],{"class":88,"line":4098},[86,8917,8918],{},"        title = title.strip()\n",[86,8920,8921],{"class":88,"line":5763},[86,8922,8923],{},"        if not title:\n",[86,8925,8926],{"class":88,"line":5768},[86,8927,8928],{},"            raise ValueError(\"课程名称不能为空\")\n",[86,8930,8931],{"class":88,"line":7373},[86,8932,8933],{},"        self.items.append({\"title\": title, \"done\": False})\n",[86,8935,8936],{"class":88,"line":7379},[86,8937,1068],{"emptyLinePlaceholder":198},[86,8939,8940],{"class":88,"line":8502},[86,8941,8942],{},"    def save(self):\n",[86,8944,8945],{"class":88,"line":8507},[86,8946,8947],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[86,8949,8951],{"class":88,"line":8950},17,[86,8952,8953],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[86,8955,8957],{"class":88,"line":8956},18,[86,8958,1068],{"emptyLinePlaceholder":198},[86,8960,8962],{"class":88,"line":8961},19,[86,8963,8964],{},"records = LearningRecords(\"learning-records.json\")\n",[86,8966,8968],{"class":88,"line":8967},20,[86,8969,1068],{"emptyLinePlaceholder":198},[86,8971,8973],{"class":88,"line":8972},21,[86,8974,7346],{},[86,8976,8978],{"class":88,"line":8977},22,[86,8979,8980],{},"    title = input(\"输入已学习课程：\")\n",[86,8982,8984],{"class":88,"line":8983},23,[86,8985,8986],{},"    records.add(title)\n",[86,8988,8990],{"class":88,"line":8989},24,[86,8991,8992],{},"    records.save()\n",[86,8994,8996],{"class":88,"line":8995},25,[86,8997,7356],{},[86,8999,9001],{"class":88,"line":9000},26,[86,9002,9003],{},"    print(\"无法保存：\", error)\n",[86,9005,9007],{"class":88,"line":9006},27,[86,9008,1118],{},[86,9010,9012],{"class":88,"line":9011},28,[86,9013,9014],{},"    print(\"已保存 1 条学习记录\")\n",[10,9016,107],{},[77,9018,9021],{"className":9019,"code":9020,"language":113,"meta":82},[111],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[34,9022,9020],{"__ignoreMap":82},[10,9024,118],{},[14,9026,121],{"id":121},[123,9028,9029,9035],{},[52,9030,9031,9032,9034],{},"输入层取得课程名后，",[34,9033,8862],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[52,9036,9037,9039],{},[34,9038,8094],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[298,9041,2630],{"id":2630},[10,9043,9044],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9046,9047],{},[26,9048],{"alt":9049,"src":9050},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9052,9053],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[298,9055,2630],{"id":4153},[10,9057,9058],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9060,9061],{},[26,9062],{"alt":9063,"src":9064},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9066,9067,9068,9071],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[34,9069,9070],{},"load()"," 把文件状态恢复到内存。",[14,9073,144],{"id":144},[49,9075,9076,9079],{},[52,9077,9078],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[52,9080,9081,9082,9084],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[34,9083,9070],{}," 是下一项必要扩展。",[14,9086,155],{"id":155},[123,9088,9089,9095,9098],{},[52,9090,9091,9092,9094],{},"增加 ",[34,9093,9070],{},"，文件不存在时从空列表开始。",[52,9096,9097],{},"增加按序号标记完成的功能，并校验序号范围。",[52,9099,9100,9101,9104,9105,9107],{},"把输入循环放进 ",[34,9102,9103],{},"main()","，通过 ",[34,9106,6072],{}," 控制程序入口。",[10,9109,173],{},[14,9111,176],{"id":176},[10,9113,9114],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[181,9116,183],{},{"title":82,"searchDepth":95,"depth":95,"links":9118},[9119,9120,9121,9122,9123,9127,9128,9129],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":9124},[9125,9126],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8825,"description":8830},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[194,9137,9138],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9141,9244,9363,9494,9637,9762,9899,10036,10177,10346,10483,10616,10739,10868,10995,11158,11334,11475,11604,11753,11896,12017,12140,12289,12442,12607,12734,12915,13058,13215,13366,13513,13668,13886,14041,14216,14367,14534,14721,14884,15126,15366],{"id":1366,"title":1367,"body":9142,"category":194,"cover":195,"description":1372,"extension":196,"meta":9241,"navigation":198,"path":1490,"pinned":200,"publishedAt":201,"seo":9242,"slug":1492,"stem":1493,"summary":1494,"tags":9243,"updatedAt":201,"visible":198,"__hash__":1497},{"type":7,"value":9143,"toc":9231},[9144,9146,9148,9150,9152,9156,9160,9162,9172,9174,9176,9184,9186,9191,9193,9195,9205,9207,9215,9217,9223,9225,9227,9229],[10,9145,1372],{},[14,9147,16],{"id":16},[10,9149,1377],{},[14,9151,22],{"id":22},[10,9153,9154],{},[26,9155],{"alt":1384,"src":1385},[10,9157,9158,1390],{},[34,9159,1144],{},[14,9161,47],{"id":47},[49,9163,9164,9168,9170],{},[52,9165,1397,9166,1400],{},[34,9167,1144],{},[52,9169,1403],{},[52,9171,1406],{},[14,9173,72],{"id":72},[10,9175,75],{},[77,9177,9178],{"className":79,"code":1413,"language":81,"meta":82,"style":82},[34,9179,9180],{"__ignoreMap":82},[86,9181,9182],{"class":88,"line":89},[86,9183,1413],{},[10,9185,107],{},[77,9187,9189],{"className":9188,"code":1425,"language":113,"meta":82},[111],[34,9190,1425],{"__ignoreMap":82},[10,9192,118],{},[14,9194,121],{"id":121},[123,9196,9197,9201],{},[52,9198,1436,9199,1440],{},[34,9200,1439],{},[52,9202,1443,9203,1446],{},[34,9204,36],{},[14,9206,144],{"id":144},[49,9208,9209,9211],{},[52,9210,1453],{},[52,9212,1456,9213,1459],{},[34,9214,1144],{},[14,9216,155],{"id":155},[123,9218,9219,9221],{},[52,9220,1466],{},[52,9222,1469],{},[10,9224,173],{},[14,9226,176],{"id":176},[10,9228,1476],{},[181,9230,183],{},{"title":82,"searchDepth":95,"depth":95,"links":9232},[9233,9234,9235,9236,9237,9238,9239,9240],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":1367,"description":1372},[194,1362,1496],{"id":1499,"title":1500,"body":9245,"category":194,"cover":195,"description":1505,"extension":196,"meta":9360,"navigation":198,"path":1642,"pinned":200,"publishedAt":201,"seo":9361,"slug":1644,"stem":1645,"summary":1646,"tags":9362,"updatedAt":201,"visible":198,"__hash__":1649},{"type":7,"value":9246,"toc":9350},[9247,9249,9251,9253,9255,9259,9263,9265,9275,9277,9279,9299,9301,9306,9308,9310,9320,9322,9332,9334,9342,9344,9346,9348],[10,9248,1505],{},[14,9250,16],{"id":16},[10,9252,1510],{},[14,9254,22],{"id":22},[10,9256,9257],{},[26,9258],{"alt":1517,"src":1518},[10,9260,1521,9261,1524],{},[34,9262,661],{},[14,9264,47],{"id":47},[49,9266,9267,9269,9271],{},[52,9268,1531],{},[52,9270,1534],{},[52,9272,1537,9273,1541],{},[34,9274,1540],{},[14,9276,72],{"id":72},[10,9278,1546],{},[77,9280,9281],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,9282,9283,9289],{"__ignoreMap":82},[86,9284,9285,9287],{"class":88,"line":89},[86,9286,661],{"class":570},[86,9288,574],{"class":573},[86,9290,9291,9293,9295,9297],{"class":88,"line":95},[86,9292,661],{"class":570},[86,9294,603],{"class":573},[86,9296,607],{"class":606},[86,9298,574],{"class":573},[10,9300,107],{},[77,9302,9304],{"className":9303,"code":1572,"language":113,"meta":82},[111],[34,9305,1572],{"__ignoreMap":82},[10,9307,118],{},[14,9309,121],{"id":121},[123,9311,9312,9316],{},[52,9313,9314,1586],{},[34,9315,1585],{},[52,9317,9318,1591],{},[34,9319,669],{},[14,9321,144],{"id":144},[49,9323,9324,9328],{},[52,9325,1598,9326,1601],{},[34,9327,661],{},[52,9329,1604,9330,1607],{},[34,9331,661],{},[14,9333,155],{"id":155},[123,9335,9336,9340],{},[52,9337,908,9338,1617],{},[34,9339,1616],{},[52,9341,1620],{},[10,9343,173],{},[14,9345,176],{"id":176},[10,9347,1627],{},[181,9349,1630],{},{"title":82,"searchDepth":95,"depth":95,"links":9351},[9352,9353,9354,9355,9356,9357,9358,9359],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":1500,"description":1505},[194,1648,1022],{"id":1651,"title":1652,"body":9364,"category":194,"cover":195,"description":1817,"extension":196,"meta":9491,"navigation":198,"path":1819,"pinned":200,"publishedAt":201,"seo":9492,"slug":1821,"stem":1822,"summary":1823,"tags":9493,"updatedAt":201,"visible":198,"__hash__":1827},{"type":7,"value":9365,"toc":9481},[9366,9370,9372,9374,9376,9380,9382,9384,9400,9402,9404,9424,9426,9431,9433,9435,9447,9449,9459,9461,9471,9473,9475,9479],[10,9367,1657,9368,1660],{},[34,9369,1144],{},[14,9371,16],{"id":16},[10,9373,1665],{},[14,9375,22],{"id":22},[10,9377,9378],{},[26,9379],{"alt":1672,"src":1673},[10,9381,1676],{},[14,9383,47],{"id":47},[49,9385,9386,9392,9396],{},[52,9387,1683,9388,1686,9390,37],{},[34,9389,661],{},[34,9391,1689],{},[52,9393,1692,9394,1696],{},[34,9395,1695],{},[52,9397,1699,9398,1702],{},[34,9399,1144],{},[14,9401,72],{"id":72},[10,9403,75],{},[77,9405,9406],{"className":1709,"code":1710,"language":1711,"meta":82,"style":82},[34,9407,9408,9412,9416,9420],{"__ignoreMap":82},[86,9409,9410],{"class":88,"line":89},[86,9411,1718],{},[86,9413,9414],{"class":88,"line":95},[86,9415,1723],{},[86,9417,9418],{"class":88,"line":101},[86,9419,1728],{},[86,9421,9422],{"class":88,"line":398},[86,9423,1733],{},[10,9425,107],{},[77,9427,9429],{"className":9428,"code":1739,"language":113,"meta":82},[111],[34,9430,1739],{"__ignoreMap":82},[10,9432,118],{},[14,9434,121],{"id":121},[123,9436,9437,9443],{},[52,9438,1750,9439,1753,9441,37],{},[34,9440,44],{},[34,9442,1756],{},[52,9444,1759,9445,1762],{},[34,9446,36],{},[14,9448,144],{"id":144},[49,9450,9451,9457],{},[52,9452,1769,9453,1772,9455,1775],{},[34,9454,1689],{},[34,9456,1144],{},[52,9458,1778],{},[14,9460,155],{"id":155},[123,9462,9463,9467],{},[52,9464,1785,9465,37],{},[34,9466,1788],{},[52,9468,1791,9469,1794],{},[34,9470,36],{},[10,9472,173],{},[14,9474,176],{"id":176},[10,9476,1801,9477,1804],{},[34,9478,1144],{},[181,9480,183],{},{"title":82,"searchDepth":95,"depth":95,"links":9482},[9483,9484,9485,9486,9487,9488,9489,9490],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":1652,"description":1817},[194,1825,1826],{"id":1829,"title":1830,"body":9495,"category":194,"cover":195,"description":1835,"extension":196,"meta":9634,"navigation":198,"path":2007,"pinned":200,"publishedAt":201,"seo":9635,"slug":2009,"stem":2010,"summary":2011,"tags":9636,"updatedAt":201,"visible":198,"__hash__":2015},{"type":7,"value":9496,"toc":9624},[9497,9499,9501,9503,9505,9509,9513,9515,9527,9529,9531,9567,9569,9574,9576,9578,9594,9596,9606,9608,9616,9618,9620,9622],[10,9498,1835],{},[14,9500,16],{"id":16},[10,9502,1840],{},[14,9504,22],{"id":22},[10,9506,9507],{},[26,9508],{"alt":1847,"src":1848},[10,9510,9511,1854],{},[34,9512,1853],{},[14,9514,47],{"id":47},[49,9516,9517,9519,9525],{},[52,9518,1861],{},[52,9520,9521,1867,9523,1871],{},[34,9522,1866],{},[34,9524,1870],{},[52,9526,1874],{},[14,9528,72],{"id":72},[10,9530,1546],{},[77,9532,9533],{"className":561,"code":1881,"language":563,"meta":82,"style":82},[34,9534,9535,9541,9547,9551,9561],{"__ignoreMap":82},[86,9536,9537,9539],{"class":88,"line":89},[86,9538,1888],{"class":570},[86,9540,1891],{"class":606},[86,9542,9543,9545],{"class":88,"line":95},[86,9544,1896],{"class":573},[86,9546,1891],{"class":606},[86,9548,9549],{"class":88,"line":101},[86,9550,1903],{"class":573},[86,9552,9553,9555,9557,9559],{"class":88,"line":398},[86,9554,1908],{"class":573},[86,9556,1911],{"class":606},[86,9558,1915],{"class":1914},[86,9560,1188],{"class":606},[86,9562,9563,9565],{"class":88,"line":1115},[86,9564,661],{"class":570},[86,9566,1188],{"class":606},[10,9568,107],{},[77,9570,9572],{"className":9571,"code":1929,"language":113,"meta":82},[111],[34,9573,1929],{"__ignoreMap":82},[10,9575,118],{},[14,9577,121],{"id":121},[123,9579,9580,9588],{},[52,9581,9582,1942,9584,1945,9586,1948],{},[34,9583,1888],{},[34,9585,1896],{},[34,9587,1866],{},[52,9589,9590,1953,9592,1957],{},[34,9591,1853],{},[34,9593,1956],{},[14,9595,144],{"id":144},[49,9597,9598,9604],{},[52,9599,1964,9600,1130,9602,37],{},[34,9601,1866],{},[34,9603,1870],{},[52,9605,1971],{},[14,9607,155],{"id":155},[123,9609,9610,9614],{},[52,9611,1978,9612,1982],{},[34,9613,1981],{},[52,9615,1985],{},[10,9617,173],{},[14,9619,176],{"id":176},[10,9621,1992],{},[181,9623,1995],{},{"title":82,"searchDepth":95,"depth":95,"links":9625},[9626,9627,9628,9629,9630,9631,9632,9633],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":1830,"description":1835},[194,2013,2014],{"id":4,"title":5,"body":9638,"category":194,"cover":195,"description":12,"extension":196,"meta":9759,"navigation":198,"path":199,"pinned":200,"publishedAt":201,"seo":9760,"slug":203,"stem":204,"summary":205,"tags":9761,"updatedAt":201,"visible":198,"__hash__":209},{"type":7,"value":9639,"toc":9749},[9640,9642,9644,9646,9648,9652,9660,9662,9676,9678,9680,9696,9698,9703,9705,9707,9721,9723,9729,9731,9741,9743,9745,9747],[10,9641,12],{},[14,9643,16],{"id":16},[10,9645,19],{},[14,9647,22],{"id":22},[10,9649,9650],{},[26,9651],{"alt":28,"src":29},[10,9653,32,9654,37,9656,41,9658,37],{},[34,9655,36],{},[34,9657,40],{},[34,9659,44],{},[14,9661,47],{"id":47},[49,9663,9664,9668,9674],{},[52,9665,9666,57],{},[34,9667,56],{},[52,9669,9670,63,9672,37],{},[34,9671,62],{},[34,9673,66],{},[52,9675,69],{},[14,9677,72],{"id":72},[10,9679,75],{},[77,9681,9682],{"className":79,"code":80,"language":81,"meta":82,"style":82},[34,9683,9684,9688,9692],{"__ignoreMap":82},[86,9685,9686],{"class":88,"line":89},[86,9687,92],{},[86,9689,9690],{"class":88,"line":95},[86,9691,98],{},[86,9693,9694],{"class":88,"line":101},[86,9695,104],{},[10,9697,107],{},[77,9699,9701],{"className":9700,"code":112,"language":113,"meta":82},[111],[34,9702,112],{"__ignoreMap":82},[10,9704,118],{},[14,9706,121],{"id":121},[123,9708,9709,9715],{},[52,9710,9711,130,9713,37],{},[34,9712,129],{},[34,9714,66],{},[52,9716,9717,137,9719,141],{},[34,9718,36],{},[34,9720,140],{},[14,9722,144],{"id":144},[49,9724,9725,9727],{},[52,9726,149],{},[52,9728,152],{},[14,9730,155],{"id":155},[123,9732,9733,9735],{},[52,9734,160],{},[52,9736,163,9737,166,9739,170],{},[34,9738,40],{},[34,9740,169],{},[10,9742,173],{},[14,9744,176],{"id":176},[10,9746,179],{},[181,9748,183],{},{"title":82,"searchDepth":95,"depth":95,"links":9750},[9751,9752,9753,9754,9755,9756,9757,9758],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5,"description":12},[194,207,208],{"id":2142,"title":2143,"body":9763,"category":194,"cover":195,"description":2148,"extension":196,"meta":9896,"navigation":198,"path":2316,"pinned":200,"publishedAt":201,"seo":9897,"slug":2318,"stem":2319,"summary":2320,"tags":9898,"updatedAt":201,"visible":198,"__hash__":2324},{"type":7,"value":9764,"toc":9886},[9765,9767,9769,9771,9773,9777,9779,9781,9797,9799,9801,9825,9827,9832,9834,9836,9852,9854,9866,9868,9878,9880,9882,9884],[10,9766,2148],{},[14,9768,16],{"id":16},[10,9770,2153],{},[14,9772,22],{"id":22},[10,9774,9775],{},[26,9776],{"alt":2160,"src":2161},[10,9778,2164],{},[14,9780,47],{"id":47},[49,9782,9783,9785,9791],{},[52,9784,2171],{},[52,9786,2174,9787,166,9789,2181],{},[34,9788,2177],{},[34,9790,2180],{},[52,9792,2184,9793,2188,9795,2192],{},[34,9794,2187],{},[34,9796,2191],{},[14,9798,72],{"id":72},[10,9800,75],{},[77,9802,9803],{"className":79,"code":2199,"language":81,"meta":82,"style":82},[34,9804,9805,9809,9813,9817,9821],{"__ignoreMap":82},[86,9806,9807],{"class":88,"line":89},[86,9808,2206],{},[86,9810,9811],{"class":88,"line":95},[86,9812,2211],{},[86,9814,9815],{"class":88,"line":101},[86,9816,1068],{"emptyLinePlaceholder":198},[86,9818,9819],{"class":88,"line":398},[86,9820,2220],{},[86,9822,9823],{"class":88,"line":1115},[86,9824,2211],{},[10,9826,107],{},[77,9828,9830],{"className":9829,"code":2230,"language":113,"meta":82},[111],[34,9831,2230],{"__ignoreMap":82},[10,9833,118],{},[14,9835,121],{"id":121},[123,9837,9838,9844],{},[52,9839,908,9840,2244,9842,2247],{},[34,9841,2243],{},[34,9843,2177],{},[52,9845,908,9846,2253,9848,2257,9850,37],{},[34,9847,2252],{},[34,9849,2256],{},[34,9851,2260],{},[14,9853,144],{"id":144},[49,9855,9856,9858],{},[52,9857,2267],{},[52,9859,2270,9860,2188,9862,2188,9864,2278],{},[34,9861,2187],{},[34,9863,2191],{},[34,9865,2277],{},[14,9867,155],{"id":155},[123,9869,9870,9876],{},[52,9871,2285,9872,1130,9874,2292],{},[34,9873,2288],{},[34,9875,2291],{},[52,9877,2295],{},[10,9879,173],{},[14,9881,176],{"id":176},[10,9883,2302],{},[181,9885,183],{},{"title":82,"searchDepth":95,"depth":95,"links":9887},[9888,9889,9890,9891,9892,9893,9894,9895],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":2143,"description":2148},[194,2322,2323],{"id":2326,"title":2327,"body":9900,"category":194,"cover":195,"description":2332,"extension":196,"meta":10033,"navigation":198,"path":2499,"pinned":200,"publishedAt":201,"seo":10034,"slug":2501,"stem":2502,"summary":2503,"tags":10035,"updatedAt":201,"visible":198,"__hash__":2507},{"type":7,"value":9901,"toc":10023},[9902,9904,9906,9908,9910,9914,9916,9918,9936,9938,9940,9976,9978,9983,9985,9987,9997,9999,10007,10009,10015,10017,10019,10021],[10,9903,2332],{},[14,9905,16],{"id":16},[10,9907,2337],{},[14,9909,22],{"id":22},[10,9911,9912],{},[26,9913],{"alt":2344,"src":2345},[10,9915,2348],{},[14,9917,47],{"id":47},[49,9919,9920,9926,9934],{},[52,9921,9922,2358,9924,2362],{},[34,9923,2357],{},[34,9925,2361],{},[52,9927,9928,2368,9930,2372,9932,2376],{},[34,9929,2367],{},[34,9931,2371],{},[34,9933,2375],{},[52,9935,2379],{},[14,9937,72],{"id":72},[10,9939,75],{},[77,9941,9942],{"className":79,"code":2386,"language":81,"meta":82,"style":82},[34,9943,9944,9948,9952,9956,9960,9964,9968,9972],{"__ignoreMap":82},[86,9945,9946],{"class":88,"line":89},[86,9947,2393],{},[86,9949,9950],{"class":88,"line":95},[86,9951,2398],{},[86,9953,9954],{"class":88,"line":101},[86,9955,2403],{},[86,9957,9958],{"class":88,"line":398},[86,9959,1068],{"emptyLinePlaceholder":198},[86,9961,9962],{"class":88,"line":1115},[86,9963,2412],{},[86,9965,9966],{"class":88,"line":1121},[86,9967,2417],{},[86,9969,9970],{"class":88,"line":2420},[86,9971,2423],{},[86,9973,9974],{"class":88,"line":2426},[86,9975,2429],{},[10,9977,107],{},[77,9979,9981],{"className":9980,"code":2435,"language":113,"meta":82},[111],[34,9982,2435],{"__ignoreMap":82},[10,9984,118],{},[14,9986,121],{"id":121},[123,9988,9989,9993],{},[52,9990,9991,2449],{},[34,9992,2448],{},[52,9994,9995,2455],{},[34,9996,2454],{},[14,9998,144],{"id":144},[49,10000,10001,10005],{},[52,10002,2462,10003,37],{},[34,10004,2465],{},[52,10006,2468],{},[14,10008,155],{"id":155},[123,10010,10011,10013],{},[52,10012,2475],{},[52,10014,2478],{},[10,10016,173],{},[14,10018,176],{"id":176},[10,10020,2485],{},[181,10022,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10024},[10025,10026,10027,10028,10029,10030,10031,10032],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":2327,"description":2332},[194,2505,2506],{"id":2509,"title":2510,"body":10037,"category":194,"cover":195,"description":2515,"extension":196,"meta":10174,"navigation":198,"path":2692,"pinned":200,"publishedAt":201,"seo":10175,"slug":2694,"stem":2695,"summary":2696,"tags":10176,"updatedAt":201,"visible":198,"__hash__":2700},{"type":7,"value":10038,"toc":10162},[10039,10041,10043,10045,10047,10051,10057,10059,10067,10069,10071,10095,10097,10102,10104,10106,10124,10126,10128,10132,10134,10136,10142,10144,10154,10156,10158,10160],[10,10040,2515],{},[14,10042,16],{"id":16},[10,10044,2520],{},[14,10046,22],{"id":22},[10,10048,10049],{},[26,10050],{"alt":2527,"src":2528},[10,10052,2531,10053,2535,10055,37],{},[34,10054,2534],{},[34,10056,2538],{},[14,10058,47],{"id":47},[49,10060,10061,10063,10065],{},[52,10062,2545],{},[52,10064,2548],{},[52,10066,2551],{},[14,10068,72],{"id":72},[10,10070,75],{},[77,10072,10073],{"className":79,"code":2558,"language":81,"meta":82,"style":82},[34,10074,10075,10079,10083,10087,10091],{"__ignoreMap":82},[86,10076,10077],{"class":88,"line":89},[86,10078,2565],{},[86,10080,10081],{"class":88,"line":95},[86,10082,2570],{},[86,10084,10085],{"class":88,"line":101},[86,10086,2575],{},[86,10088,10089],{"class":88,"line":398},[86,10090,2580],{},[86,10092,10093],{"class":88,"line":1115},[86,10094,2585],{},[10,10096,107],{},[77,10098,10100],{"className":10099,"code":2591,"language":113,"meta":82},[111],[34,10101,2591],{"__ignoreMap":82},[10,10103,118],{},[14,10105,121],{"id":121},[123,10107,10108,10116],{},[52,10109,2602,10110,2605,10112,2609,10114,2613],{},[34,10111,194],{},[34,10113,2608],{},[34,10115,2612],{},[52,10117,10118,2619,10120,2623,10122,2627],{},[34,10119,2618],{},[34,10121,2622],{},[34,10123,2626],{},[298,10125,2630],{"id":2630},[10,10127,2633],{},[10,10129,10130],{},[26,10131],{"alt":2638,"src":2639},[10,10133,2642],{},[14,10135,144],{"id":144},[49,10137,10138,10140],{},[52,10139,2649],{},[52,10141,2652],{},[14,10143,155],{"id":155},[123,10145,10146,10152],{},[52,10147,2659,10148,2663,10150,37],{},[34,10149,2662],{},[34,10151,2666],{},[52,10153,2669],{},[10,10155,173],{},[14,10157,176],{"id":176},[10,10159,2676],{},[181,10161,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10163},[10164,10165,10166,10167,10168,10171,10172,10173],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":10169},[10170],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":2510,"description":2515},[194,2698,2699],{"id":2702,"title":2703,"body":10178,"category":194,"cover":195,"description":2708,"extension":196,"meta":10343,"navigation":198,"path":2923,"pinned":200,"publishedAt":201,"seo":10344,"slug":2925,"stem":2926,"summary":2927,"tags":10345,"updatedAt":201,"visible":198,"__hash__":2931},{"type":7,"value":10179,"toc":10331},[10180,10182,10184,10186,10188,10192,10198,10200,10220,10222,10224,10260,10262,10267,10269,10271,10285,10287,10289,10293,10299,10301,10311,10313,10323,10325,10327,10329],[10,10181,2708],{},[14,10183,16],{"id":16},[10,10185,2713],{},[14,10187,22],{"id":22},[10,10189,10190],{},[26,10191],{"alt":2720,"src":2721},[10,10193,2724,10194,979,10196,2731],{},[34,10195,2727],{},[34,10197,2730],{},[14,10199,47],{"id":47},[49,10201,10202,10210,10218],{},[52,10203,10204,2741,10206,2745,10208,2749],{},[34,10205,2740],{},[34,10207,2744],{},[34,10209,2748],{},[52,10211,10212,2755,10214,2759,10216,2763],{},[34,10213,2754],{},[34,10215,2758],{},[34,10217,2762],{},[52,10219,2766],{},[14,10221,72],{"id":72},[10,10223,75],{},[77,10225,10226],{"className":79,"code":2773,"language":81,"meta":82,"style":82},[34,10227,10228,10232,10236,10240,10244,10248,10252,10256],{"__ignoreMap":82},[86,10229,10230],{"class":88,"line":89},[86,10231,2780],{},[86,10233,10234],{"class":88,"line":95},[86,10235,2785],{},[86,10237,10238],{"class":88,"line":101},[86,10239,1068],{"emptyLinePlaceholder":198},[86,10241,10242],{"class":88,"line":398},[86,10243,2794],{},[86,10245,10246],{"class":88,"line":1115},[86,10247,2799],{},[86,10249,10250],{"class":88,"line":1121},[86,10251,2804],{},[86,10253,10254],{"class":88,"line":2420},[86,10255,2809],{},[86,10257,10258],{"class":88,"line":2426},[86,10259,2814],{},[10,10261,107],{},[77,10263,10265],{"className":10264,"code":2820,"language":113,"meta":82},[111],[34,10266,2820],{"__ignoreMap":82},[10,10268,118],{},[14,10270,121],{"id":121},[123,10272,10273,10279],{},[52,10274,10275,2834,10277,2838],{},[34,10276,2833],{},[34,10278,2837],{},[52,10280,10281,2844,10283,2847],{},[34,10282,2843],{},[34,10284,2762],{},[298,10286,2630],{"id":2630},[10,10288,2852],{},[10,10290,10291],{},[26,10292],{"alt":2857,"src":2858},[10,10294,10295,2863,10297,2866],{},[34,10296,2754],{},[34,10298,2758],{},[14,10300,144],{"id":144},[49,10302,10303,10309],{},[52,10304,2873,10305,2876,10307,2879],{},[34,10306,2748],{},[34,10308,2740],{},[52,10310,2882],{},[14,10312,155],{"id":155},[123,10314,10315,10319],{},[52,10316,2889,10317,2893],{},[34,10318,2892],{},[52,10320,2896,10321,2900],{},[34,10322,2899],{},[10,10324,173],{},[14,10326,176],{"id":176},[10,10328,2907],{},[181,10330,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10332},[10333,10334,10335,10336,10337,10340,10341,10342],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":10338},[10339],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":2703,"description":2708},[194,2929,2930],{"id":2933,"title":2934,"body":10347,"category":194,"cover":195,"description":2939,"extension":196,"meta":10480,"navigation":198,"path":3108,"pinned":200,"publishedAt":201,"seo":10481,"slug":3110,"stem":3111,"summary":3112,"tags":10482,"updatedAt":201,"visible":198,"__hash__":3115},{"type":7,"value":10348,"toc":10470},[10349,10351,10353,10355,10357,10361,10371,10373,10383,10385,10387,10415,10417,10422,10424,10426,10440,10442,10450,10452,10462,10464,10466,10468],[10,10350,2939],{},[14,10352,16],{"id":16},[10,10354,2944],{},[14,10356,22],{"id":22},[10,10358,10359],{},[26,10360],{"alt":2951,"src":2952},[10,10362,10363,2958,10365,2962,10367,2966,10369,2970],{},[34,10364,2957],{},[34,10366,2961],{},[34,10368,2965],{},[34,10370,2969],{},[14,10372,47],{"id":47},[49,10374,10375,10377,10381],{},[52,10376,2977],{},[52,10378,10379,2982],{},[34,10380,2969],{},[52,10382,2985],{},[14,10384,72],{"id":72},[10,10386,75],{},[77,10388,10389],{"className":79,"code":2992,"language":81,"meta":82,"style":82},[34,10390,10391,10395,10399,10403,10407,10411],{"__ignoreMap":82},[86,10392,10393],{"class":88,"line":89},[86,10394,2999],{},[86,10396,10397],{"class":88,"line":95},[86,10398,3004],{},[86,10400,10401],{"class":88,"line":101},[86,10402,3009],{},[86,10404,10405],{"class":88,"line":398},[86,10406,1068],{"emptyLinePlaceholder":198},[86,10408,10409],{"class":88,"line":1115},[86,10410,3018],{},[86,10412,10413],{"class":88,"line":1121},[86,10414,3023],{},[10,10416,107],{},[77,10418,10420],{"className":10419,"code":3029,"language":113,"meta":82},[111],[34,10421,3029],{"__ignoreMap":82},[10,10423,118],{},[14,10425,121],{"id":121},[123,10427,10428,10434],{},[52,10429,3040,10430,3043,10432,3047],{},[34,10431,2957],{},[34,10433,3046],{},[52,10435,10436,3053,10438,3057],{},[34,10437,3052],{},[34,10439,3056],{},[14,10441,144],{"id":144},[49,10443,10444,10448],{},[52,10445,3064,10446,3068],{},[34,10447,3067],{},[52,10449,3071],{},[14,10451,155],{"id":155},[123,10453,10454,10456],{},[52,10455,3078],{},[52,10457,1692,10458,3084,10460,3087],{},[34,10459,3083],{},[34,10461,2969],{},[10,10463,173],{},[14,10465,176],{"id":176},[10,10467,3094],{},[181,10469,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10471},[10472,10473,10474,10475,10476,10477,10478,10479],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":2934,"description":2939},[194,2277,3114],{"id":3117,"title":3118,"body":10484,"category":194,"cover":195,"description":3123,"extension":196,"meta":10613,"navigation":198,"path":3284,"pinned":200,"publishedAt":201,"seo":10614,"slug":3286,"stem":3287,"summary":3288,"tags":10615,"updatedAt":201,"visible":198,"__hash__":3292},{"type":7,"value":10485,"toc":10603},[10486,10488,10490,10492,10494,10498,10502,10504,10514,10516,10518,10550,10552,10557,10559,10561,10573,10575,10585,10587,10595,10597,10599,10601],[10,10487,3123],{},[14,10489,16],{"id":16},[10,10491,3128],{},[14,10493,22],{"id":22},[10,10495,10496],{},[26,10497],{"alt":3135,"src":3136},[10,10499,3139,10500,3143],{},[34,10501,3142],{},[14,10503,47],{"id":47},[49,10505,10506,10508,10510],{},[52,10507,3150],{},[52,10509,3153],{},[52,10511,3156,10512,37],{},[34,10513,3159],{},[14,10515,72],{"id":72},[10,10517,75],{},[77,10519,10520],{"className":79,"code":3166,"language":81,"meta":82,"style":82},[34,10521,10522,10526,10530,10534,10538,10542,10546],{"__ignoreMap":82},[86,10523,10524],{"class":88,"line":89},[86,10525,3173],{},[86,10527,10528],{"class":88,"line":95},[86,10529,3178],{},[86,10531,10532],{"class":88,"line":101},[86,10533,1068],{"emptyLinePlaceholder":198},[86,10535,10536],{"class":88,"line":398},[86,10537,3187],{},[86,10539,10540],{"class":88,"line":1115},[86,10541,3192],{},[86,10543,10544],{"class":88,"line":1121},[86,10545,3197],{},[86,10547,10548],{"class":88,"line":2420},[86,10549,3202],{},[10,10551,107],{},[77,10553,10555],{"className":10554,"code":3208,"language":113,"meta":82},[111],[34,10556,3208],{"__ignoreMap":82},[10,10558,118],{},[14,10560,121],{"id":121},[123,10562,10563,10565],{},[52,10564,3219],{},[52,10566,10567,3225,10569,3229,10571,3233],{},[34,10568,3224],{},[34,10570,3228],{},[34,10572,3232],{},[14,10574,144],{"id":144},[49,10576,10577,10583],{},[52,10578,3240,10579,3244,10581,37],{},[34,10580,3243],{},[34,10582,3247],{},[52,10584,3250],{},[14,10586,155],{"id":155},[123,10588,10589,10591],{},[52,10590,3257],{},[52,10592,3260,10593,3263],{},[34,10594,3232],{},[10,10596,173],{},[14,10598,176],{"id":176},[10,10600,3270],{},[181,10602,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10604},[10605,10606,10607,10608,10609,10610,10611,10612],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":3118,"description":3123},[194,3290,3291],{"id":3294,"title":3295,"body":10617,"category":194,"cover":195,"description":3300,"extension":196,"meta":10736,"navigation":198,"path":3442,"pinned":200,"publishedAt":201,"seo":10737,"slug":3444,"stem":3445,"summary":3446,"tags":10738,"updatedAt":201,"visible":198,"__hash__":3449},{"type":7,"value":10618,"toc":10726},[10619,10621,10623,10625,10627,10631,10633,10635,10643,10645,10647,10675,10677,10682,10684,10686,10696,10698,10706,10708,10718,10720,10722,10724],[10,10620,3300],{},[14,10622,16],{"id":16},[10,10624,3305],{},[14,10626,22],{"id":22},[10,10628,10629],{},[26,10630],{"alt":3312,"src":3313},[10,10632,3316],{},[14,10634,47],{"id":47},[49,10636,10637,10639,10641],{},[52,10638,3323],{},[52,10640,3326],{},[52,10642,3329],{},[14,10644,72],{"id":72},[10,10646,75],{},[77,10648,10649],{"className":79,"code":3336,"language":81,"meta":82,"style":82},[34,10650,10651,10655,10659,10663,10667,10671],{"__ignoreMap":82},[86,10652,10653],{"class":88,"line":89},[86,10654,3343],{},[86,10656,10657],{"class":88,"line":95},[86,10658,3348],{},[86,10660,10661],{"class":88,"line":101},[86,10662,3353],{},[86,10664,10665],{"class":88,"line":398},[86,10666,1068],{"emptyLinePlaceholder":198},[86,10668,10669],{"class":88,"line":1115},[86,10670,3362],{},[86,10672,10673],{"class":88,"line":1121},[86,10674,3367],{},[10,10676,107],{},[77,10678,10680],{"className":10679,"code":3373,"language":113,"meta":82},[111],[34,10681,3373],{"__ignoreMap":82},[10,10683,118],{},[14,10685,121],{"id":121},[123,10687,10688,10692],{},[52,10689,10690,3387],{},[34,10691,3386],{},[52,10693,10694,3393],{},[34,10695,3392],{},[14,10697,144],{"id":144},[49,10699,10700,10704],{},[52,10701,3400,10702,3404],{},[34,10703,3403],{},[52,10705,3407],{},[14,10707,155],{"id":155},[123,10709,10710,10712],{},[52,10711,3414],{},[52,10713,163,10714,166,10716,3421],{},[34,10715,3403],{},[34,10717,3392],{},[10,10719,173],{},[14,10721,176],{"id":176},[10,10723,3428],{},[181,10725,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10727},[10728,10729,10730,10731,10732,10733,10734,10735],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":3295,"description":3300},[194,3448,3291],{"id":3451,"title":3452,"body":10740,"category":194,"cover":195,"description":3457,"extension":196,"meta":10865,"navigation":198,"path":3613,"pinned":200,"publishedAt":201,"seo":10866,"slug":3615,"stem":3616,"summary":3617,"tags":10867,"updatedAt":201,"visible":198,"__hash__":3620},{"type":7,"value":10741,"toc":10855},[10742,10744,10746,10748,10750,10754,10760,10762,10772,10774,10776,10804,10806,10811,10813,10815,10825,10827,10839,10841,10847,10849,10851,10853],[10,10743,3457],{},[14,10745,16],{"id":16},[10,10747,3462],{},[14,10749,22],{"id":22},[10,10751,10752],{},[26,10753],{"alt":3469,"src":3470},[10,10755,3473,10756,3477,10758,3480],{},[34,10757,3476],{},[34,10759,2177],{},[14,10761,47],{"id":47},[49,10763,10764,10766,10770],{},[52,10765,3487],{},[52,10767,2270,10768,3493],{},[34,10769,3492],{},[52,10771,3496],{},[14,10773,72],{"id":72},[10,10775,75],{},[77,10777,10778],{"className":79,"code":3503,"language":81,"meta":82,"style":82},[34,10779,10780,10784,10788,10792,10796,10800],{"__ignoreMap":82},[86,10781,10782],{"class":88,"line":89},[86,10783,3510],{},[86,10785,10786],{"class":88,"line":95},[86,10787,3515],{},[86,10789,10790],{"class":88,"line":101},[86,10791,1068],{"emptyLinePlaceholder":198},[86,10793,10794],{"class":88,"line":398},[86,10795,3524],{},[86,10797,10798],{"class":88,"line":1115},[86,10799,3529],{},[86,10801,10802],{"class":88,"line":1121},[86,10803,3534],{},[10,10805,107],{},[77,10807,10809],{"className":10808,"code":3540,"language":113,"meta":82},[111],[34,10810,3540],{"__ignoreMap":82},[10,10812,118],{},[14,10814,121],{"id":121},[123,10816,10817,10819],{},[52,10818,3551],{},[52,10820,3554,10821,3557,10823,3561],{},[34,10822,2177],{},[34,10824,3560],{},[14,10826,144],{"id":144},[49,10828,10829,10833],{},[52,10830,3568,10831,3572],{},[34,10832,3571],{},[52,10834,3575,10835,3579,10837,37],{},[34,10836,3578],{},[34,10838,3582],{},[14,10840,155],{"id":155},[123,10842,10843,10845],{},[52,10844,3589],{},[52,10846,3592],{},[10,10848,173],{},[14,10850,176],{"id":176},[10,10852,3599],{},[181,10854,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10856},[10857,10858,10859,10860,10861,10862,10863,10864],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":3452,"description":3457},[194,3619,3291],{"id":3622,"title":3623,"body":10869,"category":194,"cover":195,"description":3628,"extension":196,"meta":10992,"navigation":198,"path":3778,"pinned":200,"publishedAt":201,"seo":10993,"slug":3780,"stem":3781,"summary":3782,"tags":10994,"updatedAt":201,"visible":198,"__hash__":3785},{"type":7,"value":10870,"toc":10982},[10871,10873,10875,10877,10879,10883,10885,10887,10899,10901,10903,10931,10933,10938,10940,10942,10952,10954,10964,10966,10974,10976,10978,10980],[10,10872,3628],{},[14,10874,16],{"id":16},[10,10876,3633],{},[14,10878,22],{"id":22},[10,10880,10881],{},[26,10882],{"alt":3640,"src":3641},[10,10884,3644],{},[14,10886,47],{"id":47},[49,10888,10889,10891,10893],{},[52,10890,3651],{},[52,10892,3654],{},[52,10894,3657,10895,3661,10897,3665],{},[34,10896,3660],{},[34,10898,3664],{},[14,10900,72],{"id":72},[10,10902,75],{},[77,10904,10905],{"className":79,"code":3672,"language":81,"meta":82,"style":82},[34,10906,10907,10911,10915,10919,10923,10927],{"__ignoreMap":82},[86,10908,10909],{"class":88,"line":89},[86,10910,3679],{},[86,10912,10913],{"class":88,"line":95},[86,10914,3684],{},[86,10916,10917],{"class":88,"line":101},[86,10918,1068],{"emptyLinePlaceholder":198},[86,10920,10921],{"class":88,"line":398},[86,10922,3693],{},[86,10924,10925],{"class":88,"line":1115},[86,10926,3698],{},[86,10928,10929],{"class":88,"line":1121},[86,10930,3703],{},[10,10932,107],{},[77,10934,10936],{"className":10935,"code":3709,"language":113,"meta":82},[111],[34,10937,3709],{"__ignoreMap":82},[10,10939,118],{},[14,10941,121],{"id":121},[123,10943,10944,10946],{},[52,10945,3720],{},[52,10947,10948,3726,10950,3730],{},[34,10949,3725],{},[34,10951,3729],{},[14,10953,144],{"id":144},[49,10955,10956,10962],{},[52,10957,2270,10958,3739,10960,37],{},[34,10959,3664],{},[34,10961,3660],{},[52,10963,3744],{},[14,10965,155],{"id":155},[123,10967,10968,10972],{},[52,10969,3751,10970,3754],{},[34,10971,3660],{},[52,10973,3757],{},[10,10975,173],{},[14,10977,176],{"id":176},[10,10979,3764],{},[181,10981,183],{},{"title":82,"searchDepth":95,"depth":95,"links":10983},[10984,10985,10986,10987,10988,10989,10990,10991],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":3623,"description":3628},[194,3784,3291],{"id":3787,"title":3788,"body":10996,"category":194,"cover":195,"description":3793,"extension":196,"meta":11155,"navigation":198,"path":3992,"pinned":200,"publishedAt":201,"seo":11156,"slug":3994,"stem":3995,"summary":3996,"tags":11157,"updatedAt":201,"visible":198,"__hash__":4000},{"type":7,"value":10997,"toc":11143},[10998,11000,11002,11004,11006,11010,11016,11018,11030,11032,11034,11074,11076,11081,11083,11085,11099,11101,11103,11107,11109,11111,11121,11123,11135,11137,11139,11141],[10,10999,3793],{},[14,11001,16],{"id":16},[10,11003,3798],{},[14,11005,22],{"id":22},[10,11007,11008],{},[26,11009],{"alt":3805,"src":3806},[10,11011,11012,3812,11014,3816],{},[34,11013,3811],{},[34,11015,3815],{},[14,11017,47],{"id":47},[49,11019,11020,11026,11028],{},[52,11021,11022,3825,11024,3829],{},[34,11023,2740],{},[34,11025,3828],{},[52,11027,3832],{},[52,11029,3835],{},[14,11031,72],{"id":72},[10,11033,75],{},[77,11035,11036],{"className":79,"code":3842,"language":81,"meta":82,"style":82},[34,11037,11038,11042,11046,11050,11054,11058,11062,11066,11070],{"__ignoreMap":82},[86,11039,11040],{"class":88,"line":89},[86,11041,3849],{},[86,11043,11044],{"class":88,"line":95},[86,11045,3854],{},[86,11047,11048],{"class":88,"line":101},[86,11049,3859],{},[86,11051,11052],{"class":88,"line":398},[86,11053,1068],{"emptyLinePlaceholder":198},[86,11055,11056],{"class":88,"line":1115},[86,11057,3868],{},[86,11059,11060],{"class":88,"line":1121},[86,11061,3873],{},[86,11063,11064],{"class":88,"line":2420},[86,11065,3878],{},[86,11067,11068],{"class":88,"line":2426},[86,11069,3883],{},[86,11071,11072],{"class":88,"line":3886},[86,11073,3889],{},[10,11075,107],{},[77,11077,11079],{"className":11078,"code":3895,"language":113,"meta":82},[111],[34,11080,3895],{"__ignoreMap":82},[10,11082,118],{},[14,11084,121],{"id":121},[123,11086,11087,11091],{},[52,11088,11089,3909],{},[34,11090,3908],{},[52,11092,11093,3915,11095,3919,11097,3923],{},[34,11094,3914],{},[34,11096,3918],{},[34,11098,3922],{},[298,11100,2630],{"id":2630},[10,11102,3928],{},[10,11104,11105],{},[26,11106],{"alt":3933,"src":3934},[10,11108,3937],{},[14,11110,144],{"id":144},[49,11112,11113,11119],{},[52,11114,3944,11115,3947,11117,37],{},[34,11116,2740],{},[34,11118,3828],{},[52,11120,3952],{},[14,11122,155],{"id":155},[123,11124,11125,11127],{},[52,11126,3959],{},[52,11128,2270,11129,3965,11131,1130,11133,37],{},[34,11130,3964],{},[34,11132,3828],{},[34,11134,2740],{},[10,11136,173],{},[14,11138,176],{"id":176},[10,11140,3976],{},[181,11142,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11144},[11145,11146,11147,11148,11149,11152,11153,11154],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":11150},[11151],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":3788,"description":3793},[194,3998,3999],{"id":4002,"title":4003,"body":11159,"category":194,"cover":195,"description":4008,"extension":196,"meta":11331,"navigation":198,"path":4222,"pinned":200,"publishedAt":201,"seo":11332,"slug":4224,"stem":4225,"summary":4226,"tags":11333,"updatedAt":201,"visible":198,"__hash__":4229},{"type":7,"value":11160,"toc":11318},[11161,11163,11165,11167,11169,11173,11181,11183,11191,11193,11195,11239,11241,11246,11248,11250,11262,11264,11266,11270,11276,11278,11280,11284,11288,11290,11302,11304,11310,11312,11314,11316],[10,11162,4008],{},[14,11164,16],{"id":16},[10,11166,4013],{},[14,11168,22],{"id":22},[10,11170,11171],{},[26,11172],{"alt":4020,"src":4021},[10,11174,11175,2188,11177,2188,11179,4031],{},[34,11176,1129],{},[34,11178,4028],{},[34,11180,1133],{},[14,11182,47],{"id":47},[49,11184,11185,11187,11189],{},[52,11186,4038],{},[52,11188,4041],{},[52,11190,4044],{},[14,11192,72],{"id":72},[10,11194,75],{},[77,11196,11197],{"className":79,"code":4051,"language":81,"meta":82,"style":82},[34,11198,11199,11203,11207,11211,11215,11219,11223,11227,11231,11235],{"__ignoreMap":82},[86,11200,11201],{"class":88,"line":89},[86,11202,4058],{},[86,11204,11205],{"class":88,"line":95},[86,11206,1068],{"emptyLinePlaceholder":198},[86,11208,11209],{"class":88,"line":101},[86,11210,4067],{},[86,11212,11213],{"class":88,"line":398},[86,11214,4072],{},[86,11216,11217],{"class":88,"line":1115},[86,11218,4077],{},[86,11220,11221],{"class":88,"line":1121},[86,11222,4082],{},[86,11224,11225],{"class":88,"line":2420},[86,11226,1118],{},[86,11228,11229],{"class":88,"line":2426},[86,11230,4091],{},[86,11232,11233],{"class":88,"line":3886},[86,11234,1068],{"emptyLinePlaceholder":198},[86,11236,11237],{"class":88,"line":4098},[86,11238,4101],{},[10,11240,107],{},[77,11242,11244],{"className":11243,"code":4107,"language":113,"meta":82},[111],[34,11245,4107],{"__ignoreMap":82},[10,11247,118],{},[14,11249,121],{"id":121},[123,11251,11252,11256],{},[52,11253,4118,11254,4122],{},[34,11255,4121],{},[52,11257,11258,4128,11260,4131],{},[34,11259,4127],{},[34,11261,1133],{},[298,11263,2630],{"id":2630},[10,11265,4136],{},[10,11267,11268],{},[26,11269],{"alt":4141,"src":4142},[10,11271,11272,4147,11274,4150],{},[34,11273,4121],{},[34,11275,4127],{},[298,11277,2630],{"id":4153},[10,11279,4156],{},[10,11281,11282],{},[26,11283],{"alt":4161,"src":4162},[10,11285,4165,11286,4168],{},[34,11287,1129],{},[14,11289,144],{"id":144},[49,11291,11292,11296],{},[52,11293,4175,11294,4178],{},[34,11295,4127],{},[52,11297,4181,11298,4184,11300,4188],{},[34,11299,1129],{},[34,11301,4187],{},[14,11303,155],{"id":155},[123,11305,11306,11308],{},[52,11307,4195],{},[52,11309,4198],{},[10,11311,173],{},[14,11313,176],{"id":176},[10,11315,4205],{},[181,11317,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11319},[11320,11321,11322,11323,11324,11328,11329,11330],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":11325},[11326,11327],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4003,"description":4008},[194,1129,4228],{"id":4231,"title":4232,"body":11335,"category":194,"cover":195,"description":4237,"extension":196,"meta":11472,"navigation":198,"path":4404,"pinned":200,"publishedAt":201,"seo":11473,"slug":4406,"stem":4407,"summary":4408,"tags":11474,"updatedAt":201,"visible":198,"__hash__":4411},{"type":7,"value":11336,"toc":11460},[11337,11339,11341,11343,11345,11349,11353,11355,11365,11367,11369,11401,11403,11408,11410,11412,11422,11424,11426,11430,11434,11436,11442,11444,11452,11454,11456,11458],[10,11338,4237],{},[14,11340,16],{"id":16},[10,11342,4242],{},[14,11344,22],{"id":22},[10,11346,11347],{},[26,11348],{"alt":4249,"src":4250},[10,11350,11351,4256],{},[34,11352,4255],{},[14,11354,47],{"id":47},[49,11356,11357,11359,11361],{},[52,11358,4263],{},[52,11360,4266],{},[52,11362,4269,11363,4273],{},[34,11364,4272],{},[14,11366,72],{"id":72},[10,11368,75],{},[77,11370,11371],{"className":79,"code":4280,"language":81,"meta":82,"style":82},[34,11372,11373,11377,11381,11385,11389,11393,11397],{"__ignoreMap":82},[86,11374,11375],{"class":88,"line":89},[86,11376,4287],{},[86,11378,11379],{"class":88,"line":95},[86,11380,1068],{"emptyLinePlaceholder":198},[86,11382,11383],{"class":88,"line":101},[86,11384,4296],{},[86,11386,11387],{"class":88,"line":398},[86,11388,4301],{},[86,11390,11391],{"class":88,"line":1115},[86,11392,4306],{},[86,11394,11395],{"class":88,"line":1121},[86,11396,1068],{"emptyLinePlaceholder":198},[86,11398,11399],{"class":88,"line":2420},[86,11400,4315],{},[10,11402,107],{},[77,11404,11406],{"className":11405,"code":4321,"language":113,"meta":82},[111],[34,11407,4321],{"__ignoreMap":82},[10,11409,118],{},[14,11411,121],{"id":121},[123,11413,11414,11418],{},[52,11415,4332,11416,4336],{},[34,11417,4335],{},[52,11419,4339,11420,4342],{},[34,11421,4335],{},[298,11423,2630],{"id":2630},[10,11425,4347],{},[10,11427,11428],{},[26,11429],{"alt":4352,"src":4353},[10,11431,4356,11432,4359],{},[34,11433,4335],{},[14,11435,144],{"id":144},[49,11437,11438,11440],{},[52,11439,4366],{},[52,11441,4369],{},[14,11443,155],{"id":155},[123,11445,11446,11450],{},[52,11447,2270,11448,4378],{},[34,11449,4255],{},[52,11451,4381],{},[10,11453,173],{},[14,11455,176],{"id":176},[10,11457,4388],{},[181,11459,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11461},[11462,11463,11464,11465,11466,11469,11470,11471],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":11467},[11468],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4232,"description":4237},[194,4255,4410],{"id":4413,"title":4414,"body":11476,"category":194,"cover":195,"description":4419,"extension":196,"meta":11601,"navigation":198,"path":4568,"pinned":200,"publishedAt":201,"seo":11602,"slug":4570,"stem":4571,"summary":4572,"tags":11603,"updatedAt":201,"visible":198,"__hash__":4575},{"type":7,"value":11477,"toc":11591},[11478,11480,11482,11484,11486,11490,11494,11496,11506,11508,11510,11542,11544,11549,11551,11553,11565,11567,11573,11575,11583,11585,11587,11589],[10,11479,4419],{},[14,11481,16],{"id":16},[10,11483,4424],{},[14,11485,22],{"id":22},[10,11487,11488],{},[26,11489],{"alt":4431,"src":4432},[10,11491,11492,4437],{},[34,11493,4272],{},[14,11495,47],{"id":47},[49,11497,11498,11502,11504],{},[52,11499,11500,4447],{},[34,11501,4446],{},[52,11503,4450],{},[52,11505,4453],{},[14,11507,72],{"id":72},[10,11509,75],{},[77,11511,11512],{"className":79,"code":4460,"language":81,"meta":82,"style":82},[34,11513,11514,11518,11522,11526,11530,11534,11538],{"__ignoreMap":82},[86,11515,11516],{"class":88,"line":89},[86,11517,4467],{},[86,11519,11520],{"class":88,"line":95},[86,11521,1068],{"emptyLinePlaceholder":198},[86,11523,11524],{"class":88,"line":101},[86,11525,4476],{},[86,11527,11528],{"class":88,"line":398},[86,11529,4481],{},[86,11531,11532],{"class":88,"line":1115},[86,11533,1068],{"emptyLinePlaceholder":198},[86,11535,11536],{"class":88,"line":1121},[86,11537,4490],{},[86,11539,11540],{"class":88,"line":2420},[86,11541,4495],{},[10,11543,107],{},[77,11545,11547],{"className":11546,"code":4501,"language":113,"meta":82},[111],[34,11548,4501],{"__ignoreMap":82},[10,11550,118],{},[14,11552,121],{"id":121},[123,11554,11555,11561],{},[52,11556,4512,11557,4515,11559,4519],{},[34,11558,4272],{},[34,11560,4518],{},[52,11562,11563,4524],{},[34,11564,4446],{},[14,11566,144],{"id":144},[49,11568,11569,11571],{},[52,11570,4531],{},[52,11572,4534],{},[14,11574,155],{"id":155},[123,11576,11577,11579],{},[52,11578,4541],{},[52,11580,2270,11581,4547],{},[34,11582,4546],{},[10,11584,173],{},[14,11586,176],{"id":176},[10,11588,4554],{},[181,11590,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11592},[11593,11594,11595,11596,11597,11598,11599,11600],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4414,"description":4419},[194,4272,4574],{"id":4577,"title":4578,"body":11605,"category":194,"cover":195,"description":4583,"extension":196,"meta":11750,"navigation":198,"path":4758,"pinned":200,"publishedAt":201,"seo":11751,"slug":4760,"stem":4761,"summary":4762,"tags":11752,"updatedAt":201,"visible":198,"__hash__":4764},{"type":7,"value":11606,"toc":11740},[11607,11609,11611,11613,11615,11619,11625,11627,11641,11643,11645,11689,11691,11696,11698,11700,11710,11712,11724,11726,11732,11734,11736,11738],[10,11608,4583],{},[14,11610,16],{"id":16},[10,11612,4588],{},[14,11614,22],{"id":22},[10,11616,11617],{},[26,11618],{"alt":4595,"src":4596},[10,11620,11621,4602,11623,4606],{},[34,11622,4601],{},[34,11624,4605],{},[14,11626,47],{"id":47},[49,11628,11629,11631,11637],{},[52,11630,4613],{},[52,11632,11633,4618,11635,4621],{},[34,11634,4601],{},[34,11636,4255],{},[52,11638,4624,11639,4627],{},[34,11640,4605],{},[14,11642,72],{"id":72},[10,11644,75],{},[77,11646,11647],{"className":79,"code":4634,"language":81,"meta":82,"style":82},[34,11648,11649,11653,11657,11661,11665,11669,11673,11677,11681,11685],{"__ignoreMap":82},[86,11650,11651],{"class":88,"line":89},[86,11652,4641],{},[86,11654,11655],{"class":88,"line":95},[86,11656,1068],{"emptyLinePlaceholder":198},[86,11658,11659],{"class":88,"line":101},[86,11660,4650],{},[86,11662,11663],{"class":88,"line":398},[86,11664,4655],{},[86,11666,11667],{"class":88,"line":1115},[86,11668,4660],{},[86,11670,11671],{"class":88,"line":1121},[86,11672,4665],{},[86,11674,11675],{"class":88,"line":2420},[86,11676,4670],{},[86,11678,11679],{"class":88,"line":2426},[86,11680,4495],{},[86,11682,11683],{"class":88,"line":3886},[86,11684,1068],{"emptyLinePlaceholder":198},[86,11686,11687],{"class":88,"line":4098},[86,11688,4683],{},[10,11690,107],{},[77,11692,11694],{"className":11693,"code":4689,"language":113,"meta":82},[111],[34,11695,4689],{"__ignoreMap":82},[10,11697,118],{},[14,11699,121],{"id":121},[123,11701,11702,11706],{},[52,11703,4700,11704,4703],{},[34,11705,4601],{},[52,11707,4706,11708,4709],{},[34,11709,4605],{},[14,11711,144],{"id":144},[49,11713,11714,11718],{},[52,11715,3400,11716,4718],{},[34,11717,4601],{},[52,11719,4721,11720,4724,11722,4727],{},[34,11721,4255],{},[34,11723,4601],{},[14,11725,155],{"id":155},[123,11727,11728,11730],{},[52,11729,4734],{},[52,11731,4737],{},[10,11733,173],{},[14,11735,176],{"id":176},[10,11737,4744],{},[181,11739,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11741},[11742,11743,11744,11745,11746,11747,11748,11749],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4578,"description":4583},[194,4605,4601],{"id":4766,"title":4767,"body":11754,"category":194,"cover":195,"description":4772,"extension":196,"meta":11893,"navigation":198,"path":4944,"pinned":200,"publishedAt":201,"seo":11894,"slug":4946,"stem":4947,"summary":4948,"tags":11895,"updatedAt":201,"visible":198,"__hash__":4952},{"type":7,"value":11755,"toc":11881},[11756,11758,11760,11762,11764,11768,11770,11772,11788,11790,11792,11820,11822,11827,11829,11831,11843,11845,11847,11851,11853,11855,11865,11867,11873,11875,11877,11879],[10,11757,4772],{},[14,11759,16],{"id":16},[10,11761,4777],{},[14,11763,22],{"id":22},[10,11765,11766],{},[26,11767],{"alt":4784,"src":4785},[10,11769,4788],{},[14,11771,47],{"id":47},[49,11773,11774,11776,11778],{},[52,11775,4795],{},[52,11777,4798],{},[52,11779,4801,11780,2188,11782,4808,11784,2188,11786,37],{},[34,11781,4804],{},[34,11783,4807],{},[34,11785,4811],{},[34,11787,4814],{},[14,11789,72],{"id":72},[10,11791,75],{},[77,11793,11794],{"className":79,"code":4821,"language":81,"meta":82,"style":82},[34,11795,11796,11800,11804,11808,11812,11816],{"__ignoreMap":82},[86,11797,11798],{"class":88,"line":89},[86,11799,4828],{},[86,11801,11802],{"class":88,"line":95},[86,11803,1068],{"emptyLinePlaceholder":198},[86,11805,11806],{"class":88,"line":101},[86,11807,4837],{},[86,11809,11810],{"class":88,"line":398},[86,11811,4842],{},[86,11813,11814],{"class":88,"line":1115},[86,11815,4847],{},[86,11817,11818],{"class":88,"line":1121},[86,11819,4852],{},[10,11821,107],{},[77,11823,11825],{"className":11824,"code":4858,"language":113,"meta":82},[111],[34,11826,4858],{"__ignoreMap":82},[10,11828,118],{},[14,11830,121],{"id":121},[123,11832,11833,11841],{},[52,11834,4869,11835,4872,11837,1130,11839,37],{},[34,11836,4804],{},[34,11838,4875],{},[34,11840,4878],{},[52,11842,4881],{},[298,11844,2630],{"id":2630},[10,11846,4886],{},[10,11848,11849],{},[26,11850],{"alt":4891,"src":4892},[10,11852,4895],{},[14,11854,144],{"id":144},[49,11856,11857,11863],{},[52,11858,4902,11859,979,11861,4908],{},[34,11860,4905],{},[34,11862,4811],{},[52,11864,4911],{},[14,11866,155],{"id":155},[123,11868,11869,11871],{},[52,11870,4918],{},[52,11872,4921],{},[10,11874,173],{},[14,11876,176],{"id":176},[10,11878,4928],{},[181,11880,183],{},{"title":82,"searchDepth":95,"depth":95,"links":11882},[11883,11884,11885,11886,11887,11890,11891,11892],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":11888},[11889],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4767,"description":4772},[194,4950,4951],{"id":4954,"title":4955,"body":11897,"category":194,"cover":195,"description":4960,"extension":196,"meta":12014,"navigation":198,"path":5099,"pinned":200,"publishedAt":201,"seo":12015,"slug":5101,"stem":5102,"summary":5103,"tags":12016,"updatedAt":201,"visible":198,"__hash__":5107},{"type":7,"value":11898,"toc":12004},[11899,11901,11903,11905,11907,11911,11913,11915,11923,11925,11927,11959,11961,11966,11968,11970,11978,11980,11988,11990,11996,11998,12000,12002],[10,11900,4960],{},[14,11902,16],{"id":16},[10,11904,4965],{},[14,11906,22],{"id":22},[10,11908,11909],{},[26,11910],{"alt":4972,"src":4973},[10,11912,4976],{},[14,11914,47],{"id":47},[49,11916,11917,11919,11921],{},[52,11918,4983],{},[52,11920,4986],{},[52,11922,4989],{},[14,11924,72],{"id":72},[10,11926,75],{},[77,11928,11929],{"className":79,"code":4996,"language":81,"meta":82,"style":82},[34,11930,11931,11935,11939,11943,11947,11951,11955],{"__ignoreMap":82},[86,11932,11933],{"class":88,"line":89},[86,11934,5003],{},[86,11936,11937],{"class":88,"line":95},[86,11938,1068],{"emptyLinePlaceholder":198},[86,11940,11941],{"class":88,"line":101},[86,11942,5012],{},[86,11944,11945],{"class":88,"line":398},[86,11946,5017],{},[86,11948,11949],{"class":88,"line":1115},[86,11950,1068],{"emptyLinePlaceholder":198},[86,11952,11953],{"class":88,"line":1121},[86,11954,5026],{},[86,11956,11957],{"class":88,"line":2420},[86,11958,5031],{},[10,11960,107],{},[77,11962,11964],{"className":11963,"code":5037,"language":113,"meta":82},[111],[34,11965,5037],{"__ignoreMap":82},[10,11967,118],{},[14,11969,121],{"id":121},[123,11971,11972,11974],{},[52,11973,5048],{},[52,11975,5051,11976,5055],{},[34,11977,5054],{},[14,11979,144],{"id":144},[49,11981,11982,11986],{},[52,11983,5062,11984,5065],{},[34,11985,4272],{},[52,11987,5068],{},[14,11989,155],{"id":155},[123,11991,11992,11994],{},[52,11993,5075],{},[52,11995,5078],{},[10,11997,173],{},[14,11999,176],{"id":176},[10,12001,5085],{},[181,12003,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12005},[12006,12007,12008,12009,12010,12011,12012,12013],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":4955,"description":4960},[194,5105,5106],{"id":5109,"title":5110,"body":12018,"category":194,"cover":195,"description":5115,"extension":196,"meta":12137,"navigation":198,"path":5259,"pinned":200,"publishedAt":201,"seo":12138,"slug":5261,"stem":5262,"summary":5263,"tags":12139,"updatedAt":201,"visible":198,"__hash__":5267},{"type":7,"value":12019,"toc":12127},[12020,12022,12024,12026,12028,12032,12034,12036,12044,12046,12048,12080,12082,12087,12089,12091,12101,12103,12109,12111,12119,12121,12123,12125],[10,12021,5115],{},[14,12023,16],{"id":16},[10,12025,5120],{},[14,12027,22],{"id":22},[10,12029,12030],{},[26,12031],{"alt":5127,"src":5128},[10,12033,5131],{},[14,12035,47],{"id":47},[49,12037,12038,12040,12042],{},[52,12039,5138],{},[52,12041,5141],{},[52,12043,5144],{},[14,12045,72],{"id":72},[10,12047,75],{},[77,12049,12050],{"className":79,"code":5151,"language":81,"meta":82,"style":82},[34,12051,12052,12056,12060,12064,12068,12072,12076],{"__ignoreMap":82},[86,12053,12054],{"class":88,"line":89},[86,12055,5158],{},[86,12057,12058],{"class":88,"line":95},[86,12059,5163],{},[86,12061,12062],{"class":88,"line":101},[86,12063,5168],{},[86,12065,12066],{"class":88,"line":398},[86,12067,1068],{"emptyLinePlaceholder":198},[86,12069,12070],{"class":88,"line":1115},[86,12071,5177],{},[86,12073,12074],{"class":88,"line":1121},[86,12075,5182],{},[86,12077,12078],{"class":88,"line":2420},[86,12079,5187],{},[10,12081,107],{},[77,12083,12085],{"className":12084,"code":5193,"language":113,"meta":82},[111],[34,12086,5193],{"__ignoreMap":82},[10,12088,118],{},[14,12090,121],{"id":121},[123,12092,12093,12097],{},[52,12094,908,12095,5207],{},[34,12096,5206],{},[52,12098,5210,12099,5214],{},[34,12100,5213],{},[14,12102,144],{"id":144},[49,12104,12105,12107],{},[52,12106,5221],{},[52,12108,5224],{},[14,12110,155],{"id":155},[123,12112,12113,12117],{},[52,12114,5231,12115,5235],{},[34,12116,5234],{},[52,12118,5238],{},[10,12120,173],{},[14,12122,176],{"id":176},[10,12124,5245],{},[181,12126,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12128},[12129,12130,12131,12132,12133,12134,12135,12136],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5110,"description":5115},[194,5265,5266],{"id":5269,"title":5270,"body":12141,"category":194,"cover":195,"description":5275,"extension":196,"meta":12286,"navigation":198,"path":5456,"pinned":200,"publishedAt":201,"seo":12287,"slug":5458,"stem":5459,"summary":5460,"tags":12288,"updatedAt":201,"visible":198,"__hash__":5464},{"type":7,"value":12142,"toc":12274},[12143,12145,12147,12149,12151,12155,12159,12161,12173,12175,12177,12205,12207,12212,12214,12216,12230,12232,12234,12238,12246,12248,12258,12260,12266,12268,12270,12272],[10,12144,5275],{},[14,12146,16],{"id":16},[10,12148,5280],{},[14,12150,22],{"id":22},[10,12152,12153],{},[26,12154],{"alt":5287,"src":5288},[10,12156,5291,12157,5295],{},[34,12158,5294],{},[14,12160,47],{"id":47},[49,12162,12163,12165,12167],{},[52,12164,5302],{},[52,12166,5305],{},[52,12168,5308,12169,5311,12171,37],{},[34,12170,5294],{},[34,12172,5314],{},[14,12174,72],{"id":72},[10,12176,75],{},[77,12178,12179],{"className":79,"code":5321,"language":81,"meta":82,"style":82},[34,12180,12181,12185,12189,12193,12197,12201],{"__ignoreMap":82},[86,12182,12183],{"class":88,"line":89},[86,12184,5328],{},[86,12186,12187],{"class":88,"line":95},[86,12188,5333],{},[86,12190,12191],{"class":88,"line":101},[86,12192,5338],{},[86,12194,12195],{"class":88,"line":398},[86,12196,1068],{"emptyLinePlaceholder":198},[86,12198,12199],{"class":88,"line":1115},[86,12200,5347],{},[86,12202,12203],{"class":88,"line":1121},[86,12204,5352],{},[10,12206,107],{},[77,12208,12210],{"className":12209,"code":5358,"language":113,"meta":82},[111],[34,12211,5358],{"__ignoreMap":82},[10,12213,118],{},[14,12215,121],{"id":121},[123,12217,12218,12224],{},[52,12219,5369,12220,2188,12222,5375],{},[34,12221,5372],{},[34,12223,4335],{},[52,12225,12226,5381,12228,5385],{},[34,12227,5380],{},[34,12229,5384],{},[298,12231,2630],{"id":2630},[10,12233,5390],{},[10,12235,12236],{},[26,12237],{"alt":5395,"src":5396},[10,12239,12240,2188,12242,1130,12244,5406],{},[34,12241,5372],{},[34,12243,4335],{},[34,12245,5405],{},[14,12247,144],{"id":144},[49,12249,12250,12254],{},[52,12251,5413,12252,5417],{},[34,12253,5416],{},[52,12255,5420,12256,5423],{},[34,12257,5405],{},[14,12259,155],{"id":155},[123,12261,12262,12264],{},[52,12263,5430],{},[52,12265,5433],{},[10,12267,173],{},[14,12269,176],{"id":176},[10,12271,5440],{},[181,12273,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12275},[12276,12277,12278,12279,12280,12283,12284,12285],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":12281},[12282],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5270,"description":5275},[194,5462,5463],{"id":5466,"title":5467,"body":12290,"category":194,"cover":195,"description":5472,"extension":196,"meta":12439,"navigation":198,"path":5653,"pinned":200,"publishedAt":201,"seo":12440,"slug":5655,"stem":5656,"summary":5657,"tags":12441,"updatedAt":201,"visible":198,"__hash__":5661},{"type":7,"value":12291,"toc":12427},[12292,12294,12296,12298,12300,12304,12306,12308,12320,12322,12324,12368,12370,12375,12377,12379,12391,12393,12395,12399,12401,12403,12411,12413,12419,12421,12423,12425],[10,12293,5472],{},[14,12295,16],{"id":16},[10,12297,5477],{},[14,12299,22],{"id":22},[10,12301,12302],{},[26,12303],{"alt":5484,"src":5485},[10,12305,5488],{},[14,12307,47],{"id":47},[49,12309,12310,12312,12316],{},[52,12311,5495],{},[52,12313,12314,5501],{},[34,12315,5500],{},[52,12317,12318,5507],{},[34,12319,5506],{},[14,12321,72],{"id":72},[10,12323,75],{},[77,12325,12326],{"className":79,"code":5514,"language":81,"meta":82,"style":82},[34,12327,12328,12332,12336,12340,12344,12348,12352,12356,12360,12364],{"__ignoreMap":82},[86,12329,12330],{"class":88,"line":89},[86,12331,5521],{},[86,12333,12334],{"class":88,"line":95},[86,12335,5526],{},[86,12337,12338],{"class":88,"line":101},[86,12339,1068],{"emptyLinePlaceholder":198},[86,12341,12342],{"class":88,"line":398},[86,12343,5535],{},[86,12345,12346],{"class":88,"line":1115},[86,12347,5540],{},[86,12349,12350],{"class":88,"line":1121},[86,12351,1068],{"emptyLinePlaceholder":198},[86,12353,12354],{"class":88,"line":2420},[86,12355,5549],{},[86,12357,12358],{"class":88,"line":2426},[86,12359,5554],{},[86,12361,12362],{"class":88,"line":3886},[86,12363,1068],{"emptyLinePlaceholder":198},[86,12365,12366],{"class":88,"line":4098},[86,12367,5563],{},[10,12369,107],{},[77,12371,12373],{"className":12372,"code":5569,"language":113,"meta":82},[111],[34,12374,5569],{"__ignoreMap":82},[10,12376,118],{},[14,12378,121],{"id":121},[123,12380,12381,12385],{},[52,12382,5580,12383,5584],{},[34,12384,5583],{},[52,12386,12387,5590,12389,37],{},[34,12388,5589],{},[34,12390,5593],{},[298,12392,2630],{"id":2630},[10,12394,5598],{},[10,12396,12397],{},[26,12398],{"alt":5603,"src":5604},[10,12400,5607],{},[14,12402,144],{"id":144},[49,12404,12405,12409],{},[52,12406,5614,12407,5617],{},[34,12408,5314],{},[52,12410,5620],{},[14,12412,155],{"id":155},[123,12414,12415,12417],{},[52,12416,5627],{},[52,12418,5630],{},[10,12420,173],{},[14,12422,176],{"id":176},[10,12424,5637],{},[181,12426,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12428},[12429,12430,12431,12432,12433,12436,12437,12438],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":12434},[12435],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5467,"description":5472},[194,5659,5660],{"id":5663,"title":5664,"body":12443,"category":194,"cover":195,"description":5669,"extension":196,"meta":12604,"navigation":198,"path":5867,"pinned":200,"publishedAt":201,"seo":12605,"slug":5869,"stem":5870,"summary":5871,"tags":12606,"updatedAt":201,"visible":198,"__hash__":5875},{"type":7,"value":12444,"toc":12592},[12445,12447,12449,12451,12453,12457,12459,12461,12473,12475,12477,12529,12531,12536,12538,12540,12558,12560,12562,12566,12568,12570,12576,12578,12584,12586,12588,12590],[10,12446,5669],{},[14,12448,16],{"id":16},[10,12450,5674],{},[14,12452,22],{"id":22},[10,12454,12455],{},[26,12456],{"alt":5681,"src":5682},[10,12458,5685],{},[14,12460,47],{"id":47},[49,12462,12463,12465,12467],{},[52,12464,5692],{},[52,12466,5695],{},[52,12468,12469,166,12471,5704],{},[34,12470,5700],{},[34,12472,5703],{},[14,12474,72],{"id":72},[10,12476,75],{},[77,12478,12479],{"className":79,"code":5711,"language":81,"meta":82,"style":82},[34,12480,12481,12485,12489,12493,12497,12501,12505,12509,12513,12517,12521,12525],{"__ignoreMap":82},[86,12482,12483],{"class":88,"line":89},[86,12484,5718],{},[86,12486,12487],{"class":88,"line":95},[86,12488,1068],{"emptyLinePlaceholder":198},[86,12490,12491],{"class":88,"line":101},[86,12492,5727],{},[86,12494,12495],{"class":88,"line":398},[86,12496,5732],{},[86,12498,12499],{"class":88,"line":1115},[86,12500,1068],{"emptyLinePlaceholder":198},[86,12502,12503],{"class":88,"line":1121},[86,12504,5741],{},[86,12506,12507],{"class":88,"line":2420},[86,12508,5746],{},[86,12510,12511],{"class":88,"line":2426},[86,12512,5751],{},[86,12514,12515],{"class":88,"line":3886},[86,12516,1068],{"emptyLinePlaceholder":198},[86,12518,12519],{"class":88,"line":4098},[86,12520,5760],{},[86,12522,12523],{"class":88,"line":5763},[86,12524,1068],{"emptyLinePlaceholder":198},[86,12526,12527],{"class":88,"line":5768},[86,12528,5771],{},[10,12530,107],{},[77,12532,12534],{"className":12533,"code":5777,"language":113,"meta":82},[111],[34,12535,5777],{"__ignoreMap":82},[10,12537,118],{},[14,12539,121],{"id":121},[123,12541,12542,12552],{},[52,12543,12544,5791,12546,5795,12548,5798,12550,5802],{},[34,12545,5790],{},[34,12547,5794],{},[34,12549,5583],{},[34,12551,5801],{},[52,12553,12554,5807,12556,5810],{},[34,12555,4518],{},[34,12557,208],{},[298,12559,2630],{"id":2630},[10,12561,5815],{},[10,12563,12564],{},[26,12565],{"alt":5820,"src":5821},[10,12567,5824],{},[14,12569,144],{"id":144},[49,12571,12572,12574],{},[52,12573,5831],{},[52,12575,5834],{},[14,12577,155],{"id":155},[123,12579,12580,12582],{},[52,12581,5841],{},[52,12583,5844],{},[10,12585,173],{},[14,12587,176],{"id":176},[10,12589,5851],{},[181,12591,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12593},[12594,12595,12596,12597,12598,12601,12602,12603],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":12599},[12600],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5664,"description":5669},[194,5873,5874],{"id":5877,"title":5878,"body":12608,"category":194,"cover":195,"description":5883,"extension":196,"meta":12731,"navigation":198,"path":6034,"pinned":200,"publishedAt":201,"seo":12732,"slug":6036,"stem":6037,"summary":6038,"tags":12733,"updatedAt":201,"visible":198,"__hash__":6042},{"type":7,"value":12609,"toc":12721},[12610,12612,12614,12616,12618,12622,12624,12626,12640,12642,12644,12672,12674,12679,12681,12683,12693,12695,12703,12705,12713,12715,12717,12719],[10,12611,5883],{},[14,12613,16],{"id":16},[10,12615,5888],{},[14,12617,22],{"id":22},[10,12619,12620],{},[26,12621],{"alt":5895,"src":5896},[10,12623,5899],{},[14,12625,47],{"id":47},[49,12627,12628,12630,12632],{},[52,12629,5906],{},[52,12631,5909],{},[52,12633,5912,12634,2188,12636,2188,12638,5920],{},[34,12635,2191],{},[34,12637,2357],{},[34,12639,5919],{},[14,12641,72],{"id":72},[10,12643,75],{},[77,12645,12646],{"className":79,"code":5927,"language":81,"meta":82,"style":82},[34,12647,12648,12652,12656,12660,12664,12668],{"__ignoreMap":82},[86,12649,12650],{"class":88,"line":89},[86,12651,5934],{},[86,12653,12654],{"class":88,"line":95},[86,12655,5939],{},[86,12657,12658],{"class":88,"line":101},[86,12659,5944],{},[86,12661,12662],{"class":88,"line":398},[86,12663,1068],{"emptyLinePlaceholder":198},[86,12665,12666],{"class":88,"line":1115},[86,12667,5953],{},[86,12669,12670],{"class":88,"line":1121},[86,12671,5958],{},[10,12673,107],{},[77,12675,12677],{"className":12676,"code":5964,"language":113,"meta":82},[111],[34,12678,5964],{"__ignoreMap":82},[10,12680,118],{},[14,12682,121],{"id":121},[123,12684,12685,12691],{},[52,12686,5975,12687,5979,12689,5982],{},[34,12688,5978],{},[34,12690,2177],{},[52,12692,5985],{},[14,12694,144],{"id":144},[49,12696,12697,12701],{},[52,12698,5992,12699,5996],{},[34,12700,5995],{},[52,12702,5999],{},[14,12704,155],{"id":155},[123,12706,12707,12709],{},[52,12708,6006],{},[52,12710,6009,12711,6013],{},[34,12712,6012],{},[10,12714,173],{},[14,12716,176],{"id":176},[10,12718,6020],{},[181,12720,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12722},[12723,12724,12725,12726,12727,12728,12729,12730],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":5878,"description":5883},[194,6040,6041],{"id":6044,"title":6045,"body":12735,"category":194,"cover":195,"description":6050,"extension":196,"meta":12912,"navigation":198,"path":6278,"pinned":200,"publishedAt":201,"seo":12913,"slug":6280,"stem":6281,"summary":6282,"tags":12914,"updatedAt":201,"visible":198,"__hash__":6286},{"type":7,"value":12736,"toc":12900},[12737,12739,12741,12745,12747,12751,12757,12759,12771,12773,12777,12801,12805,12821,12827,12829,12834,12836,12838,12854,12856,12858,12862,12866,12868,12880,12882,12892,12894,12896,12898],[10,12738,6050],{},[14,12740,16],{"id":16},[10,12742,6055,12743,6058],{},[264,12744,5978],{},[14,12746,22],{"id":22},[10,12748,12749],{},[26,12750],{"alt":6065,"src":6066},[10,12752,6069,12753,6073,12755,6077],{},[34,12754,6072],{},[34,12756,6076],{},[14,12758,47],{"id":47},[49,12760,12761,12765,12767],{},[52,12762,6084,12763,6087],{},[34,12764,1144],{},[52,12766,6090],{},[52,12768,6093,12769,6097],{},[34,12770,6096],{},[14,12772,72],{"id":72},[10,12774,6102,12775,6106],{},[34,12776,6105],{},[77,12778,12779],{"className":79,"code":6109,"language":81,"meta":82,"style":82},[34,12780,12781,12785,12789,12793,12797],{"__ignoreMap":82},[86,12782,12783],{"class":88,"line":89},[86,12784,6116],{},[86,12786,12787],{"class":88,"line":95},[86,12788,6121],{},[86,12790,12791],{"class":88,"line":101},[86,12792,1068],{"emptyLinePlaceholder":198},[86,12794,12795],{"class":88,"line":398},[86,12796,6130],{},[86,12798,12799],{"class":88,"line":1115},[86,12800,6135],{},[10,12802,6138,12803,6142],{},[34,12804,6141],{},[77,12806,12807],{"className":79,"code":6145,"language":81,"meta":82,"style":82},[34,12808,12809,12813,12817],{"__ignoreMap":82},[86,12810,12811],{"class":88,"line":89},[86,12812,6152],{},[86,12814,12815],{"class":88,"line":95},[86,12816,1068],{"emptyLinePlaceholder":198},[86,12818,12819],{"class":88,"line":101},[86,12820,6161],{},[10,12822,6164,12823,1130,12825,37],{},[34,12824,6167],{},[34,12826,6170],{},[10,12828,107],{},[77,12830,12832],{"className":12831,"code":6176,"language":113,"meta":82},[111],[34,12833,6176],{"__ignoreMap":82},[10,12835,118],{},[14,12837,121],{"id":121},[123,12839,12840,12846],{},[52,12841,6187,12842,6190,12844,6194],{},[34,12843,6105],{},[34,12845,6193],{},[52,12847,12848,6199,12850,6202,12852,6205],{},[34,12849,6141],{},[34,12851,6105],{},[34,12853,6141],{},[298,12855,2630],{"id":2630},[10,12857,6210],{},[10,12859,12860],{},[26,12861],{"alt":6215,"src":6216},[10,12863,6219,12864,6222],{},[34,12865,6193],{},[14,12867,144],{"id":144},[49,12869,12870,12876],{},[52,12871,6229,12872,1130,12874,37],{},[34,12873,6105],{},[34,12875,6141],{},[52,12877,6236,12878,6240],{},[34,12879,6239],{},[14,12881,155],{"id":155},[123,12883,12884,12888],{},[52,12885,2285,12886,6250],{},[34,12887,6249],{},[52,12889,6253,12890,37],{},[34,12891,6072],{},[10,12893,173],{},[14,12895,176],{"id":176},[10,12897,6262],{},[181,12899,183],{},{"title":82,"searchDepth":95,"depth":95,"links":12901},[12902,12903,12904,12905,12906,12909,12910,12911],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":12907},[12908],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":6045,"description":6050},[194,6284,6285],{"id":6288,"title":6289,"body":12916,"category":194,"cover":195,"description":6294,"extension":196,"meta":13055,"navigation":198,"path":6460,"pinned":200,"publishedAt":201,"seo":13056,"slug":6462,"stem":6463,"summary":6464,"tags":13057,"updatedAt":201,"visible":198,"__hash__":6467},{"type":7,"value":12917,"toc":13045},[12918,12920,12922,12924,12926,12930,12932,12934,12944,12946,12948,12988,12990,12995,12997,12999,13017,13019,13027,13029,13037,13039,13041,13043],[10,12919,6294],{},[14,12921,16],{"id":16},[10,12923,6299],{},[14,12925,22],{"id":22},[10,12927,12928],{},[26,12929],{"alt":6306,"src":6307},[10,12931,6310],{},[14,12933,47],{"id":47},[49,12935,12936,12940,12942],{},[52,12937,12938,6320],{},[34,12939,6319],{},[52,12941,6323],{},[52,12943,6326],{},[14,12945,72],{"id":72},[10,12947,1546],{},[77,12949,12950],{"className":561,"code":6333,"language":563,"meta":82,"style":82},[34,12951,12952,12962,12968,12974,12984],{"__ignoreMap":82},[86,12953,12954,12956,12958,12960],{"class":88,"line":89},[86,12955,661],{"class":570},[86,12957,603],{"class":573},[86,12959,6344],{"class":606},[86,12961,6347],{"class":606},[86,12963,12964,12966],{"class":88,"line":95},[86,12965,6352],{"class":573},[86,12967,6355],{"class":606},[86,12969,12970,12972],{"class":88,"line":101},[86,12971,81],{"class":570},[86,12973,574],{"class":573},[86,12975,12976,12978,12980,12982],{"class":88,"line":398},[86,12977,81],{"class":570},[86,12979,603],{"class":573},[86,12981,607],{"class":606},[86,12983,574],{"class":573},[86,12985,12986],{"class":88,"line":1115},[86,12987,6376],{"class":570},[10,12989,107],{},[77,12991,12993],{"className":12992,"code":6382,"language":113,"meta":82},[111],[34,12994,6382],{"__ignoreMap":82},[10,12996,118],{},[14,12998,121],{"id":121},[123,13000,13001,13007],{},[52,13002,13003,6396,13005,6399],{},[34,13004,6395],{},[34,13006,661],{},[52,13008,6402,13009,166,13011,6408,13013,3661,13015,6414],{},[34,13010,81],{},[34,13012,6407],{},[34,13014,6319],{},[34,13016,6413],{},[14,13018,144],{"id":144},[49,13020,13021,13023],{},[52,13022,6421],{},[52,13024,3400,13025,6426],{},[34,13026,6319],{},[14,13028,155],{"id":155},[123,13030,13031,13035],{},[52,13032,6433,13033,37],{},[34,13034,6436],{},[52,13036,6439],{},[10,13038,173],{},[14,13040,176],{"id":176},[10,13042,6446],{},[181,13044,1630],{},{"title":82,"searchDepth":95,"depth":95,"links":13046},[13047,13048,13049,13050,13051,13052,13053,13054],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":6289,"description":6294},[194,6466,230],{"id":6469,"title":6470,"body":13059,"category":194,"cover":195,"description":6475,"extension":196,"meta":13212,"navigation":198,"path":6664,"pinned":200,"publishedAt":201,"seo":13213,"slug":6666,"stem":6667,"summary":6668,"tags":13214,"updatedAt":201,"visible":198,"__hash__":6672},{"type":7,"value":13060,"toc":13202},[13061,13063,13065,13067,13069,13073,13079,13081,13097,13099,13101,13145,13147,13152,13154,13156,13168,13170,13184,13186,13194,13196,13198,13200],[10,13062,6475],{},[14,13064,16],{"id":16},[10,13066,6480],{},[14,13068,22],{"id":22},[10,13070,13071],{},[26,13072],{"alt":6487,"src":6488},[10,13074,13075,6494,13077,6497],{},[34,13076,6493],{},[34,13078,2367],{},[14,13080,47],{"id":47},[49,13082,13083,13085,13093],{},[52,13084,6504],{},[52,13086,13087,2188,13089,2188,13091,6516],{},[34,13088,6509],{},[34,13090,6512],{},[34,13092,6515],{},[52,13094,6519,13095,6523],{},[34,13096,6522],{},[14,13098,72],{"id":72},[10,13100,75],{},[77,13102,13103],{"className":79,"code":6530,"language":81,"meta":82,"style":82},[34,13104,13105,13109,13113,13117,13121,13125,13129,13133,13137,13141],{"__ignoreMap":82},[86,13106,13107],{"class":88,"line":89},[86,13108,6537],{},[86,13110,13111],{"class":88,"line":95},[86,13112,1068],{"emptyLinePlaceholder":198},[86,13114,13115],{"class":88,"line":101},[86,13116,6546],{},[86,13118,13119],{"class":88,"line":398},[86,13120,6551],{},[86,13122,13123],{"class":88,"line":1115},[86,13124,6556],{},[86,13126,13127],{"class":88,"line":1121},[86,13128,1068],{"emptyLinePlaceholder":198},[86,13130,13131],{"class":88,"line":2420},[86,13132,6565],{},[86,13134,13135],{"class":88,"line":2426},[86,13136,6570],{},[86,13138,13139],{"class":88,"line":3886},[86,13140,6575],{},[86,13142,13143],{"class":88,"line":4098},[86,13144,6580],{},[10,13146,107],{},[77,13148,13150],{"className":13149,"code":6586,"language":113,"meta":82},[111],[34,13151,6586],{"__ignoreMap":82},[10,13153,118],{},[14,13155,121],{"id":121},[123,13157,13158,13162],{},[52,13159,13160,6600],{},[34,13161,6599],{},[52,13163,2270,13164,6605,13166,6608],{},[34,13165,2367],{},[34,13167,6493],{},[14,13169,144],{"id":144},[49,13171,13172,13178],{},[52,13173,3400,13174,6617,13176,6620],{},[34,13175,6493],{},[34,13177,6509],{},[52,13179,6623,13180,979,13182,6629],{},[34,13181,2367],{},[34,13183,6628],{},[14,13185,155],{"id":155},[123,13187,13188,13192],{},[52,13189,6636,13190,6640],{},[34,13191,6639],{},[52,13193,6643],{},[10,13195,173],{},[14,13197,176],{"id":176},[10,13199,6650],{},[181,13201,183],{},{"title":82,"searchDepth":95,"depth":95,"links":13203},[13204,13205,13206,13207,13208,13209,13210,13211],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":6470,"description":6475},[194,6670,6671],{"id":6674,"title":6675,"body":13216,"category":194,"cover":195,"description":6680,"extension":196,"meta":13363,"navigation":198,"path":6859,"pinned":200,"publishedAt":201,"seo":13364,"slug":6861,"stem":6862,"summary":6863,"tags":13365,"updatedAt":201,"visible":198,"__hash__":6867},{"type":7,"value":13217,"toc":13353},[13218,13220,13222,13224,13226,13230,13232,13234,13252,13254,13256,13304,13306,13311,13313,13315,13323,13325,13335,13337,13345,13347,13349,13351],[10,13219,6680],{},[14,13221,16],{"id":16},[10,13223,6685],{},[14,13225,22],{"id":22},[10,13227,13228],{},[26,13229],{"alt":6692,"src":6693},[10,13231,6696],{},[14,13233,47],{"id":47},[49,13235,13236,13240,13246],{},[52,13237,13238,6706],{},[34,13239,6705],{},[52,13241,13242,6712,13244,37],{},[34,13243,6711],{},[34,13245,6715],{},[52,13247,6718,13248,6722,13250,6726],{},[34,13249,6721],{},[34,13251,6725],{},[14,13253,72],{"id":72},[10,13255,75],{},[77,13257,13258],{"className":79,"code":6733,"language":81,"meta":82,"style":82},[34,13259,13260,13264,13268,13272,13276,13280,13284,13288,13292,13296,13300],{"__ignoreMap":82},[86,13261,13262],{"class":88,"line":89},[86,13263,6537],{},[86,13265,13266],{"class":88,"line":95},[86,13267,1068],{"emptyLinePlaceholder":198},[86,13269,13270],{"class":88,"line":101},[86,13271,6748],{},[86,13273,13274],{"class":88,"line":398},[86,13275,6753],{},[86,13277,13278],{"class":88,"line":1115},[86,13279,6758],{},[86,13281,13282],{"class":88,"line":1121},[86,13283,6763],{},[86,13285,13286],{"class":88,"line":2420},[86,13287,1068],{"emptyLinePlaceholder":198},[86,13289,13290],{"class":88,"line":2426},[86,13291,6772],{},[86,13293,13294],{"class":88,"line":3886},[86,13295,6777],{},[86,13297,13298],{"class":88,"line":4098},[86,13299,6782],{},[86,13301,13302],{"class":88,"line":5763},[86,13303,6787],{},[10,13305,107],{},[77,13307,13309],{"className":13308,"code":6793,"language":113,"meta":82},[111],[34,13310,6793],{"__ignoreMap":82},[10,13312,118],{},[14,13314,121],{"id":121},[123,13316,13317,13321],{},[52,13318,6804,13319,6807],{},[34,13320,6721],{},[52,13322,6810],{},[14,13324,144],{"id":144},[49,13326,13327,13331],{},[52,13328,2270,13329,6819],{},[34,13330,6705],{},[52,13332,6822,13333,37],{},[34,13334,6825],{},[14,13336,155],{"id":155},[123,13338,13339,13341],{},[52,13340,6832],{},[52,13342,6835,13343,6838],{},[34,13344,306],{},[10,13346,173],{},[14,13348,176],{"id":176},[10,13350,6845],{},[181,13352,183],{},{"title":82,"searchDepth":95,"depth":95,"links":13354},[13355,13356,13357,13358,13359,13360,13361,13362],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":6675,"description":6680},[194,6865,6866],{"id":6869,"title":6870,"body":13367,"category":194,"cover":195,"description":6875,"extension":196,"meta":13510,"navigation":198,"path":7043,"pinned":200,"publishedAt":201,"seo":13511,"slug":7045,"stem":7046,"summary":7047,"tags":13512,"updatedAt":201,"visible":198,"__hash__":7051},{"type":7,"value":13368,"toc":13500},[13369,13371,13373,13375,13377,13381,13387,13389,13399,13401,13403,13455,13457,13462,13464,13466,13476,13478,13484,13486,13492,13494,13496,13498],[10,13370,6875],{},[14,13372,16],{"id":16},[10,13374,6880],{},[14,13376,22],{"id":22},[10,13378,13379],{},[26,13380],{"alt":6887,"src":6888},[10,13382,13383,6894,13385,6898],{},[34,13384,6893],{},[34,13386,6897],{},[14,13388,47],{"id":47},[49,13390,13391,13393,13397],{},[52,13392,6905],{},[52,13394,13395,6911],{},[34,13396,6910],{},[52,13398,6914],{},[14,13400,72],{"id":72},[10,13402,75],{},[77,13404,13405],{"className":79,"code":6921,"language":81,"meta":82,"style":82},[34,13406,13407,13411,13415,13419,13423,13427,13431,13435,13439,13443,13447,13451],{"__ignoreMap":82},[86,13408,13409],{"class":88,"line":89},[86,13410,6928],{},[86,13412,13413],{"class":88,"line":95},[86,13414,1068],{"emptyLinePlaceholder":198},[86,13416,13417],{"class":88,"line":101},[86,13418,6937],{},[86,13420,13421],{"class":88,"line":398},[86,13422,1068],{"emptyLinePlaceholder":198},[86,13424,13425],{"class":88,"line":1115},[86,13426,6946],{},[86,13428,13429],{"class":88,"line":1121},[86,13430,6951],{},[86,13432,13433],{"class":88,"line":2420},[86,13434,6763],{},[86,13436,13437],{"class":88,"line":2426},[86,13438,1068],{"emptyLinePlaceholder":198},[86,13440,13441],{"class":88,"line":3886},[86,13442,6964],{},[86,13444,13445],{"class":88,"line":4098},[86,13446,6969],{},[86,13448,13449],{"class":88,"line":5763},[86,13450,6782],{},[86,13452,13453],{"class":88,"line":5768},[86,13454,6978],{},[10,13456,107],{},[77,13458,13460],{"className":13459,"code":6984,"language":113,"meta":82},[111],[34,13461,6984],{"__ignoreMap":82},[10,13463,118],{},[14,13465,121],{"id":121},[123,13467,13468,13472],{},[52,13469,13470,6997],{},[34,13471,6893],{},[52,13473,13474,7002],{},[34,13475,6897],{},[14,13477,144],{"id":144},[49,13479,13480,13482],{},[52,13481,7009],{},[52,13483,7012],{},[14,13485,155],{"id":155},[123,13487,13488,13490],{},[52,13489,7019],{},[52,13491,7022],{},[10,13493,173],{},[14,13495,176],{"id":176},[10,13497,7029],{},[181,13499,183],{},{"title":82,"searchDepth":95,"depth":95,"links":13501},[13502,13503,13504,13505,13506,13507,13508,13509],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":6870,"description":6875},[194,7049,7050],{"id":7053,"title":7054,"body":13514,"category":194,"cover":195,"description":7059,"extension":196,"meta":13665,"navigation":198,"path":7244,"pinned":200,"publishedAt":201,"seo":13666,"slug":7246,"stem":7247,"summary":7248,"tags":13667,"updatedAt":201,"visible":198,"__hash__":7252},{"type":7,"value":13515,"toc":13655},[13516,13518,13520,13522,13524,13528,13532,13534,13548,13550,13552,13604,13606,13611,13613,13615,13627,13629,13639,13641,13647,13649,13651,13653],[10,13517,7059],{},[14,13519,16],{"id":16},[10,13521,7064],{},[14,13523,22],{"id":22},[10,13525,13526],{},[26,13527],{"alt":7071,"src":7072},[10,13529,13530,7078],{},[34,13531,7077],{},[14,13533,47],{"id":47},[49,13535,13536,13542,13546],{},[52,13537,2270,13538,7088,13540,7092],{},[34,13539,7087],{},[34,13541,7091],{},[52,13543,7095,13544,7099],{},[34,13545,7098],{},[52,13547,7102],{},[14,13549,72],{"id":72},[10,13551,75],{},[77,13553,13554],{"className":79,"code":7109,"language":81,"meta":82,"style":82},[34,13555,13556,13560,13564,13568,13572,13576,13580,13584,13588,13592,13596,13600],{"__ignoreMap":82},[86,13557,13558],{"class":88,"line":89},[86,13559,7116],{},[86,13561,13562],{"class":88,"line":95},[86,13563,1068],{"emptyLinePlaceholder":198},[86,13565,13566],{"class":88,"line":101},[86,13567,7125],{},[86,13569,13570],{"class":88,"line":398},[86,13571,7130],{},[86,13573,13574],{"class":88,"line":1115},[86,13575,7135],{},[86,13577,13578],{"class":88,"line":1121},[86,13579,7140],{},[86,13581,13582],{"class":88,"line":2420},[86,13583,7145],{},[86,13585,13586],{"class":88,"line":2426},[86,13587,1068],{"emptyLinePlaceholder":198},[86,13589,13590],{"class":88,"line":3886},[86,13591,7154],{},[86,13593,13594],{"class":88,"line":4098},[86,13595,7159],{},[86,13597,13598],{"class":88,"line":5763},[86,13599,7164],{},[86,13601,13602],{"class":88,"line":5768},[86,13603,7169],{},[10,13605,107],{},[77,13607,13609],{"className":13608,"code":7175,"language":113,"meta":82},[111],[34,13610,7175],{"__ignoreMap":82},[10,13612,118],{},[14,13614,121],{"id":121},[123,13616,13617,13623],{},[52,13618,13619,7189,13621,7192],{},[34,13620,7188],{},[34,13622,7098],{},[52,13624,13625,7197],{},[34,13626,7077],{},[14,13628,144],{"id":144},[49,13630,13631,13633],{},[52,13632,7204],{},[52,13634,7207,13635,7210,13637,7213],{},[34,13636,7087],{},[34,13638,7091],{},[14,13640,155],{"id":155},[123,13642,13643,13645],{},[52,13644,7220],{},[52,13646,7223],{},[10,13648,173],{},[14,13650,176],{"id":176},[10,13652,7230],{},[181,13654,183],{},{"title":82,"searchDepth":95,"depth":95,"links":13656},[13657,13658,13659,13660,13661,13662,13663,13664],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":7054,"description":7059},[194,7250,7251],{"id":7254,"title":7255,"body":13669,"category":194,"cover":195,"description":7260,"extension":196,"meta":13883,"navigation":198,"path":7534,"pinned":200,"publishedAt":201,"seo":13884,"slug":7536,"stem":7537,"summary":7538,"tags":13885,"updatedAt":201,"visible":198,"__hash__":7542},{"type":7,"value":13670,"toc":13870},[13671,13673,13675,13677,13679,13683,13689,13691,13703,13705,13707,13767,13769,13774,13776,13778,13796,13798,13806,13810,13818,13820,13824,13828,13834,13836,13846,13848,13862,13864,13866,13868],[10,13672,7260],{},[14,13674,16],{"id":16},[10,13676,7265],{},[14,13678,22],{"id":22},[10,13680,13681],{},[26,13682],{"alt":7272,"src":7273},[10,13684,7276,13685,7280,13687,7284],{},[34,13686,7279],{},[34,13688,7283],{},[14,13690,47],{"id":47},[49,13692,13693,13697,13701],{},[52,13694,7291,13695,7294],{},[34,13696,7279],{},[52,13698,13699,7300],{},[34,13700,7299],{},[52,13702,7303],{},[14,13704,72],{"id":72},[10,13706,75],{},[77,13708,13709],{"className":79,"code":7310,"language":81,"meta":82,"style":82},[34,13710,13711,13715,13719,13723,13727,13731,13735,13739,13743,13747,13751,13755,13759,13763],{"__ignoreMap":82},[86,13712,13713],{"class":88,"line":89},[86,13714,7317],{},[86,13716,13717],{"class":88,"line":95},[86,13718,7322],{},[86,13720,13721],{"class":88,"line":101},[86,13722,7327],{},[86,13724,13725],{"class":88,"line":398},[86,13726,7332],{},[86,13728,13729],{"class":88,"line":1115},[86,13730,7337],{},[86,13732,13733],{"class":88,"line":1121},[86,13734,1068],{"emptyLinePlaceholder":198},[86,13736,13737],{"class":88,"line":2420},[86,13738,7346],{},[86,13740,13741],{"class":88,"line":2426},[86,13742,7351],{},[86,13744,13745],{"class":88,"line":3886},[86,13746,7356],{},[86,13748,13749],{"class":88,"line":4098},[86,13750,7361],{},[86,13752,13753],{"class":88,"line":5763},[86,13754,1118],{},[86,13756,13757],{"class":88,"line":5768},[86,13758,7370],{},[86,13760,13761],{"class":88,"line":7373},[86,13762,7376],{},[86,13764,13765],{"class":88,"line":7379},[86,13766,7382],{},[10,13768,107],{},[77,13770,13772],{"className":13771,"code":7388,"language":113,"meta":82},[111],[34,13773,7388],{"__ignoreMap":82},[10,13775,118],{},[14,13777,121],{"id":121},[123,13779,13780,13788],{},[52,13781,13782,7401,13784,7404,13786,7408],{},[34,13783,2969],{},[34,13785,7299],{},[34,13787,7407],{},[52,13789,7411,13790,7414,13792,7417,13794,37],{},[34,13791,7279],{},[34,13793,1133],{},[34,13795,7283],{},[298,13797,2630],{"id":2630},[10,13799,13800,2188,13802,1130,13804,7430],{},[34,13801,7279],{},[34,13803,1133],{},[34,13805,7283],{},[10,13807,13808],{},[26,13809],{"alt":7435,"src":7436},[10,13811,13812,7441,13814,7444,13816,7447],{},[34,13813,7279],{},[34,13815,1133],{},[34,13817,7283],{},[298,13819,2630],{"id":4153},[10,13821,13822,7455],{},[34,13823,7454],{},[10,13825,13826],{},[26,13827],{"alt":7460,"src":7461},[10,13829,7464,13830,7467,13832,7470],{},[34,13831,7454],{},[34,13833,1133],{},[14,13835,144],{"id":144},[49,13837,13838,13842],{},[52,13839,7477,13840,7481],{},[34,13841,7480],{},[52,13843,7484,13844,7487],{},[34,13845,7454],{},[14,13847,155],{"id":155},[123,13849,13850,13858],{},[52,13851,7494,13852,7498,13854,1130,13856,37],{},[34,13853,7497],{},[34,13855,7501],{},[34,13857,7504],{},[52,13859,7507,13860,7510],{},[34,13861,6715],{},[10,13863,173],{},[14,13865,176],{"id":176},[10,13867,7517],{},[181,13869,183],{},{"title":82,"searchDepth":95,"depth":95,"links":13871},[13872,13873,13874,13875,13876,13880,13881,13882],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":13877},[13878,13879],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":7255,"description":7260},[194,7540,7541],{"id":7544,"title":7545,"body":13887,"category":194,"cover":195,"description":7550,"extension":196,"meta":14038,"navigation":198,"path":7727,"pinned":200,"publishedAt":201,"seo":14039,"slug":7729,"stem":7730,"summary":7731,"tags":14040,"updatedAt":201,"visible":198,"__hash__":7734},{"type":7,"value":13888,"toc":14028},[13889,13891,13893,13895,13897,13901,13905,13907,13919,13921,13923,13971,13973,13978,13980,13982,13992,13994,14004,14006,14020,14022,14024,14026],[10,13890,7550],{},[14,13892,16],{"id":16},[10,13894,7555],{},[14,13896,22],{"id":22},[10,13898,13899],{},[26,13900],{"alt":7562,"src":7563},[10,13902,7566,13903,7569],{},[34,13904,6725],{},[14,13906,47],{"id":47},[49,13908,13909,13913,13917],{},[52,13910,13911,7578],{},[34,13912,6725],{},[52,13914,13915,7584],{},[34,13916,7583],{},[52,13918,7587],{},[14,13920,72],{"id":72},[10,13922,75],{},[77,13924,13925],{"className":79,"code":7594,"language":81,"meta":82,"style":82},[34,13926,13927,13931,13935,13939,13943,13947,13951,13955,13959,13963,13967],{"__ignoreMap":82},[86,13928,13929],{"class":88,"line":89},[86,13930,6537],{},[86,13932,13933],{"class":88,"line":95},[86,13934,1068],{"emptyLinePlaceholder":198},[86,13936,13937],{"class":88,"line":101},[86,13938,6748],{},[86,13940,13941],{"class":88,"line":398},[86,13942,1068],{"emptyLinePlaceholder":198},[86,13944,13945],{"class":88,"line":1115},[86,13946,7617],{},[86,13948,13949],{"class":88,"line":1121},[86,13950,7622],{},[86,13952,13953],{"class":88,"line":2420},[86,13954,1068],{"emptyLinePlaceholder":198},[86,13956,13957],{"class":88,"line":2426},[86,13958,7631],{},[86,13960,13961],{"class":88,"line":3886},[86,13962,7636],{},[86,13964,13965],{"class":88,"line":4098},[86,13966,1068],{"emptyLinePlaceholder":198},[86,13968,13969],{"class":88,"line":5763},[86,13970,7645],{},[10,13972,107],{},[77,13974,13976],{"className":13975,"code":7651,"language":113,"meta":82},[111],[34,13977,7651],{"__ignoreMap":82},[10,13979,118],{},[14,13981,121],{"id":121},[123,13983,13984,13990],{},[52,13985,7566,13986,7664,13988,37],{},[34,13987,6725],{},[34,13989,7667],{},[52,13991,7670],{},[14,13993,144],{"id":144},[49,13995,13996,14000],{},[52,13997,4721,13998,7679],{},[34,13999,6725],{},[52,14001,7682,14002,7685],{},[34,14003,6725],{},[14,14005,155],{"id":155},[123,14007,14008,14014],{},[52,14009,7692,14010,7696,14012,37],{},[34,14011,7695],{},[34,14013,6725],{},[52,14015,4721,14016,7703,14018,37],{},[34,14017,6725],{},[34,14019,7706],{},[10,14021,173],{},[14,14023,176],{"id":176},[10,14025,7713],{},[181,14027,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14029},[14030,14031,14032,14033,14034,14035,14036,14037],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":7545,"description":7550},[194,6725,7733],{"id":7736,"title":7737,"body":14042,"category":194,"cover":195,"description":7742,"extension":196,"meta":14213,"navigation":198,"path":7955,"pinned":200,"publishedAt":201,"seo":14214,"slug":7957,"stem":7958,"summary":7959,"tags":14215,"updatedAt":201,"visible":198,"__hash__":7963},{"type":7,"value":14043,"toc":14201},[14044,14046,14048,14050,14052,14056,14058,14060,14072,14074,14076,14132,14134,14139,14141,14143,14159,14161,14163,14167,14173,14175,14183,14185,14193,14195,14197,14199],[10,14045,7742],{},[14,14047,16],{"id":16},[10,14049,7747],{},[14,14051,22],{"id":22},[10,14053,14054],{},[26,14055],{"alt":7754,"src":7755},[10,14057,7758],{},[14,14059,47],{"id":47},[49,14061,14062,14066,14070],{},[52,14063,14064,7768],{},[34,14065,7767],{},[52,14067,14068,7774],{},[34,14069,7773],{},[52,14071,7777],{},[14,14073,72],{"id":72},[10,14075,75],{},[77,14077,14078],{"className":79,"code":7784,"language":81,"meta":82,"style":82},[34,14079,14080,14084,14088,14092,14096,14100,14104,14108,14112,14116,14120,14124,14128],{"__ignoreMap":82},[86,14081,14082],{"class":88,"line":89},[86,14083,7791],{},[86,14085,14086],{"class":88,"line":95},[86,14087,7796],{},[86,14089,14090],{"class":88,"line":101},[86,14091,7801],{},[86,14093,14094],{"class":88,"line":398},[86,14095,7806],{},[86,14097,14098],{"class":88,"line":1115},[86,14099,1068],{"emptyLinePlaceholder":198},[86,14101,14102],{"class":88,"line":1121},[86,14103,7815],{},[86,14105,14106],{"class":88,"line":2420},[86,14107,7820],{},[86,14109,14110],{"class":88,"line":2426},[86,14111,7825],{},[86,14113,14114],{"class":88,"line":3886},[86,14115,7830],{},[86,14117,14118],{"class":88,"line":4098},[86,14119,1068],{"emptyLinePlaceholder":198},[86,14121,14122],{"class":88,"line":5763},[86,14123,7839],{},[86,14125,14126],{"class":88,"line":5768},[86,14127,7844],{},[86,14129,14130],{"class":88,"line":7373},[86,14131,7849],{},[10,14133,107],{},[77,14135,14137],{"className":14136,"code":7855,"language":113,"meta":82},[111],[34,14138,7855],{"__ignoreMap":82},[10,14140,118],{},[14,14142,121],{"id":121},[123,14144,14145,14151],{},[52,14146,7866,14147,7870,14149,7873],{},[34,14148,7869],{},[34,14150,7773],{},[52,14152,14153,7879,14155,7883,14157,7886],{},[34,14154,7878],{},[34,14156,7882],{},[34,14158,7767],{},[298,14160,2630],{"id":2630},[10,14162,7891],{},[10,14164,14165],{},[26,14166],{"alt":7896,"src":7897},[10,14168,7900,14169,1130,14171,7906],{},[34,14170,4518],{},[34,14172,7905],{},[14,14174,144],{"id":144},[49,14176,14177,14181],{},[52,14178,7913,14179,7916],{},[34,14180,7767],{},[52,14182,7919],{},[14,14184,155],{"id":155},[123,14186,14187,14191],{},[52,14188,5231,14189,7929],{},[34,14190,7928],{},[52,14192,7932],{},[10,14194,173],{},[14,14196,176],{"id":176},[10,14198,7939],{},[181,14200,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14202},[14203,14204,14205,14206,14207,14210,14211,14212],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":14208},[14209],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":7737,"description":7742},[194,7961,7962],{"id":7965,"title":7966,"body":14217,"category":194,"cover":195,"description":7971,"extension":196,"meta":14364,"navigation":198,"path":8150,"pinned":200,"publishedAt":201,"seo":14365,"slug":8152,"stem":8153,"summary":8154,"tags":14366,"updatedAt":201,"visible":198,"__hash__":8158},{"type":7,"value":14218,"toc":14354},[14219,14221,14223,14225,14227,14231,14233,14235,14243,14245,14247,14303,14305,14310,14312,14314,14326,14328,14334,14336,14346,14348,14350,14352],[10,14220,7971],{},[14,14222,16],{"id":16},[10,14224,7976],{},[14,14226,22],{"id":22},[10,14228,14229],{},[26,14230],{"alt":7983,"src":7984},[10,14232,7987],{},[14,14234,47],{"id":47},[49,14236,14237,14239,14241],{},[52,14238,7994],{},[52,14240,7997],{},[52,14242,8000],{},[14,14244,72],{"id":72},[10,14246,75],{},[77,14248,14249],{"className":79,"code":8007,"language":81,"meta":82,"style":82},[34,14250,14251,14255,14259,14263,14267,14271,14275,14279,14283,14287,14291,14295,14299],{"__ignoreMap":82},[86,14252,14253],{"class":88,"line":89},[86,14254,8014],{},[86,14256,14257],{"class":88,"line":95},[86,14258,8019],{},[86,14260,14261],{"class":88,"line":101},[86,14262,8024],{},[86,14264,14265],{"class":88,"line":398},[86,14266,1068],{"emptyLinePlaceholder":198},[86,14268,14269],{"class":88,"line":1115},[86,14270,8033],{},[86,14272,14273],{"class":88,"line":1121},[86,14274,8038],{},[86,14276,14277],{"class":88,"line":2420},[86,14278,8043],{},[86,14280,14281],{"class":88,"line":2426},[86,14282,1068],{"emptyLinePlaceholder":198},[86,14284,14285],{"class":88,"line":3886},[86,14286,8052],{},[86,14288,14289],{"class":88,"line":4098},[86,14290,8057],{},[86,14292,14293],{"class":88,"line":5763},[86,14294,1068],{"emptyLinePlaceholder":198},[86,14296,14297],{"class":88,"line":5768},[86,14298,8066],{},[86,14300,14301],{"class":88,"line":7373},[86,14302,8071],{},[10,14304,107],{},[77,14306,14308],{"className":14307,"code":8077,"language":113,"meta":82},[111],[34,14309,8077],{"__ignoreMap":82},[10,14311,118],{},[14,14313,121],{"id":121},[123,14315,14316,14322],{},[52,14317,14318,8091,14320,8095],{},[34,14319,8090],{},[34,14321,8094],{},[52,14323,8098,14324,8102],{},[34,14325,8101],{},[14,14327,144],{"id":144},[49,14329,14330,14332],{},[52,14331,8109],{},[52,14333,8112],{},[14,14335,155],{"id":155},[123,14337,14338,14344],{},[52,14339,8119,14340,8123,14342,37],{},[34,14341,8122],{},[34,14343,8126],{},[52,14345,8129],{},[10,14347,173],{},[14,14349,176],{"id":176},[10,14351,8136],{},[181,14353,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14355},[14356,14357,14358,14359,14360,14361,14362,14363],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":7966,"description":7971},[194,8156,8157],{"id":8160,"title":8161,"body":14368,"category":194,"cover":195,"description":8166,"extension":196,"meta":14531,"navigation":198,"path":8370,"pinned":200,"publishedAt":201,"seo":14532,"slug":8372,"stem":8373,"summary":8374,"tags":14533,"updatedAt":201,"visible":198,"__hash__":8378},{"type":7,"value":14369,"toc":14519},[14370,14372,14374,14376,14378,14382,14386,14388,14404,14406,14408,14452,14454,14459,14461,14463,14477,14479,14483,14487,14491,14493,14499,14501,14511,14513,14515,14517],[10,14371,8166],{},[14,14373,16],{"id":16},[10,14375,8171],{},[14,14377,22],{"id":22},[10,14379,14380],{},[26,14381],{"alt":8178,"src":8179},[10,14383,8182,14384,8186],{},[34,14385,8185],{},[14,14387,47],{"id":47},[49,14389,14390,14396,14402],{},[52,14391,14392,8196,14394,8200],{},[34,14393,8195],{},[34,14395,8199],{},[52,14397,8203,14398,8207,14400,8210],{},[34,14399,8206],{},[34,14401,4272],{},[52,14403,8213],{},[14,14405,72],{"id":72},[10,14407,75],{},[77,14409,14410],{"className":79,"code":8220,"language":81,"meta":82,"style":82},[34,14411,14412,14416,14420,14424,14428,14432,14436,14440,14444,14448],{"__ignoreMap":82},[86,14413,14414],{"class":88,"line":89},[86,14415,8227],{},[86,14417,14418],{"class":88,"line":95},[86,14419,8232],{},[86,14421,14422],{"class":88,"line":101},[86,14423,8237],{},[86,14425,14426],{"class":88,"line":398},[86,14427,8242],{},[86,14429,14430],{"class":88,"line":1115},[86,14431,8247],{},[86,14433,14434],{"class":88,"line":1121},[86,14435,1068],{"emptyLinePlaceholder":198},[86,14437,14438],{"class":88,"line":2420},[86,14439,8256],{},[86,14441,14442],{"class":88,"line":2426},[86,14443,8261],{},[86,14445,14446],{"class":88,"line":3886},[86,14447,8261],{},[86,14449,14450],{"class":88,"line":4098},[86,14451,8261],{},[10,14453,107],{},[77,14455,14457],{"className":14456,"code":8275,"language":113,"meta":82},[111],[34,14458,8275],{"__ignoreMap":82},[10,14460,118],{},[14,14462,121],{"id":121},[123,14464,14465,14469],{},[52,14466,7866,14467,8289],{},[34,14468,8288],{},[52,14470,8292,14471,8295,14473,8298,14475,8302],{},[34,14472,8199],{},[34,14474,8185],{},[34,14476,8301],{},[298,14478,2630],{"id":2630},[10,14480,8307,14481,8310],{},[34,14482,8199],{},[10,14484,14485],{},[26,14486],{"alt":8315,"src":8316},[10,14488,8319,14489,8322],{},[34,14490,8185],{},[14,14492,144],{"id":144},[49,14494,14495,14497],{},[52,14496,8329],{},[52,14498,8332],{},[14,14500,155],{"id":155},[123,14502,14503,14505],{},[52,14504,8339],{},[52,14506,3944,14507,8344,14509,8347],{},[34,14508,4272],{},[34,14510,8199],{},[10,14512,173],{},[14,14514,176],{"id":176},[10,14516,8354],{},[181,14518,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14520},[14521,14522,14523,14524,14525,14528,14529,14530],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":14526},[14527],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":8161,"description":8166},[194,8376,8377],{"id":8380,"title":8381,"body":14535,"category":194,"cover":195,"description":8386,"extension":196,"meta":14718,"navigation":198,"path":8611,"pinned":200,"publishedAt":201,"seo":14719,"slug":8613,"stem":8614,"summary":8615,"tags":14720,"updatedAt":201,"visible":198,"__hash__":8618},{"type":7,"value":14536,"toc":14706},[14537,14539,14541,14543,14545,14549,14551,14553,14567,14569,14571,14639,14641,14646,14648,14650,14664,14666,14668,14672,14678,14680,14688,14690,14698,14700,14702,14704],[10,14538,8386],{},[14,14540,16],{"id":16},[10,14542,8391],{},[14,14544,22],{"id":22},[10,14546,14547],{},[26,14548],{"alt":8398,"src":8399},[10,14550,8402],{},[14,14552,47],{"id":47},[49,14554,14555,14561,14563],{},[52,14556,14557,8412,14559,37],{},[34,14558,8411],{},[34,14560,8415],{},[52,14562,8418],{},[52,14564,14565,8424],{},[34,14566,8423],{},[14,14568,72],{"id":72},[10,14570,75],{},[77,14572,14573],{"className":79,"code":8431,"language":81,"meta":82,"style":82},[34,14574,14575,14579,14583,14587,14591,14595,14599,14603,14607,14611,14615,14619,14623,14627,14631,14635],{"__ignoreMap":82},[86,14576,14577],{"class":88,"line":89},[86,14578,8438],{},[86,14580,14581],{"class":88,"line":95},[86,14582,1068],{"emptyLinePlaceholder":198},[86,14584,14585],{"class":88,"line":101},[86,14586,8447],{},[86,14588,14589],{"class":88,"line":398},[86,14590,8452],{},[86,14592,14593],{"class":88,"line":1115},[86,14594,8457],{},[86,14596,14597],{"class":88,"line":1121},[86,14598,8462],{},[86,14600,14601],{"class":88,"line":2420},[86,14602,8467],{},[86,14604,14605],{"class":88,"line":2426},[86,14606,8472],{},[86,14608,14609],{"class":88,"line":3886},[86,14610,8477],{},[86,14612,14613],{"class":88,"line":4098},[86,14614,8482],{},[86,14616,14617],{"class":88,"line":5763},[86,14618,1068],{"emptyLinePlaceholder":198},[86,14620,14621],{"class":88,"line":5768},[86,14622,8491],{},[86,14624,14625],{"class":88,"line":7373},[86,14626,6116],{},[86,14628,14629],{"class":88,"line":7379},[86,14630,6121],{},[86,14632,14633],{"class":88,"line":8502},[86,14634,1068],{"emptyLinePlaceholder":198},[86,14636,14637],{"class":88,"line":8507},[86,14638,8510],{},[10,14640,107],{},[77,14642,14644],{"className":14643,"code":8516,"language":113,"meta":82},[111],[34,14645,8516],{"__ignoreMap":82},[10,14647,118],{},[14,14649,121],{"id":121},[123,14651,14652,14662],{},[52,14653,8527,14654,8531,14656,8535,14658,8539,14660,37],{},[34,14655,8530],{},[34,14657,8534],{},[34,14659,8538],{},[34,14661,8530],{},[52,14663,8544],{},[298,14665,2630],{"id":2630},[10,14667,8549],{},[10,14669,14670],{},[26,14671],{"alt":8554,"src":8555},[10,14673,14674,8560,14676,37],{},[34,14675,8411],{},[34,14677,8415],{},[14,14679,144],{"id":144},[49,14681,14682,14686],{},[52,14683,8569,14684,37],{},[34,14685,5314],{},[52,14687,8574],{},[14,14689,155],{"id":155},[123,14691,14692,14694],{},[52,14693,8581],{},[52,14695,8584,14696,8588],{},[34,14697,8587],{},[10,14699,173],{},[14,14701,176],{"id":176},[10,14703,8595],{},[181,14705,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14707},[14708,14709,14710,14711,14712,14715,14716,14717],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":14713},[14714],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":8381,"description":8386},[194,8617,5265],{"id":8620,"title":8621,"body":14722,"category":194,"cover":195,"description":8626,"extension":196,"meta":14881,"navigation":198,"path":8814,"pinned":200,"publishedAt":201,"seo":14882,"slug":8816,"stem":8817,"summary":8818,"tags":14883,"updatedAt":201,"visible":198,"__hash__":8822},{"type":7,"value":14723,"toc":14869},[14724,14726,14728,14730,14732,14736,14738,14740,14748,14750,14752,14816,14818,14823,14825,14827,14835,14837,14839,14843,14845,14847,14853,14855,14861,14863,14865,14867],[10,14725,8626],{},[14,14727,16],{"id":16},[10,14729,8631],{},[14,14731,22],{"id":22},[10,14733,14734],{},[26,14735],{"alt":8638,"src":8639},[10,14737,8642],{},[14,14739,47],{"id":47},[49,14741,14742,14744,14746],{},[52,14743,8649],{},[52,14745,8652],{},[52,14747,8655],{},[14,14749,72],{"id":72},[10,14751,75],{},[77,14753,14754],{"className":79,"code":8662,"language":81,"meta":82,"style":82},[34,14755,14756,14760,14764,14768,14772,14776,14780,14784,14788,14792,14796,14800,14804,14808,14812],{"__ignoreMap":82},[86,14757,14758],{"class":88,"line":89},[86,14759,8669],{},[86,14761,14762],{"class":88,"line":95},[86,14763,8674],{},[86,14765,14766],{"class":88,"line":101},[86,14767,1068],{"emptyLinePlaceholder":198},[86,14769,14770],{"class":88,"line":398},[86,14771,8683],{},[86,14773,14774],{"class":88,"line":1115},[86,14775,1068],{"emptyLinePlaceholder":198},[86,14777,14778],{"class":88,"line":1121},[86,14779,8692],{},[86,14781,14782],{"class":88,"line":2420},[86,14783,8697],{},[86,14785,14786],{"class":88,"line":2426},[86,14787,8702],{},[86,14789,14790],{"class":88,"line":3886},[86,14791,1068],{"emptyLinePlaceholder":198},[86,14793,14794],{"class":88,"line":4098},[86,14795,8711],{},[86,14797,14798],{"class":88,"line":5763},[86,14799,8716],{},[86,14801,14802],{"class":88,"line":5768},[86,14803,8721],{},[86,14805,14806],{"class":88,"line":7373},[86,14807,1068],{"emptyLinePlaceholder":198},[86,14809,14810],{"class":88,"line":7379},[86,14811,6130],{},[86,14813,14814],{"class":88,"line":8502},[86,14815,8734],{},[10,14817,107],{},[77,14819,14821],{"className":14820,"code":8740,"language":113,"meta":82},[111],[34,14822,8740],{"__ignoreMap":82},[10,14824,118],{},[14,14826,121],{"id":121},[123,14828,14829,14833],{},[52,14830,14831,8754],{},[34,14832,8753],{},[52,14834,8757],{},[298,14836,2630],{"id":2630},[10,14838,8762],{},[10,14840,14841],{},[26,14842],{"alt":8767,"src":8768},[10,14844,8771],{},[14,14846,144],{"id":144},[49,14848,14849,14851],{},[52,14850,8778],{},[52,14852,8781],{},[14,14854,155],{"id":155},[123,14856,14857,14859],{},[52,14858,8788],{},[52,14860,8791],{},[10,14862,173],{},[14,14864,176],{"id":176},[10,14866,8798],{},[181,14868,183],{},{"title":82,"searchDepth":95,"depth":95,"links":14870},[14871,14872,14873,14874,14875,14878,14879,14880],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":14876},[14877],{"id":2630,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":8621,"description":8626},[194,8820,8821],{"id":8824,"title":8825,"body":14885,"category":194,"cover":195,"description":8830,"extension":196,"meta":15123,"navigation":198,"path":9131,"pinned":200,"publishedAt":201,"seo":15124,"slug":9133,"stem":9134,"summary":9135,"tags":15125,"updatedAt":201,"visible":198,"__hash__":9139},{"type":7,"value":14886,"toc":15110},[14887,14889,14891,14893,14895,14899,14901,14903,14913,14915,14917,15033,15035,15040,15042,15044,15054,15056,15058,15062,15064,15066,15068,15072,15076,15078,15086,15088,15102,15104,15106,15108],[10,14888,8830],{},[14,14890,16],{"id":16},[10,14892,8835],{},[14,14894,22],{"id":22},[10,14896,14897],{},[26,14898],{"alt":8842,"src":8843},[10,14900,8846],{},[14,14902,47],{"id":47},[49,14904,14905,14907,14909],{},[52,14906,8853],{},[52,14908,8856],{},[52,14910,8859,14911,8863],{},[34,14912,8862],{},[14,14914,72],{"id":72},[10,14916,75],{},[77,14918,14919],{"className":79,"code":8870,"language":81,"meta":82,"style":82},[34,14920,14921,14925,14929,14933,14937,14941,14945,14949,14953,14957,14961,14965,14969,14973,14977,14981,14985,14989,14993,14997,15001,15005,15009,15013,15017,15021,15025,15029],{"__ignoreMap":82},[86,14922,14923],{"class":88,"line":89},[86,14924,6928],{},[86,14926,14927],{"class":88,"line":95},[86,14928,6537],{},[86,14930,14931],{"class":88,"line":101},[86,14932,1068],{"emptyLinePlaceholder":198},[86,14934,14935],{"class":88,"line":398},[86,14936,8889],{},[86,14938,14939],{"class":88,"line":1115},[86,14940,8894],{},[86,14942,14943],{"class":88,"line":1121},[86,14944,8899],{},[86,14946,14947],{"class":88,"line":2420},[86,14948,8904],{},[86,14950,14951],{"class":88,"line":2426},[86,14952,1068],{"emptyLinePlaceholder":198},[86,14954,14955],{"class":88,"line":3886},[86,14956,8913],{},[86,14958,14959],{"class":88,"line":4098},[86,14960,8918],{},[86,14962,14963],{"class":88,"line":5763},[86,14964,8923],{},[86,14966,14967],{"class":88,"line":5768},[86,14968,8928],{},[86,14970,14971],{"class":88,"line":7373},[86,14972,8933],{},[86,14974,14975],{"class":88,"line":7379},[86,14976,1068],{"emptyLinePlaceholder":198},[86,14978,14979],{"class":88,"line":8502},[86,14980,8942],{},[86,14982,14983],{"class":88,"line":8507},[86,14984,8947],{},[86,14986,14987],{"class":88,"line":8950},[86,14988,8953],{},[86,14990,14991],{"class":88,"line":8956},[86,14992,1068],{"emptyLinePlaceholder":198},[86,14994,14995],{"class":88,"line":8961},[86,14996,8964],{},[86,14998,14999],{"class":88,"line":8967},[86,15000,1068],{"emptyLinePlaceholder":198},[86,15002,15003],{"class":88,"line":8972},[86,15004,7346],{},[86,15006,15007],{"class":88,"line":8977},[86,15008,8980],{},[86,15010,15011],{"class":88,"line":8983},[86,15012,8986],{},[86,15014,15015],{"class":88,"line":8989},[86,15016,8992],{},[86,15018,15019],{"class":88,"line":8995},[86,15020,7356],{},[86,15022,15023],{"class":88,"line":9000},[86,15024,9003],{},[86,15026,15027],{"class":88,"line":9006},[86,15028,1118],{},[86,15030,15031],{"class":88,"line":9011},[86,15032,9014],{},[10,15034,107],{},[77,15036,15038],{"className":15037,"code":9020,"language":113,"meta":82},[111],[34,15039,9020],{"__ignoreMap":82},[10,15041,118],{},[14,15043,121],{"id":121},[123,15045,15046,15050],{},[52,15047,9031,15048,9034],{},[34,15049,8862],{},[52,15051,15052,9039],{},[34,15053,8094],{},[298,15055,2630],{"id":2630},[10,15057,9044],{},[10,15059,15060],{},[26,15061],{"alt":9049,"src":9050},[10,15063,9053],{},[298,15065,2630],{"id":4153},[10,15067,9058],{},[10,15069,15070],{},[26,15071],{"alt":9063,"src":9064},[10,15073,9067,15074,9071],{},[34,15075,9070],{},[14,15077,144],{"id":144},[49,15079,15080,15082],{},[52,15081,9078],{},[52,15083,9081,15084,9084],{},[34,15085,9070],{},[14,15087,155],{"id":155},[123,15089,15090,15094,15096],{},[52,15091,9091,15092,9094],{},[34,15093,9070],{},[52,15095,9097],{},[52,15097,9100,15098,9104,15100,9107],{},[34,15099,9103],{},[34,15101,6072],{},[10,15103,173],{},[14,15105,176],{"id":176},[10,15107,9114],{},[181,15109,183],{},{"title":82,"searchDepth":95,"depth":95,"links":15111},[15112,15113,15114,15115,15116,15120,15121,15122],{"id":16,"depth":95,"text":16},{"id":22,"depth":95,"text":22},{"id":47,"depth":95,"text":47},{"id":72,"depth":95,"text":72},{"id":121,"depth":95,"text":121,"children":15117},[15118,15119],{"id":2630,"depth":101,"text":2630},{"id":4153,"depth":101,"text":2630},{"id":144,"depth":95,"text":144},{"id":155,"depth":95,"text":155},{"id":176,"depth":95,"text":176},{},{"title":8825,"description":8830},[194,9137,9138],{"id":1026,"title":1027,"body":15127,"category":194,"cover":1035,"description":82,"extension":196,"meta":15363,"navigation":198,"path":1355,"pinned":200,"publishedAt":1356,"seo":15364,"slug":1358,"stem":1359,"summary":1360,"tags":15365,"updatedAt":1356,"visible":198,"__hash__":1364},{"type":7,"value":15128,"toc":15348},[15129,15133,15135,15137,15139,15141,15161,15163,15168,15170,15172,15200,15206,15208,15212,15214,15234,15236,15246,15248,15250,15252,15254,15256,15258,15260,15262,15264,15284,15286,15288,15292,15294,15296,15298,15300,15304,15306,15324,15326,15328,15330,15332,15334,15336,15338,15340,15342,15344,15346],[10,15130,15131],{},[26,15132],{"alt":1034,"src":1035},[10,15134,1038],{},[10,15136,1041],{},[14,15138,1045],{"id":1044},[10,15140,1048],{},[77,15142,15143],{"className":79,"code":1051,"language":81,"meta":82,"style":82},[34,15144,15145,15149,15153,15157],{"__ignoreMap":82},[86,15146,15147],{"class":88,"line":89},[86,15148,1058],{},[86,15150,15151],{"class":88,"line":95},[86,15152,1063],{},[86,15154,15155],{"class":88,"line":101},[86,15156,1068],{"emptyLinePlaceholder":198},[86,15158,15159],{"class":88,"line":398},[86,15160,1073],{},[10,15162,1076],{},[77,15164,15166],{"className":15165,"code":1080,"language":113,"meta":82},[111],[34,15167,1080],{"__ignoreMap":82},[10,15169,1085],{},[10,15171,1088],{},[77,15173,15174],{"className":79,"code":1091,"language":81,"meta":82,"style":82},[34,15175,15176,15180,15184,15188,15192,15196],{"__ignoreMap":82},[86,15177,15178],{"class":88,"line":89},[86,15179,1098],{},[86,15181,15182],{"class":88,"line":95},[86,15183,1068],{"emptyLinePlaceholder":198},[86,15185,15186],{"class":88,"line":101},[86,15187,1107],{},[86,15189,15190],{"class":88,"line":398},[86,15191,1112],{},[86,15193,15194],{"class":88,"line":1115},[86,15195,1118],{},[86,15197,15198],{"class":88,"line":1121},[86,15199,1124],{},[10,15201,15202,1130,15204,1134],{},[34,15203,1129],{},[34,15205,1133],{},[14,15207,1138],{"id":1137},[10,15209,1141,15210,1145],{},[34,15211,1144],{},[10,15213,1148],{},[77,15215,15216],{"className":79,"code":1151,"language":81,"meta":82,"style":82},[34,15217,15218,15222,15226,15230],{"__ignoreMap":82},[86,15219,15220],{"class":88,"line":89},[86,15221,1158],{},[86,15223,15224],{"class":88,"line":95},[86,15225,1163],{},[86,15227,15228],{"class":88,"line":101},[86,15229,1168],{},[86,15231,15232],{"class":88,"line":398},[86,15233,1173],{},[10,15235,1176],{},[77,15237,15238],{"className":561,"code":1179,"language":563,"meta":82,"style":82},[34,15239,15240],{"__ignoreMap":82},[86,15241,15242,15244],{"class":88,"line":89},[86,15243,661],{"class":570},[86,15245,1188],{"class":606},[10,15247,1191],{},[14,15249,1195],{"id":1194},[298,15251,1198],{"id":1198},[10,15253,1201],{},[298,15255,1204],{"id":1204},[10,15257,1207],{},[298,15259,1210],{"id":1210},[10,15261,1213],{},[10,15263,1216],{},[77,15265,15266],{"className":79,"code":1219,"language":81,"meta":82,"style":82},[34,15267,15268,15272,15276,15280],{"__ignoreMap":82},[86,15269,15270],{"class":88,"line":89},[86,15271,1226],{},[86,15273,15274],{"class":88,"line":95},[86,15275,1068],{"emptyLinePlaceholder":198},[86,15277,15278],{"class":88,"line":101},[86,15279,1235],{},[86,15281,15282],{"class":88,"line":398},[86,15283,1240],{},[10,15285,1243],{},[298,15287,1246],{"id":1246},[10,15289,1249,15290,1252],{},[34,15291,230],{},[10,15293,1255],{},[298,15295,1258],{"id":1258},[10,15297,1261],{},[14,15299,1265],{"id":1264},[10,15301,15302],{},[26,15303],{"alt":1270,"src":1271},[10,15305,1274],{},[49,15307,15308,15310,15312,15314,15316,15318,15320,15322],{},[52,15309,1279],{},[52,15311,1282],{},[52,15313,1285],{},[52,15315,1288],{},[52,15317,1291],{},[52,15319,1294],{},[52,15321,1297],{},[52,15323,1300],{},[10,15325,1303],{},[14,15327,1307],{"id":1306},[10,15329,1310],{},[10,15331,1313],{},[14,15333,1317],{"id":1316},[10,15335,1320],{},[10,15337,1323],{},[10,15339,1326],{},[14,15341,1329],{"id":1329},[10,15343,1332],{},[10,15345,1335],{},[181,15347,1338],{},{"title":82,"searchDepth":95,"depth":95,"links":15349},[15350,15351,15352,15359,15360,15361,15362],{"id":1044,"depth":95,"text":1045},{"id":1137,"depth":95,"text":1138},{"id":1194,"depth":95,"text":1195,"children":15353},[15354,15355,15356,15357,15358],{"id":1198,"depth":101,"text":1198},{"id":1204,"depth":101,"text":1204},{"id":1210,"depth":101,"text":1210},{"id":1246,"depth":101,"text":1246},{"id":1258,"depth":101,"text":1258},{"id":1264,"depth":95,"text":1265},{"id":1306,"depth":95,"text":1307},{"id":1316,"depth":95,"text":1317},{"id":1329,"depth":95,"text":1329},{},{"title":1027,"description":82},[194,1362,1363],{"id":212,"title":213,"body":15367,"category":194,"cover":195,"description":82,"extension":196,"meta":15946,"navigation":198,"path":1015,"pinned":200,"publishedAt":1016,"seo":15947,"slug":1018,"stem":1019,"summary":1020,"tags":15948,"updatedAt":1016,"visible":198,"__hash__":1024},{"type":7,"value":15368,"toc":15922},[15369,15371,15373,15375,15379,15381,15383,15407,15419,15421,15423,15428,15432,15436,15448,15452,15456,15460,15462,15496,15498,15502,15506,15508,15530,15560,15572,15582,15590,15592,15598,15608,15610,15615,15619,15621,15635,15641,15661,15663,15665,15667,15677,15681,15683,15692,15696,15698,15700,15720,15724,15726,15728,15730,15732,15752,15754,15756,15758,15784,15786,15802,15804,15820,15824,15826,15828,15848,15850,15852,15854,15858,15868,15870,15872,15874,15884,15892,15894,15896,15910,15920],[14,15370,218],{"id":218},[10,15372,221],{},[10,15374,224],{},[10,15376,227,15377,231],{},[34,15378,230],{},[14,15380,234],{"id":234},[10,15382,237],{},[239,15384,15385,15387],{},[10,15386,243],{},[239,15388,15389,15395,15397,15401,15403],{},[10,15390,248,15391,252,15393,256],{},[34,15392,251],{},[34,15394,255],{},[10,15396,259],{},[10,15398,262,15399,267],{},[264,15400,266],{},[10,15402,270],{},[10,15404,15405],{},[26,15406],{"alt":275,"src":276},[239,15408,15409,15411],{},[10,15410,281],{},[239,15412,15413,15415],{},[10,15414,286],{},[10,15416,15417],{},[26,15418],{"alt":291,"src":292},[14,15420,296],{"id":295},[298,15422,301],{"id":300},[10,15424,304,15425,312],{},[306,15426,311],{"href":308,"rel":15427},[310],[239,15429,15430],{},[10,15431,317],{},[10,15433,15434],{},[26,15435],{"alt":322,"src":323},[49,15437,15438,15442,15446],{},[52,15439,328,15440,37],{},[264,15441,331],{},[52,15443,334,15444,37],{},[264,15445,337],{},[52,15447,340],{},[10,15449,15450],{},[26,15451],{"alt":345,"src":346},[239,15453,15454],{},[10,15455,351],{},[10,15457,15458],{},[26,15459],{"alt":356,"src":357},[298,15461,361],{"id":360},[239,15463,15464,15468,15472,15492],{},[239,15465,15466],{},[10,15467,368],{},[10,15469,371,15470,375],{},[264,15471,374],{},[77,15473,15474],{"className":79,"code":378,"language":81,"meta":82,"style":82},[34,15475,15476,15480,15484,15488],{"__ignoreMap":82},[86,15477,15478],{"class":88,"line":89},[86,15479,385],{},[86,15481,15482],{"class":88,"line":95},[86,15483,390],{},[86,15485,15486],{"class":88,"line":101},[86,15487,395],{},[86,15489,15490],{"class":88,"line":398},[86,15491,401],{},[10,15493,404,15494,408],{},[264,15495,407],{},[10,15497,411],{},[10,15499,414,15500,417],{},[34,15501,81],{},[10,15503,15504],{},[26,15505],{"alt":422,"src":423},[10,15507,426],{},[239,15509,15510,15512,15516],{},[10,15511,431],{},[10,15513,15514],{},[264,15515,436],{},[239,15517,15518,15522,15526],{},[10,15519,441,15520,444],{},[34,15521,81],{},[10,15523,447,15524,450],{},[34,15525,81],{},[10,15527,453,15528,457],{},[264,15529,456],{},[239,15531,15532,15534,15538],{},[10,15533,462],{},[10,15535,15536],{},[264,15537,467],{},[239,15539,15540,15546,15554,15556],{},[10,15541,15542,475,15544,479],{},[34,15543,474],{},[34,15545,478],{},[10,15547,482,15548,485,15550,489,15552,493],{},[34,15549,474],{},[264,15551,488],{},[264,15553,492],{},[10,15555,496],{},[10,15557,15558,502],{},[264,15559,501],{},[239,15561,15562,15564],{},[10,15563,507],{},[239,15565,15566,15570],{},[10,15567,512,15568,516],{},[264,15569,515],{},[10,15571,519],{},[239,15573,15574,15578],{},[10,15575,524,15576],{},[264,15577,527],{},[10,15579,15580],{},[26,15581],{"alt":532,"src":533},[239,15583,15584,15586],{},[10,15585,538],{},[10,15587,15588],{},[26,15589],{"alt":532,"src":543},[298,15591,547],{"id":546},[10,15593,550,15594,554,15596,558],{},[34,15595,553],{},[34,15597,557],{},[77,15599,15600],{"className":561,"code":562,"language":563,"meta":82,"style":82},[34,15601,15602],{"__ignoreMap":82},[86,15603,15604,15606],{"class":88,"line":89},[86,15605,81],{"class":570},[86,15607,574],{"class":573},[10,15609,577],{},[77,15611,15613],{"className":15612,"code":581,"language":113,"meta":82},[111],[34,15614,581],{"__ignoreMap":82},[10,15616,15617],{},[26,15618],{"alt":532,"src":588},[10,15620,591],{},[77,15622,15623],{"className":561,"code":594,"language":563,"meta":82,"style":82},[34,15624,15625],{"__ignoreMap":82},[86,15626,15627,15629,15631,15633],{"class":88,"line":89},[86,15628,81],{"class":570},[86,15630,603],{"class":573},[86,15632,607],{"class":606},[86,15634,574],{"class":573},[10,15636,612,15637,615,15639,619],{},[34,15638,81],{},[34,15640,618],{},[77,15642,15643],{"className":561,"code":622,"language":563,"meta":82,"style":82},[34,15644,15645,15651],{"__ignoreMap":82},[86,15646,15647,15649],{"class":88,"line":89},[86,15648,478],{"class":570},[86,15650,574],{"class":573},[86,15652,15653,15655,15657,15659],{"class":88,"line":95},[86,15654,478],{"class":570},[86,15656,603],{"class":573},[86,15658,607],{"class":606},[86,15660,574],{"class":573},[14,15662,644],{"id":643},[298,15664,648],{"id":647},[10,15666,651],{},[77,15668,15669],{"className":561,"code":654,"language":563,"meta":82,"style":82},[34,15670,15671],{"__ignoreMap":82},[86,15672,15673,15675],{"class":88,"line":89},[86,15674,661],{"class":570},[86,15676,574],{"class":573},[10,15678,666,15679,670],{},[34,15680,669],{},[298,15682,674],{"id":673},[10,15684,304,15685,682,15688,37,15690,689],{},[306,15686,681],{"href":679,"rel":15687},[310],[264,15689,685],{},[34,15691,688],{},[10,15693,692,15694,696],{},[34,15695,695],{},[298,15697,700],{"id":699},[10,15699,703],{},[77,15701,15702],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,15703,15704,15710],{"__ignoreMap":82},[86,15705,15706,15708],{"class":88,"line":89},[86,15707,661],{"class":570},[86,15709,574],{"class":573},[86,15711,15712,15714,15716,15718],{"class":88,"line":95},[86,15713,661],{"class":570},[86,15715,603],{"class":573},[86,15717,607],{"class":606},[86,15719,574],{"class":573},[10,15721,727,15722,730],{},[34,15723,661],{},[14,15725,734],{"id":733},[10,15727,737],{},[298,15729,741],{"id":740},[10,15731,744],{},[77,15733,15734],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,15735,15736,15742],{"__ignoreMap":82},[86,15737,15738,15740],{"class":88,"line":89},[86,15739,661],{"class":570},[86,15741,574],{"class":573},[86,15743,15744,15746,15748,15750],{"class":88,"line":95},[86,15745,661],{"class":570},[86,15747,603],{"class":573},[86,15749,607],{"class":606},[86,15751,574],{"class":573},[10,15753,767],{},[298,15755,771],{"id":770},[10,15757,774],{},[77,15759,15760],{"className":561,"code":777,"language":563,"meta":82,"style":82},[34,15761,15762,15770],{"__ignoreMap":82},[86,15763,15764,15766,15768],{"class":88,"line":89},[86,15765,784],{"class":570},[86,15767,787],{"class":606},[86,15769,790],{"class":606},[86,15771,15772,15774,15776,15778,15780,15782],{"class":88,"line":95},[86,15773,784],{"class":570},[86,15775,787],{"class":606},[86,15777,799],{"class":606},[86,15779,802],{"class":606},[86,15781,805],{"class":606},[86,15783,808],{"class":606},[10,15785,811],{},[77,15787,15788],{"className":561,"code":814,"language":563,"meta":82,"style":82},[34,15789,15790],{"__ignoreMap":82},[86,15791,15792,15794,15796,15798,15800],{"class":88,"line":89},[86,15793,784],{"class":570},[86,15795,823],{"class":606},[86,15797,799],{"class":606},[86,15799,802],{"class":606},[86,15801,830],{"class":606},[10,15803,833],{},[77,15805,15806],{"className":561,"code":836,"language":563,"meta":82,"style":82},[34,15807,15808],{"__ignoreMap":82},[86,15809,15810,15812,15814,15816,15818],{"class":88,"line":89},[86,15811,784],{"class":570},[86,15813,845],{"class":606},[86,15815,848],{"class":573},[86,15817,851],{"class":606},[86,15819,854],{"class":606},[10,15821,15822,859],{},[34,15823,784],{},[298,15825,863],{"id":862},[10,15827,866],{},[77,15829,15830],{"className":561,"code":706,"language":563,"meta":82,"style":82},[34,15831,15832,15838],{"__ignoreMap":82},[86,15833,15834,15836],{"class":88,"line":89},[86,15835,661],{"class":570},[86,15837,574],{"class":573},[86,15839,15840,15842,15844,15846],{"class":88,"line":95},[86,15841,661],{"class":570},[86,15843,603],{"class":573},[86,15845,607],{"class":606},[86,15847,574],{"class":573},[10,15849,889],{},[14,15851,892],{"id":892},[298,15853,896],{"id":895},[10,15855,899,15856,903],{},[34,15857,902],{},[123,15859,15860,15864,15866],{},[52,15861,908,15862,911],{},[34,15863,618],{},[52,15865,914],{},[52,15867,917],{},[10,15869,920],{},[298,15871,924],{"id":923},[10,15873,927],{},[77,15875,15876],{"className":561,"code":654,"language":563,"meta":82,"style":82},[34,15877,15878],{"__ignoreMap":82},[86,15879,15880,15882],{"class":88,"line":89},[86,15881,661],{"class":570},[86,15883,574],{"class":573},[10,15885,940,15886,943,15888,946,15890,37],{},[34,15887,661],{},[34,15889,81],{},[34,15891,661],{},[298,15893,952],{"id":951},[10,15895,955],{},[77,15897,15898],{"className":561,"code":958,"language":563,"meta":82,"style":82},[34,15899,15900],{"__ignoreMap":82},[86,15901,15902,15904,15906,15908],{"class":88,"line":89},[86,15903,661],{"class":570},[86,15905,603],{"class":573},[86,15907,607],{"class":606},[86,15909,574],{"class":573},[10,15911,973,15912,976,15914,979,15916,982,15918,986],{},[34,15913,661],{},[34,15915,81],{},[34,15917,478],{},[34,15919,985],{},[181,15921,989],{},{"title":82,"searchDepth":95,"depth":95,"links":15923},[15924,15925,15926,15931,15936,15941],{"id":218,"depth":95,"text":218},{"id":234,"depth":95,"text":234},{"id":295,"depth":95,"text":296,"children":15927},[15928,15929,15930],{"id":300,"depth":101,"text":301},{"id":360,"depth":101,"text":361},{"id":546,"depth":101,"text":547},{"id":643,"depth":95,"text":644,"children":15932},[15933,15934,15935],{"id":647,"depth":101,"text":648},{"id":673,"depth":101,"text":674},{"id":699,"depth":101,"text":700},{"id":733,"depth":95,"text":734,"children":15937},[15938,15939,15940],{"id":740,"depth":101,"text":741},{"id":770,"depth":101,"text":771},{"id":862,"depth":101,"text":863},{"id":892,"depth":95,"text":892,"children":15942},[15943,15944,15945],{"id":895,"depth":101,"text":896},{"id":923,"depth":101,"text":924},{"id":951,"depth":101,"text":952},{},{"title":213,"description":82},[194,1022,1023],1786973364145]