[{"data":1,"prerenderedAt":15955},["ShallowReactive",2],{"post-python-repl-and-script":3,"sidebar-posts":224,"post-related-source":9146},{"id":4,"title":5,"body":6,"category":207,"cover":208,"description":209,"extension":210,"meta":211,"navigation":212,"path":213,"pinned":214,"publishedAt":215,"seo":216,"slug":217,"stem":218,"summary":219,"tags":220,"updatedAt":215,"visible":212,"__hash__":223},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":8,"toc":197},"minimark",[9,18,22,25,28,35,38,41,69,72,75,110,113,121,124,127,147,150,164,167,181,184,187,193],[10,11,12,13,17],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[14,15,16],"code",{},".py"," 脚本。",[19,20,21],"h2",{"id":21},"本篇要解决的问题",[10,23,24],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,26,27],{"id":27},"先看清一个容易误解的细节",[10,29,30],{},[31,32],"img",{"alt":33,"src":34},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,36,37],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[19,39,40],{"id":40},"核心概念",[42,43,44,56,63],"ul",{},[45,46,47,48,51,52,55],"li",{},"在终端输入 ",[14,49,50],{},"python3"," 进入 REPL，提示符通常是 ",[14,53,54],{},">>>","。",[45,57,58,59,62],{},"输入 ",[14,60,61],{},"exit()"," 或按 Control-D 退出 REPL。",[45,64,65,66,68],{},"需要保存、复查或多次运行的代码应写入 ",[14,67,16],{}," 文件。",[19,70,71],{"id":71},"跟着示例运行",[10,73,74],{},"把下面代码保存到本课脚本并运行：",[76,77,82],"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon","",[14,83,84,92,98,104],{"__ignoreMap":81},[85,86,89],"span",{"class":87,"line":88},"line",1,[85,90,91],{},">>> 2 + 3\n",[85,93,95],{"class":87,"line":94},2,[85,96,97],{},"5\n",[85,99,101],{"class":87,"line":100},3,[85,102,103],{},">>> \"python\".upper()\n",[85,105,107],{"class":87,"line":106},4,[85,108,109],{},"'PYTHON'\n",[10,111,112],{},"预期结果：",[76,114,119],{"className":115,"code":117,"language":118,"meta":81},[116],"language-text","REPL 会直接显示表达式结果\n","text",[14,120,117],{"__ignoreMap":81},[10,122,123],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[19,125,126],{"id":126},"按执行顺序拆开看",[128,129,130,140],"ol",{},[45,131,132,133,136,137,55],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[14,134,135],{},"2 + 3"," 能直接看到 ",[14,138,139],{},"5",[45,141,142,143,146],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[14,144,145],{},"print()"," 才会写到标准输出。",[19,148,149],{"id":149},"初学者容易混淆的地方",[42,151,152,161],{},[45,153,154,155,157,158,160],{},"把提示符 ",[14,156,54],{}," 复制进 ",[14,159,16],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[45,162,163],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[19,165,166],{"id":166},"练习",[128,168,169,175],{},[45,170,171,172,55],{},"在 REPL 计算 ",[14,173,174],{},"12 * 8",[45,176,177,178,180],{},"把同一表达式写入脚本；观察脚本中不调用 ",[14,179,145],{}," 时是否显示结果。",[10,182,183],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[19,185,186],{"id":186},"本篇边界",[10,188,189,190,192],{},"本篇目标是根据任务选择 REPL 或 ",[14,191,16],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,195,196],"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":81,"searchDepth":94,"depth":94,"links":198},[199,200,201,202,203,204,205,206],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},"Python",null,"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。","md",{},true,"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",false,"2026-08-17",{"title":5,"description":209},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[207,221,222],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",[225,1039,1378,1511,1663,1794,1982,2147,2331,2514,2707,2938,3122,3299,3456,3627,3792,4007,4236,4418,4582,4771,4959,5114,5274,5471,5668,5882,6049,6293,6474,6679,6874,7058,7259,7549,7741,7970,8165,8385,8625,8829],{"id":226,"title":227,"body":228,"category":207,"cover":208,"description":81,"extension":210,"meta":1028,"navigation":212,"path":1029,"pinned":214,"publishedAt":1030,"seo":1031,"slug":1032,"stem":1033,"summary":1034,"tags":1035,"updatedAt":1030,"visible":212,"__hash__":1038},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":229,"toc":1004},[230,233,236,239,246,249,252,291,307,311,316,327,332,338,355,361,366,372,376,424,427,433,439,442,473,518,535,549,559,563,574,590,593,599,604,607,625,635,656,660,664,667,678,685,689,704,711,715,718,739,745,749,752,756,759,779,782,786,789,823,826,845,848,869,874,878,881,901,904,907,911,918,932,935,939,942,952,963,967,970,985,1001],[19,231,232],{"id":232},"引言",[10,234,235],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,237,238],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,240,241,242,245],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[14,243,244],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[19,247,248],{"id":248},"扫盲",[10,250,251],{},"那么这里有几个概念：",[253,254,255,258],"blockquote",{},[10,256,257],{},"为什么需要安装python解释器？",[253,259,260,271,274,282,285],{},[10,261,262,263,266,267,270],{},"我们写的代码，电脑其实看不懂，电脑只认识",[14,264,265],{},"0","和",[14,268,269],{},"1","组成的机器指令。",[10,272,273],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,275,276,277,281],{},"这样，我们就能用",[278,279,280],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,283,284],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,286,287],{},[31,288],{"alt":289,"src":290},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[253,292,293,296],{},[10,294,295],{},"pip又是什么？",[253,297,298,301],{},[10,299,300],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,302,303],{},[31,304],{"alt":305,"src":306},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[19,308,310],{"id":309},"windows-安装","Windows 安装",[312,313,315],"h3",{"id":314},"_1-下载官方安装程序","1. 下载官方安装程序",[10,317,318,319,326],{},"打开 ",[320,321,325],"a",{"href":322,"rel":323},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[324],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[253,328,329],{},[10,330,331],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,333,334],{},[31,335],{"alt":336,"src":337},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[42,339,340,346,352],{},[45,341,342,343,55],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[278,344,345],{},"Windows installer (64-bit)",[45,347,348,349,55],{},"搭载 ARM 处理器的 Windows 设备选择 ",[278,350,351],{},"Windows installer (ARM64)",[45,353,354],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,356,357],{},[31,358],{"alt":359,"src":360},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[253,362,363],{},[10,364,365],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,367,368],{},[31,369],{"alt":370,"src":371},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[312,373,375],{"id":374},"_2-安装并加入-path","2. 安装并加入 PATH",[253,377,378,383,390,417],{},[253,379,380],{},[10,381,382],{},"PATH 环境变量",[10,384,385,386,389],{},"Windows 有一个特殊的变量叫 ",[278,387,388],{},"PATH","，它里面存了一串文件夹路径，比如：",[76,391,395],{"className":392,"code":393,"language":394,"meta":81,"style":81},"language-python shiki shiki-themes github-dark","D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n","python",[14,396,397,402,407,412],{"__ignoreMap":81},[85,398,399],{"class":87,"line":88},[85,400,401],{},"D:\\Python313\\\n",[85,403,404],{"class":87,"line":94},[85,405,406],{},"D:\\Python313\\Scripts\\\n",[85,408,409],{"class":87,"line":100},[85,410,411],{},"C:\\Windows\\System32\\\n",[85,413,414],{"class":87,"line":106},[85,415,416],{},"...\n",[10,418,419,420,423],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[278,421,422],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,425,426],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,428,429,430,432],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[14,431,394],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,434,435],{},[31,436],{"alt":437,"src":438},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,440,441],{},"对安装界面最底部的两个勾选项分别解释 :",[253,443,444,447,452],{},[10,445,446],{},"Add python.exe to PATH",[10,448,449],{},[278,450,451],{},"把 Python 添加到系统环境变量",[253,453,454,460,466],{},[10,455,456,457,459],{},"勾选后，你可以在命令行任意位置直接输入 ",[14,458,394],{}," 就能运行",[10,461,462,463,465],{},"不勾选的话，命令行输入 ",[14,464,394],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,467,468,469,472],{},"必须",[278,470,471],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[253,474,475,478,483],{},[10,476,477],{},"Use admin privileges when installing py.exe",[10,479,480],{},[278,481,482],{},"使用管理员权限安装 py.exe（Python 启动器）",[253,484,485,495,509,512],{},[10,486,487,490,491,494],{},[14,488,489],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[14,492,493],{},"py"," 来启动 Python。",[10,496,497,498,500,501,504,505,508],{},"勾选后，",[14,499,489],{}," 会安装到",[278,502,503],{},"系统级目录","，电脑上",[278,506,507],{},"所有用户账户","都能用",[10,510,511],{},"不勾选，只有当前用户能用",[10,513,514,517],{},[278,515,516],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[253,519,520,523],{},[10,521,522],{},"操作建议",[253,524,525,532],{},[10,526,527,528,531],{},"两个都勾上之后，再点 ",[278,529,530],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,533,534],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[253,536,537,543],{},[10,538,539,540],{},"Python 安装的",[278,541,542],{},"可选功能页",[10,544,545],{},[31,546],{"alt":547,"src":548},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[253,550,551,554],{},[10,552,553],{},"高级选项页",[10,555,556],{},[31,557],{"alt":547,"src":558},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[312,560,562],{"id":561},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,564,565,566,569,570,573],{},"按 ",[14,567,568],{},"Win + R","，输入 ",[14,571,572],{},"cmd"," 并回车，然后执行：",[76,575,579],{"className":576,"code":577,"language":578,"meta":81,"style":81},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[14,580,581],{"__ignoreMap":81},[85,582,583,586],{"class":87,"line":88},[85,584,394],{"class":585},"svObZ",[85,587,589],{"class":588},"sDLfK"," --version\n",[10,591,592],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[76,594,597],{"className":595,"code":596,"language":118,"meta":81},[116],"Python 3.x.x\n",[14,598,596],{"__ignoreMap":81},[10,600,601],{},[31,602],{"alt":547,"src":603},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,605,606],{},"继续检查 pip：",[76,608,610],{"className":576,"code":609,"language":578,"meta":81,"style":81},"python -m pip --version\n",[14,611,612],{"__ignoreMap":81},[85,613,614,616,619,623],{"class":87,"line":88},[85,615,394],{"class":585},[85,617,618],{"class":588}," -m",[85,620,622],{"class":621},"sU2Wk"," pip",[85,624,589],{"class":588},[10,626,627,628,630,631,634],{},"如果 ",[14,629,394],{}," 无法识别，但 ",[14,632,633],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[76,636,638],{"className":576,"code":637,"language":578,"meta":81,"style":81},"py --version\npy -m pip --version\n",[14,639,640,646],{"__ignoreMap":81},[85,641,642,644],{"class":87,"line":88},[85,643,493],{"class":585},[85,645,589],{"class":588},[85,647,648,650,652,654],{"class":87,"line":94},[85,649,493],{"class":585},[85,651,618],{"class":588},[85,653,622],{"class":621},[85,655,589],{"class":588},[19,657,659],{"id":658},"macos-安装","macOS 安装",[312,661,663],{"id":662},"_1-先检查现有环境","1. 先检查现有环境",[10,665,666],{},"打开“终端”应用，执行：",[76,668,670],{"className":576,"code":669,"language":578,"meta":81,"style":81},"python3 --version\n",[14,671,672],{"__ignoreMap":81},[85,673,674,676],{"class":87,"line":88},[85,675,50],{"class":585},[85,677,589],{"class":588},[10,679,680,681,684],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[14,682,683],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[312,686,688],{"id":687},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,690,318,691,696,697,55,700,703],{},[320,692,695],{"href":693,"rel":694},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[324],"Python macOS 下载页","，下载当前稳定版的 ",[278,698,699],{},"macOS 64-bit universal2 installer",[14,701,702],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,705,706,707,710],{},"下载完成后打开 ",[14,708,709],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[312,712,714],{"id":713},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,716,717],{},"安装完成后重新打开终端，执行：",[76,719,721],{"className":576,"code":720,"language":578,"meta":81,"style":81},"python3 --version\npython3 -m pip --version\n",[14,722,723,729],{"__ignoreMap":81},[85,724,725,727],{"class":87,"line":88},[85,726,50],{"class":585},[85,728,589],{"class":588},[85,730,731,733,735,737],{"class":87,"line":94},[85,732,50],{"class":585},[85,734,618],{"class":588},[85,736,622],{"class":621},[85,738,589],{"class":588},[10,740,741,742,744],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[14,743,50],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[19,746,748],{"id":747},"linux-安装","Linux 安装",[10,750,751],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[312,753,755],{"id":754},"_1-检查是否已经安装","1. 检查是否已经安装",[10,757,758],{},"打开终端，执行：",[76,760,761],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,762,763,769],{"__ignoreMap":81},[85,764,765,767],{"class":87,"line":88},[85,766,50],{"class":585},[85,768,589],{"class":588},[85,770,771,773,775,777],{"class":87,"line":94},[85,772,50],{"class":585},[85,774,618],{"class":588},[85,776,622],{"class":621},[85,778,589],{"class":588},[10,780,781],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[312,783,785],{"id":784},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,787,788],{},"Ubuntu 或 Debian：",[76,790,792],{"className":576,"code":791,"language":578,"meta":81,"style":81},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[14,793,794,805],{"__ignoreMap":81},[85,795,796,799,802],{"class":87,"line":88},[85,797,798],{"class":585},"sudo",[85,800,801],{"class":621}," apt",[85,803,804],{"class":621}," update\n",[85,806,807,809,811,814,817,820],{"class":87,"line":94},[85,808,798],{"class":585},[85,810,801],{"class":621},[85,812,813],{"class":621}," install",[85,815,816],{"class":621}," python3",[85,818,819],{"class":621}," python3-pip",[85,821,822],{"class":621}," python3-venv\n",[10,824,825],{},"Fedora：",[76,827,829],{"className":576,"code":828,"language":578,"meta":81,"style":81},"sudo dnf install python3 python3-pip\n",[14,830,831],{"__ignoreMap":81},[85,832,833,835,838,840,842],{"class":87,"line":88},[85,834,798],{"class":585},[85,836,837],{"class":621}," dnf",[85,839,813],{"class":621},[85,841,816],{"class":621},[85,843,844],{"class":621}," python3-pip\n",[10,846,847],{},"Arch Linux：",[76,849,851],{"className":576,"code":850,"language":578,"meta":81,"style":81},"sudo pacman -S python python-pip\n",[14,852,853],{"__ignoreMap":81},[85,854,855,857,860,863,866],{"class":87,"line":88},[85,856,798],{"class":585},[85,858,859],{"class":621}," pacman",[85,861,862],{"class":588}," -S",[85,864,865],{"class":621}," python",[85,867,868],{"class":621}," python-pip\n",[10,870,871,873],{},[14,872,798],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[312,875,877],{"id":876},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,879,880],{},"安装结束后执行：",[76,882,883],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,884,885,891],{"__ignoreMap":81},[85,886,887,889],{"class":87,"line":88},[85,888,50],{"class":585},[85,890,589],{"class":588},[85,892,893,895,897,899],{"class":87,"line":94},[85,894,50],{"class":585},[85,896,618],{"class":588},[85,898,622],{"class":621},[85,900,589],{"class":588},[10,902,903],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[19,905,906],{"id":906},"常见问题",[312,908,910],{"id":909},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,912,913,914,917],{},"先关闭当前命令提示符并重新打开，再执行 ",[14,915,916],{},"python --version","。如果仍然失败，按下面的顺序检查：",[128,919,920,926,929],{},[45,921,922,923,925],{},"执行 ",[14,924,633],{},"，确认 Python Launcher 是否可用。",[45,927,928],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[45,930,931],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,933,934],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[312,936,938],{"id":937},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,940,941],{},"先尝试：",[76,943,944],{"className":576,"code":669,"language":578,"meta":81,"style":81},[14,945,946],{"__ignoreMap":81},[85,947,948,950],{"class":87,"line":88},[85,949,50],{"class":585},[85,951,589],{"class":588},[10,953,954,955,957,958,960,961,55],{},"在这两个系统中，只有 ",[14,956,50],{}," 命令而没有 ",[14,959,394],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[14,962,50],{},[312,964,966],{"id":965},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,968,969],{},"先使用模块方式检查：",[76,971,973],{"className":576,"code":972,"language":578,"meta":81,"style":81},"python3 -m pip --version\n",[14,974,975],{"__ignoreMap":81},[85,976,977,979,981,983],{"class":87,"line":88},[85,978,50],{"class":585},[85,980,618],{"class":588},[85,982,622],{"class":621},[85,984,589],{"class":588},[10,986,987,988,990,991,993,994,996,997,1000],{},"Windows 用户将命令中的 ",[14,989,50],{}," 换成 ",[14,992,394],{}," 或 ",[14,995,493],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[14,998,999],{},"python3-pip","；不要直接使用其他系统的安装命令。",[194,1002,1003],{},"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":81,"searchDepth":94,"depth":94,"links":1005},[1006,1007,1008,1013,1018,1023],{"id":232,"depth":94,"text":232},{"id":248,"depth":94,"text":248},{"id":309,"depth":94,"text":310,"children":1009},[1010,1011,1012],{"id":314,"depth":100,"text":315},{"id":374,"depth":100,"text":375},{"id":561,"depth":100,"text":562},{"id":658,"depth":94,"text":659,"children":1014},[1015,1016,1017],{"id":662,"depth":100,"text":663},{"id":687,"depth":100,"text":688},{"id":713,"depth":100,"text":714},{"id":747,"depth":94,"text":748,"children":1019},[1020,1021,1022],{"id":754,"depth":100,"text":755},{"id":784,"depth":100,"text":785},{"id":876,"depth":100,"text":877},{"id":906,"depth":94,"text":906,"children":1024},[1025,1026,1027],{"id":909,"depth":100,"text":910},{"id":937,"depth":100,"text":938},{"id":965,"depth":100,"text":966},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":227,"description":81},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[207,1036,1037],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1040,"title":1041,"body":1042,"category":207,"cover":1049,"description":81,"extension":210,"meta":1367,"navigation":212,"path":1368,"pinned":214,"publishedAt":1369,"seo":1370,"slug":1371,"stem":1372,"summary":1373,"tags":1374,"updatedAt":1369,"visible":212,"__hash__":1377},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1043,"toc":1352},[1044,1050,1053,1056,1060,1063,1088,1091,1097,1100,1103,1139,1149,1153,1159,1162,1187,1190,1202,1205,1209,1212,1215,1218,1221,1224,1227,1230,1254,1257,1260,1266,1269,1272,1275,1279,1285,1288,1314,1317,1321,1324,1327,1331,1334,1337,1340,1343,1346,1349],[10,1045,1046],{},[31,1047],{"alt":1048,"src":1049},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1051,1052],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1054,1055],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[19,1057,1059],{"id":1058},"python-代码是什么样的","Python 代码是什么样的",[10,1061,1062],{},"下面是一段简单的 Python 代码：",[76,1064,1066],{"className":392,"code":1065,"language":394,"meta":81,"style":81},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[14,1067,1068,1073,1078,1083],{"__ignoreMap":81},[85,1069,1070],{"class":87,"line":88},[85,1071,1072],{},"name = \"Python\"\n",[85,1074,1075],{"class":87,"line":94},[85,1076,1077],{},"year = 2026\n",[85,1079,1080],{"class":87,"line":100},[85,1081,1082],{"emptyLinePlaceholder":212},"\n",[85,1084,1085],{"class":87,"line":106},[85,1086,1087],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1089,1090],{},"运行结果：",[76,1092,1095],{"className":1093,"code":1094,"language":118,"meta":81},[116],"正在学习 Python，当前年份是 2026\n",[14,1096,1094],{"__ignoreMap":81},[10,1098,1099],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1101,1102],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[76,1104,1106],{"className":392,"code":1105,"language":394,"meta":81,"style":81},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[14,1107,1108,1113,1117,1122,1127,1133],{"__ignoreMap":81},[85,1109,1110],{"class":87,"line":88},[85,1111,1112],{},"score = 85\n",[85,1114,1115],{"class":87,"line":94},[85,1116,1082],{"emptyLinePlaceholder":212},[85,1118,1119],{"class":87,"line":100},[85,1120,1121],{},"if score >= 60:\n",[85,1123,1124],{"class":87,"line":106},[85,1125,1126],{},"    print(\"成绩合格\")\n",[85,1128,1130],{"class":87,"line":1129},5,[85,1131,1132],{},"else:\n",[85,1134,1136],{"class":87,"line":1135},6,[85,1137,1138],{},"    print(\"需要继续学习\")\n",[10,1140,1141,1144,1145,1148],{},[14,1142,1143],{},"if"," 和 ",[14,1146,1147],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[19,1150,1152],{"id":1151},"python-如何运行代码","Python 如何运行代码",[10,1154,1155,1156,1158],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[14,1157,16],{}," 文件，也可以进入交互式环境逐行执行代码。",[10,1160,1161],{},"交互式环境适合快速验证一个表达式：",[76,1163,1165],{"className":392,"code":1164,"language":394,"meta":81,"style":81},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[14,1166,1167,1172,1177,1182],{"__ignoreMap":81},[85,1168,1169],{"class":87,"line":88},[85,1170,1171],{},">>> 10 + 20\n",[85,1173,1174],{"class":87,"line":94},[85,1175,1176],{},"30\n",[85,1178,1179],{"class":87,"line":100},[85,1180,1181],{},">>> \"Python\".lower()\n",[85,1183,1184],{"class":87,"line":106},[85,1185,1186],{},"'python'\n",[10,1188,1189],{},"需要保存和重复运行的程序，则可以写入文件：",[76,1191,1193],{"className":576,"code":1192,"language":578,"meta":81,"style":81},"python3 hello.py\n",[14,1194,1195],{"__ignoreMap":81},[85,1196,1197,1199],{"class":87,"line":88},[85,1198,50],{"class":585},[85,1200,1201],{"class":621}," hello.py\n",[10,1203,1204],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[19,1206,1208],{"id":1207},"python-的特点","Python 的特点",[312,1210,1211],{"id":1211},"语法相对简洁",[10,1213,1214],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[312,1216,1217],{"id":1217},"支持多种编程方式",[10,1219,1220],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[312,1222,1223],{"id":1223},"标准库比较完整",[10,1225,1226],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1228,1229],{},"例如，获取当前时间：",[76,1231,1233],{"className":392,"code":1232,"language":394,"meta":81,"style":81},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[14,1234,1235,1240,1244,1249],{"__ignoreMap":81},[85,1236,1237],{"class":87,"line":88},[85,1238,1239],{},"from datetime import datetime\n",[85,1241,1242],{"class":87,"line":94},[85,1243,1082],{"emptyLinePlaceholder":212},[85,1245,1246],{"class":87,"line":100},[85,1247,1248],{},"now = datetime.now()\n",[85,1250,1251],{"class":87,"line":106},[85,1252,1253],{},"print(now)\n",[10,1255,1256],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[312,1258,1259],{"id":1259},"第三方工具丰富",[10,1261,1262,1263,1265],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[14,1264,244],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1267,1268],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[312,1270,1271],{"id":1271},"支持多个操作系统",[10,1273,1274],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[19,1276,1278],{"id":1277},"python-可以做什么","Python 可以做什么",[10,1280,1281],{},[31,1282],{"alt":1283,"src":1284},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1286,1287],{},"Python 的应用范围比较广，常见方向包括：",[42,1289,1290,1293,1296,1299,1302,1305,1308,1311],{},[45,1291,1292],{},"编写自动化脚本，批量处理文件和重复任务；",[45,1294,1295],{},"开发网站后端和 API 服务；",[45,1297,1298],{},"进行数据清洗、统计分析和图表展示；",[45,1300,1301],{},"编写网络爬虫和信息采集工具；",[45,1303,1304],{},"开发自动化测试程序；",[45,1306,1307],{},"进行机器学习和人工智能开发；",[45,1309,1310],{},"编写运维、监控和辅助开发工具；",[45,1312,1313],{},"开发部分桌面应用和插件。",[10,1315,1316],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[19,1318,1320],{"id":1319},"python-的发展","Python 的发展",[10,1322,1323],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1325,1326],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[19,1328,1330],{"id":1329},"python-也有局限","Python 也有局限",[10,1332,1333],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1335,1336],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1338,1339],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[19,1341,1342],{"id":1342},"写在最后",[10,1344,1345],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1347,1348],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[194,1350,1351],{},"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":81,"searchDepth":94,"depth":94,"links":1353},[1354,1355,1356,1363,1364,1365,1366],{"id":1058,"depth":94,"text":1059},{"id":1151,"depth":94,"text":1152},{"id":1207,"depth":94,"text":1208,"children":1357},[1358,1359,1360,1361,1362],{"id":1211,"depth":100,"text":1211},{"id":1217,"depth":100,"text":1217},{"id":1223,"depth":100,"text":1223},{"id":1259,"depth":100,"text":1259},{"id":1271,"depth":100,"text":1271},{"id":1277,"depth":94,"text":1278},{"id":1319,"depth":94,"text":1320},{"id":1329,"depth":94,"text":1330},{"id":1342,"depth":94,"text":1342},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1041,"description":81},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[207,1375,1376],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1379,"title":1380,"body":1381,"category":207,"cover":208,"description":1385,"extension":210,"meta":1502,"navigation":212,"path":1503,"pinned":214,"publishedAt":215,"seo":1504,"slug":1505,"stem":1506,"summary":1507,"tags":1508,"updatedAt":215,"visible":212,"__hash__":1510},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1382,"toc":1492},[1383,1386,1388,1391,1393,1399,1404,1406,1420,1422,1424,1433,1435,1441,1443,1445,1460,1462,1473,1475,1483,1485,1487,1490],[10,1384,1385],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[19,1387,21],{"id":21},[10,1389,1390],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,1392,27],{"id":27},[10,1394,1395],{},[31,1396],{"alt":1397,"src":1398},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1400,1401,1403],{},[14,1402,16],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[19,1405,40],{"id":40},[42,1407,1408,1414,1417],{},[45,1409,1410,1411,1413],{},"源代码是人编写的文本，通常保存在 ",[14,1412,16],{}," 文件中。",[45,1415,1416],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[45,1418,1419],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[19,1421,71],{"id":71},[10,1423,74],{},[76,1425,1427],{"className":392,"code":1426,"language":394,"meta":81,"style":81},"print(\"你好，Python\")\n",[14,1428,1429],{"__ignoreMap":81},[85,1430,1431],{"class":87,"line":88},[85,1432,1426],{},[10,1434,112],{},[76,1436,1439],{"className":1437,"code":1438,"language":118,"meta":81},[116],"你好，Python\n",[14,1440,1438],{"__ignoreMap":81},[10,1442,123],{},[19,1444,126],{"id":126},[128,1446,1447,1454],{},[45,1448,1449,1450,1453],{},"终端启动解释器后，解释器读取 ",[14,1451,1452],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[45,1455,1456,1457,1459],{},"字符串对象先准备好，再交给 ",[14,1458,145],{}," 写到标准输出；终端负责把这段输出显示出来。",[19,1461,149],{"id":149},[42,1463,1464,1467],{},[45,1465,1466],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[45,1468,1469,1470,1472],{},"认为 ",[14,1471,16],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[19,1474,166],{"id":166},[128,1476,1477,1480],{},[45,1478,1479],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[45,1481,1482],{},"把示例文字改成自己的学习目标并重新运行。",[10,1484,183],{},[19,1486,186],{"id":186},[10,1488,1489],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,1491,196],{},{"title":81,"searchDepth":94,"depth":94,"links":1493},[1494,1495,1496,1497,1498,1499,1500,1501],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1380,"description":1385},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[207,1375,1509],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1512,"title":1513,"body":1514,"category":207,"cover":208,"description":1518,"extension":210,"meta":1654,"navigation":212,"path":1655,"pinned":214,"publishedAt":215,"seo":1656,"slug":1657,"stem":1658,"summary":1659,"tags":1660,"updatedAt":215,"visible":212,"__hash__":1662},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1515,"toc":1644},[1516,1519,1521,1524,1526,1532,1538,1540,1555,1557,1560,1580,1582,1588,1590,1592,1605,1607,1621,1623,1634,1636,1638,1641],[10,1517,1518],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[19,1520,21],{"id":21},[10,1522,1523],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,1525,27],{"id":27},[10,1527,1528],{},[31,1529],{"alt":1530,"src":1531},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1533,1534,1535,1537],{},"终端收到 ",[14,1536,50],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[19,1539,40],{"id":40},[42,1541,1542,1545,1548],{},[45,1543,1544],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[45,1546,1547],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[45,1549,1550,1551,1554],{},"检查 pip 时使用 ",[14,1552,1553],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[19,1556,71],{"id":71},[10,1558,1559],{},"在 macOS 终端执行：",[76,1561,1562],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,1563,1564,1570],{"__ignoreMap":81},[85,1565,1566,1568],{"class":87,"line":88},[85,1567,50],{"class":585},[85,1569,589],{"class":588},[85,1571,1572,1574,1576,1578],{"class":87,"line":94},[85,1573,50],{"class":585},[85,1575,618],{"class":588},[85,1577,622],{"class":621},[85,1579,589],{"class":588},[10,1581,112],{},[76,1583,1586],{"className":1584,"code":1585,"language":118,"meta":81},[116],"Python 3.14.x\npip 版本信息与安装路径\n",[14,1587,1585],{"__ignoreMap":81},[10,1589,123],{},[19,1591,126],{"id":126},[128,1593,1594,1600],{},[45,1595,1596,1599],{},[14,1597,1598],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[45,1601,1602,1604],{},[14,1603,683],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[19,1606,149],{"id":149},[42,1608,1609,1615],{},[45,1610,1611,1612,1614],{},"看到系统已有 ",[14,1613,50],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[45,1616,1617,1618,1620],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[14,1619,50],{},"，不修改系统自带工具。",[19,1622,166],{"id":166},[128,1624,1625,1631],{},[45,1626,922,1627,1630],{},[14,1628,1629],{},"which python3","，记录当前解释器路径。",[45,1632,1633],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1635,183],{},[19,1637,186],{"id":186},[10,1639,1640],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,1642,1643],{},"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":81,"searchDepth":94,"depth":94,"links":1645},[1646,1647,1648,1649,1650,1651,1652,1653],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1513,"description":1518},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[207,1661,1036],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":4,"title":5,"body":1664,"category":207,"cover":208,"description":209,"extension":210,"meta":1791,"navigation":212,"path":213,"pinned":214,"publishedAt":215,"seo":1792,"slug":217,"stem":218,"summary":219,"tags":1793,"updatedAt":215,"visible":212,"__hash__":223},{"type":7,"value":1665,"toc":1781},[1666,1670,1672,1674,1676,1680,1682,1684,1700,1702,1704,1724,1726,1731,1733,1735,1747,1749,1759,1761,1771,1773,1775,1779],[10,1667,12,1668,17],{},[14,1669,16],{},[19,1671,21],{"id":21},[10,1673,24],{},[19,1675,27],{"id":27},[10,1677,1678],{},[31,1679],{"alt":33,"src":34},[10,1681,37],{},[19,1683,40],{"id":40},[42,1685,1686,1692,1696],{},[45,1687,47,1688,51,1690,55],{},[14,1689,50],{},[14,1691,54],{},[45,1693,58,1694,62],{},[14,1695,61],{},[45,1697,65,1698,68],{},[14,1699,16],{},[19,1701,71],{"id":71},[10,1703,74],{},[76,1705,1706],{"className":78,"code":79,"language":80,"meta":81,"style":81},[14,1707,1708,1712,1716,1720],{"__ignoreMap":81},[85,1709,1710],{"class":87,"line":88},[85,1711,91],{},[85,1713,1714],{"class":87,"line":94},[85,1715,97],{},[85,1717,1718],{"class":87,"line":100},[85,1719,103],{},[85,1721,1722],{"class":87,"line":106},[85,1723,109],{},[10,1725,112],{},[76,1727,1729],{"className":1728,"code":117,"language":118,"meta":81},[116],[14,1730,117],{"__ignoreMap":81},[10,1732,123],{},[19,1734,126],{"id":126},[128,1736,1737,1743],{},[45,1738,132,1739,136,1741,55],{},[14,1740,135],{},[14,1742,139],{},[45,1744,142,1745,146],{},[14,1746,145],{},[19,1748,149],{"id":149},[42,1750,1751,1757],{},[45,1752,154,1753,157,1755,160],{},[14,1754,54],{},[14,1756,16],{},[45,1758,163],{},[19,1760,166],{"id":166},[128,1762,1763,1767],{},[45,1764,171,1765,55],{},[14,1766,174],{},[45,1768,177,1769,180],{},[14,1770,145],{},[10,1772,183],{},[19,1774,186],{"id":186},[10,1776,189,1777,192],{},[14,1778,16],{},[194,1780,196],{},{"title":81,"searchDepth":94,"depth":94,"links":1782},[1783,1784,1785,1786,1787,1788,1789,1790],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5,"description":209},[207,221,222],{"id":1795,"title":1796,"body":1797,"category":207,"cover":208,"description":1801,"extension":210,"meta":1972,"navigation":212,"path":1973,"pinned":214,"publishedAt":215,"seo":1974,"slug":1975,"stem":1976,"summary":1977,"tags":1978,"updatedAt":215,"visible":212,"__hash__":1981},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1798,"toc":1962},[1799,1802,1804,1807,1809,1815,1821,1823,1841,1843,1845,1890,1892,1898,1900,1902,1924,1926,1938,1940,1952,1954,1956,1959],[10,1800,1801],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[19,1803,21],{"id":21},[10,1805,1806],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,1808,27],{"id":27},[10,1810,1811],{},[31,1812],{"alt":1813,"src":1814},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1816,1817,1820],{},[14,1818,1819],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[19,1822,40],{"id":40},[42,1824,1825,1828,1838],{},[45,1826,1827],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[45,1829,1830,1833,1834,1837],{},[14,1831,1832],{},"pwd"," 显示当前目录，",[14,1835,1836],{},"ls"," 显示目录里的文件。",[45,1839,1840],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[19,1842,71],{"id":71},[10,1844,1559],{},[76,1846,1848],{"className":576,"code":1847,"language":578,"meta":81,"style":81},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[14,1849,1850,1858,1865,1870,1884],{"__ignoreMap":81},[85,1851,1852,1855],{"class":87,"line":88},[85,1853,1854],{"class":585},"mkdir",[85,1856,1857],{"class":621}," python-study\n",[85,1859,1860,1863],{"class":87,"line":94},[85,1861,1862],{"class":588},"cd",[85,1864,1857],{"class":621},[85,1866,1867],{"class":87,"line":100},[85,1868,1869],{"class":588},"pwd\n",[85,1871,1872,1875,1878,1882],{"class":87,"line":106},[85,1873,1874],{"class":588},"printf",[85,1876,1877],{"class":621}," 'print(\"项目已经运行\")\\n'",[85,1879,1881],{"class":1880},"snl16"," >",[85,1883,1201],{"class":621},[85,1885,1886,1888],{"class":87,"line":1129},[85,1887,50],{"class":585},[85,1889,1201],{"class":621},[10,1891,112],{},[76,1893,1896],{"className":1894,"code":1895,"language":118,"meta":81},[116],"项目已经运行\n",[14,1897,1895],{"__ignoreMap":81},[10,1899,123],{},[19,1901,126],{"id":126},[128,1903,1904,1915],{},[45,1905,1906,1908,1909,1911,1912,1914],{},[14,1907,1854],{}," 创建目录，",[14,1910,1862],{}," 改变终端当前目录，",[14,1913,1832],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[45,1916,1917,1919,1920,1923],{},[14,1918,1819],{}," 会在当前目录寻找 ",[14,1921,1922],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[19,1925,149],{"id":149},[42,1927,1928,1935],{},[45,1929,1930,1931,1144,1933,55],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[14,1932,1832],{},[14,1934,1836],{},[45,1936,1937],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[19,1939,166],{"id":166},[128,1941,1942,1949],{},[45,1943,1944,1945,1948],{},"新建 ",[14,1946,1947],{},"lesson01.py"," 并输出课程编号。",[45,1950,1951],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1953,183],{},[19,1955,186],{"id":186},[10,1957,1958],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,1960,1961],{},"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":81,"searchDepth":94,"depth":94,"links":1963},[1964,1965,1966,1967,1968,1969,1970,1971],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1796,"description":1801},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[207,1979,1980],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":1983,"title":1984,"body":1985,"category":207,"cover":208,"description":1989,"extension":210,"meta":2137,"navigation":212,"path":2138,"pinned":214,"publishedAt":215,"seo":2139,"slug":2140,"stem":2141,"summary":2142,"tags":2143,"updatedAt":215,"visible":212,"__hash__":2146},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":1986,"toc":2127},[1987,1990,1992,1995,1997,2003,2014,2016,2036,2038,2040,2060,2062,2068,2070,2072,2091,2093,2101,2103,2118,2120,2122,2125],[10,1988,1989],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[19,1991,21],{"id":21},[10,1993,1994],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,1996,27],{"id":27},[10,1998,1999],{},[31,2000],{"alt":2001,"src":2002},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2004,2005,2006,55,2008,2011,2012,55],{},"Python 先计算表达式，再把得到的对象交给 ",[14,2007,145],{},[14,2009,2010],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[14,2013,135],{},[19,2015,40],{"id":40},[42,2017,2018,2024,2033],{},[45,2019,2020,2023],{},[14,2021,2022],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[45,2025,2026,2029,2030,55],{},[14,2027,2028],{},"7 + 5"," 是表达式，运行时先求值得到 ",[14,2031,2032],{},"12",[45,2034,2035],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[19,2037,71],{"id":71},[10,2039,74],{},[76,2041,2043],{"className":392,"code":2042,"language":394,"meta":81,"style":81},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[14,2044,2045,2050,2055],{"__ignoreMap":81},[85,2046,2047],{"class":87,"line":88},[85,2048,2049],{},"print(42)\n",[85,2051,2052],{"class":87,"line":94},[85,2053,2054],{},"print(7 + 5)\n",[85,2056,2057],{"class":87,"line":100},[85,2058,2059],{},"print(\"Python 基础课\")\n",[10,2061,112],{},[76,2063,2066],{"className":2064,"code":2065,"language":118,"meta":81},[116],"42\n12\nPython 基础课\n",[14,2067,2065],{"__ignoreMap":81},[10,2069,123],{},[19,2071,126],{"id":126},[128,2073,2074,2082],{},[45,2075,2076,2079,2080,55],{},[14,2077,2078],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[14,2081,2032],{},[45,2083,2084,2086,2087,2090],{},[14,2085,145],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[14,2088,2089],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[19,2092,149],{"id":149},[42,2094,2095,2098],{},[45,2096,2097],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[45,2099,2100],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[19,2102,166],{"id":166},[128,2104,2105,2108],{},[45,2106,2107],{},"分别输出一个整数、一个小数和一段文本。",[45,2109,2110,2111,2113,2114,2117],{},"比较 ",[14,2112,2010],{}," 与 ",[14,2115,2116],{},"print(\"2 + 3\")"," 的结果。",[10,2119,183],{},[19,2121,186],{"id":186},[10,2123,2124],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,2126,196],{},{"title":81,"searchDepth":94,"depth":94,"links":2128},[2129,2130,2131,2132,2133,2134,2135,2136],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":1984,"description":1989},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[207,2144,2145],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2148,"title":2149,"body":2150,"category":207,"cover":208,"description":2154,"extension":210,"meta":2321,"navigation":212,"path":2322,"pinned":214,"publishedAt":215,"seo":2323,"slug":2324,"stem":2325,"summary":2326,"tags":2327,"updatedAt":215,"visible":212,"__hash__":2330},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2151,"toc":2311},[2152,2155,2157,2160,2162,2168,2171,2173,2199,2201,2203,2231,2233,2239,2241,2243,2267,2269,2285,2287,2302,2304,2306,2309],[10,2153,2154],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[19,2156,21],{"id":21},[10,2158,2159],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,2161,27],{"id":27},[10,2163,2164],{},[31,2165],{"alt":2166,"src":2167},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2169,2170],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[19,2172,40],{"id":40},[42,2174,2175,2178,2188],{},[45,2176,2177],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[45,2179,2180,2181,2113,2184,2187],{},"变量名区分大小写，",[14,2182,2183],{},"score",[14,2185,2186],{},"Score"," 是两个名字。",[45,2189,2190,2191,2194,2195,2198],{},"使用能表达含义的名称；不要用 ",[14,2192,2193],{},"list","、",[14,2196,2197],{},"str"," 等内置名称作为普通变量名。",[19,2200,71],{"id":71},[10,2202,74],{},[76,2204,2206],{"className":392,"code":2205,"language":394,"meta":81,"style":81},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[14,2207,2208,2213,2218,2222,2227],{"__ignoreMap":81},[85,2209,2210],{"class":87,"line":88},[85,2211,2212],{},"score = 90\n",[85,2214,2215],{"class":87,"line":94},[85,2216,2217],{},"print(score)\n",[85,2219,2220],{"class":87,"line":100},[85,2221,1082],{"emptyLinePlaceholder":212},[85,2223,2224],{"class":87,"line":106},[85,2225,2226],{},"score = 95\n",[85,2228,2229],{"class":87,"line":1129},[85,2230,2217],{},[10,2232,112],{},[76,2234,2237],{"className":2235,"code":2236,"language":118,"meta":81},[116],"90\n95\n",[14,2238,2236],{"__ignoreMap":81},[10,2240,123],{},[19,2242,126],{"id":126},[128,2244,2245,2254],{},[45,2246,922,2247,2250,2251,2253],{},[14,2248,2249],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[14,2252,2183],{}," 再绑定到它。",[45,2255,922,2256,2259,2260,2263,2264,55],{},[14,2257,2258],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[14,2261,2262],{},"90"," 没有被改造成 ",[14,2265,2266],{},"95",[19,2268,149],{"id":149},[42,2270,2271,2274],{},[45,2272,2273],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[45,2275,2276,2277,2194,2279,2194,2281,2284],{},"使用 ",[14,2278,2193],{},[14,2280,2197],{},[14,2282,2283],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[19,2286,166],{"id":166},[128,2288,2289,2299],{},[45,2290,2291,2292,1144,2295,2298],{},"创建 ",[14,2293,2294],{},"course_name",[14,2296,2297],{},"lesson_count"," 两个变量并输出。",[45,2300,2301],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2303,183],{},[19,2305,186],{"id":186},[10,2307,2308],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,2310,196],{},{"title":81,"searchDepth":94,"depth":94,"links":2312},[2313,2314,2315,2316,2317,2318,2319,2320],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2149,"description":2154},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[207,2328,2329],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2332,"title":2333,"body":2334,"category":207,"cover":208,"description":2338,"extension":210,"meta":2504,"navigation":212,"path":2505,"pinned":214,"publishedAt":215,"seo":2506,"slug":2507,"stem":2508,"summary":2509,"tags":2510,"updatedAt":215,"visible":212,"__hash__":2513},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2335,"toc":2494},[2336,2339,2341,2344,2346,2352,2355,2357,2386,2388,2390,2436,2438,2444,2446,2448,2462,2464,2475,2477,2485,2487,2489,2492],[10,2337,2338],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[19,2340,21],{"id":21},[10,2342,2343],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,2345,27],{"id":27},[10,2347,2348],{},[31,2349],{"alt":2350,"src":2351},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2353,2354],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[19,2356,40],{"id":40},[42,2358,2359,2369,2383],{},[45,2360,2361,2364,2365,2368],{},[14,2362,2363],{},"int"," 表示整数，",[14,2366,2367],{},"float"," 表示浮点数。",[45,2370,2371,2374,2375,2378,2379,2382],{},[14,2372,2373],{},"\u002F"," 总是进行真除法；",[14,2376,2377],{},"\u002F\u002F"," 是向下取整除法，",[14,2380,2381],{},"%"," 得到余数。",[45,2384,2385],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[19,2387,71],{"id":71},[10,2389,74],{},[76,2391,2393],{"className":392,"code":2392,"language":394,"meta":81,"style":81},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[14,2394,2395,2400,2405,2410,2414,2419,2424,2430],{"__ignoreMap":81},[85,2396,2397],{"class":87,"line":88},[85,2398,2399],{},"price = 25\n",[85,2401,2402],{"class":87,"line":94},[85,2403,2404],{},"count = 4\n",[85,2406,2407],{"class":87,"line":100},[85,2408,2409],{},"discount = 0.9\n",[85,2411,2412],{"class":87,"line":106},[85,2413,1082],{"emptyLinePlaceholder":212},[85,2415,2416],{"class":87,"line":1129},[85,2417,2418],{},"total = price * count * discount\n",[85,2420,2421],{"class":87,"line":1135},[85,2422,2423],{},"average = total \u002F count\n",[85,2425,2427],{"class":87,"line":2426},7,[85,2428,2429],{},"print(total)\n",[85,2431,2433],{"class":87,"line":2432},8,[85,2434,2435],{},"print(average)\n",[10,2437,112],{},[76,2439,2442],{"className":2440,"code":2441,"language":118,"meta":81},[116],"90.0\n22.5\n",[14,2443,2441],{"__ignoreMap":81},[10,2445,123],{},[19,2447,126],{"id":126},[128,2449,2450,2456],{},[45,2451,2452,2455],{},[14,2453,2454],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[45,2457,2458,2461],{},[14,2459,2460],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[19,2463,149],{"id":149},[42,2465,2466,2472],{},[45,2467,2468,2469,55],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[14,2470,2471],{},"decimal.Decimal",[45,2473,2474],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[19,2476,166],{"id":166},[128,2478,2479,2482],{},[45,2480,2481],{},"计算 137 除以 10 的商和余数。",[45,2483,2484],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2486,183],{},[19,2488,186],{"id":186},[10,2490,2491],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,2493,196],{},{"title":81,"searchDepth":94,"depth":94,"links":2495},[2496,2497,2498,2499,2500,2501,2502,2503],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2333,"description":2338},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[207,2511,2512],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2515,"title":2516,"body":2517,"category":207,"cover":208,"description":2521,"extension":210,"meta":2697,"navigation":212,"path":2698,"pinned":214,"publishedAt":215,"seo":2699,"slug":2700,"stem":2701,"summary":2702,"tags":2703,"updatedAt":215,"visible":212,"__hash__":2706},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2518,"toc":2685},[2519,2522,2524,2527,2529,2535,2545,2547,2558,2560,2562,2592,2594,2600,2602,2604,2634,2637,2640,2646,2649,2651,2659,2661,2676,2678,2680,2683],[10,2520,2521],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[19,2523,21],{"id":21},[10,2525,2526],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,2528,27],{"id":27},[10,2530,2531],{},[31,2532],{"alt":2533,"src":2534},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2536,2537,2538,2541,2542,55],{},"切片 ",[14,2539,2540],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[14,2543,2544],{},"stop - start",[19,2546,40],{"id":40},[42,2548,2549,2552,2555],{},[45,2550,2551],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[45,2553,2554],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[45,2556,2557],{},"切片会创建新的字符串，不会修改原字符串。",[19,2559,71],{"id":71},[10,2561,74],{},[76,2563,2565],{"className":392,"code":2564,"language":394,"meta":81,"style":81},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[14,2566,2567,2572,2577,2582,2587],{"__ignoreMap":81},[85,2568,2569],{"class":87,"line":88},[85,2570,2571],{},"language = \"Python\"\n",[85,2573,2574],{"class":87,"line":94},[85,2575,2576],{},"print(language[0])\n",[85,2578,2579],{"class":87,"line":100},[85,2580,2581],{},"print(language[-1])\n",[85,2583,2584],{"class":87,"line":106},[85,2585,2586],{},"print(language[0:3])\n",[85,2588,2589],{"class":87,"line":1129},[85,2590,2591],{},"print(language + \" 3.14\")\n",[10,2593,112],{},[76,2595,2598],{"className":2596,"code":2597,"language":118,"meta":81},[116],"P\nn\nPyt\nPython 3.14\n",[14,2599,2597],{"__ignoreMap":81},[10,2601,123],{},[19,2603,126],{"id":126},[128,2605,2606,2620],{},[45,2607,2608,2609,2611,2612,2615,2616,2619],{},"字符串 ",[14,2610,207],{}," 的正索引从 ",[14,2613,2614],{},"P"," 的 0 开始，负索引从末尾 ",[14,2617,2618],{},"n"," 的 -1 开始。",[45,2621,2622,2625,2626,2629,2630,2633],{},[14,2623,2624],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[14,2627,2628],{},"Pyt","；索引 3 的 ",[14,2631,2632],{},"h"," 不在结果中。",[312,2635,2636],{"id":2636},"再看一个具体细节",[10,2638,2639],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2641,2642],{},[31,2643],{"alt":2644,"src":2645},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2647,2648],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[19,2650,149],{"id":149},[42,2652,2653,2656],{},[45,2654,2655],{},"把第一个字符写成索引 1，造成整体偏移一位。",[45,2657,2658],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[19,2660,166],{"id":166},[128,2662,2663,2673],{},[45,2664,2665,2666,2669,2670,55],{},"从 ",[14,2667,2668],{},"\"programming\""," 中切出 ",[14,2671,2672],{},"\"gram\"",[45,2674,2675],{},"使用负索引取得字符串倒数第二个字符。",[10,2677,183],{},[19,2679,186],{"id":186},[10,2681,2682],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,2684,196],{},{"title":81,"searchDepth":94,"depth":94,"links":2686},[2687,2688,2689,2690,2691,2694,2695,2696],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":2692},[2693],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2516,"description":2521},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[207,2704,2705],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2708,"title":2709,"body":2710,"category":207,"cover":208,"description":2714,"extension":210,"meta":2928,"navigation":212,"path":2929,"pinned":214,"publishedAt":215,"seo":2930,"slug":2931,"stem":2932,"summary":2933,"tags":2934,"updatedAt":215,"visible":212,"__hash__":2937},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2711,"toc":2916},[2712,2715,2717,2720,2722,2728,2738,2740,2773,2775,2777,2821,2823,2829,2831,2833,2854,2856,2859,2865,2873,2875,2889,2891,2907,2909,2911,2914],[10,2713,2714],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[19,2716,21],{"id":21},[10,2718,2719],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,2721,27],{"id":27},[10,2723,2724],{},[31,2725],{"alt":2726,"src":2727},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2729,2730,2731,993,2734,2737],{},"比较表达式先产生 ",[14,2732,2733],{},"True",[14,2735,2736],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[19,2739,40],{"id":40},[42,2741,2742,2756,2770],{},[45,2743,2744,2747,2748,2751,2752,2755],{},[14,2745,2746],{},"=="," 判断是否相等，",[14,2749,2750],{},"!="," 判断是否不等；单个 ",[14,2753,2754],{},"="," 是赋值。",[45,2757,2758,2761,2762,2765,2766,2769],{},[14,2759,2760],{},"and"," 要求两侧都为真，",[14,2763,2764],{},"or"," 只需一侧为真，",[14,2767,2768],{},"not"," 取反。",[45,2771,2772],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[19,2774,71],{"id":71},[10,2776,74],{},[76,2778,2780],{"className":392,"code":2779,"language":394,"meta":81,"style":81},"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",[14,2781,2782,2787,2792,2796,2801,2806,2811,2816],{"__ignoreMap":81},[85,2783,2784],{"class":87,"line":88},[85,2785,2786],{},"age = 20\n",[85,2788,2789],{"class":87,"line":94},[85,2790,2791],{},"has_ticket = True\n",[85,2793,2794],{"class":87,"line":100},[85,2795,1082],{"emptyLinePlaceholder":212},[85,2797,2798],{"class":87,"line":106},[85,2799,2800],{},"is_adult = age >= 18\n",[85,2802,2803],{"class":87,"line":1129},[85,2804,2805],{},"can_enter = is_adult and has_ticket\n",[85,2807,2808],{"class":87,"line":1135},[85,2809,2810],{},"print(is_adult)\n",[85,2812,2813],{"class":87,"line":2426},[85,2814,2815],{},"print(can_enter)\n",[85,2817,2818],{"class":87,"line":2432},[85,2819,2820],{},"print(not has_ticket)\n",[10,2822,112],{},[76,2824,2827],{"className":2825,"code":2826,"language":118,"meta":81},[116],"True\nTrue\nFalse\n",[14,2828,2826],{"__ignoreMap":81},[10,2830,123],{},[19,2832,126],{"id":126},[128,2834,2835,2845],{},[45,2836,2837,2840,2841,2844],{},[14,2838,2839],{},"age >= 18"," 先产生布尔值并绑定给 ",[14,2842,2843],{},"is_adult","，这一步没有任何分支跳转。",[45,2846,2847,2850,2851,2853],{},[14,2848,2849],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[14,2852,2768],{}," 只对紧随其后的值取反。",[312,2855,2636],{"id":2636},[10,2857,2858],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2860,2861],{},[31,2862],{"alt":2863,"src":2864},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2866,2867,2869,2870,2872],{},[14,2868,2760],{}," 只有“真、真”得到真；",[14,2871,2764],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[19,2874,149],{"id":149},[42,2876,2877,2886],{},[45,2878,2879,2880,2882,2883,2885],{},"用单个等号判断相等。",[14,2881,2754],{}," 是赋值，",[14,2884,2746],{}," 才是相等比较。",[45,2887,2888],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[19,2890,166],{"id":166},[128,2892,2893,2900],{},[45,2894,2895,2896,2899],{},"判断数字 ",[14,2897,2898],{},"15"," 是否同时大于 10 且小于 20。",[45,2901,2902,2903,2906],{},"分别修改年龄和票据状态，记录 ",[14,2904,2905],{},"can_enter"," 的四种组合结果。",[10,2908,183],{},[19,2910,186],{"id":186},[10,2912,2913],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,2915,196],{},{"title":81,"searchDepth":94,"depth":94,"links":2917},[2918,2919,2920,2921,2922,2925,2926,2927],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":2923},[2924],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2709,"description":2714},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[207,2935,2936],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2939,"title":2940,"body":2941,"category":207,"cover":208,"description":2945,"extension":210,"meta":3113,"navigation":212,"path":3114,"pinned":214,"publishedAt":215,"seo":3115,"slug":3116,"stem":3117,"summary":3118,"tags":3119,"updatedAt":215,"visible":212,"__hash__":3121},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2942,"toc":3103},[2943,2946,2948,2951,2953,2959,2977,2979,2992,2994,2996,3030,3032,3038,3040,3042,3064,3066,3078,3080,3094,3096,3098,3101],[10,2944,2945],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[19,2947,21],{"id":21},[10,2949,2950],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,2952,27],{"id":27},[10,2954,2955],{},[31,2956],{"alt":2957,"src":2958},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2960,2961,2964,2965,2968,2969,2972,2973,2976],{},[14,2962,2963],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[14,2966,2967],{},"18","，程序首先得到的也是 ",[14,2970,2971],{},"\"18\"","，需要 ",[14,2974,2975],{},"int()"," 后才能按整数参与计算。",[19,2978,40],{"id":40},[42,2980,2981,2984,2989],{},[45,2982,2983],{},"提示文字应告诉用户需要输入什么。",[45,2985,2986,2988],{},[14,2987,2975],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[45,2990,2991],{},"输入转换和业务计算分开写，定位问题更直接。",[19,2993,71],{"id":71},[10,2995,74],{},[76,2997,2999],{"className":392,"code":2998,"language":394,"meta":81,"style":81},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[14,3000,3001,3006,3011,3016,3020,3025],{"__ignoreMap":81},[85,3002,3003],{"class":87,"line":88},[85,3004,3005],{},"name = input(\"请输入姓名：\")\n",[85,3007,3008],{"class":87,"line":94},[85,3009,3010],{},"age_text = input(\"请输入年龄：\")\n",[85,3012,3013],{"class":87,"line":100},[85,3014,3015],{},"age = int(age_text)\n",[85,3017,3018],{"class":87,"line":106},[85,3019,1082],{"emptyLinePlaceholder":212},[85,3021,3022],{"class":87,"line":1129},[85,3023,3024],{},"print(\"你好，\" + name)\n",[85,3026,3027],{"class":87,"line":1135},[85,3028,3029],{},"print(age + 1)\n",[10,3031,112],{},[76,3033,3036],{"className":3034,"code":3035,"language":118,"meta":81},[116],"根据输入显示姓名，并输出下一年的年龄\n",[14,3037,3035],{"__ignoreMap":81},[10,3039,123],{},[19,3041,126],{"id":126},[128,3043,3044,3054],{},[45,3045,3046,3047,3049,3050,3053],{},"两次 ",[14,3048,2963],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[14,3051,3052],{},"age_text"," 用来提醒这仍是文本。",[45,3055,3056,3059,3060,3063],{},[14,3057,3058],{},"int(age_text)"," 创建整数对象，后面的 ",[14,3061,3062],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[19,3065,149],{"id":149},[42,3067,3068,3075],{},[45,3069,3070,3071,3074],{},"直接计算 ",[14,3072,3073],{},"input(...) + 1","，忽略输入结果是字符串。",[45,3076,3077],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[19,3079,166],{"id":166},[128,3081,3082,3085],{},[45,3083,3084],{},"接收两个整数并输出它们的和。",[45,3086,58,3087,3090,3091,3093],{},[14,3088,3089],{},"18.5"," 给 ",[14,3092,2975],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3095,183],{},[19,3097,186],{"id":186},[10,3099,3100],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3102,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3104},[3105,3106,3107,3108,3109,3110,3111,3112],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2940,"description":2945},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[207,2283,3120],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3123,"title":3124,"body":3125,"category":207,"cover":208,"description":3129,"extension":210,"meta":3289,"navigation":212,"path":3290,"pinned":214,"publishedAt":215,"seo":3291,"slug":3292,"stem":3293,"summary":3294,"tags":3295,"updatedAt":215,"visible":212,"__hash__":3298},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3126,"toc":3279},[3127,3130,3132,3135,3137,3143,3150,3152,3166,3168,3170,3209,3211,3217,3219,3221,3240,3242,3257,3259,3270,3272,3274,3277],[10,3128,3129],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[19,3131,21],{"id":21},[10,3133,3134],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,3136,27],{"id":27},[10,3138,3139],{},[31,3140],{"alt":3141,"src":3142},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3144,3145,3146,3149],{},"列表为元素维护从 0 开始的位置索引。修改 ",[14,3147,3148],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[19,3151,40],{"id":40},[42,3153,3154,3157,3160],{},[45,3155,3156],{},"列表使用方括号，元素之间用逗号分隔。",[45,3158,3159],{},"列表可变，可以替换、追加和删除元素。",[45,3161,3162,3163,55],{},"访问不存在的索引会产生 ",[14,3164,3165],{},"IndexError",[19,3167,71],{"id":71},[10,3169,74],{},[76,3171,3173],{"className":392,"code":3172,"language":394,"meta":81,"style":81},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[14,3174,3175,3180,3185,3189,3194,3199,3204],{"__ignoreMap":81},[85,3176,3177],{"class":87,"line":88},[85,3178,3179],{},"scores = [82, 90, 76]\n",[85,3181,3182],{"class":87,"line":94},[85,3183,3184],{},"print(scores[0])\n",[85,3186,3187],{"class":87,"line":100},[85,3188,1082],{"emptyLinePlaceholder":212},[85,3190,3191],{"class":87,"line":106},[85,3192,3193],{},"scores[1] = 95\n",[85,3195,3196],{"class":87,"line":1129},[85,3197,3198],{},"scores.append(88)\n",[85,3200,3201],{"class":87,"line":1135},[85,3202,3203],{},"print(scores)\n",[85,3205,3206],{"class":87,"line":2426},[85,3207,3208],{},"print(len(scores))\n",[10,3210,112],{},[76,3212,3215],{"className":3213,"code":3214,"language":118,"meta":81},[116],"82\n[82, 95, 76, 88]\n4\n",[14,3216,3214],{"__ignoreMap":81},[10,3218,123],{},[19,3220,126],{"id":126},[128,3222,3223,3226],{},[45,3224,3225],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[45,3227,3228,3231,3232,3235,3236,3239],{},[14,3229,3230],{},"scores[1] = 95"," 替换第二个位置，",[14,3233,3234],{},"append(88)"," 在末尾增加新位置，",[14,3237,3238],{},"len()"," 因而从 3 变为 4。",[19,3241,149],{"id":149},[42,3243,3244,3254],{},[45,3245,3246,3247,3250,3251,55],{},"访问 ",[14,3248,3249],{},"scores[len(scores)]","。最后一个合法正索引是 ",[14,3252,3253],{},"len(scores) - 1",[45,3255,3256],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[19,3258,166],{"id":166},[128,3260,3261,3264],{},[45,3262,3263],{},"建立三项学习任务列表，再追加第四项。",[45,3265,3266,3267,3269],{},"修改第二项，并用 ",[14,3268,3238],{}," 检查元素数量。",[10,3271,183],{},[19,3273,186],{"id":186},[10,3275,3276],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3278,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3280},[3281,3282,3283,3284,3285,3286,3287,3288],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3124,"description":3129},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[207,3296,3297],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3300,"title":3301,"body":3302,"category":207,"cover":208,"description":3306,"extension":210,"meta":3447,"navigation":212,"path":3448,"pinned":214,"publishedAt":215,"seo":3449,"slug":3450,"stem":3451,"summary":3452,"tags":3453,"updatedAt":215,"visible":212,"__hash__":3455},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3303,"toc":3437},[3304,3307,3309,3312,3314,3320,3323,3325,3336,3338,3340,3374,3376,3382,3384,3386,3400,3402,3414,3416,3428,3430,3432,3435],[10,3305,3306],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[19,3308,21],{"id":21},[10,3310,3311],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,3313,27],{"id":27},[10,3315,3316],{},[31,3317],{"alt":3318,"src":3319},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3321,3322],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[19,3324,40],{"id":40},[42,3326,3327,3330,3333],{},[45,3328,3329],{},"元组常用来表达固定数量、固定含义的一组值。",[45,3331,3332],{},"只有一个元素的元组必须保留尾随逗号。",[45,3334,3335],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[19,3337,71],{"id":71},[10,3339,74],{},[76,3341,3343],{"className":392,"code":3342,"language":394,"meta":81,"style":81},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[14,3344,3345,3350,3355,3360,3364,3369],{"__ignoreMap":81},[85,3346,3347],{"class":87,"line":88},[85,3348,3349],{},"point = (120, 80)\n",[85,3351,3352],{"class":87,"line":94},[85,3353,3354],{},"print(point[0])\n",[85,3356,3357],{"class":87,"line":100},[85,3358,3359],{},"print(point[1])\n",[85,3361,3362],{"class":87,"line":106},[85,3363,1082],{"emptyLinePlaceholder":212},[85,3365,3366],{"class":87,"line":1129},[85,3367,3368],{},"single = (5,)\n",[85,3370,3371],{"class":87,"line":1135},[85,3372,3373],{},"print(single)\n",[10,3375,112],{},[76,3377,3380],{"className":3378,"code":3379,"language":118,"meta":81},[116],"120\n80\n(5,)\n",[14,3381,3379],{"__ignoreMap":81},[10,3383,123],{},[19,3385,126],{"id":126},[128,3387,3388,3394],{},[45,3389,3390,3393],{},[14,3391,3392],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[45,3395,3396,3399],{},[14,3397,3398],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[19,3401,149],{"id":149},[42,3403,3404,3411],{},[45,3405,3406,3407,3410],{},"把 ",[14,3408,3409],{},"(5)"," 当作元组，实际它仍是整数。",[45,3412,3413],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[19,3415,166],{"id":166},[128,3417,3418,3421],{},[45,3419,3420],{},"用元组表示宽度和高度。",[45,3422,2110,3423,2113,3425,3427],{},[14,3424,3409],{},[14,3426,3398],{}," 的类型。",[10,3429,183],{},[19,3431,186],{"id":186},[10,3433,3434],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3436,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3438},[3439,3440,3441,3442,3443,3444,3445,3446],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3301,"description":3306},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[207,3454,3297],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3457,"title":3458,"body":3459,"category":207,"cover":208,"description":3463,"extension":210,"meta":3618,"navigation":212,"path":3619,"pinned":214,"publishedAt":215,"seo":3620,"slug":3621,"stem":3622,"summary":3623,"tags":3624,"updatedAt":215,"visible":212,"__hash__":3626},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3460,"toc":3608},[3461,3464,3466,3469,3471,3477,3487,3489,3503,3505,3507,3541,3543,3549,3551,3553,3568,3570,3589,3591,3599,3601,3603,3606],[10,3462,3463],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[19,3465,21],{"id":21},[10,3467,3468],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,3470,27],{"id":27},[10,3472,3473],{},[31,3474],{"alt":3475,"src":3476},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3478,3479,3480,3483,3484,3486],{},"字典通过键定位值，不使用连续位置表达含义。",[14,3481,3482],{},"student[\"score\"]"," 读取的是键 ",[14,3485,2183],{}," 对应的值，而不是“第几个元素”。",[19,3488,40],{"id":40},[42,3490,3491,3494,3500],{},[45,3492,3493],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[45,3495,2276,3496,3499],{},[14,3497,3498],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[45,3501,3502],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[19,3504,71],{"id":71},[10,3506,74],{},[76,3508,3510],{"className":392,"code":3509,"language":394,"meta":81,"style":81},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[14,3511,3512,3517,3522,3526,3531,3536],{"__ignoreMap":81},[85,3513,3514],{"class":87,"line":88},[85,3515,3516],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[85,3518,3519],{"class":87,"line":94},[85,3520,3521],{},"print(student[\"name\"])\n",[85,3523,3524],{"class":87,"line":100},[85,3525,1082],{"emptyLinePlaceholder":212},[85,3527,3528],{"class":87,"line":106},[85,3529,3530],{},"student[\"score\"] = 95\n",[85,3532,3533],{"class":87,"line":1129},[85,3534,3535],{},"student[\"city\"] = \"郑州\"\n",[85,3537,3538],{"class":87,"line":1135},[85,3539,3540],{},"print(student)\n",[10,3542,112],{},[76,3544,3547],{"className":3545,"code":3546,"language":118,"meta":81},[116],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[14,3548,3546],{"__ignoreMap":81},[10,3550,123],{},[19,3552,126],{"id":126},[128,3554,3555,3558],{},[45,3556,3557],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[45,3559,3560,3561,3563,3564,3567],{},"给已有键 ",[14,3562,2183],{}," 赋值会更新映射，给新键 ",[14,3565,3566],{},"city"," 赋值会增加映射。",[19,3569,149],{"id":149},[42,3571,3572,3579],{},[45,3573,3574,3575,3578],{},"按位置理解字典并尝试 ",[14,3576,3577],{},"student[0]","，而实际键是字符串。",[45,3580,3581,3582,3585,3586,55],{},"直接读取不确定存在的键并忽略 ",[14,3583,3584],{},"KeyError","；后续可根据场景使用成员检查或 ",[14,3587,3588],{},"get()",[19,3590,166],{"id":166},[128,3592,3593,3596],{},[45,3594,3595],{},"建立一本书的标题、作者和页数字典。",[45,3597,3598],{},"添加分类键，再修改页数。",[10,3600,183],{},[19,3602,186],{"id":186},[10,3604,3605],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3607,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3609},[3610,3611,3612,3613,3614,3615,3616,3617],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3458,"description":3463},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[207,3625,3297],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3628,"title":3629,"body":3630,"category":207,"cover":208,"description":3634,"extension":210,"meta":3783,"navigation":212,"path":3784,"pinned":214,"publishedAt":215,"seo":3785,"slug":3786,"stem":3787,"summary":3788,"tags":3789,"updatedAt":215,"visible":212,"__hash__":3791},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3631,"toc":3773},[3632,3635,3637,3640,3642,3648,3651,3653,3672,3674,3676,3710,3712,3718,3720,3722,3737,3739,3751,3753,3764,3766,3768,3771],[10,3633,3634],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[19,3636,21],{"id":21},[10,3638,3639],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,3641,27],{"id":27},[10,3643,3644],{},[31,3645],{"alt":3646,"src":3647},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3649,3650],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[19,3652,40],{"id":40},[42,3654,3655,3658,3661],{},[45,3656,3657],{},"集合中的元素不重复。",[45,3659,3660],{},"集合是无序容器，不要依赖打印顺序或索引。",[45,3662,3663,3664,3667,3668,3671],{},"创建空集合必须写 ",[14,3665,3666],{},"set()","；",[14,3669,3670],{},"{}"," 创建的是空字典。",[19,3673,71],{"id":71},[10,3675,74],{},[76,3677,3679],{"className":392,"code":3678,"language":394,"meta":81,"style":81},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[14,3680,3681,3686,3691,3695,3700,3705],{"__ignoreMap":81},[85,3682,3683],{"class":87,"line":88},[85,3684,3685],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[85,3687,3688],{"class":87,"line":94},[85,3689,3690],{},"right = {\"Python\", \"Docker\"}\n",[85,3692,3693],{"class":87,"line":100},[85,3694,1082],{"emptyLinePlaceholder":212},[85,3696,3697],{"class":87,"line":106},[85,3698,3699],{},"print(left & right)\n",[85,3701,3702],{"class":87,"line":1129},[85,3703,3704],{},"print(left | right)\n",[85,3706,3707],{"class":87,"line":1135},[85,3708,3709],{},"print(\"Git\" in left)\n",[10,3711,112],{},[76,3713,3716],{"className":3714,"code":3715,"language":118,"meta":81},[116],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[14,3717,3715],{"__ignoreMap":81},[10,3719,123],{},[19,3721,126],{"id":126},[128,3723,3724,3727],{},[45,3725,3726],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[45,3728,3729,3732,3733,3736],{},[14,3730,3731],{},"&"," 计算交集，",[14,3734,3735],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[19,3738,149],{"id":149},[42,3740,3741,3748],{},[45,3742,2276,3743,3745,3746,55],{},[14,3744,3670],{}," 创建空集合，实际得到空字典；空集合应写 ",[14,3747,3666],{},[45,3749,3750],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[19,3752,166],{"id":166},[128,3754,3755,3761],{},[45,3756,3757,3758,3760],{},"把包含重复标签的列表交给 ",[14,3759,3666],{}," 去重。",[45,3762,3763],{},"计算两组课程标签的交集和差集。",[10,3765,183],{},[19,3767,186],{"id":186},[10,3769,3770],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3772,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3774},[3775,3776,3777,3778,3779,3780,3781,3782],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3629,"description":3634},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[207,3790,3297],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3793,"title":3794,"body":3795,"category":207,"cover":208,"description":3799,"extension":210,"meta":3997,"navigation":212,"path":3998,"pinned":214,"publishedAt":215,"seo":3999,"slug":4000,"stem":4001,"summary":4002,"tags":4003,"updatedAt":215,"visible":212,"__hash__":4006},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3796,"toc":3985},[3797,3800,3802,3805,3807,3813,3823,3825,3842,3844,3846,3896,3898,3904,3906,3908,3930,3932,3935,3941,3944,3946,3959,3961,3976,3978,3980,3983],[10,3798,3799],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[19,3801,21],{"id":21},[10,3803,3804],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,3806,27],{"id":27},[10,3808,3809],{},[31,3810],{"alt":3811,"src":3812},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3814,3815,3818,3819,3822],{},[14,3816,3817],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[14,3820,3821],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[19,3824,40],{"id":40},[42,3826,3827,3836,3839],{},[45,3828,3829,3831,3832,3835],{},[14,3830,2746],{}," 比较内容是否相等，",[14,3833,3834],{},"is"," 比较是否为同一个对象。",[45,3837,3838],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[45,3840,3841],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[19,3843,71],{"id":71},[10,3845,74],{},[76,3847,3849],{"className":392,"code":3848,"language":394,"meta":81,"style":81},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[14,3850,3851,3856,3861,3866,3870,3875,3880,3885,3890],{"__ignoreMap":81},[85,3852,3853],{"class":87,"line":88},[85,3854,3855],{},"tasks = [\"变量\", \"字符串\"]\n",[85,3857,3858],{"class":87,"line":94},[85,3859,3860],{},"shared = tasks\n",[85,3862,3863],{"class":87,"line":100},[85,3864,3865],{},"backup = tasks.copy()\n",[85,3867,3868],{"class":87,"line":106},[85,3869,1082],{"emptyLinePlaceholder":212},[85,3871,3872],{"class":87,"line":1129},[85,3873,3874],{},"tasks.append(\"列表\")\n",[85,3876,3877],{"class":87,"line":1135},[85,3878,3879],{},"print(shared)\n",[85,3881,3882],{"class":87,"line":2426},[85,3883,3884],{},"print(backup)\n",[85,3886,3887],{"class":87,"line":2432},[85,3888,3889],{},"print(tasks is shared)\n",[85,3891,3893],{"class":87,"line":3892},9,[85,3894,3895],{},"print(tasks is backup)\n",[10,3897,112],{},[76,3899,3902],{"className":3900,"code":3901,"language":118,"meta":81},[116],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[14,3903,3901],{"__ignoreMap":81},[10,3905,123],{},[19,3907,126],{"id":126},[128,3909,3910,3916],{},[45,3911,3912,3915],{},[14,3913,3914],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[45,3917,3918,3921,3922,3925,3926,3929],{},[14,3919,3920],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[14,3923,3924],{},"shared"," 能观察到变化，",[14,3927,3928],{},"backup"," 不会。",[312,3931,2636],{"id":2636},[10,3933,3934],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3936,3937],{},[31,3938],{"alt":3939,"src":3940},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3942,3943],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[19,3945,149],{"id":149},[42,3947,3948,3956],{},[45,3949,3950,3951,3953,3954,55],{},"用 ",[14,3952,2746],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[14,3955,3834],{},[45,3957,3958],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[19,3960,166],{"id":166},[128,3962,3963,3966],{},[45,3964,3965],{},"让两个变量引用同一个字典并修改其中一个。",[45,3967,2276,3968,3971,3972,1144,3974,55],{},[14,3969,3970],{},"copy()"," 创建外层副本，再比较 ",[14,3973,3834],{},[14,3975,2746],{},[10,3977,183],{},[19,3979,186],{"id":186},[10,3981,3982],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,3984,196],{},{"title":81,"searchDepth":94,"depth":94,"links":3986},[3987,3988,3989,3990,3991,3994,3995,3996],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":3992},[3993],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3794,"description":3799},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[207,4004,4005],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4008,"title":4009,"body":4010,"category":207,"cover":208,"description":4014,"extension":210,"meta":4227,"navigation":212,"path":4228,"pinned":214,"publishedAt":215,"seo":4229,"slug":4230,"stem":4231,"summary":4232,"tags":4233,"updatedAt":215,"visible":212,"__hash__":4235},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4011,"toc":4214},[4012,4015,4017,4020,4022,4028,4038,4040,4051,4053,4055,4108,4110,4116,4118,4120,4138,4140,4143,4149,4157,4160,4163,4169,4175,4177,4195,4197,4205,4207,4209,4212],[10,4013,4014],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[19,4016,21],{"id":21},[10,4018,4019],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4021,27],{"id":27},[10,4023,4024],{},[31,4025],{"alt":4026,"src":4027},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4029,4030,2194,4032,2194,4035,4037],{},[14,4031,1143],{},[14,4033,4034],{},"elif",[14,4036,1147],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[19,4039,40],{"id":40},[42,4041,4042,4045,4048],{},[45,4043,4044],{},"冒号表示接下来开始一个代码块。",[45,4046,4047],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[45,4049,4050],{},"多分支条件要从更严格的范围向更宽的范围排列。",[19,4052,71],{"id":71},[10,4054,74],{},[76,4056,4058],{"className":392,"code":4057,"language":394,"meta":81,"style":81},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[14,4059,4060,4065,4069,4074,4079,4084,4089,4093,4098,4102],{"__ignoreMap":81},[85,4061,4062],{"class":87,"line":88},[85,4063,4064],{},"score = int(input(\"请输入分数：\"))\n",[85,4066,4067],{"class":87,"line":94},[85,4068,1082],{"emptyLinePlaceholder":212},[85,4070,4071],{"class":87,"line":100},[85,4072,4073],{},"if score >= 90:\n",[85,4075,4076],{"class":87,"line":106},[85,4077,4078],{},"    level = \"优秀\"\n",[85,4080,4081],{"class":87,"line":1129},[85,4082,4083],{},"elif score >= 60:\n",[85,4085,4086],{"class":87,"line":1135},[85,4087,4088],{},"    level = \"合格\"\n",[85,4090,4091],{"class":87,"line":2426},[85,4092,1132],{},[85,4094,4095],{"class":87,"line":2432},[85,4096,4097],{},"    level = \"需要继续学习\"\n",[85,4099,4100],{"class":87,"line":3892},[85,4101,1082],{"emptyLinePlaceholder":212},[85,4103,4105],{"class":87,"line":4104},10,[85,4106,4107],{},"print(level)\n",[10,4109,112],{},[76,4111,4114],{"className":4112,"code":4113,"language":118,"meta":81},[116],"输入 85 时输出：合格\n",[14,4115,4113],{"__ignoreMap":81},[10,4117,123],{},[19,4119,126],{"id":126},[128,4121,4122,4129],{},[45,4123,4124,4125,4128],{},"输入先转换为整数，程序从 ",[14,4126,4127],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[45,4130,4131,4134,4135,4137],{},[14,4132,4133],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[14,4136,1147],{}," 被跳过；最终三个分支只会选择一个。",[312,4139,2636],{"id":2636},[10,4141,4142],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4144,4145],{},[31,4146],{"alt":4147,"src":4148},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4150,4151,4153,4154,4156],{},[14,4152,4127],{}," 必须放在 ",[14,4155,4133],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[312,4158,2636],{"id":4159},"再看一个具体细节-1",[10,4161,4162],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4164,4165],{},[31,4166],{"alt":4167,"src":4168},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4170,4171,4172,4174],{},"同一缩进层级属于同一个代码块；回到 ",[14,4173,1143],{}," 之前的缩进后，语句就位于整条分支结构之外。",[19,4176,149],{"id":149},[42,4178,4179,4185],{},[45,4180,4181,4182,4184],{},"先写 ",[14,4183,4133],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[45,4186,4187,4188,4190,4191,4194],{},"混用多个独立 ",[14,4189,1143],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[14,4192,4193],{},"if\u002Felif\u002Felse"," 链。",[19,4196,166],{"id":166},[128,4198,4199,4202],{},[45,4200,4201],{},"根据温度输出“冷、适中、热”三个等级。",[45,4203,4204],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4206,183],{},[19,4208,186],{"id":186},[10,4210,4211],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,4213,196],{},{"title":81,"searchDepth":94,"depth":94,"links":4215},[4216,4217,4218,4219,4220,4224,4225,4226],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":4221},[4222,4223],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4009,"description":4014},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[207,1143,4234],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4237,"title":4238,"body":4239,"category":207,"cover":208,"description":4243,"extension":210,"meta":4409,"navigation":212,"path":4410,"pinned":214,"publishedAt":215,"seo":4411,"slug":4412,"stem":4413,"summary":4414,"tags":4415,"updatedAt":215,"visible":212,"__hash__":4417},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4240,"toc":4397},[4241,4244,4246,4249,4251,4257,4263,4265,4280,4282,4284,4322,4324,4330,4332,4334,4349,4351,4354,4360,4366,4368,4376,4378,4388,4390,4392,4395],[10,4242,4243],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[19,4245,21],{"id":21},[10,4247,4248],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4250,27],{"id":27},[10,4252,4253],{},[31,4254],{"alt":4255,"src":4256},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4258,4259,4262],{},[14,4260,4261],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[19,4264,40],{"id":40},[42,4266,4267,4270,4273],{},[45,4268,4269],{},"进入循环前先准备参与条件判断的状态。",[45,4271,4272],{},"循环体中必须有机会让条件变为假。",[45,4274,4275,4276,4279],{},"能够预先确定遍历对象时，后续介绍的 ",[14,4277,4278],{},"for"," 通常更直接。",[19,4281,71],{"id":71},[10,4283,74],{},[76,4285,4287],{"className":392,"code":4286,"language":394,"meta":81,"style":81},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[14,4288,4289,4294,4298,4303,4308,4313,4317],{"__ignoreMap":81},[85,4290,4291],{"class":87,"line":88},[85,4292,4293],{},"count = 1\n",[85,4295,4296],{"class":87,"line":94},[85,4297,1082],{"emptyLinePlaceholder":212},[85,4299,4300],{"class":87,"line":100},[85,4301,4302],{},"while count \u003C= 3:\n",[85,4304,4305],{"class":87,"line":106},[85,4306,4307],{},"    print(\"第\", count, \"次练习\")\n",[85,4309,4310],{"class":87,"line":1129},[85,4311,4312],{},"    count = count + 1\n",[85,4314,4315],{"class":87,"line":1135},[85,4316,1082],{"emptyLinePlaceholder":212},[85,4318,4319],{"class":87,"line":2426},[85,4320,4321],{},"print(\"练习结束\")\n",[10,4323,112],{},[76,4325,4328],{"className":4326,"code":4327,"language":118,"meta":81},[116],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[14,4329,4327],{"__ignoreMap":81},[10,4331,123],{},[19,4333,126],{"id":126},[128,4335,4336,4343],{},[45,4337,4338,4339,4342],{},"进入循环前 ",[14,4340,4341],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[45,4344,4345,4346,4348],{},"循环体末尾把 ",[14,4347,4341],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[312,4350,2636],{"id":2636},[10,4352,4353],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4355,4356],{},[31,4357],{"alt":4358,"src":4359},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4361,4362,4363,4365],{},"第4次检查时 ",[14,4364,4341],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[19,4367,149],{"id":149},[42,4369,4370,4373],{},[45,4371,4372],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[45,4374,4375],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[19,4377,166],{"id":166},[128,4379,4380,4385],{},[45,4381,2276,4382,4384],{},[14,4383,4261],{}," 输出 1 到 5。",[45,4386,4387],{},"计算 1 到 10 的累加和。",[10,4389,183],{},[19,4391,186],{"id":186},[10,4393,4394],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,4396,196],{},{"title":81,"searchDepth":94,"depth":94,"links":4398},[4399,4400,4401,4402,4403,4406,4407,4408],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":4404},[4405],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4238,"description":4243},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[207,4261,4416],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4419,"title":4420,"body":4421,"category":207,"cover":208,"description":4425,"extension":210,"meta":4573,"navigation":212,"path":4574,"pinned":214,"publishedAt":215,"seo":4575,"slug":4576,"stem":4577,"summary":4578,"tags":4579,"updatedAt":215,"visible":212,"__hash__":4581},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4422,"toc":4563},[4423,4426,4428,4431,4433,4439,4444,4446,4460,4462,4464,4502,4504,4510,4512,4514,4531,4533,4541,4543,4554,4556,4558,4561],[10,4424,4425],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[19,4427,21],{"id":21},[10,4429,4430],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4432,27],{"id":27},[10,4434,4435],{},[31,4436],{"alt":4437,"src":4438},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4440,4441,4443],{},[14,4442,4278],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[19,4445,40],{"id":40},[42,4447,4448,4454,4457],{},[45,4449,4450,4453],{},[14,4451,4452],{},"range(1, 4)"," 包含 1，不包含 4。",[45,4455,4456],{},"只需要元素时直接遍历元素，不必手工维护索引。",[45,4458,4459],{},"循环变量应使用单数名称，容器使用复数名称。",[19,4461,71],{"id":71},[10,4463,74],{},[76,4465,4467],{"className":392,"code":4466,"language":394,"meta":81,"style":81},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[14,4468,4469,4474,4478,4483,4488,4492,4497],{"__ignoreMap":81},[85,4470,4471],{"class":87,"line":88},[85,4472,4473],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[85,4475,4476],{"class":87,"line":94},[85,4477,1082],{"emptyLinePlaceholder":212},[85,4479,4480],{"class":87,"line":100},[85,4481,4482],{},"for course in courses:\n",[85,4484,4485],{"class":87,"line":106},[85,4486,4487],{},"    print(course)\n",[85,4489,4490],{"class":87,"line":1129},[85,4491,1082],{"emptyLinePlaceholder":212},[85,4493,4494],{"class":87,"line":1135},[85,4495,4496],{},"for number in range(1, 4):\n",[85,4498,4499],{"class":87,"line":2426},[85,4500,4501],{},"    print(number)\n",[10,4503,112],{},[76,4505,4508],{"className":4506,"code":4507,"language":118,"meta":81},[116],"变量\n字符串\n列表\n1\n2\n3\n",[14,4509,4507],{"__ignoreMap":81},[10,4511,123],{},[19,4513,126],{"id":126},[128,4515,4516,4526],{},[45,4517,4518,4519,4521,4522,4525],{},"第一个 ",[14,4520,4278],{}," 依次从列表取得字符串，循环变量 ",[14,4523,4524],{},"course"," 每轮重新绑定。",[45,4527,4528,4530],{},[14,4529,4452],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[19,4532,149],{"id":149},[42,4534,4535,4538],{},[45,4536,4537],{},"只需要元素却手工维护索引，增加越界风险。",[45,4539,4540],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[19,4542,166],{"id":166},[128,4544,4545,4548],{},[45,4546,4547],{},"逐项输出一个字符串中的字符。",[45,4549,2276,4550,4553],{},[14,4551,4552],{},"range()"," 输出 2、4、6、8。",[10,4555,183],{},[19,4557,186],{"id":186},[10,4559,4560],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,4562,196],{},{"title":81,"searchDepth":94,"depth":94,"links":4564},[4565,4566,4567,4568,4569,4570,4571,4572],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4420,"description":4425},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[207,4278,4580],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4583,"title":4584,"body":4585,"category":207,"cover":208,"description":4589,"extension":210,"meta":4763,"navigation":212,"path":4764,"pinned":214,"publishedAt":215,"seo":4765,"slug":4766,"stem":4767,"summary":4768,"tags":4769,"updatedAt":215,"visible":212,"__hash__":4770},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4586,"toc":4753},[4587,4590,4592,4595,4597,4603,4613,4615,4634,4636,4638,4690,4692,4698,4700,4702,4716,4718,4734,4736,4744,4746,4748,4751],[10,4588,4589],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[19,4591,21],{"id":21},[10,4593,4594],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4596,27],{"id":27},[10,4598,4599],{},[31,4600],{"alt":4601,"src":4602},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4604,4605,4608,4609,4612],{},[14,4606,4607],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[14,4610,4611],{},"break"," 立即结束整个循环，执行循环后面的代码。",[19,4614,40],{"id":40},[42,4616,4617,4620,4628],{},[45,4618,4619],{},"先写普通循环，再在确有需要时加入流程控制语句。",[45,4621,4622,4624,4625,4627],{},[14,4623,4607],{}," 前要确认不会跳过 ",[14,4626,4261],{}," 循环中的状态更新。",[45,4629,4630,4631,4633],{},"多层嵌套中 ",[14,4632,4611],{}," 只结束它所在的最内层循环。",[19,4635,71],{"id":71},[10,4637,74],{},[76,4639,4641],{"className":392,"code":4640,"language":394,"meta":81,"style":81},"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",[14,4642,4643,4648,4652,4657,4662,4667,4672,4677,4681,4685],{"__ignoreMap":81},[85,4644,4645],{"class":87,"line":88},[85,4646,4647],{},"numbers = [3, -1, 0, 8, 12]\n",[85,4649,4650],{"class":87,"line":94},[85,4651,1082],{"emptyLinePlaceholder":212},[85,4653,4654],{"class":87,"line":100},[85,4655,4656],{},"for number in numbers:\n",[85,4658,4659],{"class":87,"line":106},[85,4660,4661],{},"    if number \u003C 0:\n",[85,4663,4664],{"class":87,"line":1129},[85,4665,4666],{},"        continue\n",[85,4668,4669],{"class":87,"line":1135},[85,4670,4671],{},"    if number == 0:\n",[85,4673,4674],{"class":87,"line":2426},[85,4675,4676],{},"        break\n",[85,4678,4679],{"class":87,"line":2432},[85,4680,4501],{},[85,4682,4683],{"class":87,"line":3892},[85,4684,1082],{"emptyLinePlaceholder":212},[85,4686,4687],{"class":87,"line":4104},[85,4688,4689],{},"print(\"循环结束\")\n",[10,4691,112],{},[76,4693,4696],{"className":4694,"code":4695,"language":118,"meta":81},[116],"3\n循环结束\n",[14,4697,4695],{"__ignoreMap":81},[10,4699,123],{},[19,4701,126],{"id":126},[128,4703,4704,4710],{},[45,4705,4706,4707,4709],{},"遇到 -1 时 ",[14,4708,4607],{}," 立即结束本轮，后面的判断和输出都不执行。",[45,4711,4712,4713,4715],{},"遇到 0 时 ",[14,4714,4611],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[19,4717,149],{"id":149},[42,4719,4720,4725],{},[45,4721,3406,4722,4724],{},[14,4723,4607],{}," 当作结束循环，实际它只跳到下一轮。",[45,4726,4727,4728,4730,4731,4733],{},"在 ",[14,4729,4261],{}," 中把状态更新放在可能被 ",[14,4732,4607],{}," 跳过的位置，造成无限循环。",[19,4735,166],{"id":166},[128,4737,4738,4741],{},[45,4739,4740],{},"跳过列表中的空字符串并输出其他内容。",[45,4742,4743],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4745,183],{},[19,4747,186],{"id":186},[10,4749,4750],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,4752,196],{},{"title":81,"searchDepth":94,"depth":94,"links":4754},[4755,4756,4757,4758,4759,4760,4761,4762],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4584,"description":4589},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[207,4611,4607],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4772,"title":4773,"body":4774,"category":207,"cover":208,"description":4778,"extension":210,"meta":4949,"navigation":212,"path":4950,"pinned":214,"publishedAt":215,"seo":4951,"slug":4952,"stem":4953,"summary":4954,"tags":4955,"updatedAt":215,"visible":212,"__hash__":4958},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4775,"toc":4937},[4776,4779,4781,4784,4786,4792,4795,4797,4821,4823,4825,4859,4861,4867,4869,4871,4888,4890,4893,4899,4902,4904,4918,4920,4928,4930,4932,4935],[10,4777,4778],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[19,4780,21],{"id":21},[10,4782,4783],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4785,27],{"id":27},[10,4787,4788],{},[31,4789],{"alt":4790,"src":4791},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4793,4794],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[19,4796,40],{"id":40},[42,4798,4799,4802,4805],{},[45,4800,4801],{},"每增加一层嵌套，阅读成本都会上升。",[45,4803,4804],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[45,4806,4807,4808,2194,4811,4814,4815,2194,4818,55],{},"变量名使用 ",[14,4809,4810],{},"row",[14,4812,4813],{},"cell"," 等层级含义，避免全部写成 ",[14,4816,4817],{},"i",[14,4819,4820],{},"j",[19,4822,71],{"id":71},[10,4824,74],{},[76,4826,4828],{"className":392,"code":4827,"language":394,"meta":81,"style":81},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[14,4829,4830,4835,4839,4844,4849,4854],{"__ignoreMap":81},[85,4831,4832],{"class":87,"line":88},[85,4833,4834],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[85,4836,4837],{"class":87,"line":94},[85,4838,1082],{"emptyLinePlaceholder":212},[85,4840,4841],{"class":87,"line":100},[85,4842,4843],{},"for row in table:\n",[85,4845,4846],{"class":87,"line":106},[85,4847,4848],{},"    for cell in row:\n",[85,4850,4851],{"class":87,"line":1129},[85,4852,4853],{},"        print(cell)\n",[85,4855,4856],{"class":87,"line":1135},[85,4857,4858],{},"    print(\"一行结束\")\n",[10,4860,112],{},[76,4862,4865],{"className":4863,"code":4864,"language":118,"meta":81},[116],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[14,4866,4864],{"__ignoreMap":81},[10,4868,123],{},[19,4870,126],{"id":126},[128,4872,4873,4885],{},[45,4874,4875,4876,4878,4879,1144,4882,55],{},"外层变量 ",[14,4877,4810],{}," 先引用第一行列表，内层才依次处理 ",[14,4880,4881],{},"A1",[14,4883,4884],{},"A2",[45,4886,4887],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[312,4889,2636],{"id":2636},[10,4891,4892],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4894,4895],{},[31,4896],{"alt":4897,"src":4898},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4900,4901],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[19,4903,149],{"id":149},[42,4905,4906,4915],{},[45,4907,4908,4909,993,4912,4914],{},"把两层循环变量都叫 ",[14,4910,4911],{},"item",[14,4913,4817],{},"，难以确认当前层级。",[45,4916,4917],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[19,4919,166],{"id":166},[128,4921,4922,4925],{},[45,4923,4924],{},"打印一个 2×3 数字表。",[45,4926,4927],{},"在内层增加条件，只输出大于 3 的元素。",[10,4929,183],{},[19,4931,186],{"id":186},[10,4933,4934],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,4936,196],{},{"title":81,"searchDepth":94,"depth":94,"links":4938},[4939,4940,4941,4942,4943,4946,4947,4948],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":4944},[4945],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4773,"description":4778},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[207,4956,4957],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4960,"title":4961,"body":4962,"category":207,"cover":208,"description":4966,"extension":210,"meta":5104,"navigation":212,"path":5105,"pinned":214,"publishedAt":215,"seo":5106,"slug":5107,"stem":5108,"summary":5109,"tags":5110,"updatedAt":215,"visible":212,"__hash__":5113},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4963,"toc":5094},[4964,4967,4969,4972,4974,4980,4983,4985,4996,4998,5000,5038,5040,5046,5048,5050,5062,5064,5075,5077,5085,5087,5089,5092],[10,4965,4966],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[19,4968,21],{"id":21},[10,4970,4971],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,4973,27],{"id":27},[10,4975,4976],{},[31,4977],{"alt":4978,"src":4979},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4981,4982],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[19,4984,40],{"id":40},[42,4986,4987,4990,4993],{},[45,4988,4989],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[45,4991,4992],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[45,4994,4995],{},"推导式创建新列表，不修改输入列表。",[19,4997,71],{"id":71},[10,4999,74],{},[76,5001,5003],{"className":392,"code":5002,"language":394,"meta":81,"style":81},"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",[14,5004,5005,5010,5014,5019,5024,5028,5033],{"__ignoreMap":81},[85,5006,5007],{"class":87,"line":88},[85,5008,5009],{},"numbers = [1, 2, 3, 4, 5]\n",[85,5011,5012],{"class":87,"line":94},[85,5013,1082],{"emptyLinePlaceholder":212},[85,5015,5016],{"class":87,"line":100},[85,5017,5018],{},"squares = [number * number for number in numbers]\n",[85,5020,5021],{"class":87,"line":106},[85,5022,5023],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[85,5025,5026],{"class":87,"line":1129},[85,5027,1082],{"emptyLinePlaceholder":212},[85,5029,5030],{"class":87,"line":1135},[85,5031,5032],{},"print(squares)\n",[85,5034,5035],{"class":87,"line":2426},[85,5036,5037],{},"print(even_squares)\n",[10,5039,112],{},[76,5041,5044],{"className":5042,"code":5043,"language":118,"meta":81},[116],"[1, 4, 9, 16, 25]\n[4, 16]\n",[14,5045,5043],{"__ignoreMap":81},[10,5047,123],{},[19,5049,126],{"id":126},[128,5051,5052,5055],{},[45,5053,5054],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[45,5056,5057,5058,5061],{},"第二条先用 ",[14,5059,5060],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[19,5063,149],{"id":149},[42,5065,5066,5072],{},[45,5067,5068,5069,5071],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[14,5070,4278],{}," 开始找输入。",[45,5073,5074],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[19,5076,166],{"id":166},[128,5078,5079,5082],{},[45,5080,5081],{},"把字符串列表转换为长度列表。",[45,5083,5084],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5086,183],{},[19,5088,186],{"id":186},[10,5090,5091],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,5093,196],{},{"title":81,"searchDepth":94,"depth":94,"links":5095},[5096,5097,5098,5099,5100,5101,5102,5103],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4961,"description":4966},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[207,5111,5112],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5115,"title":5116,"body":5117,"category":207,"cover":208,"description":5121,"extension":210,"meta":5264,"navigation":212,"path":5265,"pinned":214,"publishedAt":215,"seo":5266,"slug":5267,"stem":5268,"summary":5269,"tags":5270,"updatedAt":215,"visible":212,"__hash__":5273},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5118,"toc":5254},[5119,5122,5124,5127,5129,5135,5138,5140,5151,5153,5155,5194,5196,5202,5204,5206,5221,5223,5231,5233,5245,5247,5249,5252],[10,5120,5121],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[19,5123,21],{"id":21},[10,5125,5126],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,5128,27],{"id":27},[10,5130,5131],{},[31,5132],{"alt":5133,"src":5134},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5136,5137],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[19,5139,40],{"id":40},[42,5141,5142,5145,5148],{},[45,5143,5144],{},"函数名描述动作，使用小写字母和下划线。",[45,5146,5147],{},"函数定义要先执行，之后才能调用。",[45,5149,5150],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[19,5152,71],{"id":71},[10,5154,74],{},[76,5156,5158],{"className":392,"code":5157,"language":394,"meta":81,"style":81},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[14,5159,5160,5165,5170,5175,5179,5184,5189],{"__ignoreMap":81},[85,5161,5162],{"class":87,"line":88},[85,5163,5164],{},"def show_progress():\n",[85,5166,5167],{"class":87,"line":94},[85,5168,5169],{},"    print(\"正在学习函数\")\n",[85,5171,5172],{"class":87,"line":100},[85,5173,5174],{},"    print(\"本节完成 50%\")\n",[85,5176,5177],{"class":87,"line":106},[85,5178,1082],{"emptyLinePlaceholder":212},[85,5180,5181],{"class":87,"line":1129},[85,5182,5183],{},"print(\"调用前\")\n",[85,5185,5186],{"class":87,"line":1135},[85,5187,5188],{},"show_progress()\n",[85,5190,5191],{"class":87,"line":2426},[85,5192,5193],{},"print(\"调用后\")\n",[10,5195,112],{},[76,5197,5200],{"className":5198,"code":5199,"language":118,"meta":81},[116],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[14,5201,5199],{"__ignoreMap":81},[10,5203,123],{},[19,5205,126],{"id":126},[128,5207,5208,5214],{},[45,5209,922,5210,5213],{},[14,5211,5212],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[45,5215,5216,5217,5220],{},"运行到 ",[14,5218,5219],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[19,5222,149],{"id":149},[42,5224,5225,5228],{},[45,5226,5227],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[45,5229,5230],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[19,5232,166],{"id":166},[128,5234,5235,5242],{},[45,5236,5237,5238,5241],{},"定义 ",[14,5239,5240],{},"show_plan()"," 输出两行学习计划。",[45,5243,5244],{},"连续调用同一个函数两次，观察执行顺序。",[10,5246,183],{},[19,5248,186],{"id":186},[10,5250,5251],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,5253,196],{},{"title":81,"searchDepth":94,"depth":94,"links":5255},[5256,5257,5258,5259,5260,5261,5262,5263],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5116,"description":5121},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[207,5271,5272],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5275,"title":5276,"body":5277,"category":207,"cover":208,"description":5281,"extension":210,"meta":5461,"navigation":212,"path":5462,"pinned":214,"publishedAt":215,"seo":5463,"slug":5464,"stem":5465,"summary":5466,"tags":5467,"updatedAt":215,"visible":212,"__hash__":5470},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5278,"toc":5449},[5279,5282,5284,5287,5289,5295,5302,5304,5321,5323,5325,5359,5361,5367,5369,5371,5392,5394,5397,5403,5413,5415,5430,5432,5440,5442,5444,5447],[10,5280,5281],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[19,5283,21],{"id":21},[10,5285,5286],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,5288,27],{"id":27},[10,5290,5291],{},[31,5292],{"alt":5293,"src":5294},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5296,5297,5298,5301],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[14,5299,5300],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[19,5303,40],{"id":40},[42,5305,5306,5309,5312],{},[45,5307,5308],{},"形参出现在函数定义中，实参出现在函数调用中。",[45,5310,5311],{},"局部变量默认只在函数内部可见。",[45,5313,5314,5315,5317,5318,55],{},"没有显式 ",[14,5316,5300],{}," 的函数会返回 ",[14,5319,5320],{},"None",[19,5322,71],{"id":71},[10,5324,74],{},[76,5326,5328],{"className":392,"code":5327,"language":394,"meta":81,"style":81},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[14,5329,5330,5335,5340,5345,5349,5354],{"__ignoreMap":81},[85,5331,5332],{"class":87,"line":88},[85,5333,5334],{},"def calculate_total(price, count):\n",[85,5336,5337],{"class":87,"line":94},[85,5338,5339],{},"    total = price * count\n",[85,5341,5342],{"class":87,"line":100},[85,5343,5344],{},"    return total\n",[85,5346,5347],{"class":87,"line":106},[85,5348,1082],{"emptyLinePlaceholder":212},[85,5350,5351],{"class":87,"line":1129},[85,5352,5353],{},"result = calculate_total(25, 4)\n",[85,5355,5356],{"class":87,"line":1135},[85,5357,5358],{},"print(result)\n",[10,5360,112],{},[76,5362,5365],{"className":5363,"code":5364,"language":118,"meta":81},[116],"100\n",[14,5366,5364],{"__ignoreMap":81},[10,5368,123],{},[19,5370,126],{"id":126},[128,5372,5373,5382],{},[45,5374,5375,5376,2194,5379,5381],{},"调用时 25 和 4 分别绑定到 ",[14,5377,5378],{},"price",[14,5380,4341],{},"，它们只在本次函数调用的局部范围中使用。",[45,5383,5384,5387,5388,5391],{},[14,5385,5386],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[14,5389,5390],{},"result"," 并输出。",[312,5393,2636],{"id":2636},[10,5395,5396],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5398,5399],{},[31,5400],{"alt":5401,"src":5402},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5404,5405,2194,5407,1144,5409,5412],{},[14,5406,5378],{},[14,5408,4341],{},[14,5410,5411],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[19,5414,149],{"id":149},[42,5416,5417,5424],{},[45,5418,5419,5420,5423],{},"在函数内部只 ",[14,5421,5422],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[45,5425,5426,5427,5429],{},"试图在函数外直接访问局部变量 ",[14,5428,5411],{},"，它的名字只在调用期间的局部作用域存在。",[19,5431,166],{"id":166},[128,5433,5434,5437],{},[45,5435,5436],{},"编写计算长方形面积的函数。",[45,5438,5439],{},"让函数返回结果后在调用方加上单位再输出。",[10,5441,183],{},[19,5443,186],{"id":186},[10,5445,5446],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,5448,196],{},{"title":81,"searchDepth":94,"depth":94,"links":5450},[5451,5452,5453,5454,5455,5458,5459,5460],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":5456},[5457],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5276,"description":5281},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[207,5468,5469],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5472,"title":5473,"body":5474,"category":207,"cover":208,"description":5478,"extension":210,"meta":5658,"navigation":212,"path":5659,"pinned":214,"publishedAt":215,"seo":5660,"slug":5661,"stem":5662,"summary":5663,"tags":5664,"updatedAt":215,"visible":212,"__hash__":5667},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5475,"toc":5646},[5476,5479,5481,5484,5486,5492,5495,5497,5514,5516,5518,5570,5572,5578,5580,5582,5600,5602,5605,5611,5614,5616,5627,5629,5637,5639,5641,5644],[10,5477,5478],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[19,5480,21],{"id":21},[10,5482,5483],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,5485,27],{"id":27},[10,5487,5488],{},[31,5489],{"alt":5490,"src":5491},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5493,5494],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[19,5496,40],{"id":40},[42,5498,5499,5502,5508],{},[45,5500,5501],{},"必需参数应放在有默认值的参数之前。",[45,5503,5504,5507],{},[14,5505,5506],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[45,5509,5510,5513],{},[14,5511,5512],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[19,5515,71],{"id":71},[10,5517,74],{},[76,5519,5521],{"className":392,"code":5520,"language":394,"meta":81,"style":81},"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",[14,5522,5523,5528,5533,5537,5542,5547,5551,5556,5561,5565],{"__ignoreMap":81},[85,5524,5525],{"class":87,"line":88},[85,5526,5527],{},"def build_title(name, level=\"基础\"):\n",[85,5529,5530],{"class":87,"line":94},[85,5531,5532],{},"    return name + \"｜\" + level\n",[85,5534,5535],{"class":87,"line":100},[85,5536,1082],{"emptyLinePlaceholder":212},[85,5538,5539],{"class":87,"line":106},[85,5540,5541],{},"print(build_title(\"Python\"))\n",[85,5543,5544],{"class":87,"line":1129},[85,5545,5546],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[85,5548,5549],{"class":87,"line":1135},[85,5550,1082],{"emptyLinePlaceholder":212},[85,5552,5553],{"class":87,"line":2426},[85,5554,5555],{},"def total(*numbers):\n",[85,5557,5558],{"class":87,"line":2432},[85,5559,5560],{},"    return sum(numbers)\n",[85,5562,5563],{"class":87,"line":3892},[85,5564,1082],{"emptyLinePlaceholder":212},[85,5566,5567],{"class":87,"line":4104},[85,5568,5569],{},"print(total(10, 20, 30))\n",[10,5571,112],{},[76,5573,5576],{"className":5574,"code":5575,"language":118,"meta":81},[116],"Python｜基础\n异常处理｜进阶\n60\n",[14,5577,5575],{"__ignoreMap":81},[10,5579,123],{},[19,5581,126],{"id":126},[128,5583,5584,5591],{},[45,5585,5586,5587,5590],{},"第一次调用只提供必需参数，",[14,5588,5589],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[45,5592,5593,5596,5597,55],{},[14,5594,5595],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[14,5598,5599],{},"sum()",[312,5601,2636],{"id":2636},[10,5603,5604],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5606,5607],{},[31,5608],{"alt":5609,"src":5610},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5612,5613],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[19,5615,149],{"id":149},[42,5617,5618,5624],{},[45,5619,5620,5621,5623],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[14,5622,5320],{}," 再在函数内创建。",[45,5625,5626],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[19,5628,166],{"id":166},[128,5630,5631,5634],{},[45,5632,5633],{},"给问候函数增加默认称呼。",[45,5635,5636],{},"编写接收任意数量分数并返回总分的函数。",[10,5638,183],{},[19,5640,186],{"id":186},[10,5642,5643],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,5645,196],{},{"title":81,"searchDepth":94,"depth":94,"links":5647},[5648,5649,5650,5651,5652,5655,5656,5657],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":5653},[5654],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5473,"description":5478},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[207,5665,5666],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5669,"title":5670,"body":5671,"category":207,"cover":208,"description":5675,"extension":210,"meta":5872,"navigation":212,"path":5873,"pinned":214,"publishedAt":215,"seo":5874,"slug":5875,"stem":5876,"summary":5877,"tags":5878,"updatedAt":215,"visible":212,"__hash__":5881},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5672,"toc":5860},[5673,5676,5678,5681,5683,5689,5692,5694,5711,5713,5715,5778,5780,5786,5788,5790,5817,5819,5822,5828,5831,5833,5841,5843,5851,5853,5855,5858],[10,5674,5675],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[19,5677,21],{"id":21},[10,5679,5680],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,5682,27],{"id":27},[10,5684,5685],{},[31,5686],{"alt":5687,"src":5688},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5690,5691],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[19,5693,40],{"id":40},[42,5695,5696,5699,5702],{},[45,5697,5698],{},"函数内部赋值默认创建局部变量。",[45,5700,5701],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[45,5703,5704,2113,5707,5710],{},[14,5705,5706],{},"global",[14,5708,5709],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[19,5712,71],{"id":71},[10,5714,74],{},[76,5716,5718],{"className":392,"code":5717,"language":394,"meta":81,"style":81},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[14,5719,5720,5725,5729,5734,5739,5743,5748,5753,5758,5762,5767,5772],{"__ignoreMap":81},[85,5721,5722],{"class":87,"line":88},[85,5723,5724],{},"course = \"Python\"\n",[85,5726,5727],{"class":87,"line":94},[85,5728,1082],{"emptyLinePlaceholder":212},[85,5730,5731],{"class":87,"line":100},[85,5732,5733],{},"def outer():\n",[85,5735,5736],{"class":87,"line":106},[85,5737,5738],{},"    level = \"基础\"\n",[85,5740,5741],{"class":87,"line":1129},[85,5742,1082],{"emptyLinePlaceholder":212},[85,5744,5745],{"class":87,"line":1135},[85,5746,5747],{},"    def show():\n",[85,5749,5750],{"class":87,"line":2426},[85,5751,5752],{},"        lesson = \"作用域\"\n",[85,5754,5755],{"class":87,"line":2432},[85,5756,5757],{},"        print(course, level, lesson)\n",[85,5759,5760],{"class":87,"line":3892},[85,5761,1082],{"emptyLinePlaceholder":212},[85,5763,5764],{"class":87,"line":4104},[85,5765,5766],{},"    show()\n",[85,5768,5770],{"class":87,"line":5769},11,[85,5771,1082],{"emptyLinePlaceholder":212},[85,5773,5775],{"class":87,"line":5774},12,[85,5776,5777],{},"outer()\n",[10,5779,112],{},[76,5781,5784],{"className":5782,"code":5783,"language":118,"meta":81},[116],"Python 基础 作用域\n",[14,5785,5783],{"__ignoreMap":81},[10,5787,123],{},[19,5789,126],{"id":126},[128,5791,5792,5809],{},[45,5793,5794,5797,5798,5801,5802,5804,5805,5808],{},[14,5795,5796],{},"show()"," 中查找 ",[14,5799,5800],{},"lesson"," 时先在局部找到，查找 ",[14,5803,5589],{}," 时到外层 ",[14,5806,5807],{},"outer()"," 找到。",[45,5810,5811,5813,5814,5816],{},[14,5812,4524],{}," 在局部和外层都不存在，继续到模块全局找到；",[14,5815,2145],{}," 最后在内置作用域找到。",[312,5818,2636],{"id":2636},[10,5820,5821],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5823,5824],{},[31,5825],{"alt":5826,"src":5827},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5829,5830],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[19,5832,149],{"id":149},[42,5834,5835,5838],{},[45,5836,5837],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[45,5839,5840],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[19,5842,166],{"id":166},[128,5844,5845,5848],{},[45,5846,5847],{},"在内外层定义同名变量，观察最近作用域优先。",[45,5849,5850],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5852,183],{},[19,5854,186],{"id":186},[10,5856,5857],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,5859,196],{},{"title":81,"searchDepth":94,"depth":94,"links":5861},[5862,5863,5864,5865,5866,5869,5870,5871],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":5867},[5868],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5670,"description":5675},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[207,5879,5880],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5883,"title":5884,"body":5885,"category":207,"cover":208,"description":5889,"extension":210,"meta":6039,"navigation":212,"path":6040,"pinned":214,"publishedAt":215,"seo":6041,"slug":6042,"stem":6043,"summary":6044,"tags":6045,"updatedAt":215,"visible":212,"__hash__":6048},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5886,"toc":6029},[5887,5890,5892,5895,5897,5903,5906,5908,5927,5929,5931,5965,5967,5973,5975,5977,5992,5994,6006,6008,6020,6022,6024,6027],[10,5888,5889],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[19,5891,21],{"id":21},[10,5893,5894],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,5896,27],{"id":27},[10,5898,5899],{},[31,5900],{"alt":5901,"src":5902},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5904,5905],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[19,5907,40],{"id":40},[42,5909,5910,5913,5916],{},[45,5911,5912],{},"文档字符串紧跟在函数定义后的第一条语句。",[45,5914,5915],{},"注解表达接口意图，不代替输入校验和测试。",[45,5917,5918,5919,2194,5921,2194,5923,5926],{},"基础注解优先使用 ",[14,5920,2197],{},[14,5922,2363],{},[14,5924,5925],{},"list[str]"," 等直接写法。",[19,5928,71],{"id":71},[10,5930,74],{},[76,5932,5934],{"className":392,"code":5933,"language":394,"meta":81,"style":81},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[14,5935,5936,5941,5946,5951,5955,5960],{"__ignoreMap":81},[85,5937,5938],{"class":87,"line":88},[85,5939,5940],{},"def format_score(name: str, score: int) -> str:\n",[85,5942,5943],{"class":87,"line":94},[85,5944,5945],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[85,5947,5948],{"class":87,"line":100},[85,5949,5950],{},"    return name + \"：\" + str(score)\n",[85,5952,5953],{"class":87,"line":106},[85,5954,1082],{"emptyLinePlaceholder":212},[85,5956,5957],{"class":87,"line":1129},[85,5958,5959],{},"print(format_score(\"小郑\", 95))\n",[85,5961,5962],{"class":87,"line":1135},[85,5963,5964],{},"print(format_score.__doc__)\n",[10,5966,112],{},[76,5968,5971],{"className":5969,"code":5970,"language":118,"meta":81},[116],"小郑：95\n返回带姓名的分数文本。\n",[14,5972,5970],{"__ignoreMap":81},[10,5974,123],{},[19,5976,126],{"id":126},[128,5978,5979,5989],{},[45,5980,5981,5982,5985,5986,5988],{},"函数签名说明 ",[14,5983,5984],{},"name"," 预期为字符串、",[14,5987,2183],{}," 预期为整数，返回值预期为字符串。",[45,5990,5991],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[19,5993,149],{"id":149},[42,5995,5996,6003],{},[45,5997,5998,5999,6002],{},"认为加了 ",[14,6000,6001],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[45,6004,6005],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[19,6007,166],{"id":166},[128,6009,6010,6013],{},[45,6011,6012],{},"为面积函数补充参数和返回值注解。",[45,6014,6015,6016,6019],{},"通过 ",[14,6017,6018],{},"函数名.__doc__"," 查看文档字符串。",[10,6021,183],{},[19,6023,186],{"id":186},[10,6025,6026],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,6028,196],{},{"title":81,"searchDepth":94,"depth":94,"links":6030},[6031,6032,6033,6034,6035,6036,6037,6038],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5884,"description":5889},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[207,6046,6047],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6050,"title":6051,"body":6052,"category":207,"cover":208,"description":6056,"extension":210,"meta":6283,"navigation":212,"path":6284,"pinned":214,"publishedAt":215,"seo":6285,"slug":6286,"stem":6287,"summary":6288,"tags":6289,"updatedAt":215,"visible":212,"__hash__":6292},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6053,"toc":6271},[6054,6057,6059,6065,6067,6073,6084,6086,6104,6106,6113,6142,6149,6168,6177,6179,6185,6187,6189,6212,6214,6217,6223,6229,6231,6247,6249,6262,6264,6266,6269],[10,6055,6056],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[19,6058,21],{"id":21},[10,6060,6061,6062,6064],{},"本篇只处理“模块、import 与 ",[278,6063,5984],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,6066,27],{"id":27},[10,6068,6069],{},[31,6070],{"alt":6071,"src":6072},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6074,6075,6076,6079,6080,6083],{},"同一个文件直接运行时 ",[14,6077,6078],{},"__name__"," 等于 ",[14,6081,6082],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[19,6085,40],{"id":40},[42,6087,6088,6094,6097],{},[45,6089,6090,6091,6093],{},"一个 ",[14,6092,16],{}," 文件就是一个模块。",[45,6095,6096],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[45,6098,6099,6100,6103],{},"避免使用 ",[14,6101,6102],{},"from module import *","，它会让名字来源不清楚。",[19,6105,71],{"id":71},[10,6107,6108,6109,6112],{},"先在同一个目录中创建两个文件。把函数放进 ",[14,6110,6111],{},"calculator.py","：",[76,6114,6116],{"className":392,"code":6115,"language":394,"meta":81,"style":81},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[14,6117,6118,6123,6128,6132,6137],{"__ignoreMap":81},[85,6119,6120],{"class":87,"line":88},[85,6121,6122],{},"def add(left, right):\n",[85,6124,6125],{"class":87,"line":94},[85,6126,6127],{},"    return left + right\n",[85,6129,6130],{"class":87,"line":100},[85,6131,1082],{"emptyLinePlaceholder":212},[85,6133,6134],{"class":87,"line":106},[85,6135,6136],{},"if __name__ == \"__main__\":\n",[85,6138,6139],{"class":87,"line":1129},[85,6140,6141],{},"    print(add(2, 3))\n",[10,6143,6144,6145,6148],{},"再创建 ",[14,6146,6147],{},"app.py","，从模块中导入函数：",[76,6150,6152],{"className":392,"code":6151,"language":394,"meta":81,"style":81},"from calculator import add\n\nprint(add(10, 20))\n",[14,6153,6154,6159,6163],{"__ignoreMap":81},[85,6155,6156],{"class":87,"line":88},[85,6157,6158],{},"from calculator import add\n",[85,6160,6161],{"class":87,"line":94},[85,6162,1082],{"emptyLinePlaceholder":212},[85,6164,6165],{"class":87,"line":100},[85,6166,6167],{},"print(add(10, 20))\n",[10,6169,6170,6171,1144,6174,55],{},"分别执行 ",[14,6172,6173],{},"python3 calculator.py",[14,6175,6176],{},"python3 app.py",[10,6178,112],{},[76,6180,6183],{"className":6181,"code":6182,"language":118,"meta":81},[116],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[14,6184,6182],{"__ignoreMap":81},[10,6186,123],{},[19,6188,126],{"id":126},[128,6190,6191,6201],{},[45,6192,6193,6194,6196,6197,6200],{},"直接运行 ",[14,6195,6111],{}," 时，模块名是 ",[14,6198,6199],{},"__main__","，入口代码输出 5。",[45,6202,6203,6205,6206,6208,6209,6211],{},[14,6204,6147],{}," 导入模块时，",[14,6207,6111],{}," 的函数定义会执行，但入口判断为假；随后 ",[14,6210,6147],{}," 调用函数输出 30。",[312,6213,2636],{"id":2636},[10,6215,6216],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6218,6219],{},[31,6220],{"alt":6221,"src":6222},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6224,6225,6226,6228],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[14,6227,6199],{}," 保护下的演示代码。",[19,6230,149],{"id":149},[42,6232,6233,6240],{},[45,6234,6235,6236,1144,6238,55],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[14,6237,6111],{},[14,6239,6147],{},[45,6241,6242,6243,6246],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[14,6244,6245],{},"json.py","，导致导入目标被遮蔽。",[19,6248,166],{"id":166},[128,6250,6251,6257],{},[45,6252,2291,6253,6256],{},[14,6254,6255],{},"text_tools.py"," 并导出一个格式化函数。",[45,6258,6259,6260,55],{},"分别直接运行模块和从另一个脚本导入，输出 ",[14,6261,6078],{},[10,6263,183],{},[19,6265,186],{"id":186},[10,6267,6268],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,6270,196],{},{"title":81,"searchDepth":94,"depth":94,"links":6272},[6273,6274,6275,6276,6277,6280,6281,6282],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":6278},[6279],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6051,"description":6056},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[207,6290,6291],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6294,"title":6295,"body":6296,"category":207,"cover":208,"description":6300,"extension":210,"meta":6465,"navigation":212,"path":6466,"pinned":214,"publishedAt":215,"seo":6467,"slug":6468,"stem":6469,"summary":6470,"tags":6471,"updatedAt":215,"visible":212,"__hash__":6473},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6297,"toc":6455},[6298,6301,6303,6306,6308,6314,6317,6319,6333,6335,6337,6383,6385,6391,6393,6395,6421,6423,6433,6435,6446,6448,6450,6453],[10,6299,6300],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[19,6302,21],{"id":21},[10,6304,6305],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,6307,27],{"id":27},[10,6309,6310],{},[31,6311],{"alt":6312,"src":6313},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6315,6316],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[19,6318,40],{"id":40},[42,6320,6321,6327,6330],{},[45,6322,6323,6326],{},[14,6324,6325],{},".venv"," 是常见目录名，不应提交到 Git。",[45,6328,6329],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[45,6331,6332],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[19,6334,71],{"id":71},[10,6336,1559],{},[76,6338,6340],{"className":576,"code":6339,"language":578,"meta":81,"style":81},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[14,6341,6342,6354,6362,6368,6378],{"__ignoreMap":81},[85,6343,6344,6346,6348,6351],{"class":87,"line":88},[85,6345,50],{"class":585},[85,6347,618],{"class":588},[85,6349,6350],{"class":621}," venv",[85,6352,6353],{"class":621}," .venv\n",[85,6355,6356,6359],{"class":87,"line":94},[85,6357,6358],{"class":588},"source",[85,6360,6361],{"class":621}," .venv\u002Fbin\u002Factivate\n",[85,6363,6364,6366],{"class":87,"line":100},[85,6365,394],{"class":585},[85,6367,589],{"class":588},[85,6369,6370,6372,6374,6376],{"class":87,"line":106},[85,6371,394],{"class":585},[85,6373,618],{"class":588},[85,6375,622],{"class":621},[85,6377,589],{"class":588},[85,6379,6380],{"class":87,"line":1129},[85,6381,6382],{"class":585},"deactivate\n",[10,6384,112],{},[76,6386,6389],{"className":6387,"code":6388,"language":118,"meta":81},[116],"Python 和 pip 的路径应指向当前项目的 .venv\n",[14,6390,6388],{"__ignoreMap":81},[10,6392,123],{},[19,6394,126],{"id":126},[128,6396,6397,6406],{},[45,6398,6399,6402,6403,6405],{},[14,6400,6401],{},"venv"," 根据当前 ",[14,6404,50],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[45,6407,6408,6409,2113,6411,6414,6415,3667,6417,6420],{},"激活后 ",[14,6410,394],{},[14,6412,6413],{},"python -m pip"," 优先指向 ",[14,6416,6325],{},[14,6418,6419],{},"deactivate"," 只恢复当前终端的命令查找。",[19,6422,149],{"id":149},[42,6424,6425,6428],{},[45,6426,6427],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[45,6429,3406,6430,6432],{},[14,6431,6325],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[19,6434,166],{"id":166},[128,6436,6437,6443],{},[45,6438,6439,6440,55],{},"创建虚拟环境并记录激活前后的 ",[14,6441,6442],{},"which python",[45,6444,6445],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6447,183],{},[19,6449,186],{"id":186},[10,6451,6452],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,6454,1643],{},{"title":81,"searchDepth":94,"depth":94,"links":6456},[6457,6458,6459,6460,6461,6462,6463,6464],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6295,"description":6300},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[207,6472,244],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6475,"title":6476,"body":6477,"category":207,"cover":208,"description":6481,"extension":210,"meta":6669,"navigation":212,"path":6670,"pinned":214,"publishedAt":215,"seo":6671,"slug":6672,"stem":6673,"summary":6674,"tags":6675,"updatedAt":215,"visible":212,"__hash__":6678},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6478,"toc":6659},[6479,6482,6484,6487,6489,6495,6504,6506,6530,6532,6534,6587,6589,6595,6597,6599,6615,6617,6636,6638,6650,6652,6654,6657],[10,6480,6481],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[19,6483,21],{"id":21},[10,6485,6486],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,6488,27],{"id":27},[10,6490,6491],{},[31,6492],{"alt":6493,"src":6494},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6496,6497,6500,6501,6503],{},[14,6498,6499],{},"Path"," 使用 ",[14,6502,2373],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[19,6505,40],{"id":40},[42,6507,6508,6511,6523],{},[45,6509,6510],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[45,6512,6513,2194,6516,2194,6519,6522],{},[14,6514,6515],{},"exists()",[14,6517,6518],{},"is_file()",[14,6520,6521],{},"is_dir()"," 检查真实文件系统状态。",[45,6524,6525,6526,6529],{},"创建目录前明确目标；",[14,6527,6528],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[19,6531,71],{"id":71},[10,6533,74],{},[76,6535,6537],{"className":392,"code":6536,"language":394,"meta":81,"style":81},"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",[14,6538,6539,6544,6548,6553,6558,6563,6567,6572,6577,6582],{"__ignoreMap":81},[85,6540,6541],{"class":87,"line":88},[85,6542,6543],{},"from pathlib import Path\n",[85,6545,6546],{"class":87,"line":94},[85,6547,1082],{"emptyLinePlaceholder":212},[85,6549,6550],{"class":87,"line":100},[85,6551,6552],{},"project = Path.cwd()\n",[85,6554,6555],{"class":87,"line":106},[85,6556,6557],{},"data_dir = project \u002F \"data\"\n",[85,6559,6560],{"class":87,"line":1129},[85,6561,6562],{},"file_path = data_dir \u002F \"records.json\"\n",[85,6564,6565],{"class":87,"line":1135},[85,6566,1082],{"emptyLinePlaceholder":212},[85,6568,6569],{"class":87,"line":2426},[85,6570,6571],{},"print(project)\n",[85,6573,6574],{"class":87,"line":2432},[85,6575,6576],{},"print(file_path.name)\n",[85,6578,6579],{"class":87,"line":3892},[85,6580,6581],{},"print(file_path.suffix)\n",[85,6583,6584],{"class":87,"line":4104},[85,6585,6586],{},"print(file_path.exists())\n",[10,6588,112],{},[76,6590,6593],{"className":6591,"code":6592,"language":118,"meta":81},[116],"显示当前项目路径、records.json、.json 和存在状态\n",[14,6594,6592],{"__ignoreMap":81},[10,6596,123],{},[19,6598,126],{"id":126},[128,6600,6601,6607],{},[45,6602,6603,6606],{},[14,6604,6605],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[45,6608,2276,6609,6611,6612,6614],{},[14,6610,2373],{}," 组合路径片段只创建新的 ",[14,6613,6499],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[19,6616,149],{"id":149},[42,6618,6619,6627],{},[45,6620,3406,6621,6623,6624,6626],{},[14,6622,6499],{}," 对象存在当成真实文件存在，仍需调用 ",[14,6625,6515],{}," 等方法确认。",[45,6628,6629,6630,993,6632,6635],{},"手工拼接 ",[14,6631,2373],{},[14,6633,6634],{},"\\"," 分隔符，降低跨平台可读性。",[19,6637,166],{"id":166},[128,6639,6640,6647],{},[45,6641,6642,6643,6646],{},"组合 ",[14,6644,6645],{},"output\u002Freport.txt"," 路径但先不创建文件。",[45,6648,6649],{},"输出路径的父目录、文件名和扩展名。",[10,6651,183],{},[19,6653,186],{"id":186},[10,6655,6656],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,6658,196],{},{"title":81,"searchDepth":94,"depth":94,"links":6660},[6661,6662,6663,6664,6665,6666,6667,6668],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6476,"description":6481},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[207,6676,6677],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6680,"title":6681,"body":6682,"category":207,"cover":208,"description":6686,"extension":210,"meta":6864,"navigation":212,"path":6865,"pinned":214,"publishedAt":215,"seo":6866,"slug":6867,"stem":6868,"summary":6869,"tags":6870,"updatedAt":215,"visible":212,"__hash__":6873},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6683,"toc":6854},[6684,6687,6689,6692,6694,6700,6703,6705,6733,6735,6737,6794,6796,6802,6804,6806,6817,6819,6832,6834,6845,6847,6849,6852],[10,6685,6686],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[19,6688,21],{"id":21},[10,6690,6691],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,6693,27],{"id":27},[10,6695,6696],{},[31,6697],{"alt":6698,"src":6699},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6701,6702],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[19,6704,40],{"id":40},[42,6706,6707,6713,6722],{},[45,6708,6709,6712],{},[14,6710,6711],{},"w"," 模式会截断原文件，写入前必须确认目标。",[45,6714,6715,6718,6719,55],{},[14,6716,6717],{},"r"," 模式读取不存在文件会产生 ",[14,6720,6721],{},"FileNotFoundError",[45,6723,6724,6725,6728,6729,6732],{},"本篇显式调用 ",[14,6726,6727],{},"close()","；第 34 篇会用 ",[14,6730,6731],{},"with"," 更可靠地管理关闭动作。",[19,6734,71],{"id":71},[10,6736,74],{},[76,6738,6740],{"className":392,"code":6739,"language":394,"meta":81,"style":81},"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",[14,6741,6742,6746,6750,6755,6760,6765,6770,6774,6779,6784,6789],{"__ignoreMap":81},[85,6743,6744],{"class":87,"line":88},[85,6745,6543],{},[85,6747,6748],{"class":87,"line":94},[85,6749,1082],{"emptyLinePlaceholder":212},[85,6751,6752],{"class":87,"line":100},[85,6753,6754],{},"file_path = Path(\"notes.txt\")\n",[85,6756,6757],{"class":87,"line":106},[85,6758,6759],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[85,6761,6762],{"class":87,"line":1129},[85,6763,6764],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[85,6766,6767],{"class":87,"line":1135},[85,6768,6769],{},"writer.close()\n",[85,6771,6772],{"class":87,"line":2426},[85,6773,1082],{"emptyLinePlaceholder":212},[85,6775,6776],{"class":87,"line":2432},[85,6777,6778],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[85,6780,6781],{"class":87,"line":3892},[85,6782,6783],{},"content = reader.read()\n",[85,6785,6786],{"class":87,"line":4104},[85,6787,6788],{},"reader.close()\n",[85,6790,6791],{"class":87,"line":5769},[85,6792,6793],{},"print(content)\n",[10,6795,112],{},[76,6797,6800],{"className":6798,"code":6799,"language":118,"meta":81},[116],"变量\n循环\n函数\n",[14,6801,6799],{"__ignoreMap":81},[10,6803,123],{},[19,6805,126],{"id":126},[128,6807,6808,6814],{},[45,6809,6810,6811,6813],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[14,6812,6727],{}," 确保缓冲内容交给文件系统。",[45,6815,6816],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[19,6818,149],{"id":149},[42,6820,6821,6826],{},[45,6822,2276,6823,6825],{},[14,6824,6711],{}," 模式打开重要文件却未确认覆盖风险。",[45,6827,6828,6829,55],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[14,6830,6831],{},"encoding=\"utf-8\"",[19,6833,166],{"id":166},[128,6835,6836,6839],{},[45,6837,6838],{},"写入三行学习记录并读取。",[45,6840,6841,6842,6844],{},"改用 ",[14,6843,320],{}," 模式追加一行，确认原内容仍保留。",[10,6846,183],{},[19,6848,186],{"id":186},[10,6850,6851],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,6853,196],{},{"title":81,"searchDepth":94,"depth":94,"links":6855},[6856,6857,6858,6859,6860,6861,6862,6863],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6681,"description":6686},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[207,6871,6872],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6875,"title":6876,"body":6877,"category":207,"cover":208,"description":6881,"extension":210,"meta":7048,"navigation":212,"path":7049,"pinned":214,"publishedAt":215,"seo":7050,"slug":7051,"stem":7052,"summary":7053,"tags":7054,"updatedAt":215,"visible":212,"__hash__":7057},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6878,"toc":7038},[6879,6882,6884,6887,6889,6895,6905,6907,6921,6923,6925,6985,6987,6993,6995,6997,7009,7011,7019,7021,7029,7031,7033,7036],[10,6880,6881],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[19,6883,21],{"id":21},[10,6885,6886],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,6888,27],{"id":27},[10,6890,6891],{},[31,6892],{"alt":6893,"src":6894},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6896,6897,6900,6901,6904],{},[14,6898,6899],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[14,6902,6903],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[19,6906,40],{"id":40},[42,6908,6909,6912,6918],{},[45,6910,6911],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[45,6913,6914,6917],{},[14,6915,6916],{},"ensure_ascii=False"," 让中文以可读字符写入。",[45,6919,6920],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[19,6922,71],{"id":71},[10,6924,74],{},[76,6926,6928],{"className":392,"code":6927,"language":394,"meta":81,"style":81},"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",[14,6929,6930,6935,6939,6944,6948,6953,6958,6962,6966,6971,6976,6980],{"__ignoreMap":81},[85,6931,6932],{"class":87,"line":88},[85,6933,6934],{},"import json\n",[85,6936,6937],{"class":87,"line":94},[85,6938,1082],{"emptyLinePlaceholder":212},[85,6940,6941],{"class":87,"line":100},[85,6942,6943],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[85,6945,6946],{"class":87,"line":106},[85,6947,1082],{"emptyLinePlaceholder":212},[85,6949,6950],{"class":87,"line":1129},[85,6951,6952],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[85,6954,6955],{"class":87,"line":1135},[85,6956,6957],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[85,6959,6960],{"class":87,"line":2426},[85,6961,6769],{},[85,6963,6964],{"class":87,"line":2432},[85,6965,1082],{"emptyLinePlaceholder":212},[85,6967,6968],{"class":87,"line":3892},[85,6969,6970],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[85,6972,6973],{"class":87,"line":4104},[85,6974,6975],{},"loaded = json.load(reader)\n",[85,6977,6978],{"class":87,"line":5769},[85,6979,6788],{},[85,6981,6982],{"class":87,"line":5774},[85,6983,6984],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6986,112],{},[76,6988,6991],{"className":6989,"code":6990,"language":118,"meta":81},[116],"Python 60\n",[14,6992,6990],{"__ignoreMap":81},[10,6994,123],{},[19,6996,126],{"id":126},[128,6998,6999,7004],{},[45,7000,7001,7003],{},[14,7002,6899],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[45,7005,7006,7008],{},[14,7007,6903],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[19,7010,149],{"id":149},[42,7012,7013,7016],{},[45,7014,7015],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[45,7017,7018],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[19,7020,166],{"id":166},[128,7022,7023,7026],{},[45,7024,7025],{},"保存包含两条学习记录的列表。",[45,7027,7028],{},"读取后修改进度，再重新写回文件。",[10,7030,183],{},[19,7032,186],{"id":186},[10,7034,7035],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,7037,196],{},{"title":81,"searchDepth":94,"depth":94,"links":7039},[7040,7041,7042,7043,7044,7045,7046,7047],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6876,"description":6881},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[207,7055,7056],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7059,"title":7060,"body":7061,"category":207,"cover":208,"description":7065,"extension":210,"meta":7249,"navigation":212,"path":7250,"pinned":214,"publishedAt":215,"seo":7251,"slug":7252,"stem":7253,"summary":7254,"tags":7255,"updatedAt":215,"visible":212,"__hash__":7258},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7062,"toc":7239},[7063,7066,7068,7071,7073,7079,7085,7087,7109,7111,7113,7176,7178,7184,7186,7188,7204,7206,7220,7222,7230,7232,7234,7237],[10,7064,7065],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[19,7067,21],{"id":21},[10,7069,7070],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,7072,27],{"id":27},[10,7074,7075],{},[31,7076],{"alt":7077,"src":7078},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7080,7081,7084],{},[14,7082,7083],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[19,7086,40],{"id":40},[42,7088,7089,7099,7106],{},[45,7090,2276,7091,7094,7095,7098],{},[14,7092,7093],{},"newline=\"\""," 让 ",[14,7096,7097],{},"csv"," 模块正确处理换行。",[45,7100,7101,7102,7105],{},"字段顺序由 ",[14,7103,7104],{},"fieldnames"," 决定，字典键需要与字段名一致。",[45,7107,7108],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[19,7110,71],{"id":71},[10,7112,74],{},[76,7114,7116],{"className":392,"code":7115,"language":394,"meta":81,"style":81},"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",[14,7117,7118,7123,7127,7132,7137,7142,7147,7152,7156,7161,7166,7171],{"__ignoreMap":81},[85,7119,7120],{"class":87,"line":88},[85,7121,7122],{},"import csv\n",[85,7124,7125],{"class":87,"line":94},[85,7126,1082],{"emptyLinePlaceholder":212},[85,7128,7129],{"class":87,"line":100},[85,7130,7131],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[85,7133,7134],{"class":87,"line":106},[85,7135,7136],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[85,7138,7139],{"class":87,"line":1129},[85,7140,7141],{},"writer.writeheader()\n",[85,7143,7144],{"class":87,"line":1135},[85,7145,7146],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[85,7148,7149],{"class":87,"line":2426},[85,7150,7151],{},"writer_file.close()\n",[85,7153,7154],{"class":87,"line":2432},[85,7155,1082],{"emptyLinePlaceholder":212},[85,7157,7158],{"class":87,"line":3892},[85,7159,7160],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[85,7162,7163],{"class":87,"line":4104},[85,7164,7165],{},"for row in csv.DictReader(reader_file):\n",[85,7167,7168],{"class":87,"line":5769},[85,7169,7170],{},"    print(row[\"name\"], row[\"score\"])\n",[85,7172,7173],{"class":87,"line":5774},[85,7174,7175],{},"reader_file.close()\n",[10,7177,112],{},[76,7179,7182],{"className":7180,"code":7181,"language":118,"meta":81},[116],"小郑 95\n",[14,7183,7181],{"__ignoreMap":81},[10,7185,123],{},[19,7187,126],{"id":126},[128,7189,7190,7199],{},[45,7191,7192,7195,7196,7198],{},[14,7193,7194],{},"DictWriter"," 按 ",[14,7197,7104],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[45,7200,7201,7203],{},[14,7202,7083],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[19,7205,149],{"id":149},[42,7207,7208,7211],{},[45,7209,7210],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[45,7212,7213,7214,7216,7217,7219],{},"在 macOS 以外环境忽略 ",[14,7215,7093],{}," 可能出现额外空行；统一交给 ",[14,7218,7097],{}," 模块管理换行。",[19,7221,166],{"id":166},[128,7223,7224,7227],{},[45,7225,7226],{},"写入三名学习者的课程和分数。",[45,7228,7229],{},"读取 CSV 后把分数字符串转换为整数。",[10,7231,183],{},[19,7233,186],{"id":186},[10,7235,7236],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,7238,196],{},{"title":81,"searchDepth":94,"depth":94,"links":7240},[7241,7242,7243,7244,7245,7246,7247,7248],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7060,"description":7065},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[207,7256,7257],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7260,"title":7261,"body":7262,"category":207,"cover":208,"description":7266,"extension":210,"meta":7539,"navigation":212,"path":7540,"pinned":214,"publishedAt":215,"seo":7541,"slug":7542,"stem":7543,"summary":7544,"tags":7545,"updatedAt":215,"visible":212,"__hash__":7548},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7263,"toc":7526},[7264,7267,7269,7272,7274,7280,7291,7293,7310,7312,7314,7389,7391,7397,7399,7401,7426,7428,7437,7443,7454,7456,7462,7468,7477,7479,7494,7496,7517,7519,7521,7524],[10,7265,7266],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[19,7268,21],{"id":21},[10,7270,7271],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,7273,27],{"id":27},[10,7275,7276],{},[31,7277],{"alt":7278,"src":7279},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7281,7282,7283,7286,7287,7290],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[14,7284,7285],{},"except","；无论是否异常，",[14,7288,7289],{},"finally"," 都会在离开结构前执行。",[19,7292,40],{"id":40},[42,7294,7295,7301,7307],{},[45,7296,7297,7298,7300],{},"只捕获能够处理的具体异常，不使用空的 ",[14,7299,7285],{}," 吞掉全部错误。",[45,7302,7303,7306],{},[14,7304,7305],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[45,7308,7309],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[19,7311,71],{"id":71},[10,7313,74],{},[76,7315,7317],{"className":392,"code":7316,"language":394,"meta":81,"style":81},"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",[14,7318,7319,7324,7329,7334,7339,7344,7348,7353,7358,7363,7368,7372,7377,7383],{"__ignoreMap":81},[85,7320,7321],{"class":87,"line":88},[85,7322,7323],{},"def parse_age(text):\n",[85,7325,7326],{"class":87,"line":94},[85,7327,7328],{},"    age = int(text)\n",[85,7330,7331],{"class":87,"line":100},[85,7332,7333],{},"    if age \u003C 0:\n",[85,7335,7336],{"class":87,"line":106},[85,7337,7338],{},"        raise ValueError(\"年龄不能为负数\")\n",[85,7340,7341],{"class":87,"line":1129},[85,7342,7343],{},"    return age\n",[85,7345,7346],{"class":87,"line":1135},[85,7347,1082],{"emptyLinePlaceholder":212},[85,7349,7350],{"class":87,"line":2426},[85,7351,7352],{},"try:\n",[85,7354,7355],{"class":87,"line":2432},[85,7356,7357],{},"    age = parse_age(\"18\")\n",[85,7359,7360],{"class":87,"line":3892},[85,7361,7362],{},"except ValueError as error:\n",[85,7364,7365],{"class":87,"line":4104},[85,7366,7367],{},"    print(\"输入错误：\", error)\n",[85,7369,7370],{"class":87,"line":5769},[85,7371,1132],{},[85,7373,7374],{"class":87,"line":5774},[85,7375,7376],{},"    print(\"年龄：\", age)\n",[85,7378,7380],{"class":87,"line":7379},13,[85,7381,7382],{},"finally:\n",[85,7384,7386],{"class":87,"line":7385},14,[85,7387,7388],{},"    print(\"处理结束\")\n",[10,7390,112],{},[76,7392,7395],{"className":7393,"code":7394,"language":118,"meta":81},[116],"年龄： 18\n处理结束\n",[14,7396,7394],{"__ignoreMap":81},[10,7398,123],{},[19,7400,126],{"id":126},[128,7402,7403,7415],{},[45,7404,7405,7407,7408,7410,7411,7414],{},[14,7406,2975],{}," 或主动 ",[14,7409,7305],{}," 都可能产生 ",[14,7412,7413],{},"ValueError","，控制流立即离开当前正常路径。",[45,7416,7417,7418,7420,7421,7423,7424,55],{},"有异常时进入匹配的 ",[14,7419,7285],{},"；没有异常时执行 ",[14,7422,1147],{},"；两种情况最后都会执行 ",[14,7425,7289],{},[312,7427,2636],{"id":2636},[10,7429,7430,2194,7432,1144,7434,7436],{},[14,7431,7285],{},[14,7433,1147],{},[14,7435,7289],{}," 的职责不同，不能只看它们出现的顺序。",[10,7438,7439],{},[31,7440],{"alt":7441,"src":7442},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7444,7445,7447,7448,7450,7451,7453],{},[14,7446,7285],{}," 处理匹配异常，",[14,7449,1147],{}," 只在无异常时运行，",[14,7452,7289],{}," 负责两条路径都需要的清理动作。",[312,7455,2636],{"id":4159},[10,7457,7458,7461],{},[14,7459,7460],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7463,7464],{},[31,7465],{"alt":7466,"src":7467},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7469,7470,7471,7473,7474,7476],{},"只把可能产生预期异常的操作放进 ",[14,7472,7460],{},"，后续正常业务放进 ",[14,7475,1147],{},"，错误边界会更清楚。",[19,7478,149],{"id":149},[42,7480,7481,7488],{},[45,7482,7483,7484,7487],{},"使用裸 ",[14,7485,7486],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[45,7489,7490,7491,7493],{},"把整个程序包在一个巨大 ",[14,7492,7460],{}," 中，无法判断究竟哪一步允许失败。",[19,7495,166],{"id":166},[128,7497,7498,7511],{},[45,7499,7500,7501,7504,7505,1144,7508,55],{},"让 ",[14,7502,7503],{},"parse_age"," 分别处理 ",[14,7506,7507],{},"\"abc\"",[14,7509,7510],{},"\"-1\"",[45,7512,7513,7514,7516],{},"为文件读取捕获 ",[14,7515,6721],{}," 并给出清晰提示。",[10,7518,183],{},[19,7520,186],{"id":186},[10,7522,7523],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,7525,196],{},{"title":81,"searchDepth":94,"depth":94,"links":7527},[7528,7529,7530,7531,7532,7536,7537,7538],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":7533},[7534,7535],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7261,"description":7266},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[207,7546,7547],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7550,"title":7551,"body":7552,"category":207,"cover":208,"description":7556,"extension":210,"meta":7732,"navigation":212,"path":7733,"pinned":214,"publishedAt":215,"seo":7734,"slug":7735,"stem":7736,"summary":7737,"tags":7738,"updatedAt":215,"visible":212,"__hash__":7740},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7553,"toc":7722},[7554,7557,7559,7562,7564,7570,7576,7578,7594,7596,7598,7652,7654,7660,7662,7664,7677,7679,7692,7694,7713,7715,7717,7720],[10,7555,7556],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[19,7558,21],{"id":21},[10,7560,7561],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,7563,27],{"id":27},[10,7565,7566],{},[31,7567],{"alt":7568,"src":7569},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7571,7572,7573,7575],{},"进入 ",[14,7574,6731],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[19,7577,40],{"id":40},[42,7579,7580,7585,7591],{},[45,7581,7582,7584],{},[14,7583,6731],{}," 把资源获取和释放配成一个清晰边界。",[45,7586,7587,7590],{},[14,7588,7589],{},"as file"," 得到的是上下文返回的资源对象。",[45,7592,7593],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[19,7595,71],{"id":71},[10,7597,74],{},[76,7599,7601],{"className":392,"code":7600,"language":394,"meta":81,"style":81},"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",[14,7602,7603,7607,7611,7615,7619,7624,7629,7633,7638,7643,7647],{"__ignoreMap":81},[85,7604,7605],{"class":87,"line":88},[85,7606,6543],{},[85,7608,7609],{"class":87,"line":94},[85,7610,1082],{"emptyLinePlaceholder":212},[85,7612,7613],{"class":87,"line":100},[85,7614,6754],{},[85,7616,7617],{"class":87,"line":106},[85,7618,1082],{"emptyLinePlaceholder":212},[85,7620,7621],{"class":87,"line":1129},[85,7622,7623],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[85,7625,7626],{"class":87,"line":1135},[85,7627,7628],{},"    file.write(\"上下文管理器\\n\")\n",[85,7630,7631],{"class":87,"line":2426},[85,7632,1082],{"emptyLinePlaceholder":212},[85,7634,7635],{"class":87,"line":2432},[85,7636,7637],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[85,7639,7640],{"class":87,"line":3892},[85,7641,7642],{},"    print(file.read())\n",[85,7644,7645],{"class":87,"line":4104},[85,7646,1082],{"emptyLinePlaceholder":212},[85,7648,7649],{"class":87,"line":5769},[85,7650,7651],{},"print(file.closed)\n",[10,7653,112],{},[76,7655,7658],{"className":7656,"code":7657,"language":118,"meta":81},[116],"上下文管理器\n\nTrue\n",[14,7659,7657],{"__ignoreMap":81},[10,7661,123],{},[19,7663,126],{"id":126},[128,7665,7666,7674],{},[45,7667,7572,7668,7670,7671,55],{},[14,7669,6731],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[14,7672,7673],{},"file",[45,7675,7676],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[19,7678,149],{"id":149},[42,7680,7681,7686],{},[45,7682,4727,7683,7685],{},[14,7684,6731],{}," 代码块外继续读写已经关闭的文件对象。",[45,7687,7688,7689,7691],{},"误以为 ",[14,7690,6731],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[19,7693,166],{"id":166},[128,7695,7696,7705],{},[45,7697,7698,7699,7702,7703,55],{},"把第 30 篇的手动 ",[14,7700,7701],{},"open\u002Fclose"," 改写为 ",[14,7704,6731],{},[45,7706,4727,7707,7709,7710,55],{},[14,7708,6731],{}," 块后检查 ",[14,7711,7712],{},"file.closed",[10,7714,183],{},[19,7716,186],{"id":186},[10,7718,7719],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,7721,196],{},{"title":81,"searchDepth":94,"depth":94,"links":7723},[7724,7725,7726,7727,7728,7729,7730,7731],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7551,"description":7556},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[207,6731,7739],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7742,"title":7743,"body":7744,"category":207,"cover":208,"description":7748,"extension":210,"meta":7960,"navigation":212,"path":7961,"pinned":214,"publishedAt":215,"seo":7962,"slug":7963,"stem":7964,"summary":7965,"tags":7966,"updatedAt":215,"visible":212,"__hash__":7969},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7745,"toc":7948},[7746,7749,7751,7754,7756,7762,7765,7767,7784,7786,7788,7856,7858,7864,7866,7868,7893,7895,7898,7904,7913,7915,7926,7928,7939,7941,7943,7946],[10,7747,7748],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[19,7750,21],{"id":21},[10,7752,7753],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,7755,27],{"id":27},[10,7757,7758],{},[31,7759],{"alt":7760,"src":7761},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7763,7764],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[19,7766,40],{"id":40},[42,7768,7769,7775,7781],{},[45,7770,7771,7774],{},[14,7772,7773],{},"self"," 表示当前实例，由方法调用自动传入。",[45,7776,7777,7780],{},[14,7778,7779],{},"__init__"," 在实例创建过程中初始化属性。",[45,7782,7783],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[19,7785,71],{"id":71},[10,7787,74],{},[76,7789,7791],{"className":392,"code":7790,"language":394,"meta":81,"style":81},"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",[14,7792,7793,7798,7803,7808,7813,7817,7822,7827,7832,7837,7841,7846,7851],{"__ignoreMap":81},[85,7794,7795],{"class":87,"line":88},[85,7796,7797],{},"class LearningRecord:\n",[85,7799,7800],{"class":87,"line":94},[85,7801,7802],{},"    def __init__(self, course, progress=0):\n",[85,7804,7805],{"class":87,"line":100},[85,7806,7807],{},"        self.course = course\n",[85,7809,7810],{"class":87,"line":106},[85,7811,7812],{},"        self.progress = progress\n",[85,7814,7815],{"class":87,"line":1129},[85,7816,1082],{"emptyLinePlaceholder":212},[85,7818,7819],{"class":87,"line":1135},[85,7820,7821],{},"    def advance(self, amount):\n",[85,7823,7824],{"class":87,"line":2426},[85,7825,7826],{},"        self.progress = self.progress + amount\n",[85,7828,7829],{"class":87,"line":2432},[85,7830,7831],{},"        if self.progress > 100:\n",[85,7833,7834],{"class":87,"line":3892},[85,7835,7836],{},"            self.progress = 100\n",[85,7838,7839],{"class":87,"line":4104},[85,7840,1082],{"emptyLinePlaceholder":212},[85,7842,7843],{"class":87,"line":5769},[85,7844,7845],{},"record = LearningRecord(\"Python\", 40)\n",[85,7847,7848],{"class":87,"line":5774},[85,7849,7850],{},"record.advance(15)\n",[85,7852,7853],{"class":87,"line":7379},[85,7854,7855],{},"print(record.course, record.progress)\n",[10,7857,112],{},[76,7859,7862],{"className":7860,"code":7861,"language":118,"meta":81},[116],"Python 55\n",[14,7863,7861],{"__ignoreMap":81},[10,7865,123],{},[19,7867,126],{"id":126},[128,7869,7870,7880],{},[45,7871,7872,7873,7876,7877,7879],{},"调用 ",[14,7874,7875],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[14,7878,7779],{}," 把课程和进度保存在该实例属性中。",[45,7881,7882,7885,7886,7889,7890,7892],{},[14,7883,7884],{},"record.advance(15)"," 自动把 ",[14,7887,7888],{},"record"," 作为 ",[14,7891,7773],{},"，方法更新同一实例的进度并限制上限。",[312,7894,2636],{"id":2636},[10,7896,7897],{},"类是共同定义，实例则各自保存状态。",[10,7899,7900],{},[31,7901],{"alt":7902,"src":7903},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7905,7906,7907,1144,7909,7912],{},"两个实例共享同一套方法定义，但 ",[14,7908,4524],{},[14,7910,7911],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[19,7914,149],{"id":149},[42,7916,7917,7923],{},[45,7918,7919,7920,7922],{},"调用实例方法时手工再传一次 ",[14,7921,7773],{},"。通过实例调用时 Python 会自动绑定。",[45,7924,7925],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[19,7927,166],{"id":166},[128,7929,7930,7936],{},[45,7931,5237,7932,7935],{},[14,7933,7934],{},"Book"," 类，保存标题和阅读页数。",[45,7937,7938],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7940,183],{},[19,7942,186],{"id":186},[10,7944,7945],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,7947,196],{},{"title":81,"searchDepth":94,"depth":94,"links":7949},[7950,7951,7952,7953,7954,7957,7958,7959],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":7955},[7956],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7743,"description":7748},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[207,7967,7968],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7971,"title":7972,"body":7973,"category":207,"cover":208,"description":7977,"extension":210,"meta":8155,"navigation":212,"path":8156,"pinned":214,"publishedAt":215,"seo":8157,"slug":8158,"stem":8159,"summary":8160,"tags":8161,"updatedAt":215,"visible":212,"__hash__":8164},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7974,"toc":8145},[7975,7978,7980,7983,7985,7991,7994,7996,8007,8009,8011,8078,8080,8086,8088,8090,8109,8111,8119,8121,8136,8138,8140,8143],[10,7976,7977],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[19,7979,21],{"id":21},[10,7981,7982],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,7984,27],{"id":27},[10,7986,7987],{},[31,7988],{"alt":7989,"src":7990},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7992,7993],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[19,7995,40],{"id":40},[42,7997,7998,8001,8004],{},[45,7999,8000],{},"封装让对象通过方法维护自己的有效状态。",[45,8002,8003],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[45,8005,8006],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[19,8008,71],{"id":71},[10,8010,74],{},[76,8012,8014],{"className":392,"code":8013,"language":394,"meta":81,"style":81},"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",[14,8015,8016,8021,8026,8031,8035,8040,8045,8050,8054,8059,8064,8068,8073],{"__ignoreMap":81},[85,8017,8018],{"class":87,"line":88},[85,8019,8020],{},"class Storage:\n",[85,8022,8023],{"class":87,"line":94},[85,8024,8025],{},"    def save(self, text):\n",[85,8027,8028],{"class":87,"line":100},[85,8029,8030],{},"        print(\"保存：\", text)\n",[85,8032,8033],{"class":87,"line":106},[85,8034,1082],{"emptyLinePlaceholder":212},[85,8036,8037],{"class":87,"line":1129},[85,8038,8039],{},"class LearningService:\n",[85,8041,8042],{"class":87,"line":1135},[85,8043,8044],{},"    def __init__(self, storage):\n",[85,8046,8047],{"class":87,"line":2426},[85,8048,8049],{},"        self.storage = storage\n",[85,8051,8052],{"class":87,"line":2432},[85,8053,1082],{"emptyLinePlaceholder":212},[85,8055,8056],{"class":87,"line":3892},[85,8057,8058],{},"    def finish_lesson(self, title):\n",[85,8060,8061],{"class":87,"line":4104},[85,8062,8063],{},"        self.storage.save(title)\n",[85,8065,8066],{"class":87,"line":5769},[85,8067,1082],{"emptyLinePlaceholder":212},[85,8069,8070],{"class":87,"line":5774},[85,8071,8072],{},"service = LearningService(Storage())\n",[85,8074,8075],{"class":87,"line":7379},[85,8076,8077],{},"service.finish_lesson(\"异常处理\")\n",[10,8079,112],{},[76,8081,8084],{"className":8082,"code":8083,"language":118,"meta":81},[116],"保存： 异常处理\n",[14,8085,8083],{"__ignoreMap":81},[10,8087,123],{},[19,8089,126],{"id":126},[128,8091,8092,8102],{},[45,8093,8094,8097,8098,8101],{},[14,8095,8096],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[14,8099,8100],{},"save()"," 的协作对象。",[45,8103,8104,8105,8108],{},"调用业务方法时，服务把保存动作委托给 ",[14,8106,8107],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[19,8110,149],{"id":149},[42,8112,8113,8116],{},[45,8114,8115],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[45,8117,8118],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[19,8120,166],{"id":166},[128,8122,8123,8133],{},[45,8124,8125,8126,8129,8130,55],{},"用组合让 ",[14,8127,8128],{},"OrderService"," 使用一个 ",[14,8131,8132],{},"Notifier",[45,8134,8135],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8137,183],{},[19,8139,186],{"id":186},[10,8141,8142],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,8144,196],{},{"title":81,"searchDepth":94,"depth":94,"links":8146},[8147,8148,8149,8150,8151,8152,8153,8154],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7972,"description":7977},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[207,8162,8163],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8166,"title":8167,"body":8168,"category":207,"cover":208,"description":8172,"extension":210,"meta":8375,"navigation":212,"path":8376,"pinned":214,"publishedAt":215,"seo":8377,"slug":8378,"stem":8379,"summary":8380,"tags":8381,"updatedAt":215,"visible":212,"__hash__":8384},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8169,"toc":8363},[8170,8173,8175,8178,8180,8186,8193,8195,8220,8222,8224,8276,8278,8284,8286,8288,8309,8311,8317,8323,8329,8331,8339,8341,8354,8356,8358,8361],[10,8171,8172],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[19,8174,21],{"id":21},[10,8176,8177],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,8179,27],{"id":27},[10,8181,8182],{},[31,8183],{"alt":8184,"src":8185},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8187,8188,8189,8192],{},"生成器运行到 ",[14,8190,8191],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[19,8194,40],{"id":40},[42,8196,8197,8207,8217],{},[45,8198,8199,8202,8203,8206],{},[14,8200,8201],{},"iter()"," 从可迭代对象取得迭代器，",[14,8204,8205],{},"next()"," 请求下一个值。",[45,8208,8209,8210,8213,8214,8216],{},"没有更多值时迭代器抛出 ",[14,8211,8212],{},"StopIteration","，",[14,8215,4278],{}," 会自动处理。",[45,8218,8219],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[19,8221,71],{"id":71},[10,8223,74],{},[76,8225,8227],{"className":392,"code":8226,"language":394,"meta":81,"style":81},"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",[14,8228,8229,8234,8239,8244,8249,8254,8258,8263,8268,8272],{"__ignoreMap":81},[85,8230,8231],{"class":87,"line":88},[85,8232,8233],{},"def countdown(start):\n",[85,8235,8236],{"class":87,"line":94},[85,8237,8238],{},"    current = start\n",[85,8240,8241],{"class":87,"line":100},[85,8242,8243],{},"    while current > 0:\n",[85,8245,8246],{"class":87,"line":106},[85,8247,8248],{},"        yield current\n",[85,8250,8251],{"class":87,"line":1129},[85,8252,8253],{},"        current = current - 1\n",[85,8255,8256],{"class":87,"line":1135},[85,8257,1082],{"emptyLinePlaceholder":212},[85,8259,8260],{"class":87,"line":2426},[85,8261,8262],{},"iterator = countdown(3)\n",[85,8264,8265],{"class":87,"line":2432},[85,8266,8267],{},"print(next(iterator))\n",[85,8269,8270],{"class":87,"line":3892},[85,8271,8267],{},[85,8273,8274],{"class":87,"line":4104},[85,8275,8267],{},[10,8277,112],{},[76,8279,8282],{"className":8280,"code":8281,"language":118,"meta":81},[116],"3\n2\n1\n",[14,8283,8281],{"__ignoreMap":81},[10,8285,123],{},[19,8287,126],{"id":126},[128,8289,8290,8296],{},[45,8291,7872,8292,8295],{},[14,8293,8294],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[45,8297,8298,8299,8301,8302,8304,8305,8308],{},"每次 ",[14,8300,8205],{}," 运行到下一个 ",[14,8303,8191],{}," 并暂停，局部变量 ",[14,8306,8307],{},"current"," 和执行位置被保留。",[312,8310,2636],{"id":2636},[10,8312,8313,8314,8316],{},"生成器的暂停位置可以展开成多次 ",[14,8315,8205],{}," 的时间线。",[10,8318,8319],{},[31,8320],{"alt":8321,"src":8322},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8324,8325,8326,8328],{},"每次请求只推进到下一个 ",[14,8327,8191],{},"；局部变量保留，代码不会从函数开头重新运行。",[19,8330,149],{"id":149},[42,8332,8333,8336],{},[45,8334,8335],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[45,8337,8338],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[19,8340,166],{"id":166},[128,8342,8343,8346],{},[45,8344,8345],{},"编写产生 1 到指定上限偶数的生成器。",[45,8347,3950,8348,8350,8351,8353],{},[14,8349,4278],{}," 遍历生成器，比较手动 ",[14,8352,8205],{}," 的差异。",[10,8355,183],{},[19,8357,186],{"id":186},[10,8359,8360],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,8362,196],{},{"title":81,"searchDepth":94,"depth":94,"links":8364},[8365,8366,8367,8368,8369,8372,8373,8374],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":8370},[8371],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8167,"description":8172},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[207,8382,8383],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8386,"title":8387,"body":8388,"category":207,"cover":208,"description":8392,"extension":210,"meta":8616,"navigation":212,"path":8617,"pinned":214,"publishedAt":215,"seo":8618,"slug":8619,"stem":8620,"summary":8621,"tags":8622,"updatedAt":215,"visible":212,"__hash__":8624},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8389,"toc":8604},[8390,8393,8395,8398,8400,8406,8409,8411,8431,8433,8435,8517,8519,8525,8527,8529,8551,8553,8556,8562,8569,8571,8581,8583,8595,8597,8599,8602],[10,8391,8392],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[19,8394,21],{"id":21},[10,8396,8397],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,8399,27],{"id":27},[10,8401,8402],{},[31,8403],{"alt":8404,"src":8405},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8407,8408],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[19,8410,40],{"id":40},[42,8412,8413,8422,8425],{},[45,8414,8415,8418,8419,55],{},[14,8416,8417],{},"@trace"," 等价于 ",[14,8420,8421],{},"add = trace(add)",[45,8423,8424],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[45,8426,8427,8430],{},[14,8428,8429],{},"functools.wraps"," 保留原函数名称和文档信息。",[19,8432,71],{"id":71},[10,8434,74],{},[76,8436,8438],{"className":392,"code":8437,"language":394,"meta":81,"style":81},"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",[14,8439,8440,8445,8449,8454,8459,8464,8469,8474,8479,8484,8489,8493,8498,8502,8506,8511],{"__ignoreMap":81},[85,8441,8442],{"class":87,"line":88},[85,8443,8444],{},"from functools import wraps\n",[85,8446,8447],{"class":87,"line":94},[85,8448,1082],{"emptyLinePlaceholder":212},[85,8450,8451],{"class":87,"line":100},[85,8452,8453],{},"def trace(function):\n",[85,8455,8456],{"class":87,"line":106},[85,8457,8458],{},"    @wraps(function)\n",[85,8460,8461],{"class":87,"line":1129},[85,8462,8463],{},"    def wrapper(*args, **kwargs):\n",[85,8465,8466],{"class":87,"line":1135},[85,8467,8468],{},"        print(\"开始：\", function.__name__)\n",[85,8470,8471],{"class":87,"line":2426},[85,8472,8473],{},"        result = function(*args, **kwargs)\n",[85,8475,8476],{"class":87,"line":2432},[85,8477,8478],{},"        print(\"结束：\", function.__name__)\n",[85,8480,8481],{"class":87,"line":3892},[85,8482,8483],{},"        return result\n",[85,8485,8486],{"class":87,"line":4104},[85,8487,8488],{},"    return wrapper\n",[85,8490,8491],{"class":87,"line":5769},[85,8492,1082],{"emptyLinePlaceholder":212},[85,8494,8495],{"class":87,"line":5774},[85,8496,8497],{},"@trace\n",[85,8499,8500],{"class":87,"line":7379},[85,8501,6122],{},[85,8503,8504],{"class":87,"line":7385},[85,8505,6127],{},[85,8507,8509],{"class":87,"line":8508},15,[85,8510,1082],{"emptyLinePlaceholder":212},[85,8512,8514],{"class":87,"line":8513},16,[85,8515,8516],{},"print(add(2, 3))\n",[10,8518,112],{},[76,8520,8523],{"className":8521,"code":8522,"language":118,"meta":81},[116],"开始： add\n结束： add\n5\n",[14,8524,8522],{"__ignoreMap":81},[10,8526,123],{},[19,8528,126],{"id":126},[128,8530,8531,8548],{},[45,8532,8533,8534,8537,8538,8541,8542,8545,8546,55],{},"解释器执行定义时，把原 ",[14,8535,8536],{},"add"," 函数交给 ",[14,8539,8540],{},"trace","，返回的 ",[14,8543,8544],{},"wrapper"," 重新绑定到名字 ",[14,8547,8536],{},[45,8549,8550],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[312,8552,2636],{"id":2636},[10,8554,8555],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8557,8558],{},[31,8559],{"alt":8560,"src":8561},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8563,8564,8566,8567,55],{},[14,8565,8417],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[14,8568,8421],{},[19,8570,149],{"id":149},[42,8572,8573,8578],{},[45,8574,8575,8576,55],{},"包装函数忘记返回原函数结果，调用方得到 ",[14,8577,5320],{},[45,8579,8580],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[19,8582,166],{"id":166},[128,8584,8585,8588],{},[45,8586,8587],{},"编写只记录调用次数的简单装饰器。",[45,8589,8590,8591,8594],{},"删除包装函数的 ",[14,8592,8593],{},"return result","，观察调用方得到什么。",[10,8596,183],{},[19,8598,186],{"id":186},[10,8600,8601],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,8603,196],{},{"title":81,"searchDepth":94,"depth":94,"links":8605},[8606,8607,8608,8609,8610,8613,8614,8615],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":8611},[8612],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8387,"description":8392},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[207,8623,5271],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8626,"title":8627,"body":8628,"category":207,"cover":208,"description":8632,"extension":210,"meta":8819,"navigation":212,"path":8820,"pinned":214,"publishedAt":215,"seo":8821,"slug":8822,"stem":8823,"summary":8824,"tags":8825,"updatedAt":215,"visible":212,"__hash__":8828},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8629,"toc":8807},[8630,8633,8635,8638,8640,8646,8649,8651,8662,8664,8666,8741,8743,8749,8751,8753,8764,8766,8769,8775,8778,8780,8788,8790,8798,8800,8802,8805],[10,8631,8632],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[19,8634,21],{"id":21},[10,8636,8637],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,8639,27],{"id":27},[10,8641,8642],{},[31,8643],{"alt":8644,"src":8645},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8647,8648],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[19,8650,40],{"id":40},[42,8652,8653,8656,8659],{},[45,8654,8655],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[45,8657,8658],{},"日志记录运行状态，测试判断结果是否符合约定。",[45,8660,8661],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[19,8663,71],{"id":71},[10,8665,74],{},[76,8667,8669],{"className":392,"code":8668,"language":394,"meta":81,"style":81},"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",[14,8670,8671,8676,8681,8685,8690,8694,8699,8704,8709,8713,8718,8723,8728,8732,8736],{"__ignoreMap":81},[85,8672,8673],{"class":87,"line":88},[85,8674,8675],{},"import logging\n",[85,8677,8678],{"class":87,"line":94},[85,8679,8680],{},"import unittest\n",[85,8682,8683],{"class":87,"line":100},[85,8684,1082],{"emptyLinePlaceholder":212},[85,8686,8687],{"class":87,"line":106},[85,8688,8689],{},"logging.basicConfig(level=logging.INFO)\n",[85,8691,8692],{"class":87,"line":1129},[85,8693,1082],{"emptyLinePlaceholder":212},[85,8695,8696],{"class":87,"line":1135},[85,8697,8698],{},"def clamp_progress(value):\n",[85,8700,8701],{"class":87,"line":2426},[85,8702,8703],{},"    logging.info(\"检查进度：%s\", value)\n",[85,8705,8706],{"class":87,"line":2432},[85,8707,8708],{},"    return max(0, min(100, value))\n",[85,8710,8711],{"class":87,"line":3892},[85,8712,1082],{"emptyLinePlaceholder":212},[85,8714,8715],{"class":87,"line":4104},[85,8716,8717],{},"class ProgressTest(unittest.TestCase):\n",[85,8719,8720],{"class":87,"line":5769},[85,8721,8722],{},"    def test_upper_limit(self):\n",[85,8724,8725],{"class":87,"line":5774},[85,8726,8727],{},"        self.assertEqual(clamp_progress(120), 100)\n",[85,8729,8730],{"class":87,"line":7379},[85,8731,1082],{"emptyLinePlaceholder":212},[85,8733,8734],{"class":87,"line":7385},[85,8735,6136],{},[85,8737,8738],{"class":87,"line":8508},[85,8739,8740],{},"    unittest.main()\n",[10,8742,112],{},[76,8744,8747],{"className":8745,"code":8746,"language":118,"meta":81},[116],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[14,8748,8746],{"__ignoreMap":81},[10,8750,123],{},[19,8752,126],{"id":126},[128,8754,8755,8761],{},[45,8756,8757,8760],{},[14,8758,8759],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[45,8762,8763],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[312,8765,2636],{"id":2636},[10,8767,8768],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8770,8771],{},[31,8772],{"alt":8773,"src":8774},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8776,8777],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[19,8779,149],{"id":149},[42,8781,8782,8785],{},[45,8783,8784],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[45,8786,8787],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[19,8789,166],{"id":166},[128,8791,8792,8795],{},[45,8793,8794],{},"为负数进度增加测试。",[45,8796,8797],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8799,183],{},[19,8801,186],{"id":186},[10,8803,8804],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,8806,196],{},{"title":81,"searchDepth":94,"depth":94,"links":8808},[8809,8810,8811,8812,8813,8816,8817,8818],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":8814},[8815],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8627,"description":8632},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[207,8826,8827],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8830,"title":8831,"body":8832,"category":207,"cover":208,"description":8836,"extension":210,"meta":9136,"navigation":212,"path":9137,"pinned":214,"publishedAt":215,"seo":9138,"slug":9139,"stem":9140,"summary":9141,"tags":9142,"updatedAt":215,"visible":212,"__hash__":9145},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8833,"toc":9123},[8834,8837,8839,8842,8844,8850,8853,8855,8870,8872,8874,9021,9023,9029,9031,9033,9046,9048,9051,9057,9060,9062,9065,9071,9078,9080,9091,9093,9114,9116,9118,9121],[10,8835,8836],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[19,8838,21],{"id":21},[10,8840,8841],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[19,8843,27],{"id":27},[10,8845,8846],{},[31,8847],{"alt":8848,"src":8849},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8851,8852],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[19,8854,40],{"id":40},[42,8856,8857,8860,8863],{},[45,8858,8859],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[45,8861,8862],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[45,8864,8865,8866,8869],{},"实际扩展前先为 ",[14,8867,8868],{},"add()"," 和存储边界补充测试。",[19,8871,71],{"id":71},[10,8873,74],{},[76,8875,8877],{"className":392,"code":8876,"language":394,"meta":81,"style":81},"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",[14,8878,8879,8883,8887,8891,8896,8901,8906,8911,8915,8920,8925,8930,8935,8940,8944,8949,8954,8960,8965,8971,8976,8981,8987,8993,8999,9004,9010,9015],{"__ignoreMap":81},[85,8880,8881],{"class":87,"line":88},[85,8882,6934],{},[85,8884,8885],{"class":87,"line":94},[85,8886,6543],{},[85,8888,8889],{"class":87,"line":100},[85,8890,1082],{"emptyLinePlaceholder":212},[85,8892,8893],{"class":87,"line":106},[85,8894,8895],{},"class LearningRecords:\n",[85,8897,8898],{"class":87,"line":1129},[85,8899,8900],{},"    def __init__(self, file_path):\n",[85,8902,8903],{"class":87,"line":1135},[85,8904,8905],{},"        self.file_path = Path(file_path)\n",[85,8907,8908],{"class":87,"line":2426},[85,8909,8910],{},"        self.items = []\n",[85,8912,8913],{"class":87,"line":2432},[85,8914,1082],{"emptyLinePlaceholder":212},[85,8916,8917],{"class":87,"line":3892},[85,8918,8919],{},"    def add(self, title):\n",[85,8921,8922],{"class":87,"line":4104},[85,8923,8924],{},"        title = title.strip()\n",[85,8926,8927],{"class":87,"line":5769},[85,8928,8929],{},"        if not title:\n",[85,8931,8932],{"class":87,"line":5774},[85,8933,8934],{},"            raise ValueError(\"课程名称不能为空\")\n",[85,8936,8937],{"class":87,"line":7379},[85,8938,8939],{},"        self.items.append({\"title\": title, \"done\": False})\n",[85,8941,8942],{"class":87,"line":7385},[85,8943,1082],{"emptyLinePlaceholder":212},[85,8945,8946],{"class":87,"line":8508},[85,8947,8948],{},"    def save(self):\n",[85,8950,8951],{"class":87,"line":8513},[85,8952,8953],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[85,8955,8957],{"class":87,"line":8956},17,[85,8958,8959],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[85,8961,8963],{"class":87,"line":8962},18,[85,8964,1082],{"emptyLinePlaceholder":212},[85,8966,8968],{"class":87,"line":8967},19,[85,8969,8970],{},"records = LearningRecords(\"learning-records.json\")\n",[85,8972,8974],{"class":87,"line":8973},20,[85,8975,1082],{"emptyLinePlaceholder":212},[85,8977,8979],{"class":87,"line":8978},21,[85,8980,7352],{},[85,8982,8984],{"class":87,"line":8983},22,[85,8985,8986],{},"    title = input(\"输入已学习课程：\")\n",[85,8988,8990],{"class":87,"line":8989},23,[85,8991,8992],{},"    records.add(title)\n",[85,8994,8996],{"class":87,"line":8995},24,[85,8997,8998],{},"    records.save()\n",[85,9000,9002],{"class":87,"line":9001},25,[85,9003,7362],{},[85,9005,9007],{"class":87,"line":9006},26,[85,9008,9009],{},"    print(\"无法保存：\", error)\n",[85,9011,9013],{"class":87,"line":9012},27,[85,9014,1132],{},[85,9016,9018],{"class":87,"line":9017},28,[85,9019,9020],{},"    print(\"已保存 1 条学习记录\")\n",[10,9022,112],{},[76,9024,9027],{"className":9025,"code":9026,"language":118,"meta":81},[116],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[14,9028,9026],{"__ignoreMap":81},[10,9030,123],{},[19,9032,126],{"id":126},[128,9034,9035,9041],{},[45,9036,9037,9038,9040],{},"输入层取得课程名后，",[14,9039,8868],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[45,9042,9043,9045],{},[14,9044,8100],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[312,9047,2636],{"id":2636},[10,9049,9050],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9052,9053],{},[31,9054],{"alt":9055,"src":9056},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9058,9059],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[312,9061,2636],{"id":4159},[10,9063,9064],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9066,9067],{},[31,9068],{"alt":9069,"src":9070},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9072,9073,9074,9077],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[14,9075,9076],{},"load()"," 把文件状态恢复到内存。",[19,9079,149],{"id":149},[42,9081,9082,9085],{},[45,9083,9084],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[45,9086,9087,9088,9090],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[14,9089,9076],{}," 是下一项必要扩展。",[19,9092,166],{"id":166},[128,9094,9095,9101,9104],{},[45,9096,9097,9098,9100],{},"增加 ",[14,9099,9076],{},"，文件不存在时从空列表开始。",[45,9102,9103],{},"增加按序号标记完成的功能，并校验序号范围。",[45,9105,9106,9107,9110,9111,9113],{},"把输入循环放进 ",[14,9108,9109],{},"main()","，通过 ",[14,9112,6078],{}," 控制程序入口。",[10,9115,183],{},[19,9117,186],{"id":186},[10,9119,9120],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[194,9122,196],{},{"title":81,"searchDepth":94,"depth":94,"links":9124},[9125,9126,9127,9128,9129,9133,9134,9135],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":9130},[9131,9132],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8831,"description":8836},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[207,9143,9144],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9147,9250,9369,9500,9643,9768,9905,10042,10183,10352,10489,10622,10745,10874,11001,11164,11340,11481,11610,11759,11902,12023,12146,12295,12448,12613,12740,12921,13064,13221,13372,13519,13674,13892,14047,14222,14373,14540,14727,14890,15132,15372],{"id":1379,"title":1380,"body":9148,"category":207,"cover":208,"description":1385,"extension":210,"meta":9247,"navigation":212,"path":1503,"pinned":214,"publishedAt":215,"seo":9248,"slug":1505,"stem":1506,"summary":1507,"tags":9249,"updatedAt":215,"visible":212,"__hash__":1510},{"type":7,"value":9149,"toc":9237},[9150,9152,9154,9156,9158,9162,9166,9168,9178,9180,9182,9190,9192,9197,9199,9201,9211,9213,9221,9223,9229,9231,9233,9235],[10,9151,1385],{},[19,9153,21],{"id":21},[10,9155,1390],{},[19,9157,27],{"id":27},[10,9159,9160],{},[31,9161],{"alt":1397,"src":1398},[10,9163,9164,1403],{},[14,9165,16],{},[19,9167,40],{"id":40},[42,9169,9170,9174,9176],{},[45,9171,1410,9172,1413],{},[14,9173,16],{},[45,9175,1416],{},[45,9177,1419],{},[19,9179,71],{"id":71},[10,9181,74],{},[76,9183,9184],{"className":392,"code":1426,"language":394,"meta":81,"style":81},[14,9185,9186],{"__ignoreMap":81},[85,9187,9188],{"class":87,"line":88},[85,9189,1426],{},[10,9191,112],{},[76,9193,9195],{"className":9194,"code":1438,"language":118,"meta":81},[116],[14,9196,1438],{"__ignoreMap":81},[10,9198,123],{},[19,9200,126],{"id":126},[128,9202,9203,9207],{},[45,9204,1449,9205,1453],{},[14,9206,1452],{},[45,9208,1456,9209,1459],{},[14,9210,145],{},[19,9212,149],{"id":149},[42,9214,9215,9217],{},[45,9216,1466],{},[45,9218,1469,9219,1472],{},[14,9220,16],{},[19,9222,166],{"id":166},[128,9224,9225,9227],{},[45,9226,1479],{},[45,9228,1482],{},[10,9230,183],{},[19,9232,186],{"id":186},[10,9234,1489],{},[194,9236,196],{},{"title":81,"searchDepth":94,"depth":94,"links":9238},[9239,9240,9241,9242,9243,9244,9245,9246],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":1380,"description":1385},[207,1375,1509],{"id":1512,"title":1513,"body":9251,"category":207,"cover":208,"description":1518,"extension":210,"meta":9366,"navigation":212,"path":1655,"pinned":214,"publishedAt":215,"seo":9367,"slug":1657,"stem":1658,"summary":1659,"tags":9368,"updatedAt":215,"visible":212,"__hash__":1662},{"type":7,"value":9252,"toc":9356},[9253,9255,9257,9259,9261,9265,9269,9271,9281,9283,9285,9305,9307,9312,9314,9316,9326,9328,9338,9340,9348,9350,9352,9354],[10,9254,1518],{},[19,9256,21],{"id":21},[10,9258,1523],{},[19,9260,27],{"id":27},[10,9262,9263],{},[31,9264],{"alt":1530,"src":1531},[10,9266,1534,9267,1537],{},[14,9268,50],{},[19,9270,40],{"id":40},[42,9272,9273,9275,9277],{},[45,9274,1544],{},[45,9276,1547],{},[45,9278,1550,9279,1554],{},[14,9280,1553],{},[19,9282,71],{"id":71},[10,9284,1559],{},[76,9286,9287],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,9288,9289,9295],{"__ignoreMap":81},[85,9290,9291,9293],{"class":87,"line":88},[85,9292,50],{"class":585},[85,9294,589],{"class":588},[85,9296,9297,9299,9301,9303],{"class":87,"line":94},[85,9298,50],{"class":585},[85,9300,618],{"class":588},[85,9302,622],{"class":621},[85,9304,589],{"class":588},[10,9306,112],{},[76,9308,9310],{"className":9309,"code":1585,"language":118,"meta":81},[116],[14,9311,1585],{"__ignoreMap":81},[10,9313,123],{},[19,9315,126],{"id":126},[128,9317,9318,9322],{},[45,9319,9320,1599],{},[14,9321,1598],{},[45,9323,9324,1604],{},[14,9325,683],{},[19,9327,149],{"id":149},[42,9329,9330,9334],{},[45,9331,1611,9332,1614],{},[14,9333,50],{},[45,9335,1617,9336,1620],{},[14,9337,50],{},[19,9339,166],{"id":166},[128,9341,9342,9346],{},[45,9343,922,9344,1630],{},[14,9345,1629],{},[45,9347,1633],{},[10,9349,183],{},[19,9351,186],{"id":186},[10,9353,1640],{},[194,9355,1643],{},{"title":81,"searchDepth":94,"depth":94,"links":9357},[9358,9359,9360,9361,9362,9363,9364,9365],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":1513,"description":1518},[207,1661,1036],{"id":4,"title":5,"body":9370,"category":207,"cover":208,"description":209,"extension":210,"meta":9497,"navigation":212,"path":213,"pinned":214,"publishedAt":215,"seo":9498,"slug":217,"stem":218,"summary":219,"tags":9499,"updatedAt":215,"visible":212,"__hash__":223},{"type":7,"value":9371,"toc":9487},[9372,9376,9378,9380,9382,9386,9388,9390,9406,9408,9410,9430,9432,9437,9439,9441,9453,9455,9465,9467,9477,9479,9481,9485],[10,9373,12,9374,17],{},[14,9375,16],{},[19,9377,21],{"id":21},[10,9379,24],{},[19,9381,27],{"id":27},[10,9383,9384],{},[31,9385],{"alt":33,"src":34},[10,9387,37],{},[19,9389,40],{"id":40},[42,9391,9392,9398,9402],{},[45,9393,47,9394,51,9396,55],{},[14,9395,50],{},[14,9397,54],{},[45,9399,58,9400,62],{},[14,9401,61],{},[45,9403,65,9404,68],{},[14,9405,16],{},[19,9407,71],{"id":71},[10,9409,74],{},[76,9411,9412],{"className":78,"code":79,"language":80,"meta":81,"style":81},[14,9413,9414,9418,9422,9426],{"__ignoreMap":81},[85,9415,9416],{"class":87,"line":88},[85,9417,91],{},[85,9419,9420],{"class":87,"line":94},[85,9421,97],{},[85,9423,9424],{"class":87,"line":100},[85,9425,103],{},[85,9427,9428],{"class":87,"line":106},[85,9429,109],{},[10,9431,112],{},[76,9433,9435],{"className":9434,"code":117,"language":118,"meta":81},[116],[14,9436,117],{"__ignoreMap":81},[10,9438,123],{},[19,9440,126],{"id":126},[128,9442,9443,9449],{},[45,9444,132,9445,136,9447,55],{},[14,9446,135],{},[14,9448,139],{},[45,9450,142,9451,146],{},[14,9452,145],{},[19,9454,149],{"id":149},[42,9456,9457,9463],{},[45,9458,154,9459,157,9461,160],{},[14,9460,54],{},[14,9462,16],{},[45,9464,163],{},[19,9466,166],{"id":166},[128,9468,9469,9473],{},[45,9470,171,9471,55],{},[14,9472,174],{},[45,9474,177,9475,180],{},[14,9476,145],{},[10,9478,183],{},[19,9480,186],{"id":186},[10,9482,189,9483,192],{},[14,9484,16],{},[194,9486,196],{},{"title":81,"searchDepth":94,"depth":94,"links":9488},[9489,9490,9491,9492,9493,9494,9495,9496],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5,"description":209},[207,221,222],{"id":1795,"title":1796,"body":9501,"category":207,"cover":208,"description":1801,"extension":210,"meta":9640,"navigation":212,"path":1973,"pinned":214,"publishedAt":215,"seo":9641,"slug":1975,"stem":1976,"summary":1977,"tags":9642,"updatedAt":215,"visible":212,"__hash__":1981},{"type":7,"value":9502,"toc":9630},[9503,9505,9507,9509,9511,9515,9519,9521,9533,9535,9537,9573,9575,9580,9582,9584,9600,9602,9612,9614,9622,9624,9626,9628],[10,9504,1801],{},[19,9506,21],{"id":21},[10,9508,1806],{},[19,9510,27],{"id":27},[10,9512,9513],{},[31,9514],{"alt":1813,"src":1814},[10,9516,9517,1820],{},[14,9518,1819],{},[19,9520,40],{"id":40},[42,9522,9523,9525,9531],{},[45,9524,1827],{},[45,9526,9527,1833,9529,1837],{},[14,9528,1832],{},[14,9530,1836],{},[45,9532,1840],{},[19,9534,71],{"id":71},[10,9536,1559],{},[76,9538,9539],{"className":576,"code":1847,"language":578,"meta":81,"style":81},[14,9540,9541,9547,9553,9557,9567],{"__ignoreMap":81},[85,9542,9543,9545],{"class":87,"line":88},[85,9544,1854],{"class":585},[85,9546,1857],{"class":621},[85,9548,9549,9551],{"class":87,"line":94},[85,9550,1862],{"class":588},[85,9552,1857],{"class":621},[85,9554,9555],{"class":87,"line":100},[85,9556,1869],{"class":588},[85,9558,9559,9561,9563,9565],{"class":87,"line":106},[85,9560,1874],{"class":588},[85,9562,1877],{"class":621},[85,9564,1881],{"class":1880},[85,9566,1201],{"class":621},[85,9568,9569,9571],{"class":87,"line":1129},[85,9570,50],{"class":585},[85,9572,1201],{"class":621},[10,9574,112],{},[76,9576,9578],{"className":9577,"code":1895,"language":118,"meta":81},[116],[14,9579,1895],{"__ignoreMap":81},[10,9581,123],{},[19,9583,126],{"id":126},[128,9585,9586,9594],{},[45,9587,9588,1908,9590,1911,9592,1914],{},[14,9589,1854],{},[14,9591,1862],{},[14,9593,1832],{},[45,9595,9596,1919,9598,1923],{},[14,9597,1819],{},[14,9599,1922],{},[19,9601,149],{"id":149},[42,9603,9604,9610],{},[45,9605,1930,9606,1144,9608,55],{},[14,9607,1832],{},[14,9609,1836],{},[45,9611,1937],{},[19,9613,166],{"id":166},[128,9615,9616,9620],{},[45,9617,1944,9618,1948],{},[14,9619,1947],{},[45,9621,1951],{},[10,9623,183],{},[19,9625,186],{"id":186},[10,9627,1958],{},[194,9629,1961],{},{"title":81,"searchDepth":94,"depth":94,"links":9631},[9632,9633,9634,9635,9636,9637,9638,9639],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":1796,"description":1801},[207,1979,1980],{"id":1983,"title":1984,"body":9644,"category":207,"cover":208,"description":1989,"extension":210,"meta":9765,"navigation":212,"path":2138,"pinned":214,"publishedAt":215,"seo":9766,"slug":2140,"stem":2141,"summary":2142,"tags":9767,"updatedAt":215,"visible":212,"__hash__":2146},{"type":7,"value":9645,"toc":9755},[9646,9648,9650,9652,9654,9658,9666,9668,9682,9684,9686,9702,9704,9709,9711,9713,9727,9729,9735,9737,9747,9749,9751,9753],[10,9647,1989],{},[19,9649,21],{"id":21},[10,9651,1994],{},[19,9653,27],{"id":27},[10,9655,9656],{},[31,9657],{"alt":2001,"src":2002},[10,9659,2005,9660,55,9662,2011,9664,55],{},[14,9661,145],{},[14,9663,2010],{},[14,9665,135],{},[19,9667,40],{"id":40},[42,9669,9670,9674,9680],{},[45,9671,9672,2023],{},[14,9673,2022],{},[45,9675,9676,2029,9678,55],{},[14,9677,2028],{},[14,9679,2032],{},[45,9681,2035],{},[19,9683,71],{"id":71},[10,9685,74],{},[76,9687,9688],{"className":392,"code":2042,"language":394,"meta":81,"style":81},[14,9689,9690,9694,9698],{"__ignoreMap":81},[85,9691,9692],{"class":87,"line":88},[85,9693,2049],{},[85,9695,9696],{"class":87,"line":94},[85,9697,2054],{},[85,9699,9700],{"class":87,"line":100},[85,9701,2059],{},[10,9703,112],{},[76,9705,9707],{"className":9706,"code":2065,"language":118,"meta":81},[116],[14,9708,2065],{"__ignoreMap":81},[10,9710,123],{},[19,9712,126],{"id":126},[128,9714,9715,9721],{},[45,9716,9717,2079,9719,55],{},[14,9718,2078],{},[14,9720,2032],{},[45,9722,9723,2086,9725,2090],{},[14,9724,145],{},[14,9726,2089],{},[19,9728,149],{"id":149},[42,9730,9731,9733],{},[45,9732,2097],{},[45,9734,2100],{},[19,9736,166],{"id":166},[128,9738,9739,9741],{},[45,9740,2107],{},[45,9742,2110,9743,2113,9745,2117],{},[14,9744,2010],{},[14,9746,2116],{},[10,9748,183],{},[19,9750,186],{"id":186},[10,9752,2124],{},[194,9754,196],{},{"title":81,"searchDepth":94,"depth":94,"links":9756},[9757,9758,9759,9760,9761,9762,9763,9764],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":1984,"description":1989},[207,2144,2145],{"id":2148,"title":2149,"body":9769,"category":207,"cover":208,"description":2154,"extension":210,"meta":9902,"navigation":212,"path":2322,"pinned":214,"publishedAt":215,"seo":9903,"slug":2324,"stem":2325,"summary":2326,"tags":9904,"updatedAt":215,"visible":212,"__hash__":2330},{"type":7,"value":9770,"toc":9892},[9771,9773,9775,9777,9779,9783,9785,9787,9803,9805,9807,9831,9833,9838,9840,9842,9858,9860,9872,9874,9884,9886,9888,9890],[10,9772,2154],{},[19,9774,21],{"id":21},[10,9776,2159],{},[19,9778,27],{"id":27},[10,9780,9781],{},[31,9782],{"alt":2166,"src":2167},[10,9784,2170],{},[19,9786,40],{"id":40},[42,9788,9789,9791,9797],{},[45,9790,2177],{},[45,9792,2180,9793,2113,9795,2187],{},[14,9794,2183],{},[14,9796,2186],{},[45,9798,2190,9799,2194,9801,2198],{},[14,9800,2193],{},[14,9802,2197],{},[19,9804,71],{"id":71},[10,9806,74],{},[76,9808,9809],{"className":392,"code":2205,"language":394,"meta":81,"style":81},[14,9810,9811,9815,9819,9823,9827],{"__ignoreMap":81},[85,9812,9813],{"class":87,"line":88},[85,9814,2212],{},[85,9816,9817],{"class":87,"line":94},[85,9818,2217],{},[85,9820,9821],{"class":87,"line":100},[85,9822,1082],{"emptyLinePlaceholder":212},[85,9824,9825],{"class":87,"line":106},[85,9826,2226],{},[85,9828,9829],{"class":87,"line":1129},[85,9830,2217],{},[10,9832,112],{},[76,9834,9836],{"className":9835,"code":2236,"language":118,"meta":81},[116],[14,9837,2236],{"__ignoreMap":81},[10,9839,123],{},[19,9841,126],{"id":126},[128,9843,9844,9850],{},[45,9845,922,9846,2250,9848,2253],{},[14,9847,2249],{},[14,9849,2183],{},[45,9851,922,9852,2259,9854,2263,9856,55],{},[14,9853,2258],{},[14,9855,2262],{},[14,9857,2266],{},[19,9859,149],{"id":149},[42,9861,9862,9864],{},[45,9863,2273],{},[45,9865,2276,9866,2194,9868,2194,9870,2284],{},[14,9867,2193],{},[14,9869,2197],{},[14,9871,2283],{},[19,9873,166],{"id":166},[128,9875,9876,9882],{},[45,9877,2291,9878,1144,9880,2298],{},[14,9879,2294],{},[14,9881,2297],{},[45,9883,2301],{},[10,9885,183],{},[19,9887,186],{"id":186},[10,9889,2308],{},[194,9891,196],{},{"title":81,"searchDepth":94,"depth":94,"links":9893},[9894,9895,9896,9897,9898,9899,9900,9901],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":2149,"description":2154},[207,2328,2329],{"id":2332,"title":2333,"body":9906,"category":207,"cover":208,"description":2338,"extension":210,"meta":10039,"navigation":212,"path":2505,"pinned":214,"publishedAt":215,"seo":10040,"slug":2507,"stem":2508,"summary":2509,"tags":10041,"updatedAt":215,"visible":212,"__hash__":2513},{"type":7,"value":9907,"toc":10029},[9908,9910,9912,9914,9916,9920,9922,9924,9942,9944,9946,9982,9984,9989,9991,9993,10003,10005,10013,10015,10021,10023,10025,10027],[10,9909,2338],{},[19,9911,21],{"id":21},[10,9913,2343],{},[19,9915,27],{"id":27},[10,9917,9918],{},[31,9919],{"alt":2350,"src":2351},[10,9921,2354],{},[19,9923,40],{"id":40},[42,9925,9926,9932,9940],{},[45,9927,9928,2364,9930,2368],{},[14,9929,2363],{},[14,9931,2367],{},[45,9933,9934,2374,9936,2378,9938,2382],{},[14,9935,2373],{},[14,9937,2377],{},[14,9939,2381],{},[45,9941,2385],{},[19,9943,71],{"id":71},[10,9945,74],{},[76,9947,9948],{"className":392,"code":2392,"language":394,"meta":81,"style":81},[14,9949,9950,9954,9958,9962,9966,9970,9974,9978],{"__ignoreMap":81},[85,9951,9952],{"class":87,"line":88},[85,9953,2399],{},[85,9955,9956],{"class":87,"line":94},[85,9957,2404],{},[85,9959,9960],{"class":87,"line":100},[85,9961,2409],{},[85,9963,9964],{"class":87,"line":106},[85,9965,1082],{"emptyLinePlaceholder":212},[85,9967,9968],{"class":87,"line":1129},[85,9969,2418],{},[85,9971,9972],{"class":87,"line":1135},[85,9973,2423],{},[85,9975,9976],{"class":87,"line":2426},[85,9977,2429],{},[85,9979,9980],{"class":87,"line":2432},[85,9981,2435],{},[10,9983,112],{},[76,9985,9987],{"className":9986,"code":2441,"language":118,"meta":81},[116],[14,9988,2441],{"__ignoreMap":81},[10,9990,123],{},[19,9992,126],{"id":126},[128,9994,9995,9999],{},[45,9996,9997,2455],{},[14,9998,2454],{},[45,10000,10001,2461],{},[14,10002,2460],{},[19,10004,149],{"id":149},[42,10006,10007,10011],{},[45,10008,2468,10009,55],{},[14,10010,2471],{},[45,10012,2474],{},[19,10014,166],{"id":166},[128,10016,10017,10019],{},[45,10018,2481],{},[45,10020,2484],{},[10,10022,183],{},[19,10024,186],{"id":186},[10,10026,2491],{},[194,10028,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10030},[10031,10032,10033,10034,10035,10036,10037,10038],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":2333,"description":2338},[207,2511,2512],{"id":2515,"title":2516,"body":10043,"category":207,"cover":208,"description":2521,"extension":210,"meta":10180,"navigation":212,"path":2698,"pinned":214,"publishedAt":215,"seo":10181,"slug":2700,"stem":2701,"summary":2702,"tags":10182,"updatedAt":215,"visible":212,"__hash__":2706},{"type":7,"value":10044,"toc":10168},[10045,10047,10049,10051,10053,10057,10063,10065,10073,10075,10077,10101,10103,10108,10110,10112,10130,10132,10134,10138,10140,10142,10148,10150,10160,10162,10164,10166],[10,10046,2521],{},[19,10048,21],{"id":21},[10,10050,2526],{},[19,10052,27],{"id":27},[10,10054,10055],{},[31,10056],{"alt":2533,"src":2534},[10,10058,2537,10059,2541,10061,55],{},[14,10060,2540],{},[14,10062,2544],{},[19,10064,40],{"id":40},[42,10066,10067,10069,10071],{},[45,10068,2551],{},[45,10070,2554],{},[45,10072,2557],{},[19,10074,71],{"id":71},[10,10076,74],{},[76,10078,10079],{"className":392,"code":2564,"language":394,"meta":81,"style":81},[14,10080,10081,10085,10089,10093,10097],{"__ignoreMap":81},[85,10082,10083],{"class":87,"line":88},[85,10084,2571],{},[85,10086,10087],{"class":87,"line":94},[85,10088,2576],{},[85,10090,10091],{"class":87,"line":100},[85,10092,2581],{},[85,10094,10095],{"class":87,"line":106},[85,10096,2586],{},[85,10098,10099],{"class":87,"line":1129},[85,10100,2591],{},[10,10102,112],{},[76,10104,10106],{"className":10105,"code":2597,"language":118,"meta":81},[116],[14,10107,2597],{"__ignoreMap":81},[10,10109,123],{},[19,10111,126],{"id":126},[128,10113,10114,10122],{},[45,10115,2608,10116,2611,10118,2615,10120,2619],{},[14,10117,207],{},[14,10119,2614],{},[14,10121,2618],{},[45,10123,10124,2625,10126,2629,10128,2633],{},[14,10125,2624],{},[14,10127,2628],{},[14,10129,2632],{},[312,10131,2636],{"id":2636},[10,10133,2639],{},[10,10135,10136],{},[31,10137],{"alt":2644,"src":2645},[10,10139,2648],{},[19,10141,149],{"id":149},[42,10143,10144,10146],{},[45,10145,2655],{},[45,10147,2658],{},[19,10149,166],{"id":166},[128,10151,10152,10158],{},[45,10153,2665,10154,2669,10156,55],{},[14,10155,2668],{},[14,10157,2672],{},[45,10159,2675],{},[10,10161,183],{},[19,10163,186],{"id":186},[10,10165,2682],{},[194,10167,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10169},[10170,10171,10172,10173,10174,10177,10178,10179],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":10175},[10176],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":2516,"description":2521},[207,2704,2705],{"id":2708,"title":2709,"body":10184,"category":207,"cover":208,"description":2714,"extension":210,"meta":10349,"navigation":212,"path":2929,"pinned":214,"publishedAt":215,"seo":10350,"slug":2931,"stem":2932,"summary":2933,"tags":10351,"updatedAt":215,"visible":212,"__hash__":2937},{"type":7,"value":10185,"toc":10337},[10186,10188,10190,10192,10194,10198,10204,10206,10226,10228,10230,10266,10268,10273,10275,10277,10291,10293,10295,10299,10305,10307,10317,10319,10329,10331,10333,10335],[10,10187,2714],{},[19,10189,21],{"id":21},[10,10191,2719],{},[19,10193,27],{"id":27},[10,10195,10196],{},[31,10197],{"alt":2726,"src":2727},[10,10199,2730,10200,993,10202,2737],{},[14,10201,2733],{},[14,10203,2736],{},[19,10205,40],{"id":40},[42,10207,10208,10216,10224],{},[45,10209,10210,2747,10212,2751,10214,2755],{},[14,10211,2746],{},[14,10213,2750],{},[14,10215,2754],{},[45,10217,10218,2761,10220,2765,10222,2769],{},[14,10219,2760],{},[14,10221,2764],{},[14,10223,2768],{},[45,10225,2772],{},[19,10227,71],{"id":71},[10,10229,74],{},[76,10231,10232],{"className":392,"code":2779,"language":394,"meta":81,"style":81},[14,10233,10234,10238,10242,10246,10250,10254,10258,10262],{"__ignoreMap":81},[85,10235,10236],{"class":87,"line":88},[85,10237,2786],{},[85,10239,10240],{"class":87,"line":94},[85,10241,2791],{},[85,10243,10244],{"class":87,"line":100},[85,10245,1082],{"emptyLinePlaceholder":212},[85,10247,10248],{"class":87,"line":106},[85,10249,2800],{},[85,10251,10252],{"class":87,"line":1129},[85,10253,2805],{},[85,10255,10256],{"class":87,"line":1135},[85,10257,2810],{},[85,10259,10260],{"class":87,"line":2426},[85,10261,2815],{},[85,10263,10264],{"class":87,"line":2432},[85,10265,2820],{},[10,10267,112],{},[76,10269,10271],{"className":10270,"code":2826,"language":118,"meta":81},[116],[14,10272,2826],{"__ignoreMap":81},[10,10274,123],{},[19,10276,126],{"id":126},[128,10278,10279,10285],{},[45,10280,10281,2840,10283,2844],{},[14,10282,2839],{},[14,10284,2843],{},[45,10286,10287,2850,10289,2853],{},[14,10288,2849],{},[14,10290,2768],{},[312,10292,2636],{"id":2636},[10,10294,2858],{},[10,10296,10297],{},[31,10298],{"alt":2863,"src":2864},[10,10300,10301,2869,10303,2872],{},[14,10302,2760],{},[14,10304,2764],{},[19,10306,149],{"id":149},[42,10308,10309,10315],{},[45,10310,2879,10311,2882,10313,2885],{},[14,10312,2754],{},[14,10314,2746],{},[45,10316,2888],{},[19,10318,166],{"id":166},[128,10320,10321,10325],{},[45,10322,2895,10323,2899],{},[14,10324,2898],{},[45,10326,2902,10327,2906],{},[14,10328,2905],{},[10,10330,183],{},[19,10332,186],{"id":186},[10,10334,2913],{},[194,10336,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10338},[10339,10340,10341,10342,10343,10346,10347,10348],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":10344},[10345],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":2709,"description":2714},[207,2935,2936],{"id":2939,"title":2940,"body":10353,"category":207,"cover":208,"description":2945,"extension":210,"meta":10486,"navigation":212,"path":3114,"pinned":214,"publishedAt":215,"seo":10487,"slug":3116,"stem":3117,"summary":3118,"tags":10488,"updatedAt":215,"visible":212,"__hash__":3121},{"type":7,"value":10354,"toc":10476},[10355,10357,10359,10361,10363,10367,10377,10379,10389,10391,10393,10421,10423,10428,10430,10432,10446,10448,10456,10458,10468,10470,10472,10474],[10,10356,2945],{},[19,10358,21],{"id":21},[10,10360,2950],{},[19,10362,27],{"id":27},[10,10364,10365],{},[31,10366],{"alt":2957,"src":2958},[10,10368,10369,2964,10371,2968,10373,2972,10375,2976],{},[14,10370,2963],{},[14,10372,2967],{},[14,10374,2971],{},[14,10376,2975],{},[19,10378,40],{"id":40},[42,10380,10381,10383,10387],{},[45,10382,2983],{},[45,10384,10385,2988],{},[14,10386,2975],{},[45,10388,2991],{},[19,10390,71],{"id":71},[10,10392,74],{},[76,10394,10395],{"className":392,"code":2998,"language":394,"meta":81,"style":81},[14,10396,10397,10401,10405,10409,10413,10417],{"__ignoreMap":81},[85,10398,10399],{"class":87,"line":88},[85,10400,3005],{},[85,10402,10403],{"class":87,"line":94},[85,10404,3010],{},[85,10406,10407],{"class":87,"line":100},[85,10408,3015],{},[85,10410,10411],{"class":87,"line":106},[85,10412,1082],{"emptyLinePlaceholder":212},[85,10414,10415],{"class":87,"line":1129},[85,10416,3024],{},[85,10418,10419],{"class":87,"line":1135},[85,10420,3029],{},[10,10422,112],{},[76,10424,10426],{"className":10425,"code":3035,"language":118,"meta":81},[116],[14,10427,3035],{"__ignoreMap":81},[10,10429,123],{},[19,10431,126],{"id":126},[128,10433,10434,10440],{},[45,10435,3046,10436,3049,10438,3053],{},[14,10437,2963],{},[14,10439,3052],{},[45,10441,10442,3059,10444,3063],{},[14,10443,3058],{},[14,10445,3062],{},[19,10447,149],{"id":149},[42,10449,10450,10454],{},[45,10451,3070,10452,3074],{},[14,10453,3073],{},[45,10455,3077],{},[19,10457,166],{"id":166},[128,10459,10460,10462],{},[45,10461,3084],{},[45,10463,58,10464,3090,10466,3093],{},[14,10465,3089],{},[14,10467,2975],{},[10,10469,183],{},[19,10471,186],{"id":186},[10,10473,3100],{},[194,10475,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10477},[10478,10479,10480,10481,10482,10483,10484,10485],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":2940,"description":2945},[207,2283,3120],{"id":3123,"title":3124,"body":10490,"category":207,"cover":208,"description":3129,"extension":210,"meta":10619,"navigation":212,"path":3290,"pinned":214,"publishedAt":215,"seo":10620,"slug":3292,"stem":3293,"summary":3294,"tags":10621,"updatedAt":215,"visible":212,"__hash__":3298},{"type":7,"value":10491,"toc":10609},[10492,10494,10496,10498,10500,10504,10508,10510,10520,10522,10524,10556,10558,10563,10565,10567,10579,10581,10591,10593,10601,10603,10605,10607],[10,10493,3129],{},[19,10495,21],{"id":21},[10,10497,3134],{},[19,10499,27],{"id":27},[10,10501,10502],{},[31,10503],{"alt":3141,"src":3142},[10,10505,3145,10506,3149],{},[14,10507,3148],{},[19,10509,40],{"id":40},[42,10511,10512,10514,10516],{},[45,10513,3156],{},[45,10515,3159],{},[45,10517,3162,10518,55],{},[14,10519,3165],{},[19,10521,71],{"id":71},[10,10523,74],{},[76,10525,10526],{"className":392,"code":3172,"language":394,"meta":81,"style":81},[14,10527,10528,10532,10536,10540,10544,10548,10552],{"__ignoreMap":81},[85,10529,10530],{"class":87,"line":88},[85,10531,3179],{},[85,10533,10534],{"class":87,"line":94},[85,10535,3184],{},[85,10537,10538],{"class":87,"line":100},[85,10539,1082],{"emptyLinePlaceholder":212},[85,10541,10542],{"class":87,"line":106},[85,10543,3193],{},[85,10545,10546],{"class":87,"line":1129},[85,10547,3198],{},[85,10549,10550],{"class":87,"line":1135},[85,10551,3203],{},[85,10553,10554],{"class":87,"line":2426},[85,10555,3208],{},[10,10557,112],{},[76,10559,10561],{"className":10560,"code":3214,"language":118,"meta":81},[116],[14,10562,3214],{"__ignoreMap":81},[10,10564,123],{},[19,10566,126],{"id":126},[128,10568,10569,10571],{},[45,10570,3225],{},[45,10572,10573,3231,10575,3235,10577,3239],{},[14,10574,3230],{},[14,10576,3234],{},[14,10578,3238],{},[19,10580,149],{"id":149},[42,10582,10583,10589],{},[45,10584,3246,10585,3250,10587,55],{},[14,10586,3249],{},[14,10588,3253],{},[45,10590,3256],{},[19,10592,166],{"id":166},[128,10594,10595,10597],{},[45,10596,3263],{},[45,10598,3266,10599,3269],{},[14,10600,3238],{},[10,10602,183],{},[19,10604,186],{"id":186},[10,10606,3276],{},[194,10608,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10610},[10611,10612,10613,10614,10615,10616,10617,10618],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":3124,"description":3129},[207,3296,3297],{"id":3300,"title":3301,"body":10623,"category":207,"cover":208,"description":3306,"extension":210,"meta":10742,"navigation":212,"path":3448,"pinned":214,"publishedAt":215,"seo":10743,"slug":3450,"stem":3451,"summary":3452,"tags":10744,"updatedAt":215,"visible":212,"__hash__":3455},{"type":7,"value":10624,"toc":10732},[10625,10627,10629,10631,10633,10637,10639,10641,10649,10651,10653,10681,10683,10688,10690,10692,10702,10704,10712,10714,10724,10726,10728,10730],[10,10626,3306],{},[19,10628,21],{"id":21},[10,10630,3311],{},[19,10632,27],{"id":27},[10,10634,10635],{},[31,10636],{"alt":3318,"src":3319},[10,10638,3322],{},[19,10640,40],{"id":40},[42,10642,10643,10645,10647],{},[45,10644,3329],{},[45,10646,3332],{},[45,10648,3335],{},[19,10650,71],{"id":71},[10,10652,74],{},[76,10654,10655],{"className":392,"code":3342,"language":394,"meta":81,"style":81},[14,10656,10657,10661,10665,10669,10673,10677],{"__ignoreMap":81},[85,10658,10659],{"class":87,"line":88},[85,10660,3349],{},[85,10662,10663],{"class":87,"line":94},[85,10664,3354],{},[85,10666,10667],{"class":87,"line":100},[85,10668,3359],{},[85,10670,10671],{"class":87,"line":106},[85,10672,1082],{"emptyLinePlaceholder":212},[85,10674,10675],{"class":87,"line":1129},[85,10676,3368],{},[85,10678,10679],{"class":87,"line":1135},[85,10680,3373],{},[10,10682,112],{},[76,10684,10686],{"className":10685,"code":3379,"language":118,"meta":81},[116],[14,10687,3379],{"__ignoreMap":81},[10,10689,123],{},[19,10691,126],{"id":126},[128,10693,10694,10698],{},[45,10695,10696,3393],{},[14,10697,3392],{},[45,10699,10700,3399],{},[14,10701,3398],{},[19,10703,149],{"id":149},[42,10705,10706,10710],{},[45,10707,3406,10708,3410],{},[14,10709,3409],{},[45,10711,3413],{},[19,10713,166],{"id":166},[128,10715,10716,10718],{},[45,10717,3420],{},[45,10719,2110,10720,2113,10722,3427],{},[14,10721,3409],{},[14,10723,3398],{},[10,10725,183],{},[19,10727,186],{"id":186},[10,10729,3434],{},[194,10731,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10733},[10734,10735,10736,10737,10738,10739,10740,10741],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":3301,"description":3306},[207,3454,3297],{"id":3457,"title":3458,"body":10746,"category":207,"cover":208,"description":3463,"extension":210,"meta":10871,"navigation":212,"path":3619,"pinned":214,"publishedAt":215,"seo":10872,"slug":3621,"stem":3622,"summary":3623,"tags":10873,"updatedAt":215,"visible":212,"__hash__":3626},{"type":7,"value":10747,"toc":10861},[10748,10750,10752,10754,10756,10760,10766,10768,10778,10780,10782,10810,10812,10817,10819,10821,10831,10833,10845,10847,10853,10855,10857,10859],[10,10749,3463],{},[19,10751,21],{"id":21},[10,10753,3468],{},[19,10755,27],{"id":27},[10,10757,10758],{},[31,10759],{"alt":3475,"src":3476},[10,10761,3479,10762,3483,10764,3486],{},[14,10763,3482],{},[14,10765,2183],{},[19,10767,40],{"id":40},[42,10769,10770,10772,10776],{},[45,10771,3493],{},[45,10773,2276,10774,3499],{},[14,10775,3498],{},[45,10777,3502],{},[19,10779,71],{"id":71},[10,10781,74],{},[76,10783,10784],{"className":392,"code":3509,"language":394,"meta":81,"style":81},[14,10785,10786,10790,10794,10798,10802,10806],{"__ignoreMap":81},[85,10787,10788],{"class":87,"line":88},[85,10789,3516],{},[85,10791,10792],{"class":87,"line":94},[85,10793,3521],{},[85,10795,10796],{"class":87,"line":100},[85,10797,1082],{"emptyLinePlaceholder":212},[85,10799,10800],{"class":87,"line":106},[85,10801,3530],{},[85,10803,10804],{"class":87,"line":1129},[85,10805,3535],{},[85,10807,10808],{"class":87,"line":1135},[85,10809,3540],{},[10,10811,112],{},[76,10813,10815],{"className":10814,"code":3546,"language":118,"meta":81},[116],[14,10816,3546],{"__ignoreMap":81},[10,10818,123],{},[19,10820,126],{"id":126},[128,10822,10823,10825],{},[45,10824,3557],{},[45,10826,3560,10827,3563,10829,3567],{},[14,10828,2183],{},[14,10830,3566],{},[19,10832,149],{"id":149},[42,10834,10835,10839],{},[45,10836,3574,10837,3578],{},[14,10838,3577],{},[45,10840,3581,10841,3585,10843,55],{},[14,10842,3584],{},[14,10844,3588],{},[19,10846,166],{"id":166},[128,10848,10849,10851],{},[45,10850,3595],{},[45,10852,3598],{},[10,10854,183],{},[19,10856,186],{"id":186},[10,10858,3605],{},[194,10860,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10862},[10863,10864,10865,10866,10867,10868,10869,10870],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":3458,"description":3463},[207,3625,3297],{"id":3628,"title":3629,"body":10875,"category":207,"cover":208,"description":3634,"extension":210,"meta":10998,"navigation":212,"path":3784,"pinned":214,"publishedAt":215,"seo":10999,"slug":3786,"stem":3787,"summary":3788,"tags":11000,"updatedAt":215,"visible":212,"__hash__":3791},{"type":7,"value":10876,"toc":10988},[10877,10879,10881,10883,10885,10889,10891,10893,10905,10907,10909,10937,10939,10944,10946,10948,10958,10960,10970,10972,10980,10982,10984,10986],[10,10878,3634],{},[19,10880,21],{"id":21},[10,10882,3639],{},[19,10884,27],{"id":27},[10,10886,10887],{},[31,10888],{"alt":3646,"src":3647},[10,10890,3650],{},[19,10892,40],{"id":40},[42,10894,10895,10897,10899],{},[45,10896,3657],{},[45,10898,3660],{},[45,10900,3663,10901,3667,10903,3671],{},[14,10902,3666],{},[14,10904,3670],{},[19,10906,71],{"id":71},[10,10908,74],{},[76,10910,10911],{"className":392,"code":3678,"language":394,"meta":81,"style":81},[14,10912,10913,10917,10921,10925,10929,10933],{"__ignoreMap":81},[85,10914,10915],{"class":87,"line":88},[85,10916,3685],{},[85,10918,10919],{"class":87,"line":94},[85,10920,3690],{},[85,10922,10923],{"class":87,"line":100},[85,10924,1082],{"emptyLinePlaceholder":212},[85,10926,10927],{"class":87,"line":106},[85,10928,3699],{},[85,10930,10931],{"class":87,"line":1129},[85,10932,3704],{},[85,10934,10935],{"class":87,"line":1135},[85,10936,3709],{},[10,10938,112],{},[76,10940,10942],{"className":10941,"code":3715,"language":118,"meta":81},[116],[14,10943,3715],{"__ignoreMap":81},[10,10945,123],{},[19,10947,126],{"id":126},[128,10949,10950,10952],{},[45,10951,3726],{},[45,10953,10954,3732,10956,3736],{},[14,10955,3731],{},[14,10957,3735],{},[19,10959,149],{"id":149},[42,10961,10962,10968],{},[45,10963,2276,10964,3745,10966,55],{},[14,10965,3670],{},[14,10967,3666],{},[45,10969,3750],{},[19,10971,166],{"id":166},[128,10973,10974,10978],{},[45,10975,3757,10976,3760],{},[14,10977,3666],{},[45,10979,3763],{},[10,10981,183],{},[19,10983,186],{"id":186},[10,10985,3770],{},[194,10987,196],{},{"title":81,"searchDepth":94,"depth":94,"links":10989},[10990,10991,10992,10993,10994,10995,10996,10997],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":3629,"description":3634},[207,3790,3297],{"id":3793,"title":3794,"body":11002,"category":207,"cover":208,"description":3799,"extension":210,"meta":11161,"navigation":212,"path":3998,"pinned":214,"publishedAt":215,"seo":11162,"slug":4000,"stem":4001,"summary":4002,"tags":11163,"updatedAt":215,"visible":212,"__hash__":4006},{"type":7,"value":11003,"toc":11149},[11004,11006,11008,11010,11012,11016,11022,11024,11036,11038,11040,11080,11082,11087,11089,11091,11105,11107,11109,11113,11115,11117,11127,11129,11141,11143,11145,11147],[10,11005,3799],{},[19,11007,21],{"id":21},[10,11009,3804],{},[19,11011,27],{"id":27},[10,11013,11014],{},[31,11015],{"alt":3811,"src":3812},[10,11017,11018,3818,11020,3822],{},[14,11019,3817],{},[14,11021,3821],{},[19,11023,40],{"id":40},[42,11025,11026,11032,11034],{},[45,11027,11028,3831,11030,3835],{},[14,11029,2746],{},[14,11031,3834],{},[45,11033,3838],{},[45,11035,3841],{},[19,11037,71],{"id":71},[10,11039,74],{},[76,11041,11042],{"className":392,"code":3848,"language":394,"meta":81,"style":81},[14,11043,11044,11048,11052,11056,11060,11064,11068,11072,11076],{"__ignoreMap":81},[85,11045,11046],{"class":87,"line":88},[85,11047,3855],{},[85,11049,11050],{"class":87,"line":94},[85,11051,3860],{},[85,11053,11054],{"class":87,"line":100},[85,11055,3865],{},[85,11057,11058],{"class":87,"line":106},[85,11059,1082],{"emptyLinePlaceholder":212},[85,11061,11062],{"class":87,"line":1129},[85,11063,3874],{},[85,11065,11066],{"class":87,"line":1135},[85,11067,3879],{},[85,11069,11070],{"class":87,"line":2426},[85,11071,3884],{},[85,11073,11074],{"class":87,"line":2432},[85,11075,3889],{},[85,11077,11078],{"class":87,"line":3892},[85,11079,3895],{},[10,11081,112],{},[76,11083,11085],{"className":11084,"code":3901,"language":118,"meta":81},[116],[14,11086,3901],{"__ignoreMap":81},[10,11088,123],{},[19,11090,126],{"id":126},[128,11092,11093,11097],{},[45,11094,11095,3915],{},[14,11096,3914],{},[45,11098,11099,3921,11101,3925,11103,3929],{},[14,11100,3920],{},[14,11102,3924],{},[14,11104,3928],{},[312,11106,2636],{"id":2636},[10,11108,3934],{},[10,11110,11111],{},[31,11112],{"alt":3939,"src":3940},[10,11114,3943],{},[19,11116,149],{"id":149},[42,11118,11119,11125],{},[45,11120,3950,11121,3953,11123,55],{},[14,11122,2746],{},[14,11124,3834],{},[45,11126,3958],{},[19,11128,166],{"id":166},[128,11130,11131,11133],{},[45,11132,3965],{},[45,11134,2276,11135,3971,11137,1144,11139,55],{},[14,11136,3970],{},[14,11138,3834],{},[14,11140,2746],{},[10,11142,183],{},[19,11144,186],{"id":186},[10,11146,3982],{},[194,11148,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11150},[11151,11152,11153,11154,11155,11158,11159,11160],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":11156},[11157],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":3794,"description":3799},[207,4004,4005],{"id":4008,"title":4009,"body":11165,"category":207,"cover":208,"description":4014,"extension":210,"meta":11337,"navigation":212,"path":4228,"pinned":214,"publishedAt":215,"seo":11338,"slug":4230,"stem":4231,"summary":4232,"tags":11339,"updatedAt":215,"visible":212,"__hash__":4235},{"type":7,"value":11166,"toc":11324},[11167,11169,11171,11173,11175,11179,11187,11189,11197,11199,11201,11245,11247,11252,11254,11256,11268,11270,11272,11276,11282,11284,11286,11290,11294,11296,11308,11310,11316,11318,11320,11322],[10,11168,4014],{},[19,11170,21],{"id":21},[10,11172,4019],{},[19,11174,27],{"id":27},[10,11176,11177],{},[31,11178],{"alt":4026,"src":4027},[10,11180,11181,2194,11183,2194,11185,4037],{},[14,11182,1143],{},[14,11184,4034],{},[14,11186,1147],{},[19,11188,40],{"id":40},[42,11190,11191,11193,11195],{},[45,11192,4044],{},[45,11194,4047],{},[45,11196,4050],{},[19,11198,71],{"id":71},[10,11200,74],{},[76,11202,11203],{"className":392,"code":4057,"language":394,"meta":81,"style":81},[14,11204,11205,11209,11213,11217,11221,11225,11229,11233,11237,11241],{"__ignoreMap":81},[85,11206,11207],{"class":87,"line":88},[85,11208,4064],{},[85,11210,11211],{"class":87,"line":94},[85,11212,1082],{"emptyLinePlaceholder":212},[85,11214,11215],{"class":87,"line":100},[85,11216,4073],{},[85,11218,11219],{"class":87,"line":106},[85,11220,4078],{},[85,11222,11223],{"class":87,"line":1129},[85,11224,4083],{},[85,11226,11227],{"class":87,"line":1135},[85,11228,4088],{},[85,11230,11231],{"class":87,"line":2426},[85,11232,1132],{},[85,11234,11235],{"class":87,"line":2432},[85,11236,4097],{},[85,11238,11239],{"class":87,"line":3892},[85,11240,1082],{"emptyLinePlaceholder":212},[85,11242,11243],{"class":87,"line":4104},[85,11244,4107],{},[10,11246,112],{},[76,11248,11250],{"className":11249,"code":4113,"language":118,"meta":81},[116],[14,11251,4113],{"__ignoreMap":81},[10,11253,123],{},[19,11255,126],{"id":126},[128,11257,11258,11262],{},[45,11259,4124,11260,4128],{},[14,11261,4127],{},[45,11263,11264,4134,11266,4137],{},[14,11265,4133],{},[14,11267,1147],{},[312,11269,2636],{"id":2636},[10,11271,4142],{},[10,11273,11274],{},[31,11275],{"alt":4147,"src":4148},[10,11277,11278,4153,11280,4156],{},[14,11279,4127],{},[14,11281,4133],{},[312,11283,2636],{"id":4159},[10,11285,4162],{},[10,11287,11288],{},[31,11289],{"alt":4167,"src":4168},[10,11291,4171,11292,4174],{},[14,11293,1143],{},[19,11295,149],{"id":149},[42,11297,11298,11302],{},[45,11299,4181,11300,4184],{},[14,11301,4133],{},[45,11303,4187,11304,4190,11306,4194],{},[14,11305,1143],{},[14,11307,4193],{},[19,11309,166],{"id":166},[128,11311,11312,11314],{},[45,11313,4201],{},[45,11315,4204],{},[10,11317,183],{},[19,11319,186],{"id":186},[10,11321,4211],{},[194,11323,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11325},[11326,11327,11328,11329,11330,11334,11335,11336],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":11331},[11332,11333],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4009,"description":4014},[207,1143,4234],{"id":4237,"title":4238,"body":11341,"category":207,"cover":208,"description":4243,"extension":210,"meta":11478,"navigation":212,"path":4410,"pinned":214,"publishedAt":215,"seo":11479,"slug":4412,"stem":4413,"summary":4414,"tags":11480,"updatedAt":215,"visible":212,"__hash__":4417},{"type":7,"value":11342,"toc":11466},[11343,11345,11347,11349,11351,11355,11359,11361,11371,11373,11375,11407,11409,11414,11416,11418,11428,11430,11432,11436,11440,11442,11448,11450,11458,11460,11462,11464],[10,11344,4243],{},[19,11346,21],{"id":21},[10,11348,4248],{},[19,11350,27],{"id":27},[10,11352,11353],{},[31,11354],{"alt":4255,"src":4256},[10,11356,11357,4262],{},[14,11358,4261],{},[19,11360,40],{"id":40},[42,11362,11363,11365,11367],{},[45,11364,4269],{},[45,11366,4272],{},[45,11368,4275,11369,4279],{},[14,11370,4278],{},[19,11372,71],{"id":71},[10,11374,74],{},[76,11376,11377],{"className":392,"code":4286,"language":394,"meta":81,"style":81},[14,11378,11379,11383,11387,11391,11395,11399,11403],{"__ignoreMap":81},[85,11380,11381],{"class":87,"line":88},[85,11382,4293],{},[85,11384,11385],{"class":87,"line":94},[85,11386,1082],{"emptyLinePlaceholder":212},[85,11388,11389],{"class":87,"line":100},[85,11390,4302],{},[85,11392,11393],{"class":87,"line":106},[85,11394,4307],{},[85,11396,11397],{"class":87,"line":1129},[85,11398,4312],{},[85,11400,11401],{"class":87,"line":1135},[85,11402,1082],{"emptyLinePlaceholder":212},[85,11404,11405],{"class":87,"line":2426},[85,11406,4321],{},[10,11408,112],{},[76,11410,11412],{"className":11411,"code":4327,"language":118,"meta":81},[116],[14,11413,4327],{"__ignoreMap":81},[10,11415,123],{},[19,11417,126],{"id":126},[128,11419,11420,11424],{},[45,11421,4338,11422,4342],{},[14,11423,4341],{},[45,11425,4345,11426,4348],{},[14,11427,4341],{},[312,11429,2636],{"id":2636},[10,11431,4353],{},[10,11433,11434],{},[31,11435],{"alt":4358,"src":4359},[10,11437,4362,11438,4365],{},[14,11439,4341],{},[19,11441,149],{"id":149},[42,11443,11444,11446],{},[45,11445,4372],{},[45,11447,4375],{},[19,11449,166],{"id":166},[128,11451,11452,11456],{},[45,11453,2276,11454,4384],{},[14,11455,4261],{},[45,11457,4387],{},[10,11459,183],{},[19,11461,186],{"id":186},[10,11463,4394],{},[194,11465,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11467},[11468,11469,11470,11471,11472,11475,11476,11477],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":11473},[11474],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4238,"description":4243},[207,4261,4416],{"id":4419,"title":4420,"body":11482,"category":207,"cover":208,"description":4425,"extension":210,"meta":11607,"navigation":212,"path":4574,"pinned":214,"publishedAt":215,"seo":11608,"slug":4576,"stem":4577,"summary":4578,"tags":11609,"updatedAt":215,"visible":212,"__hash__":4581},{"type":7,"value":11483,"toc":11597},[11484,11486,11488,11490,11492,11496,11500,11502,11512,11514,11516,11548,11550,11555,11557,11559,11571,11573,11579,11581,11589,11591,11593,11595],[10,11485,4425],{},[19,11487,21],{"id":21},[10,11489,4430],{},[19,11491,27],{"id":27},[10,11493,11494],{},[31,11495],{"alt":4437,"src":4438},[10,11497,11498,4443],{},[14,11499,4278],{},[19,11501,40],{"id":40},[42,11503,11504,11508,11510],{},[45,11505,11506,4453],{},[14,11507,4452],{},[45,11509,4456],{},[45,11511,4459],{},[19,11513,71],{"id":71},[10,11515,74],{},[76,11517,11518],{"className":392,"code":4466,"language":394,"meta":81,"style":81},[14,11519,11520,11524,11528,11532,11536,11540,11544],{"__ignoreMap":81},[85,11521,11522],{"class":87,"line":88},[85,11523,4473],{},[85,11525,11526],{"class":87,"line":94},[85,11527,1082],{"emptyLinePlaceholder":212},[85,11529,11530],{"class":87,"line":100},[85,11531,4482],{},[85,11533,11534],{"class":87,"line":106},[85,11535,4487],{},[85,11537,11538],{"class":87,"line":1129},[85,11539,1082],{"emptyLinePlaceholder":212},[85,11541,11542],{"class":87,"line":1135},[85,11543,4496],{},[85,11545,11546],{"class":87,"line":2426},[85,11547,4501],{},[10,11549,112],{},[76,11551,11553],{"className":11552,"code":4507,"language":118,"meta":81},[116],[14,11554,4507],{"__ignoreMap":81},[10,11556,123],{},[19,11558,126],{"id":126},[128,11560,11561,11567],{},[45,11562,4518,11563,4521,11565,4525],{},[14,11564,4278],{},[14,11566,4524],{},[45,11568,11569,4530],{},[14,11570,4452],{},[19,11572,149],{"id":149},[42,11574,11575,11577],{},[45,11576,4537],{},[45,11578,4540],{},[19,11580,166],{"id":166},[128,11582,11583,11585],{},[45,11584,4547],{},[45,11586,2276,11587,4553],{},[14,11588,4552],{},[10,11590,183],{},[19,11592,186],{"id":186},[10,11594,4560],{},[194,11596,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11598},[11599,11600,11601,11602,11603,11604,11605,11606],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4420,"description":4425},[207,4278,4580],{"id":4583,"title":4584,"body":11611,"category":207,"cover":208,"description":4589,"extension":210,"meta":11756,"navigation":212,"path":4764,"pinned":214,"publishedAt":215,"seo":11757,"slug":4766,"stem":4767,"summary":4768,"tags":11758,"updatedAt":215,"visible":212,"__hash__":4770},{"type":7,"value":11612,"toc":11746},[11613,11615,11617,11619,11621,11625,11631,11633,11647,11649,11651,11695,11697,11702,11704,11706,11716,11718,11730,11732,11738,11740,11742,11744],[10,11614,4589],{},[19,11616,21],{"id":21},[10,11618,4594],{},[19,11620,27],{"id":27},[10,11622,11623],{},[31,11624],{"alt":4601,"src":4602},[10,11626,11627,4608,11629,4612],{},[14,11628,4607],{},[14,11630,4611],{},[19,11632,40],{"id":40},[42,11634,11635,11637,11643],{},[45,11636,4619],{},[45,11638,11639,4624,11641,4627],{},[14,11640,4607],{},[14,11642,4261],{},[45,11644,4630,11645,4633],{},[14,11646,4611],{},[19,11648,71],{"id":71},[10,11650,74],{},[76,11652,11653],{"className":392,"code":4640,"language":394,"meta":81,"style":81},[14,11654,11655,11659,11663,11667,11671,11675,11679,11683,11687,11691],{"__ignoreMap":81},[85,11656,11657],{"class":87,"line":88},[85,11658,4647],{},[85,11660,11661],{"class":87,"line":94},[85,11662,1082],{"emptyLinePlaceholder":212},[85,11664,11665],{"class":87,"line":100},[85,11666,4656],{},[85,11668,11669],{"class":87,"line":106},[85,11670,4661],{},[85,11672,11673],{"class":87,"line":1129},[85,11674,4666],{},[85,11676,11677],{"class":87,"line":1135},[85,11678,4671],{},[85,11680,11681],{"class":87,"line":2426},[85,11682,4676],{},[85,11684,11685],{"class":87,"line":2432},[85,11686,4501],{},[85,11688,11689],{"class":87,"line":3892},[85,11690,1082],{"emptyLinePlaceholder":212},[85,11692,11693],{"class":87,"line":4104},[85,11694,4689],{},[10,11696,112],{},[76,11698,11700],{"className":11699,"code":4695,"language":118,"meta":81},[116],[14,11701,4695],{"__ignoreMap":81},[10,11703,123],{},[19,11705,126],{"id":126},[128,11707,11708,11712],{},[45,11709,4706,11710,4709],{},[14,11711,4607],{},[45,11713,4712,11714,4715],{},[14,11715,4611],{},[19,11717,149],{"id":149},[42,11719,11720,11724],{},[45,11721,3406,11722,4724],{},[14,11723,4607],{},[45,11725,4727,11726,4730,11728,4733],{},[14,11727,4261],{},[14,11729,4607],{},[19,11731,166],{"id":166},[128,11733,11734,11736],{},[45,11735,4740],{},[45,11737,4743],{},[10,11739,183],{},[19,11741,186],{"id":186},[10,11743,4750],{},[194,11745,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11747},[11748,11749,11750,11751,11752,11753,11754,11755],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4584,"description":4589},[207,4611,4607],{"id":4772,"title":4773,"body":11760,"category":207,"cover":208,"description":4778,"extension":210,"meta":11899,"navigation":212,"path":4950,"pinned":214,"publishedAt":215,"seo":11900,"slug":4952,"stem":4953,"summary":4954,"tags":11901,"updatedAt":215,"visible":212,"__hash__":4958},{"type":7,"value":11761,"toc":11887},[11762,11764,11766,11768,11770,11774,11776,11778,11794,11796,11798,11826,11828,11833,11835,11837,11849,11851,11853,11857,11859,11861,11871,11873,11879,11881,11883,11885],[10,11763,4778],{},[19,11765,21],{"id":21},[10,11767,4783],{},[19,11769,27],{"id":27},[10,11771,11772],{},[31,11773],{"alt":4790,"src":4791},[10,11775,4794],{},[19,11777,40],{"id":40},[42,11779,11780,11782,11784],{},[45,11781,4801],{},[45,11783,4804],{},[45,11785,4807,11786,2194,11788,4814,11790,2194,11792,55],{},[14,11787,4810],{},[14,11789,4813],{},[14,11791,4817],{},[14,11793,4820],{},[19,11795,71],{"id":71},[10,11797,74],{},[76,11799,11800],{"className":392,"code":4827,"language":394,"meta":81,"style":81},[14,11801,11802,11806,11810,11814,11818,11822],{"__ignoreMap":81},[85,11803,11804],{"class":87,"line":88},[85,11805,4834],{},[85,11807,11808],{"class":87,"line":94},[85,11809,1082],{"emptyLinePlaceholder":212},[85,11811,11812],{"class":87,"line":100},[85,11813,4843],{},[85,11815,11816],{"class":87,"line":106},[85,11817,4848],{},[85,11819,11820],{"class":87,"line":1129},[85,11821,4853],{},[85,11823,11824],{"class":87,"line":1135},[85,11825,4858],{},[10,11827,112],{},[76,11829,11831],{"className":11830,"code":4864,"language":118,"meta":81},[116],[14,11832,4864],{"__ignoreMap":81},[10,11834,123],{},[19,11836,126],{"id":126},[128,11838,11839,11847],{},[45,11840,4875,11841,4878,11843,1144,11845,55],{},[14,11842,4810],{},[14,11844,4881],{},[14,11846,4884],{},[45,11848,4887],{},[312,11850,2636],{"id":2636},[10,11852,4892],{},[10,11854,11855],{},[31,11856],{"alt":4897,"src":4898},[10,11858,4901],{},[19,11860,149],{"id":149},[42,11862,11863,11869],{},[45,11864,4908,11865,993,11867,4914],{},[14,11866,4911],{},[14,11868,4817],{},[45,11870,4917],{},[19,11872,166],{"id":166},[128,11874,11875,11877],{},[45,11876,4924],{},[45,11878,4927],{},[10,11880,183],{},[19,11882,186],{"id":186},[10,11884,4934],{},[194,11886,196],{},{"title":81,"searchDepth":94,"depth":94,"links":11888},[11889,11890,11891,11892,11893,11896,11897,11898],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":11894},[11895],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4773,"description":4778},[207,4956,4957],{"id":4960,"title":4961,"body":11903,"category":207,"cover":208,"description":4966,"extension":210,"meta":12020,"navigation":212,"path":5105,"pinned":214,"publishedAt":215,"seo":12021,"slug":5107,"stem":5108,"summary":5109,"tags":12022,"updatedAt":215,"visible":212,"__hash__":5113},{"type":7,"value":11904,"toc":12010},[11905,11907,11909,11911,11913,11917,11919,11921,11929,11931,11933,11965,11967,11972,11974,11976,11984,11986,11994,11996,12002,12004,12006,12008],[10,11906,4966],{},[19,11908,21],{"id":21},[10,11910,4971],{},[19,11912,27],{"id":27},[10,11914,11915],{},[31,11916],{"alt":4978,"src":4979},[10,11918,4982],{},[19,11920,40],{"id":40},[42,11922,11923,11925,11927],{},[45,11924,4989],{},[45,11926,4992],{},[45,11928,4995],{},[19,11930,71],{"id":71},[10,11932,74],{},[76,11934,11935],{"className":392,"code":5002,"language":394,"meta":81,"style":81},[14,11936,11937,11941,11945,11949,11953,11957,11961],{"__ignoreMap":81},[85,11938,11939],{"class":87,"line":88},[85,11940,5009],{},[85,11942,11943],{"class":87,"line":94},[85,11944,1082],{"emptyLinePlaceholder":212},[85,11946,11947],{"class":87,"line":100},[85,11948,5018],{},[85,11950,11951],{"class":87,"line":106},[85,11952,5023],{},[85,11954,11955],{"class":87,"line":1129},[85,11956,1082],{"emptyLinePlaceholder":212},[85,11958,11959],{"class":87,"line":1135},[85,11960,5032],{},[85,11962,11963],{"class":87,"line":2426},[85,11964,5037],{},[10,11966,112],{},[76,11968,11970],{"className":11969,"code":5043,"language":118,"meta":81},[116],[14,11971,5043],{"__ignoreMap":81},[10,11973,123],{},[19,11975,126],{"id":126},[128,11977,11978,11980],{},[45,11979,5054],{},[45,11981,5057,11982,5061],{},[14,11983,5060],{},[19,11985,149],{"id":149},[42,11987,11988,11992],{},[45,11989,5068,11990,5071],{},[14,11991,4278],{},[45,11993,5074],{},[19,11995,166],{"id":166},[128,11997,11998,12000],{},[45,11999,5081],{},[45,12001,5084],{},[10,12003,183],{},[19,12005,186],{"id":186},[10,12007,5091],{},[194,12009,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12011},[12012,12013,12014,12015,12016,12017,12018,12019],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":4961,"description":4966},[207,5111,5112],{"id":5115,"title":5116,"body":12024,"category":207,"cover":208,"description":5121,"extension":210,"meta":12143,"navigation":212,"path":5265,"pinned":214,"publishedAt":215,"seo":12144,"slug":5267,"stem":5268,"summary":5269,"tags":12145,"updatedAt":215,"visible":212,"__hash__":5273},{"type":7,"value":12025,"toc":12133},[12026,12028,12030,12032,12034,12038,12040,12042,12050,12052,12054,12086,12088,12093,12095,12097,12107,12109,12115,12117,12125,12127,12129,12131],[10,12027,5121],{},[19,12029,21],{"id":21},[10,12031,5126],{},[19,12033,27],{"id":27},[10,12035,12036],{},[31,12037],{"alt":5133,"src":5134},[10,12039,5137],{},[19,12041,40],{"id":40},[42,12043,12044,12046,12048],{},[45,12045,5144],{},[45,12047,5147],{},[45,12049,5150],{},[19,12051,71],{"id":71},[10,12053,74],{},[76,12055,12056],{"className":392,"code":5157,"language":394,"meta":81,"style":81},[14,12057,12058,12062,12066,12070,12074,12078,12082],{"__ignoreMap":81},[85,12059,12060],{"class":87,"line":88},[85,12061,5164],{},[85,12063,12064],{"class":87,"line":94},[85,12065,5169],{},[85,12067,12068],{"class":87,"line":100},[85,12069,5174],{},[85,12071,12072],{"class":87,"line":106},[85,12073,1082],{"emptyLinePlaceholder":212},[85,12075,12076],{"class":87,"line":1129},[85,12077,5183],{},[85,12079,12080],{"class":87,"line":1135},[85,12081,5188],{},[85,12083,12084],{"class":87,"line":2426},[85,12085,5193],{},[10,12087,112],{},[76,12089,12091],{"className":12090,"code":5199,"language":118,"meta":81},[116],[14,12092,5199],{"__ignoreMap":81},[10,12094,123],{},[19,12096,126],{"id":126},[128,12098,12099,12103],{},[45,12100,922,12101,5213],{},[14,12102,5212],{},[45,12104,5216,12105,5220],{},[14,12106,5219],{},[19,12108,149],{"id":149},[42,12110,12111,12113],{},[45,12112,5227],{},[45,12114,5230],{},[19,12116,166],{"id":166},[128,12118,12119,12123],{},[45,12120,5237,12121,5241],{},[14,12122,5240],{},[45,12124,5244],{},[10,12126,183],{},[19,12128,186],{"id":186},[10,12130,5251],{},[194,12132,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12134},[12135,12136,12137,12138,12139,12140,12141,12142],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5116,"description":5121},[207,5271,5272],{"id":5275,"title":5276,"body":12147,"category":207,"cover":208,"description":5281,"extension":210,"meta":12292,"navigation":212,"path":5462,"pinned":214,"publishedAt":215,"seo":12293,"slug":5464,"stem":5465,"summary":5466,"tags":12294,"updatedAt":215,"visible":212,"__hash__":5470},{"type":7,"value":12148,"toc":12280},[12149,12151,12153,12155,12157,12161,12165,12167,12179,12181,12183,12211,12213,12218,12220,12222,12236,12238,12240,12244,12252,12254,12264,12266,12272,12274,12276,12278],[10,12150,5281],{},[19,12152,21],{"id":21},[10,12154,5286],{},[19,12156,27],{"id":27},[10,12158,12159],{},[31,12160],{"alt":5293,"src":5294},[10,12162,5297,12163,5301],{},[14,12164,5300],{},[19,12166,40],{"id":40},[42,12168,12169,12171,12173],{},[45,12170,5308],{},[45,12172,5311],{},[45,12174,5314,12175,5317,12177,55],{},[14,12176,5300],{},[14,12178,5320],{},[19,12180,71],{"id":71},[10,12182,74],{},[76,12184,12185],{"className":392,"code":5327,"language":394,"meta":81,"style":81},[14,12186,12187,12191,12195,12199,12203,12207],{"__ignoreMap":81},[85,12188,12189],{"class":87,"line":88},[85,12190,5334],{},[85,12192,12193],{"class":87,"line":94},[85,12194,5339],{},[85,12196,12197],{"class":87,"line":100},[85,12198,5344],{},[85,12200,12201],{"class":87,"line":106},[85,12202,1082],{"emptyLinePlaceholder":212},[85,12204,12205],{"class":87,"line":1129},[85,12206,5353],{},[85,12208,12209],{"class":87,"line":1135},[85,12210,5358],{},[10,12212,112],{},[76,12214,12216],{"className":12215,"code":5364,"language":118,"meta":81},[116],[14,12217,5364],{"__ignoreMap":81},[10,12219,123],{},[19,12221,126],{"id":126},[128,12223,12224,12230],{},[45,12225,5375,12226,2194,12228,5381],{},[14,12227,5378],{},[14,12229,4341],{},[45,12231,12232,5387,12234,5391],{},[14,12233,5386],{},[14,12235,5390],{},[312,12237,2636],{"id":2636},[10,12239,5396],{},[10,12241,12242],{},[31,12243],{"alt":5401,"src":5402},[10,12245,12246,2194,12248,1144,12250,5412],{},[14,12247,5378],{},[14,12249,4341],{},[14,12251,5411],{},[19,12253,149],{"id":149},[42,12255,12256,12260],{},[45,12257,5419,12258,5423],{},[14,12259,5422],{},[45,12261,5426,12262,5429],{},[14,12263,5411],{},[19,12265,166],{"id":166},[128,12267,12268,12270],{},[45,12269,5436],{},[45,12271,5439],{},[10,12273,183],{},[19,12275,186],{"id":186},[10,12277,5446],{},[194,12279,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12281},[12282,12283,12284,12285,12286,12289,12290,12291],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":12287},[12288],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5276,"description":5281},[207,5468,5469],{"id":5472,"title":5473,"body":12296,"category":207,"cover":208,"description":5478,"extension":210,"meta":12445,"navigation":212,"path":5659,"pinned":214,"publishedAt":215,"seo":12446,"slug":5661,"stem":5662,"summary":5663,"tags":12447,"updatedAt":215,"visible":212,"__hash__":5667},{"type":7,"value":12297,"toc":12433},[12298,12300,12302,12304,12306,12310,12312,12314,12326,12328,12330,12374,12376,12381,12383,12385,12397,12399,12401,12405,12407,12409,12417,12419,12425,12427,12429,12431],[10,12299,5478],{},[19,12301,21],{"id":21},[10,12303,5483],{},[19,12305,27],{"id":27},[10,12307,12308],{},[31,12309],{"alt":5490,"src":5491},[10,12311,5494],{},[19,12313,40],{"id":40},[42,12315,12316,12318,12322],{},[45,12317,5501],{},[45,12319,12320,5507],{},[14,12321,5506],{},[45,12323,12324,5513],{},[14,12325,5512],{},[19,12327,71],{"id":71},[10,12329,74],{},[76,12331,12332],{"className":392,"code":5520,"language":394,"meta":81,"style":81},[14,12333,12334,12338,12342,12346,12350,12354,12358,12362,12366,12370],{"__ignoreMap":81},[85,12335,12336],{"class":87,"line":88},[85,12337,5527],{},[85,12339,12340],{"class":87,"line":94},[85,12341,5532],{},[85,12343,12344],{"class":87,"line":100},[85,12345,1082],{"emptyLinePlaceholder":212},[85,12347,12348],{"class":87,"line":106},[85,12349,5541],{},[85,12351,12352],{"class":87,"line":1129},[85,12353,5546],{},[85,12355,12356],{"class":87,"line":1135},[85,12357,1082],{"emptyLinePlaceholder":212},[85,12359,12360],{"class":87,"line":2426},[85,12361,5555],{},[85,12363,12364],{"class":87,"line":2432},[85,12365,5560],{},[85,12367,12368],{"class":87,"line":3892},[85,12369,1082],{"emptyLinePlaceholder":212},[85,12371,12372],{"class":87,"line":4104},[85,12373,5569],{},[10,12375,112],{},[76,12377,12379],{"className":12378,"code":5575,"language":118,"meta":81},[116],[14,12380,5575],{"__ignoreMap":81},[10,12382,123],{},[19,12384,126],{"id":126},[128,12386,12387,12391],{},[45,12388,5586,12389,5590],{},[14,12390,5589],{},[45,12392,12393,5596,12395,55],{},[14,12394,5595],{},[14,12396,5599],{},[312,12398,2636],{"id":2636},[10,12400,5604],{},[10,12402,12403],{},[31,12404],{"alt":5609,"src":5610},[10,12406,5613],{},[19,12408,149],{"id":149},[42,12410,12411,12415],{},[45,12412,5620,12413,5623],{},[14,12414,5320],{},[45,12416,5626],{},[19,12418,166],{"id":166},[128,12420,12421,12423],{},[45,12422,5633],{},[45,12424,5636],{},[10,12426,183],{},[19,12428,186],{"id":186},[10,12430,5643],{},[194,12432,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12434},[12435,12436,12437,12438,12439,12442,12443,12444],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":12440},[12441],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5473,"description":5478},[207,5665,5666],{"id":5669,"title":5670,"body":12449,"category":207,"cover":208,"description":5675,"extension":210,"meta":12610,"navigation":212,"path":5873,"pinned":214,"publishedAt":215,"seo":12611,"slug":5875,"stem":5876,"summary":5877,"tags":12612,"updatedAt":215,"visible":212,"__hash__":5881},{"type":7,"value":12450,"toc":12598},[12451,12453,12455,12457,12459,12463,12465,12467,12479,12481,12483,12535,12537,12542,12544,12546,12564,12566,12568,12572,12574,12576,12582,12584,12590,12592,12594,12596],[10,12452,5675],{},[19,12454,21],{"id":21},[10,12456,5680],{},[19,12458,27],{"id":27},[10,12460,12461],{},[31,12462],{"alt":5687,"src":5688},[10,12464,5691],{},[19,12466,40],{"id":40},[42,12468,12469,12471,12473],{},[45,12470,5698],{},[45,12472,5701],{},[45,12474,12475,2113,12477,5710],{},[14,12476,5706],{},[14,12478,5709],{},[19,12480,71],{"id":71},[10,12482,74],{},[76,12484,12485],{"className":392,"code":5717,"language":394,"meta":81,"style":81},[14,12486,12487,12491,12495,12499,12503,12507,12511,12515,12519,12523,12527,12531],{"__ignoreMap":81},[85,12488,12489],{"class":87,"line":88},[85,12490,5724],{},[85,12492,12493],{"class":87,"line":94},[85,12494,1082],{"emptyLinePlaceholder":212},[85,12496,12497],{"class":87,"line":100},[85,12498,5733],{},[85,12500,12501],{"class":87,"line":106},[85,12502,5738],{},[85,12504,12505],{"class":87,"line":1129},[85,12506,1082],{"emptyLinePlaceholder":212},[85,12508,12509],{"class":87,"line":1135},[85,12510,5747],{},[85,12512,12513],{"class":87,"line":2426},[85,12514,5752],{},[85,12516,12517],{"class":87,"line":2432},[85,12518,5757],{},[85,12520,12521],{"class":87,"line":3892},[85,12522,1082],{"emptyLinePlaceholder":212},[85,12524,12525],{"class":87,"line":4104},[85,12526,5766],{},[85,12528,12529],{"class":87,"line":5769},[85,12530,1082],{"emptyLinePlaceholder":212},[85,12532,12533],{"class":87,"line":5774},[85,12534,5777],{},[10,12536,112],{},[76,12538,12540],{"className":12539,"code":5783,"language":118,"meta":81},[116],[14,12541,5783],{"__ignoreMap":81},[10,12543,123],{},[19,12545,126],{"id":126},[128,12547,12548,12558],{},[45,12549,12550,5797,12552,5801,12554,5804,12556,5808],{},[14,12551,5796],{},[14,12553,5800],{},[14,12555,5589],{},[14,12557,5807],{},[45,12559,12560,5813,12562,5816],{},[14,12561,4524],{},[14,12563,2145],{},[312,12565,2636],{"id":2636},[10,12567,5821],{},[10,12569,12570],{},[31,12571],{"alt":5826,"src":5827},[10,12573,5830],{},[19,12575,149],{"id":149},[42,12577,12578,12580],{},[45,12579,5837],{},[45,12581,5840],{},[19,12583,166],{"id":166},[128,12585,12586,12588],{},[45,12587,5847],{},[45,12589,5850],{},[10,12591,183],{},[19,12593,186],{"id":186},[10,12595,5857],{},[194,12597,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12599},[12600,12601,12602,12603,12604,12607,12608,12609],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":12605},[12606],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5670,"description":5675},[207,5879,5880],{"id":5883,"title":5884,"body":12614,"category":207,"cover":208,"description":5889,"extension":210,"meta":12737,"navigation":212,"path":6040,"pinned":214,"publishedAt":215,"seo":12738,"slug":6042,"stem":6043,"summary":6044,"tags":12739,"updatedAt":215,"visible":212,"__hash__":6048},{"type":7,"value":12615,"toc":12727},[12616,12618,12620,12622,12624,12628,12630,12632,12646,12648,12650,12678,12680,12685,12687,12689,12699,12701,12709,12711,12719,12721,12723,12725],[10,12617,5889],{},[19,12619,21],{"id":21},[10,12621,5894],{},[19,12623,27],{"id":27},[10,12625,12626],{},[31,12627],{"alt":5901,"src":5902},[10,12629,5905],{},[19,12631,40],{"id":40},[42,12633,12634,12636,12638],{},[45,12635,5912],{},[45,12637,5915],{},[45,12639,5918,12640,2194,12642,2194,12644,5926],{},[14,12641,2197],{},[14,12643,2363],{},[14,12645,5925],{},[19,12647,71],{"id":71},[10,12649,74],{},[76,12651,12652],{"className":392,"code":5933,"language":394,"meta":81,"style":81},[14,12653,12654,12658,12662,12666,12670,12674],{"__ignoreMap":81},[85,12655,12656],{"class":87,"line":88},[85,12657,5940],{},[85,12659,12660],{"class":87,"line":94},[85,12661,5945],{},[85,12663,12664],{"class":87,"line":100},[85,12665,5950],{},[85,12667,12668],{"class":87,"line":106},[85,12669,1082],{"emptyLinePlaceholder":212},[85,12671,12672],{"class":87,"line":1129},[85,12673,5959],{},[85,12675,12676],{"class":87,"line":1135},[85,12677,5964],{},[10,12679,112],{},[76,12681,12683],{"className":12682,"code":5970,"language":118,"meta":81},[116],[14,12684,5970],{"__ignoreMap":81},[10,12686,123],{},[19,12688,126],{"id":126},[128,12690,12691,12697],{},[45,12692,5981,12693,5985,12695,5988],{},[14,12694,5984],{},[14,12696,2183],{},[45,12698,5991],{},[19,12700,149],{"id":149},[42,12702,12703,12707],{},[45,12704,5998,12705,6002],{},[14,12706,6001],{},[45,12708,6005],{},[19,12710,166],{"id":166},[128,12712,12713,12715],{},[45,12714,6012],{},[45,12716,6015,12717,6019],{},[14,12718,6018],{},[10,12720,183],{},[19,12722,186],{"id":186},[10,12724,6026],{},[194,12726,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12728},[12729,12730,12731,12732,12733,12734,12735,12736],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":5884,"description":5889},[207,6046,6047],{"id":6050,"title":6051,"body":12741,"category":207,"cover":208,"description":6056,"extension":210,"meta":12918,"navigation":212,"path":6284,"pinned":214,"publishedAt":215,"seo":12919,"slug":6286,"stem":6287,"summary":6288,"tags":12920,"updatedAt":215,"visible":212,"__hash__":6292},{"type":7,"value":12742,"toc":12906},[12743,12745,12747,12751,12753,12757,12763,12765,12777,12779,12783,12807,12811,12827,12833,12835,12840,12842,12844,12860,12862,12864,12868,12872,12874,12886,12888,12898,12900,12902,12904],[10,12744,6056],{},[19,12746,21],{"id":21},[10,12748,6061,12749,6064],{},[278,12750,5984],{},[19,12752,27],{"id":27},[10,12754,12755],{},[31,12756],{"alt":6071,"src":6072},[10,12758,6075,12759,6079,12761,6083],{},[14,12760,6078],{},[14,12762,6082],{},[19,12764,40],{"id":40},[42,12766,12767,12771,12773],{},[45,12768,6090,12769,6093],{},[14,12770,16],{},[45,12772,6096],{},[45,12774,6099,12775,6103],{},[14,12776,6102],{},[19,12778,71],{"id":71},[10,12780,6108,12781,6112],{},[14,12782,6111],{},[76,12784,12785],{"className":392,"code":6115,"language":394,"meta":81,"style":81},[14,12786,12787,12791,12795,12799,12803],{"__ignoreMap":81},[85,12788,12789],{"class":87,"line":88},[85,12790,6122],{},[85,12792,12793],{"class":87,"line":94},[85,12794,6127],{},[85,12796,12797],{"class":87,"line":100},[85,12798,1082],{"emptyLinePlaceholder":212},[85,12800,12801],{"class":87,"line":106},[85,12802,6136],{},[85,12804,12805],{"class":87,"line":1129},[85,12806,6141],{},[10,12808,6144,12809,6148],{},[14,12810,6147],{},[76,12812,12813],{"className":392,"code":6151,"language":394,"meta":81,"style":81},[14,12814,12815,12819,12823],{"__ignoreMap":81},[85,12816,12817],{"class":87,"line":88},[85,12818,6158],{},[85,12820,12821],{"class":87,"line":94},[85,12822,1082],{"emptyLinePlaceholder":212},[85,12824,12825],{"class":87,"line":100},[85,12826,6167],{},[10,12828,6170,12829,1144,12831,55],{},[14,12830,6173],{},[14,12832,6176],{},[10,12834,112],{},[76,12836,12838],{"className":12837,"code":6182,"language":118,"meta":81},[116],[14,12839,6182],{"__ignoreMap":81},[10,12841,123],{},[19,12843,126],{"id":126},[128,12845,12846,12852],{},[45,12847,6193,12848,6196,12850,6200],{},[14,12849,6111],{},[14,12851,6199],{},[45,12853,12854,6205,12856,6208,12858,6211],{},[14,12855,6147],{},[14,12857,6111],{},[14,12859,6147],{},[312,12861,2636],{"id":2636},[10,12863,6216],{},[10,12865,12866],{},[31,12867],{"alt":6221,"src":6222},[10,12869,6225,12870,6228],{},[14,12871,6199],{},[19,12873,149],{"id":149},[42,12875,12876,12882],{},[45,12877,6235,12878,1144,12880,55],{},[14,12879,6111],{},[14,12881,6147],{},[45,12883,6242,12884,6246],{},[14,12885,6245],{},[19,12887,166],{"id":166},[128,12889,12890,12894],{},[45,12891,2291,12892,6256],{},[14,12893,6255],{},[45,12895,6259,12896,55],{},[14,12897,6078],{},[10,12899,183],{},[19,12901,186],{"id":186},[10,12903,6268],{},[194,12905,196],{},{"title":81,"searchDepth":94,"depth":94,"links":12907},[12908,12909,12910,12911,12912,12915,12916,12917],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":12913},[12914],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":6051,"description":6056},[207,6290,6291],{"id":6294,"title":6295,"body":12922,"category":207,"cover":208,"description":6300,"extension":210,"meta":13061,"navigation":212,"path":6466,"pinned":214,"publishedAt":215,"seo":13062,"slug":6468,"stem":6469,"summary":6470,"tags":13063,"updatedAt":215,"visible":212,"__hash__":6473},{"type":7,"value":12923,"toc":13051},[12924,12926,12928,12930,12932,12936,12938,12940,12950,12952,12954,12994,12996,13001,13003,13005,13023,13025,13033,13035,13043,13045,13047,13049],[10,12925,6300],{},[19,12927,21],{"id":21},[10,12929,6305],{},[19,12931,27],{"id":27},[10,12933,12934],{},[31,12935],{"alt":6312,"src":6313},[10,12937,6316],{},[19,12939,40],{"id":40},[42,12941,12942,12946,12948],{},[45,12943,12944,6326],{},[14,12945,6325],{},[45,12947,6329],{},[45,12949,6332],{},[19,12951,71],{"id":71},[10,12953,1559],{},[76,12955,12956],{"className":576,"code":6339,"language":578,"meta":81,"style":81},[14,12957,12958,12968,12974,12980,12990],{"__ignoreMap":81},[85,12959,12960,12962,12964,12966],{"class":87,"line":88},[85,12961,50],{"class":585},[85,12963,618],{"class":588},[85,12965,6350],{"class":621},[85,12967,6353],{"class":621},[85,12969,12970,12972],{"class":87,"line":94},[85,12971,6358],{"class":588},[85,12973,6361],{"class":621},[85,12975,12976,12978],{"class":87,"line":100},[85,12977,394],{"class":585},[85,12979,589],{"class":588},[85,12981,12982,12984,12986,12988],{"class":87,"line":106},[85,12983,394],{"class":585},[85,12985,618],{"class":588},[85,12987,622],{"class":621},[85,12989,589],{"class":588},[85,12991,12992],{"class":87,"line":1129},[85,12993,6382],{"class":585},[10,12995,112],{},[76,12997,12999],{"className":12998,"code":6388,"language":118,"meta":81},[116],[14,13000,6388],{"__ignoreMap":81},[10,13002,123],{},[19,13004,126],{"id":126},[128,13006,13007,13013],{},[45,13008,13009,6402,13011,6405],{},[14,13010,6401],{},[14,13012,50],{},[45,13014,6408,13015,2113,13017,6414,13019,3667,13021,6420],{},[14,13016,394],{},[14,13018,6413],{},[14,13020,6325],{},[14,13022,6419],{},[19,13024,149],{"id":149},[42,13026,13027,13029],{},[45,13028,6427],{},[45,13030,3406,13031,6432],{},[14,13032,6325],{},[19,13034,166],{"id":166},[128,13036,13037,13041],{},[45,13038,6439,13039,55],{},[14,13040,6442],{},[45,13042,6445],{},[10,13044,183],{},[19,13046,186],{"id":186},[10,13048,6452],{},[194,13050,1643],{},{"title":81,"searchDepth":94,"depth":94,"links":13052},[13053,13054,13055,13056,13057,13058,13059,13060],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":6295,"description":6300},[207,6472,244],{"id":6475,"title":6476,"body":13065,"category":207,"cover":208,"description":6481,"extension":210,"meta":13218,"navigation":212,"path":6670,"pinned":214,"publishedAt":215,"seo":13219,"slug":6672,"stem":6673,"summary":6674,"tags":13220,"updatedAt":215,"visible":212,"__hash__":6678},{"type":7,"value":13066,"toc":13208},[13067,13069,13071,13073,13075,13079,13085,13087,13103,13105,13107,13151,13153,13158,13160,13162,13174,13176,13190,13192,13200,13202,13204,13206],[10,13068,6481],{},[19,13070,21],{"id":21},[10,13072,6486],{},[19,13074,27],{"id":27},[10,13076,13077],{},[31,13078],{"alt":6493,"src":6494},[10,13080,13081,6500,13083,6503],{},[14,13082,6499],{},[14,13084,2373],{},[19,13086,40],{"id":40},[42,13088,13089,13091,13099],{},[45,13090,6510],{},[45,13092,13093,2194,13095,2194,13097,6522],{},[14,13094,6515],{},[14,13096,6518],{},[14,13098,6521],{},[45,13100,6525,13101,6529],{},[14,13102,6528],{},[19,13104,71],{"id":71},[10,13106,74],{},[76,13108,13109],{"className":392,"code":6536,"language":394,"meta":81,"style":81},[14,13110,13111,13115,13119,13123,13127,13131,13135,13139,13143,13147],{"__ignoreMap":81},[85,13112,13113],{"class":87,"line":88},[85,13114,6543],{},[85,13116,13117],{"class":87,"line":94},[85,13118,1082],{"emptyLinePlaceholder":212},[85,13120,13121],{"class":87,"line":100},[85,13122,6552],{},[85,13124,13125],{"class":87,"line":106},[85,13126,6557],{},[85,13128,13129],{"class":87,"line":1129},[85,13130,6562],{},[85,13132,13133],{"class":87,"line":1135},[85,13134,1082],{"emptyLinePlaceholder":212},[85,13136,13137],{"class":87,"line":2426},[85,13138,6571],{},[85,13140,13141],{"class":87,"line":2432},[85,13142,6576],{},[85,13144,13145],{"class":87,"line":3892},[85,13146,6581],{},[85,13148,13149],{"class":87,"line":4104},[85,13150,6586],{},[10,13152,112],{},[76,13154,13156],{"className":13155,"code":6592,"language":118,"meta":81},[116],[14,13157,6592],{"__ignoreMap":81},[10,13159,123],{},[19,13161,126],{"id":126},[128,13163,13164,13168],{},[45,13165,13166,6606],{},[14,13167,6605],{},[45,13169,2276,13170,6611,13172,6614],{},[14,13171,2373],{},[14,13173,6499],{},[19,13175,149],{"id":149},[42,13177,13178,13184],{},[45,13179,3406,13180,6623,13182,6626],{},[14,13181,6499],{},[14,13183,6515],{},[45,13185,6629,13186,993,13188,6635],{},[14,13187,2373],{},[14,13189,6634],{},[19,13191,166],{"id":166},[128,13193,13194,13198],{},[45,13195,6642,13196,6646],{},[14,13197,6645],{},[45,13199,6649],{},[10,13201,183],{},[19,13203,186],{"id":186},[10,13205,6656],{},[194,13207,196],{},{"title":81,"searchDepth":94,"depth":94,"links":13209},[13210,13211,13212,13213,13214,13215,13216,13217],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":6476,"description":6481},[207,6676,6677],{"id":6680,"title":6681,"body":13222,"category":207,"cover":208,"description":6686,"extension":210,"meta":13369,"navigation":212,"path":6865,"pinned":214,"publishedAt":215,"seo":13370,"slug":6867,"stem":6868,"summary":6869,"tags":13371,"updatedAt":215,"visible":212,"__hash__":6873},{"type":7,"value":13223,"toc":13359},[13224,13226,13228,13230,13232,13236,13238,13240,13258,13260,13262,13310,13312,13317,13319,13321,13329,13331,13341,13343,13351,13353,13355,13357],[10,13225,6686],{},[19,13227,21],{"id":21},[10,13229,6691],{},[19,13231,27],{"id":27},[10,13233,13234],{},[31,13235],{"alt":6698,"src":6699},[10,13237,6702],{},[19,13239,40],{"id":40},[42,13241,13242,13246,13252],{},[45,13243,13244,6712],{},[14,13245,6711],{},[45,13247,13248,6718,13250,55],{},[14,13249,6717],{},[14,13251,6721],{},[45,13253,6724,13254,6728,13256,6732],{},[14,13255,6727],{},[14,13257,6731],{},[19,13259,71],{"id":71},[10,13261,74],{},[76,13263,13264],{"className":392,"code":6739,"language":394,"meta":81,"style":81},[14,13265,13266,13270,13274,13278,13282,13286,13290,13294,13298,13302,13306],{"__ignoreMap":81},[85,13267,13268],{"class":87,"line":88},[85,13269,6543],{},[85,13271,13272],{"class":87,"line":94},[85,13273,1082],{"emptyLinePlaceholder":212},[85,13275,13276],{"class":87,"line":100},[85,13277,6754],{},[85,13279,13280],{"class":87,"line":106},[85,13281,6759],{},[85,13283,13284],{"class":87,"line":1129},[85,13285,6764],{},[85,13287,13288],{"class":87,"line":1135},[85,13289,6769],{},[85,13291,13292],{"class":87,"line":2426},[85,13293,1082],{"emptyLinePlaceholder":212},[85,13295,13296],{"class":87,"line":2432},[85,13297,6778],{},[85,13299,13300],{"class":87,"line":3892},[85,13301,6783],{},[85,13303,13304],{"class":87,"line":4104},[85,13305,6788],{},[85,13307,13308],{"class":87,"line":5769},[85,13309,6793],{},[10,13311,112],{},[76,13313,13315],{"className":13314,"code":6799,"language":118,"meta":81},[116],[14,13316,6799],{"__ignoreMap":81},[10,13318,123],{},[19,13320,126],{"id":126},[128,13322,13323,13327],{},[45,13324,6810,13325,6813],{},[14,13326,6727],{},[45,13328,6816],{},[19,13330,149],{"id":149},[42,13332,13333,13337],{},[45,13334,2276,13335,6825],{},[14,13336,6711],{},[45,13338,6828,13339,55],{},[14,13340,6831],{},[19,13342,166],{"id":166},[128,13344,13345,13347],{},[45,13346,6838],{},[45,13348,6841,13349,6844],{},[14,13350,320],{},[10,13352,183],{},[19,13354,186],{"id":186},[10,13356,6851],{},[194,13358,196],{},{"title":81,"searchDepth":94,"depth":94,"links":13360},[13361,13362,13363,13364,13365,13366,13367,13368],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":6681,"description":6686},[207,6871,6872],{"id":6875,"title":6876,"body":13373,"category":207,"cover":208,"description":6881,"extension":210,"meta":13516,"navigation":212,"path":7049,"pinned":214,"publishedAt":215,"seo":13517,"slug":7051,"stem":7052,"summary":7053,"tags":13518,"updatedAt":215,"visible":212,"__hash__":7057},{"type":7,"value":13374,"toc":13506},[13375,13377,13379,13381,13383,13387,13393,13395,13405,13407,13409,13461,13463,13468,13470,13472,13482,13484,13490,13492,13498,13500,13502,13504],[10,13376,6881],{},[19,13378,21],{"id":21},[10,13380,6886],{},[19,13382,27],{"id":27},[10,13384,13385],{},[31,13386],{"alt":6893,"src":6894},[10,13388,13389,6900,13391,6904],{},[14,13390,6899],{},[14,13392,6903],{},[19,13394,40],{"id":40},[42,13396,13397,13399,13403],{},[45,13398,6911],{},[45,13400,13401,6917],{},[14,13402,6916],{},[45,13404,6920],{},[19,13406,71],{"id":71},[10,13408,74],{},[76,13410,13411],{"className":392,"code":6927,"language":394,"meta":81,"style":81},[14,13412,13413,13417,13421,13425,13429,13433,13437,13441,13445,13449,13453,13457],{"__ignoreMap":81},[85,13414,13415],{"class":87,"line":88},[85,13416,6934],{},[85,13418,13419],{"class":87,"line":94},[85,13420,1082],{"emptyLinePlaceholder":212},[85,13422,13423],{"class":87,"line":100},[85,13424,6943],{},[85,13426,13427],{"class":87,"line":106},[85,13428,1082],{"emptyLinePlaceholder":212},[85,13430,13431],{"class":87,"line":1129},[85,13432,6952],{},[85,13434,13435],{"class":87,"line":1135},[85,13436,6957],{},[85,13438,13439],{"class":87,"line":2426},[85,13440,6769],{},[85,13442,13443],{"class":87,"line":2432},[85,13444,1082],{"emptyLinePlaceholder":212},[85,13446,13447],{"class":87,"line":3892},[85,13448,6970],{},[85,13450,13451],{"class":87,"line":4104},[85,13452,6975],{},[85,13454,13455],{"class":87,"line":5769},[85,13456,6788],{},[85,13458,13459],{"class":87,"line":5774},[85,13460,6984],{},[10,13462,112],{},[76,13464,13466],{"className":13465,"code":6990,"language":118,"meta":81},[116],[14,13467,6990],{"__ignoreMap":81},[10,13469,123],{},[19,13471,126],{"id":126},[128,13473,13474,13478],{},[45,13475,13476,7003],{},[14,13477,6899],{},[45,13479,13480,7008],{},[14,13481,6903],{},[19,13483,149],{"id":149},[42,13485,13486,13488],{},[45,13487,7015],{},[45,13489,7018],{},[19,13491,166],{"id":166},[128,13493,13494,13496],{},[45,13495,7025],{},[45,13497,7028],{},[10,13499,183],{},[19,13501,186],{"id":186},[10,13503,7035],{},[194,13505,196],{},{"title":81,"searchDepth":94,"depth":94,"links":13507},[13508,13509,13510,13511,13512,13513,13514,13515],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":6876,"description":6881},[207,7055,7056],{"id":7059,"title":7060,"body":13520,"category":207,"cover":208,"description":7065,"extension":210,"meta":13671,"navigation":212,"path":7250,"pinned":214,"publishedAt":215,"seo":13672,"slug":7252,"stem":7253,"summary":7254,"tags":13673,"updatedAt":215,"visible":212,"__hash__":7258},{"type":7,"value":13521,"toc":13661},[13522,13524,13526,13528,13530,13534,13538,13540,13554,13556,13558,13610,13612,13617,13619,13621,13633,13635,13645,13647,13653,13655,13657,13659],[10,13523,7065],{},[19,13525,21],{"id":21},[10,13527,7070],{},[19,13529,27],{"id":27},[10,13531,13532],{},[31,13533],{"alt":7077,"src":7078},[10,13535,13536,7084],{},[14,13537,7083],{},[19,13539,40],{"id":40},[42,13541,13542,13548,13552],{},[45,13543,2276,13544,7094,13546,7098],{},[14,13545,7093],{},[14,13547,7097],{},[45,13549,7101,13550,7105],{},[14,13551,7104],{},[45,13553,7108],{},[19,13555,71],{"id":71},[10,13557,74],{},[76,13559,13560],{"className":392,"code":7115,"language":394,"meta":81,"style":81},[14,13561,13562,13566,13570,13574,13578,13582,13586,13590,13594,13598,13602,13606],{"__ignoreMap":81},[85,13563,13564],{"class":87,"line":88},[85,13565,7122],{},[85,13567,13568],{"class":87,"line":94},[85,13569,1082],{"emptyLinePlaceholder":212},[85,13571,13572],{"class":87,"line":100},[85,13573,7131],{},[85,13575,13576],{"class":87,"line":106},[85,13577,7136],{},[85,13579,13580],{"class":87,"line":1129},[85,13581,7141],{},[85,13583,13584],{"class":87,"line":1135},[85,13585,7146],{},[85,13587,13588],{"class":87,"line":2426},[85,13589,7151],{},[85,13591,13592],{"class":87,"line":2432},[85,13593,1082],{"emptyLinePlaceholder":212},[85,13595,13596],{"class":87,"line":3892},[85,13597,7160],{},[85,13599,13600],{"class":87,"line":4104},[85,13601,7165],{},[85,13603,13604],{"class":87,"line":5769},[85,13605,7170],{},[85,13607,13608],{"class":87,"line":5774},[85,13609,7175],{},[10,13611,112],{},[76,13613,13615],{"className":13614,"code":7181,"language":118,"meta":81},[116],[14,13616,7181],{"__ignoreMap":81},[10,13618,123],{},[19,13620,126],{"id":126},[128,13622,13623,13629],{},[45,13624,13625,7195,13627,7198],{},[14,13626,7194],{},[14,13628,7104],{},[45,13630,13631,7203],{},[14,13632,7083],{},[19,13634,149],{"id":149},[42,13636,13637,13639],{},[45,13638,7210],{},[45,13640,7213,13641,7216,13643,7219],{},[14,13642,7093],{},[14,13644,7097],{},[19,13646,166],{"id":166},[128,13648,13649,13651],{},[45,13650,7226],{},[45,13652,7229],{},[10,13654,183],{},[19,13656,186],{"id":186},[10,13658,7236],{},[194,13660,196],{},{"title":81,"searchDepth":94,"depth":94,"links":13662},[13663,13664,13665,13666,13667,13668,13669,13670],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":7060,"description":7065},[207,7256,7257],{"id":7260,"title":7261,"body":13675,"category":207,"cover":208,"description":7266,"extension":210,"meta":13889,"navigation":212,"path":7540,"pinned":214,"publishedAt":215,"seo":13890,"slug":7542,"stem":7543,"summary":7544,"tags":13891,"updatedAt":215,"visible":212,"__hash__":7548},{"type":7,"value":13676,"toc":13876},[13677,13679,13681,13683,13685,13689,13695,13697,13709,13711,13713,13773,13775,13780,13782,13784,13802,13804,13812,13816,13824,13826,13830,13834,13840,13842,13852,13854,13868,13870,13872,13874],[10,13678,7266],{},[19,13680,21],{"id":21},[10,13682,7271],{},[19,13684,27],{"id":27},[10,13686,13687],{},[31,13688],{"alt":7278,"src":7279},[10,13690,7282,13691,7286,13693,7290],{},[14,13692,7285],{},[14,13694,7289],{},[19,13696,40],{"id":40},[42,13698,13699,13703,13707],{},[45,13700,7297,13701,7300],{},[14,13702,7285],{},[45,13704,13705,7306],{},[14,13706,7305],{},[45,13708,7309],{},[19,13710,71],{"id":71},[10,13712,74],{},[76,13714,13715],{"className":392,"code":7316,"language":394,"meta":81,"style":81},[14,13716,13717,13721,13725,13729,13733,13737,13741,13745,13749,13753,13757,13761,13765,13769],{"__ignoreMap":81},[85,13718,13719],{"class":87,"line":88},[85,13720,7323],{},[85,13722,13723],{"class":87,"line":94},[85,13724,7328],{},[85,13726,13727],{"class":87,"line":100},[85,13728,7333],{},[85,13730,13731],{"class":87,"line":106},[85,13732,7338],{},[85,13734,13735],{"class":87,"line":1129},[85,13736,7343],{},[85,13738,13739],{"class":87,"line":1135},[85,13740,1082],{"emptyLinePlaceholder":212},[85,13742,13743],{"class":87,"line":2426},[85,13744,7352],{},[85,13746,13747],{"class":87,"line":2432},[85,13748,7357],{},[85,13750,13751],{"class":87,"line":3892},[85,13752,7362],{},[85,13754,13755],{"class":87,"line":4104},[85,13756,7367],{},[85,13758,13759],{"class":87,"line":5769},[85,13760,1132],{},[85,13762,13763],{"class":87,"line":5774},[85,13764,7376],{},[85,13766,13767],{"class":87,"line":7379},[85,13768,7382],{},[85,13770,13771],{"class":87,"line":7385},[85,13772,7388],{},[10,13774,112],{},[76,13776,13778],{"className":13777,"code":7394,"language":118,"meta":81},[116],[14,13779,7394],{"__ignoreMap":81},[10,13781,123],{},[19,13783,126],{"id":126},[128,13785,13786,13794],{},[45,13787,13788,7407,13790,7410,13792,7414],{},[14,13789,2975],{},[14,13791,7305],{},[14,13793,7413],{},[45,13795,7417,13796,7420,13798,7423,13800,55],{},[14,13797,7285],{},[14,13799,1147],{},[14,13801,7289],{},[312,13803,2636],{"id":2636},[10,13805,13806,2194,13808,1144,13810,7436],{},[14,13807,7285],{},[14,13809,1147],{},[14,13811,7289],{},[10,13813,13814],{},[31,13815],{"alt":7441,"src":7442},[10,13817,13818,7447,13820,7450,13822,7453],{},[14,13819,7285],{},[14,13821,1147],{},[14,13823,7289],{},[312,13825,2636],{"id":4159},[10,13827,13828,7461],{},[14,13829,7460],{},[10,13831,13832],{},[31,13833],{"alt":7466,"src":7467},[10,13835,7470,13836,7473,13838,7476],{},[14,13837,7460],{},[14,13839,1147],{},[19,13841,149],{"id":149},[42,13843,13844,13848],{},[45,13845,7483,13846,7487],{},[14,13847,7486],{},[45,13849,7490,13850,7493],{},[14,13851,7460],{},[19,13853,166],{"id":166},[128,13855,13856,13864],{},[45,13857,7500,13858,7504,13860,1144,13862,55],{},[14,13859,7503],{},[14,13861,7507],{},[14,13863,7510],{},[45,13865,7513,13866,7516],{},[14,13867,6721],{},[10,13869,183],{},[19,13871,186],{"id":186},[10,13873,7523],{},[194,13875,196],{},{"title":81,"searchDepth":94,"depth":94,"links":13877},[13878,13879,13880,13881,13882,13886,13887,13888],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":13883},[13884,13885],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":7261,"description":7266},[207,7546,7547],{"id":7550,"title":7551,"body":13893,"category":207,"cover":208,"description":7556,"extension":210,"meta":14044,"navigation":212,"path":7733,"pinned":214,"publishedAt":215,"seo":14045,"slug":7735,"stem":7736,"summary":7737,"tags":14046,"updatedAt":215,"visible":212,"__hash__":7740},{"type":7,"value":13894,"toc":14034},[13895,13897,13899,13901,13903,13907,13911,13913,13925,13927,13929,13977,13979,13984,13986,13988,13998,14000,14010,14012,14026,14028,14030,14032],[10,13896,7556],{},[19,13898,21],{"id":21},[10,13900,7561],{},[19,13902,27],{"id":27},[10,13904,13905],{},[31,13906],{"alt":7568,"src":7569},[10,13908,7572,13909,7575],{},[14,13910,6731],{},[19,13912,40],{"id":40},[42,13914,13915,13919,13923],{},[45,13916,13917,7584],{},[14,13918,6731],{},[45,13920,13921,7590],{},[14,13922,7589],{},[45,13924,7593],{},[19,13926,71],{"id":71},[10,13928,74],{},[76,13930,13931],{"className":392,"code":7600,"language":394,"meta":81,"style":81},[14,13932,13933,13937,13941,13945,13949,13953,13957,13961,13965,13969,13973],{"__ignoreMap":81},[85,13934,13935],{"class":87,"line":88},[85,13936,6543],{},[85,13938,13939],{"class":87,"line":94},[85,13940,1082],{"emptyLinePlaceholder":212},[85,13942,13943],{"class":87,"line":100},[85,13944,6754],{},[85,13946,13947],{"class":87,"line":106},[85,13948,1082],{"emptyLinePlaceholder":212},[85,13950,13951],{"class":87,"line":1129},[85,13952,7623],{},[85,13954,13955],{"class":87,"line":1135},[85,13956,7628],{},[85,13958,13959],{"class":87,"line":2426},[85,13960,1082],{"emptyLinePlaceholder":212},[85,13962,13963],{"class":87,"line":2432},[85,13964,7637],{},[85,13966,13967],{"class":87,"line":3892},[85,13968,7642],{},[85,13970,13971],{"class":87,"line":4104},[85,13972,1082],{"emptyLinePlaceholder":212},[85,13974,13975],{"class":87,"line":5769},[85,13976,7651],{},[10,13978,112],{},[76,13980,13982],{"className":13981,"code":7657,"language":118,"meta":81},[116],[14,13983,7657],{"__ignoreMap":81},[10,13985,123],{},[19,13987,126],{"id":126},[128,13989,13990,13996],{},[45,13991,7572,13992,7670,13994,55],{},[14,13993,6731],{},[14,13995,7673],{},[45,13997,7676],{},[19,13999,149],{"id":149},[42,14001,14002,14006],{},[45,14003,4727,14004,7685],{},[14,14005,6731],{},[45,14007,7688,14008,7691],{},[14,14009,6731],{},[19,14011,166],{"id":166},[128,14013,14014,14020],{},[45,14015,7698,14016,7702,14018,55],{},[14,14017,7701],{},[14,14019,6731],{},[45,14021,4727,14022,7709,14024,55],{},[14,14023,6731],{},[14,14025,7712],{},[10,14027,183],{},[19,14029,186],{"id":186},[10,14031,7719],{},[194,14033,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14035},[14036,14037,14038,14039,14040,14041,14042,14043],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":7551,"description":7556},[207,6731,7739],{"id":7742,"title":7743,"body":14048,"category":207,"cover":208,"description":7748,"extension":210,"meta":14219,"navigation":212,"path":7961,"pinned":214,"publishedAt":215,"seo":14220,"slug":7963,"stem":7964,"summary":7965,"tags":14221,"updatedAt":215,"visible":212,"__hash__":7969},{"type":7,"value":14049,"toc":14207},[14050,14052,14054,14056,14058,14062,14064,14066,14078,14080,14082,14138,14140,14145,14147,14149,14165,14167,14169,14173,14179,14181,14189,14191,14199,14201,14203,14205],[10,14051,7748],{},[19,14053,21],{"id":21},[10,14055,7753],{},[19,14057,27],{"id":27},[10,14059,14060],{},[31,14061],{"alt":7760,"src":7761},[10,14063,7764],{},[19,14065,40],{"id":40},[42,14067,14068,14072,14076],{},[45,14069,14070,7774],{},[14,14071,7773],{},[45,14073,14074,7780],{},[14,14075,7779],{},[45,14077,7783],{},[19,14079,71],{"id":71},[10,14081,74],{},[76,14083,14084],{"className":392,"code":7790,"language":394,"meta":81,"style":81},[14,14085,14086,14090,14094,14098,14102,14106,14110,14114,14118,14122,14126,14130,14134],{"__ignoreMap":81},[85,14087,14088],{"class":87,"line":88},[85,14089,7797],{},[85,14091,14092],{"class":87,"line":94},[85,14093,7802],{},[85,14095,14096],{"class":87,"line":100},[85,14097,7807],{},[85,14099,14100],{"class":87,"line":106},[85,14101,7812],{},[85,14103,14104],{"class":87,"line":1129},[85,14105,1082],{"emptyLinePlaceholder":212},[85,14107,14108],{"class":87,"line":1135},[85,14109,7821],{},[85,14111,14112],{"class":87,"line":2426},[85,14113,7826],{},[85,14115,14116],{"class":87,"line":2432},[85,14117,7831],{},[85,14119,14120],{"class":87,"line":3892},[85,14121,7836],{},[85,14123,14124],{"class":87,"line":4104},[85,14125,1082],{"emptyLinePlaceholder":212},[85,14127,14128],{"class":87,"line":5769},[85,14129,7845],{},[85,14131,14132],{"class":87,"line":5774},[85,14133,7850],{},[85,14135,14136],{"class":87,"line":7379},[85,14137,7855],{},[10,14139,112],{},[76,14141,14143],{"className":14142,"code":7861,"language":118,"meta":81},[116],[14,14144,7861],{"__ignoreMap":81},[10,14146,123],{},[19,14148,126],{"id":126},[128,14150,14151,14157],{},[45,14152,7872,14153,7876,14155,7879],{},[14,14154,7875],{},[14,14156,7779],{},[45,14158,14159,7885,14161,7889,14163,7892],{},[14,14160,7884],{},[14,14162,7888],{},[14,14164,7773],{},[312,14166,2636],{"id":2636},[10,14168,7897],{},[10,14170,14171],{},[31,14172],{"alt":7902,"src":7903},[10,14174,7906,14175,1144,14177,7912],{},[14,14176,4524],{},[14,14178,7911],{},[19,14180,149],{"id":149},[42,14182,14183,14187],{},[45,14184,7919,14185,7922],{},[14,14186,7773],{},[45,14188,7925],{},[19,14190,166],{"id":166},[128,14192,14193,14197],{},[45,14194,5237,14195,7935],{},[14,14196,7934],{},[45,14198,7938],{},[10,14200,183],{},[19,14202,186],{"id":186},[10,14204,7945],{},[194,14206,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14208},[14209,14210,14211,14212,14213,14216,14217,14218],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":14214},[14215],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":7743,"description":7748},[207,7967,7968],{"id":7971,"title":7972,"body":14223,"category":207,"cover":208,"description":7977,"extension":210,"meta":14370,"navigation":212,"path":8156,"pinned":214,"publishedAt":215,"seo":14371,"slug":8158,"stem":8159,"summary":8160,"tags":14372,"updatedAt":215,"visible":212,"__hash__":8164},{"type":7,"value":14224,"toc":14360},[14225,14227,14229,14231,14233,14237,14239,14241,14249,14251,14253,14309,14311,14316,14318,14320,14332,14334,14340,14342,14352,14354,14356,14358],[10,14226,7977],{},[19,14228,21],{"id":21},[10,14230,7982],{},[19,14232,27],{"id":27},[10,14234,14235],{},[31,14236],{"alt":7989,"src":7990},[10,14238,7993],{},[19,14240,40],{"id":40},[42,14242,14243,14245,14247],{},[45,14244,8000],{},[45,14246,8003],{},[45,14248,8006],{},[19,14250,71],{"id":71},[10,14252,74],{},[76,14254,14255],{"className":392,"code":8013,"language":394,"meta":81,"style":81},[14,14256,14257,14261,14265,14269,14273,14277,14281,14285,14289,14293,14297,14301,14305],{"__ignoreMap":81},[85,14258,14259],{"class":87,"line":88},[85,14260,8020],{},[85,14262,14263],{"class":87,"line":94},[85,14264,8025],{},[85,14266,14267],{"class":87,"line":100},[85,14268,8030],{},[85,14270,14271],{"class":87,"line":106},[85,14272,1082],{"emptyLinePlaceholder":212},[85,14274,14275],{"class":87,"line":1129},[85,14276,8039],{},[85,14278,14279],{"class":87,"line":1135},[85,14280,8044],{},[85,14282,14283],{"class":87,"line":2426},[85,14284,8049],{},[85,14286,14287],{"class":87,"line":2432},[85,14288,1082],{"emptyLinePlaceholder":212},[85,14290,14291],{"class":87,"line":3892},[85,14292,8058],{},[85,14294,14295],{"class":87,"line":4104},[85,14296,8063],{},[85,14298,14299],{"class":87,"line":5769},[85,14300,1082],{"emptyLinePlaceholder":212},[85,14302,14303],{"class":87,"line":5774},[85,14304,8072],{},[85,14306,14307],{"class":87,"line":7379},[85,14308,8077],{},[10,14310,112],{},[76,14312,14314],{"className":14313,"code":8083,"language":118,"meta":81},[116],[14,14315,8083],{"__ignoreMap":81},[10,14317,123],{},[19,14319,126],{"id":126},[128,14321,14322,14328],{},[45,14323,14324,8097,14326,8101],{},[14,14325,8096],{},[14,14327,8100],{},[45,14329,8104,14330,8108],{},[14,14331,8107],{},[19,14333,149],{"id":149},[42,14335,14336,14338],{},[45,14337,8115],{},[45,14339,8118],{},[19,14341,166],{"id":166},[128,14343,14344,14350],{},[45,14345,8125,14346,8129,14348,55],{},[14,14347,8128],{},[14,14349,8132],{},[45,14351,8135],{},[10,14353,183],{},[19,14355,186],{"id":186},[10,14357,8142],{},[194,14359,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14361},[14362,14363,14364,14365,14366,14367,14368,14369],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":7972,"description":7977},[207,8162,8163],{"id":8166,"title":8167,"body":14374,"category":207,"cover":208,"description":8172,"extension":210,"meta":14537,"navigation":212,"path":8376,"pinned":214,"publishedAt":215,"seo":14538,"slug":8378,"stem":8379,"summary":8380,"tags":14539,"updatedAt":215,"visible":212,"__hash__":8384},{"type":7,"value":14375,"toc":14525},[14376,14378,14380,14382,14384,14388,14392,14394,14410,14412,14414,14458,14460,14465,14467,14469,14483,14485,14489,14493,14497,14499,14505,14507,14517,14519,14521,14523],[10,14377,8172],{},[19,14379,21],{"id":21},[10,14381,8177],{},[19,14383,27],{"id":27},[10,14385,14386],{},[31,14387],{"alt":8184,"src":8185},[10,14389,8188,14390,8192],{},[14,14391,8191],{},[19,14393,40],{"id":40},[42,14395,14396,14402,14408],{},[45,14397,14398,8202,14400,8206],{},[14,14399,8201],{},[14,14401,8205],{},[45,14403,8209,14404,8213,14406,8216],{},[14,14405,8212],{},[14,14407,4278],{},[45,14409,8219],{},[19,14411,71],{"id":71},[10,14413,74],{},[76,14415,14416],{"className":392,"code":8226,"language":394,"meta":81,"style":81},[14,14417,14418,14422,14426,14430,14434,14438,14442,14446,14450,14454],{"__ignoreMap":81},[85,14419,14420],{"class":87,"line":88},[85,14421,8233],{},[85,14423,14424],{"class":87,"line":94},[85,14425,8238],{},[85,14427,14428],{"class":87,"line":100},[85,14429,8243],{},[85,14431,14432],{"class":87,"line":106},[85,14433,8248],{},[85,14435,14436],{"class":87,"line":1129},[85,14437,8253],{},[85,14439,14440],{"class":87,"line":1135},[85,14441,1082],{"emptyLinePlaceholder":212},[85,14443,14444],{"class":87,"line":2426},[85,14445,8262],{},[85,14447,14448],{"class":87,"line":2432},[85,14449,8267],{},[85,14451,14452],{"class":87,"line":3892},[85,14453,8267],{},[85,14455,14456],{"class":87,"line":4104},[85,14457,8267],{},[10,14459,112],{},[76,14461,14463],{"className":14462,"code":8281,"language":118,"meta":81},[116],[14,14464,8281],{"__ignoreMap":81},[10,14466,123],{},[19,14468,126],{"id":126},[128,14470,14471,14475],{},[45,14472,7872,14473,8295],{},[14,14474,8294],{},[45,14476,8298,14477,8301,14479,8304,14481,8308],{},[14,14478,8205],{},[14,14480,8191],{},[14,14482,8307],{},[312,14484,2636],{"id":2636},[10,14486,8313,14487,8316],{},[14,14488,8205],{},[10,14490,14491],{},[31,14492],{"alt":8321,"src":8322},[10,14494,8325,14495,8328],{},[14,14496,8191],{},[19,14498,149],{"id":149},[42,14500,14501,14503],{},[45,14502,8335],{},[45,14504,8338],{},[19,14506,166],{"id":166},[128,14508,14509,14511],{},[45,14510,8345],{},[45,14512,3950,14513,8350,14515,8353],{},[14,14514,4278],{},[14,14516,8205],{},[10,14518,183],{},[19,14520,186],{"id":186},[10,14522,8360],{},[194,14524,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14526},[14527,14528,14529,14530,14531,14534,14535,14536],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":14532},[14533],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":8167,"description":8172},[207,8382,8383],{"id":8386,"title":8387,"body":14541,"category":207,"cover":208,"description":8392,"extension":210,"meta":14724,"navigation":212,"path":8617,"pinned":214,"publishedAt":215,"seo":14725,"slug":8619,"stem":8620,"summary":8621,"tags":14726,"updatedAt":215,"visible":212,"__hash__":8624},{"type":7,"value":14542,"toc":14712},[14543,14545,14547,14549,14551,14555,14557,14559,14573,14575,14577,14645,14647,14652,14654,14656,14670,14672,14674,14678,14684,14686,14694,14696,14704,14706,14708,14710],[10,14544,8392],{},[19,14546,21],{"id":21},[10,14548,8397],{},[19,14550,27],{"id":27},[10,14552,14553],{},[31,14554],{"alt":8404,"src":8405},[10,14556,8408],{},[19,14558,40],{"id":40},[42,14560,14561,14567,14569],{},[45,14562,14563,8418,14565,55],{},[14,14564,8417],{},[14,14566,8421],{},[45,14568,8424],{},[45,14570,14571,8430],{},[14,14572,8429],{},[19,14574,71],{"id":71},[10,14576,74],{},[76,14578,14579],{"className":392,"code":8437,"language":394,"meta":81,"style":81},[14,14580,14581,14585,14589,14593,14597,14601,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641],{"__ignoreMap":81},[85,14582,14583],{"class":87,"line":88},[85,14584,8444],{},[85,14586,14587],{"class":87,"line":94},[85,14588,1082],{"emptyLinePlaceholder":212},[85,14590,14591],{"class":87,"line":100},[85,14592,8453],{},[85,14594,14595],{"class":87,"line":106},[85,14596,8458],{},[85,14598,14599],{"class":87,"line":1129},[85,14600,8463],{},[85,14602,14603],{"class":87,"line":1135},[85,14604,8468],{},[85,14606,14607],{"class":87,"line":2426},[85,14608,8473],{},[85,14610,14611],{"class":87,"line":2432},[85,14612,8478],{},[85,14614,14615],{"class":87,"line":3892},[85,14616,8483],{},[85,14618,14619],{"class":87,"line":4104},[85,14620,8488],{},[85,14622,14623],{"class":87,"line":5769},[85,14624,1082],{"emptyLinePlaceholder":212},[85,14626,14627],{"class":87,"line":5774},[85,14628,8497],{},[85,14630,14631],{"class":87,"line":7379},[85,14632,6122],{},[85,14634,14635],{"class":87,"line":7385},[85,14636,6127],{},[85,14638,14639],{"class":87,"line":8508},[85,14640,1082],{"emptyLinePlaceholder":212},[85,14642,14643],{"class":87,"line":8513},[85,14644,8516],{},[10,14646,112],{},[76,14648,14650],{"className":14649,"code":8522,"language":118,"meta":81},[116],[14,14651,8522],{"__ignoreMap":81},[10,14653,123],{},[19,14655,126],{"id":126},[128,14657,14658,14668],{},[45,14659,8533,14660,8537,14662,8541,14664,8545,14666,55],{},[14,14661,8536],{},[14,14663,8540],{},[14,14665,8544],{},[14,14667,8536],{},[45,14669,8550],{},[312,14671,2636],{"id":2636},[10,14673,8555],{},[10,14675,14676],{},[31,14677],{"alt":8560,"src":8561},[10,14679,14680,8566,14682,55],{},[14,14681,8417],{},[14,14683,8421],{},[19,14685,149],{"id":149},[42,14687,14688,14692],{},[45,14689,8575,14690,55],{},[14,14691,5320],{},[45,14693,8580],{},[19,14695,166],{"id":166},[128,14697,14698,14700],{},[45,14699,8587],{},[45,14701,8590,14702,8594],{},[14,14703,8593],{},[10,14705,183],{},[19,14707,186],{"id":186},[10,14709,8601],{},[194,14711,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14713},[14714,14715,14716,14717,14718,14721,14722,14723],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":14719},[14720],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":8387,"description":8392},[207,8623,5271],{"id":8626,"title":8627,"body":14728,"category":207,"cover":208,"description":8632,"extension":210,"meta":14887,"navigation":212,"path":8820,"pinned":214,"publishedAt":215,"seo":14888,"slug":8822,"stem":8823,"summary":8824,"tags":14889,"updatedAt":215,"visible":212,"__hash__":8828},{"type":7,"value":14729,"toc":14875},[14730,14732,14734,14736,14738,14742,14744,14746,14754,14756,14758,14822,14824,14829,14831,14833,14841,14843,14845,14849,14851,14853,14859,14861,14867,14869,14871,14873],[10,14731,8632],{},[19,14733,21],{"id":21},[10,14735,8637],{},[19,14737,27],{"id":27},[10,14739,14740],{},[31,14741],{"alt":8644,"src":8645},[10,14743,8648],{},[19,14745,40],{"id":40},[42,14747,14748,14750,14752],{},[45,14749,8655],{},[45,14751,8658],{},[45,14753,8661],{},[19,14755,71],{"id":71},[10,14757,74],{},[76,14759,14760],{"className":392,"code":8668,"language":394,"meta":81,"style":81},[14,14761,14762,14766,14770,14774,14778,14782,14786,14790,14794,14798,14802,14806,14810,14814,14818],{"__ignoreMap":81},[85,14763,14764],{"class":87,"line":88},[85,14765,8675],{},[85,14767,14768],{"class":87,"line":94},[85,14769,8680],{},[85,14771,14772],{"class":87,"line":100},[85,14773,1082],{"emptyLinePlaceholder":212},[85,14775,14776],{"class":87,"line":106},[85,14777,8689],{},[85,14779,14780],{"class":87,"line":1129},[85,14781,1082],{"emptyLinePlaceholder":212},[85,14783,14784],{"class":87,"line":1135},[85,14785,8698],{},[85,14787,14788],{"class":87,"line":2426},[85,14789,8703],{},[85,14791,14792],{"class":87,"line":2432},[85,14793,8708],{},[85,14795,14796],{"class":87,"line":3892},[85,14797,1082],{"emptyLinePlaceholder":212},[85,14799,14800],{"class":87,"line":4104},[85,14801,8717],{},[85,14803,14804],{"class":87,"line":5769},[85,14805,8722],{},[85,14807,14808],{"class":87,"line":5774},[85,14809,8727],{},[85,14811,14812],{"class":87,"line":7379},[85,14813,1082],{"emptyLinePlaceholder":212},[85,14815,14816],{"class":87,"line":7385},[85,14817,6136],{},[85,14819,14820],{"class":87,"line":8508},[85,14821,8740],{},[10,14823,112],{},[76,14825,14827],{"className":14826,"code":8746,"language":118,"meta":81},[116],[14,14828,8746],{"__ignoreMap":81},[10,14830,123],{},[19,14832,126],{"id":126},[128,14834,14835,14839],{},[45,14836,14837,8760],{},[14,14838,8759],{},[45,14840,8763],{},[312,14842,2636],{"id":2636},[10,14844,8768],{},[10,14846,14847],{},[31,14848],{"alt":8773,"src":8774},[10,14850,8777],{},[19,14852,149],{"id":149},[42,14854,14855,14857],{},[45,14856,8784],{},[45,14858,8787],{},[19,14860,166],{"id":166},[128,14862,14863,14865],{},[45,14864,8794],{},[45,14866,8797],{},[10,14868,183],{},[19,14870,186],{"id":186},[10,14872,8804],{},[194,14874,196],{},{"title":81,"searchDepth":94,"depth":94,"links":14876},[14877,14878,14879,14880,14881,14884,14885,14886],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":14882},[14883],{"id":2636,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":8627,"description":8632},[207,8826,8827],{"id":8830,"title":8831,"body":14891,"category":207,"cover":208,"description":8836,"extension":210,"meta":15129,"navigation":212,"path":9137,"pinned":214,"publishedAt":215,"seo":15130,"slug":9139,"stem":9140,"summary":9141,"tags":15131,"updatedAt":215,"visible":212,"__hash__":9145},{"type":7,"value":14892,"toc":15116},[14893,14895,14897,14899,14901,14905,14907,14909,14919,14921,14923,15039,15041,15046,15048,15050,15060,15062,15064,15068,15070,15072,15074,15078,15082,15084,15092,15094,15108,15110,15112,15114],[10,14894,8836],{},[19,14896,21],{"id":21},[10,14898,8841],{},[19,14900,27],{"id":27},[10,14902,14903],{},[31,14904],{"alt":8848,"src":8849},[10,14906,8852],{},[19,14908,40],{"id":40},[42,14910,14911,14913,14915],{},[45,14912,8859],{},[45,14914,8862],{},[45,14916,8865,14917,8869],{},[14,14918,8868],{},[19,14920,71],{"id":71},[10,14922,74],{},[76,14924,14925],{"className":392,"code":8876,"language":394,"meta":81,"style":81},[14,14926,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035],{"__ignoreMap":81},[85,14928,14929],{"class":87,"line":88},[85,14930,6934],{},[85,14932,14933],{"class":87,"line":94},[85,14934,6543],{},[85,14936,14937],{"class":87,"line":100},[85,14938,1082],{"emptyLinePlaceholder":212},[85,14940,14941],{"class":87,"line":106},[85,14942,8895],{},[85,14944,14945],{"class":87,"line":1129},[85,14946,8900],{},[85,14948,14949],{"class":87,"line":1135},[85,14950,8905],{},[85,14952,14953],{"class":87,"line":2426},[85,14954,8910],{},[85,14956,14957],{"class":87,"line":2432},[85,14958,1082],{"emptyLinePlaceholder":212},[85,14960,14961],{"class":87,"line":3892},[85,14962,8919],{},[85,14964,14965],{"class":87,"line":4104},[85,14966,8924],{},[85,14968,14969],{"class":87,"line":5769},[85,14970,8929],{},[85,14972,14973],{"class":87,"line":5774},[85,14974,8934],{},[85,14976,14977],{"class":87,"line":7379},[85,14978,8939],{},[85,14980,14981],{"class":87,"line":7385},[85,14982,1082],{"emptyLinePlaceholder":212},[85,14984,14985],{"class":87,"line":8508},[85,14986,8948],{},[85,14988,14989],{"class":87,"line":8513},[85,14990,8953],{},[85,14992,14993],{"class":87,"line":8956},[85,14994,8959],{},[85,14996,14997],{"class":87,"line":8962},[85,14998,1082],{"emptyLinePlaceholder":212},[85,15000,15001],{"class":87,"line":8967},[85,15002,8970],{},[85,15004,15005],{"class":87,"line":8973},[85,15006,1082],{"emptyLinePlaceholder":212},[85,15008,15009],{"class":87,"line":8978},[85,15010,7352],{},[85,15012,15013],{"class":87,"line":8983},[85,15014,8986],{},[85,15016,15017],{"class":87,"line":8989},[85,15018,8992],{},[85,15020,15021],{"class":87,"line":8995},[85,15022,8998],{},[85,15024,15025],{"class":87,"line":9001},[85,15026,7362],{},[85,15028,15029],{"class":87,"line":9006},[85,15030,9009],{},[85,15032,15033],{"class":87,"line":9012},[85,15034,1132],{},[85,15036,15037],{"class":87,"line":9017},[85,15038,9020],{},[10,15040,112],{},[76,15042,15044],{"className":15043,"code":9026,"language":118,"meta":81},[116],[14,15045,9026],{"__ignoreMap":81},[10,15047,123],{},[19,15049,126],{"id":126},[128,15051,15052,15056],{},[45,15053,9037,15054,9040],{},[14,15055,8868],{},[45,15057,15058,9045],{},[14,15059,8100],{},[312,15061,2636],{"id":2636},[10,15063,9050],{},[10,15065,15066],{},[31,15067],{"alt":9055,"src":9056},[10,15069,9059],{},[312,15071,2636],{"id":4159},[10,15073,9064],{},[10,15075,15076],{},[31,15077],{"alt":9069,"src":9070},[10,15079,9073,15080,9077],{},[14,15081,9076],{},[19,15083,149],{"id":149},[42,15085,15086,15088],{},[45,15087,9084],{},[45,15089,9087,15090,9090],{},[14,15091,9076],{},[19,15093,166],{"id":166},[128,15095,15096,15100,15102],{},[45,15097,9097,15098,9100],{},[14,15099,9076],{},[45,15101,9103],{},[45,15103,9106,15104,9110,15106,9113],{},[14,15105,9109],{},[14,15107,6078],{},[10,15109,183],{},[19,15111,186],{"id":186},[10,15113,9120],{},[194,15115,196],{},{"title":81,"searchDepth":94,"depth":94,"links":15117},[15118,15119,15120,15121,15122,15126,15127,15128],{"id":21,"depth":94,"text":21},{"id":27,"depth":94,"text":27},{"id":40,"depth":94,"text":40},{"id":71,"depth":94,"text":71},{"id":126,"depth":94,"text":126,"children":15123},[15124,15125],{"id":2636,"depth":100,"text":2636},{"id":4159,"depth":100,"text":2636},{"id":149,"depth":94,"text":149},{"id":166,"depth":94,"text":166},{"id":186,"depth":94,"text":186},{},{"title":8831,"description":8836},[207,9143,9144],{"id":1040,"title":1041,"body":15133,"category":207,"cover":1049,"description":81,"extension":210,"meta":15369,"navigation":212,"path":1368,"pinned":214,"publishedAt":1369,"seo":15370,"slug":1371,"stem":1372,"summary":1373,"tags":15371,"updatedAt":1369,"visible":212,"__hash__":1377},{"type":7,"value":15134,"toc":15354},[15135,15139,15141,15143,15145,15147,15167,15169,15174,15176,15178,15206,15212,15214,15218,15220,15240,15242,15252,15254,15256,15258,15260,15262,15264,15266,15268,15270,15290,15292,15294,15298,15300,15302,15304,15306,15310,15312,15330,15332,15334,15336,15338,15340,15342,15344,15346,15348,15350,15352],[10,15136,15137],{},[31,15138],{"alt":1048,"src":1049},[10,15140,1052],{},[10,15142,1055],{},[19,15144,1059],{"id":1058},[10,15146,1062],{},[76,15148,15149],{"className":392,"code":1065,"language":394,"meta":81,"style":81},[14,15150,15151,15155,15159,15163],{"__ignoreMap":81},[85,15152,15153],{"class":87,"line":88},[85,15154,1072],{},[85,15156,15157],{"class":87,"line":94},[85,15158,1077],{},[85,15160,15161],{"class":87,"line":100},[85,15162,1082],{"emptyLinePlaceholder":212},[85,15164,15165],{"class":87,"line":106},[85,15166,1087],{},[10,15168,1090],{},[76,15170,15172],{"className":15171,"code":1094,"language":118,"meta":81},[116],[14,15173,1094],{"__ignoreMap":81},[10,15175,1099],{},[10,15177,1102],{},[76,15179,15180],{"className":392,"code":1105,"language":394,"meta":81,"style":81},[14,15181,15182,15186,15190,15194,15198,15202],{"__ignoreMap":81},[85,15183,15184],{"class":87,"line":88},[85,15185,1112],{},[85,15187,15188],{"class":87,"line":94},[85,15189,1082],{"emptyLinePlaceholder":212},[85,15191,15192],{"class":87,"line":100},[85,15193,1121],{},[85,15195,15196],{"class":87,"line":106},[85,15197,1126],{},[85,15199,15200],{"class":87,"line":1129},[85,15201,1132],{},[85,15203,15204],{"class":87,"line":1135},[85,15205,1138],{},[10,15207,15208,1144,15210,1148],{},[14,15209,1143],{},[14,15211,1147],{},[19,15213,1152],{"id":1151},[10,15215,1155,15216,1158],{},[14,15217,16],{},[10,15219,1161],{},[76,15221,15222],{"className":392,"code":1164,"language":394,"meta":81,"style":81},[14,15223,15224,15228,15232,15236],{"__ignoreMap":81},[85,15225,15226],{"class":87,"line":88},[85,15227,1171],{},[85,15229,15230],{"class":87,"line":94},[85,15231,1176],{},[85,15233,15234],{"class":87,"line":100},[85,15235,1181],{},[85,15237,15238],{"class":87,"line":106},[85,15239,1186],{},[10,15241,1189],{},[76,15243,15244],{"className":576,"code":1192,"language":578,"meta":81,"style":81},[14,15245,15246],{"__ignoreMap":81},[85,15247,15248,15250],{"class":87,"line":88},[85,15249,50],{"class":585},[85,15251,1201],{"class":621},[10,15253,1204],{},[19,15255,1208],{"id":1207},[312,15257,1211],{"id":1211},[10,15259,1214],{},[312,15261,1217],{"id":1217},[10,15263,1220],{},[312,15265,1223],{"id":1223},[10,15267,1226],{},[10,15269,1229],{},[76,15271,15272],{"className":392,"code":1232,"language":394,"meta":81,"style":81},[14,15273,15274,15278,15282,15286],{"__ignoreMap":81},[85,15275,15276],{"class":87,"line":88},[85,15277,1239],{},[85,15279,15280],{"class":87,"line":94},[85,15281,1082],{"emptyLinePlaceholder":212},[85,15283,15284],{"class":87,"line":100},[85,15285,1248],{},[85,15287,15288],{"class":87,"line":106},[85,15289,1253],{},[10,15291,1256],{},[312,15293,1259],{"id":1259},[10,15295,1262,15296,1265],{},[14,15297,244],{},[10,15299,1268],{},[312,15301,1271],{"id":1271},[10,15303,1274],{},[19,15305,1278],{"id":1277},[10,15307,15308],{},[31,15309],{"alt":1283,"src":1284},[10,15311,1287],{},[42,15313,15314,15316,15318,15320,15322,15324,15326,15328],{},[45,15315,1292],{},[45,15317,1295],{},[45,15319,1298],{},[45,15321,1301],{},[45,15323,1304],{},[45,15325,1307],{},[45,15327,1310],{},[45,15329,1313],{},[10,15331,1316],{},[19,15333,1320],{"id":1319},[10,15335,1323],{},[10,15337,1326],{},[19,15339,1330],{"id":1329},[10,15341,1333],{},[10,15343,1336],{},[10,15345,1339],{},[19,15347,1342],{"id":1342},[10,15349,1345],{},[10,15351,1348],{},[194,15353,1351],{},{"title":81,"searchDepth":94,"depth":94,"links":15355},[15356,15357,15358,15365,15366,15367,15368],{"id":1058,"depth":94,"text":1059},{"id":1151,"depth":94,"text":1152},{"id":1207,"depth":94,"text":1208,"children":15359},[15360,15361,15362,15363,15364],{"id":1211,"depth":100,"text":1211},{"id":1217,"depth":100,"text":1217},{"id":1223,"depth":100,"text":1223},{"id":1259,"depth":100,"text":1259},{"id":1271,"depth":100,"text":1271},{"id":1277,"depth":94,"text":1278},{"id":1319,"depth":94,"text":1320},{"id":1329,"depth":94,"text":1330},{"id":1342,"depth":94,"text":1342},{},{"title":1041,"description":81},[207,1375,1376],{"id":226,"title":227,"body":15373,"category":207,"cover":208,"description":81,"extension":210,"meta":15952,"navigation":212,"path":1029,"pinned":214,"publishedAt":1030,"seo":15953,"slug":1032,"stem":1033,"summary":1034,"tags":15954,"updatedAt":1030,"visible":212,"__hash__":1038},{"type":7,"value":15374,"toc":15928},[15375,15377,15379,15381,15385,15387,15389,15413,15425,15427,15429,15434,15438,15442,15454,15458,15462,15466,15468,15502,15504,15508,15512,15514,15536,15566,15578,15588,15596,15598,15604,15614,15616,15621,15625,15627,15641,15647,15667,15669,15671,15673,15683,15687,15689,15698,15702,15704,15706,15726,15730,15732,15734,15736,15738,15758,15760,15762,15764,15790,15792,15808,15810,15826,15830,15832,15834,15854,15856,15858,15860,15864,15874,15876,15878,15880,15890,15898,15900,15902,15916,15926],[19,15376,232],{"id":232},[10,15378,235],{},[10,15380,238],{},[10,15382,241,15383,245],{},[14,15384,244],{},[19,15386,248],{"id":248},[10,15388,251],{},[253,15390,15391,15393],{},[10,15392,257],{},[253,15394,15395,15401,15403,15407,15409],{},[10,15396,262,15397,266,15399,270],{},[14,15398,265],{},[14,15400,269],{},[10,15402,273],{},[10,15404,276,15405,281],{},[278,15406,280],{},[10,15408,284],{},[10,15410,15411],{},[31,15412],{"alt":289,"src":290},[253,15414,15415,15417],{},[10,15416,295],{},[253,15418,15419,15421],{},[10,15420,300],{},[10,15422,15423],{},[31,15424],{"alt":305,"src":306},[19,15426,310],{"id":309},[312,15428,315],{"id":314},[10,15430,318,15431,326],{},[320,15432,325],{"href":322,"rel":15433},[324],[253,15435,15436],{},[10,15437,331],{},[10,15439,15440],{},[31,15441],{"alt":336,"src":337},[42,15443,15444,15448,15452],{},[45,15445,342,15446,55],{},[278,15447,345],{},[45,15449,348,15450,55],{},[278,15451,351],{},[45,15453,354],{},[10,15455,15456],{},[31,15457],{"alt":359,"src":360},[253,15459,15460],{},[10,15461,365],{},[10,15463,15464],{},[31,15465],{"alt":370,"src":371},[312,15467,375],{"id":374},[253,15469,15470,15474,15478,15498],{},[253,15471,15472],{},[10,15473,382],{},[10,15475,385,15476,389],{},[278,15477,388],{},[76,15479,15480],{"className":392,"code":393,"language":394,"meta":81,"style":81},[14,15481,15482,15486,15490,15494],{"__ignoreMap":81},[85,15483,15484],{"class":87,"line":88},[85,15485,401],{},[85,15487,15488],{"class":87,"line":94},[85,15489,406],{},[85,15491,15492],{"class":87,"line":100},[85,15493,411],{},[85,15495,15496],{"class":87,"line":106},[85,15497,416],{},[10,15499,419,15500,423],{},[278,15501,422],{},[10,15503,426],{},[10,15505,429,15506,432],{},[14,15507,394],{},[10,15509,15510],{},[31,15511],{"alt":437,"src":438},[10,15513,441],{},[253,15515,15516,15518,15522],{},[10,15517,446],{},[10,15519,15520],{},[278,15521,451],{},[253,15523,15524,15528,15532],{},[10,15525,456,15526,459],{},[14,15527,394],{},[10,15529,462,15530,465],{},[14,15531,394],{},[10,15533,468,15534,472],{},[278,15535,471],{},[253,15537,15538,15540,15544],{},[10,15539,477],{},[10,15541,15542],{},[278,15543,482],{},[253,15545,15546,15552,15560,15562],{},[10,15547,15548,490,15550,494],{},[14,15549,489],{},[14,15551,493],{},[10,15553,497,15554,500,15556,504,15558,508],{},[14,15555,489],{},[278,15557,503],{},[278,15559,507],{},[10,15561,511],{},[10,15563,15564,517],{},[278,15565,516],{},[253,15567,15568,15570],{},[10,15569,522],{},[253,15571,15572,15576],{},[10,15573,527,15574,531],{},[278,15575,530],{},[10,15577,534],{},[253,15579,15580,15584],{},[10,15581,539,15582],{},[278,15583,542],{},[10,15585,15586],{},[31,15587],{"alt":547,"src":548},[253,15589,15590,15592],{},[10,15591,553],{},[10,15593,15594],{},[31,15595],{"alt":547,"src":558},[312,15597,562],{"id":561},[10,15599,565,15600,569,15602,573],{},[14,15601,568],{},[14,15603,572],{},[76,15605,15606],{"className":576,"code":577,"language":578,"meta":81,"style":81},[14,15607,15608],{"__ignoreMap":81},[85,15609,15610,15612],{"class":87,"line":88},[85,15611,394],{"class":585},[85,15613,589],{"class":588},[10,15615,592],{},[76,15617,15619],{"className":15618,"code":596,"language":118,"meta":81},[116],[14,15620,596],{"__ignoreMap":81},[10,15622,15623],{},[31,15624],{"alt":547,"src":603},[10,15626,606],{},[76,15628,15629],{"className":576,"code":609,"language":578,"meta":81,"style":81},[14,15630,15631],{"__ignoreMap":81},[85,15632,15633,15635,15637,15639],{"class":87,"line":88},[85,15634,394],{"class":585},[85,15636,618],{"class":588},[85,15638,622],{"class":621},[85,15640,589],{"class":588},[10,15642,627,15643,630,15645,634],{},[14,15644,394],{},[14,15646,633],{},[76,15648,15649],{"className":576,"code":637,"language":578,"meta":81,"style":81},[14,15650,15651,15657],{"__ignoreMap":81},[85,15652,15653,15655],{"class":87,"line":88},[85,15654,493],{"class":585},[85,15656,589],{"class":588},[85,15658,15659,15661,15663,15665],{"class":87,"line":94},[85,15660,493],{"class":585},[85,15662,618],{"class":588},[85,15664,622],{"class":621},[85,15666,589],{"class":588},[19,15668,659],{"id":658},[312,15670,663],{"id":662},[10,15672,666],{},[76,15674,15675],{"className":576,"code":669,"language":578,"meta":81,"style":81},[14,15676,15677],{"__ignoreMap":81},[85,15678,15679,15681],{"class":87,"line":88},[85,15680,50],{"class":585},[85,15682,589],{"class":588},[10,15684,680,15685,684],{},[14,15686,683],{},[312,15688,688],{"id":687},[10,15690,318,15691,696,15694,55,15696,703],{},[320,15692,695],{"href":693,"rel":15693},[324],[278,15695,699],{},[14,15697,702],{},[10,15699,706,15700,710],{},[14,15701,709],{},[312,15703,714],{"id":713},[10,15705,717],{},[76,15707,15708],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,15709,15710,15716],{"__ignoreMap":81},[85,15711,15712,15714],{"class":87,"line":88},[85,15713,50],{"class":585},[85,15715,589],{"class":588},[85,15717,15718,15720,15722,15724],{"class":87,"line":94},[85,15719,50],{"class":585},[85,15721,618],{"class":588},[85,15723,622],{"class":621},[85,15725,589],{"class":588},[10,15727,741,15728,744],{},[14,15729,50],{},[19,15731,748],{"id":747},[10,15733,751],{},[312,15735,755],{"id":754},[10,15737,758],{},[76,15739,15740],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,15741,15742,15748],{"__ignoreMap":81},[85,15743,15744,15746],{"class":87,"line":88},[85,15745,50],{"class":585},[85,15747,589],{"class":588},[85,15749,15750,15752,15754,15756],{"class":87,"line":94},[85,15751,50],{"class":585},[85,15753,618],{"class":588},[85,15755,622],{"class":621},[85,15757,589],{"class":588},[10,15759,781],{},[312,15761,785],{"id":784},[10,15763,788],{},[76,15765,15766],{"className":576,"code":791,"language":578,"meta":81,"style":81},[14,15767,15768,15776],{"__ignoreMap":81},[85,15769,15770,15772,15774],{"class":87,"line":88},[85,15771,798],{"class":585},[85,15773,801],{"class":621},[85,15775,804],{"class":621},[85,15777,15778,15780,15782,15784,15786,15788],{"class":87,"line":94},[85,15779,798],{"class":585},[85,15781,801],{"class":621},[85,15783,813],{"class":621},[85,15785,816],{"class":621},[85,15787,819],{"class":621},[85,15789,822],{"class":621},[10,15791,825],{},[76,15793,15794],{"className":576,"code":828,"language":578,"meta":81,"style":81},[14,15795,15796],{"__ignoreMap":81},[85,15797,15798,15800,15802,15804,15806],{"class":87,"line":88},[85,15799,798],{"class":585},[85,15801,837],{"class":621},[85,15803,813],{"class":621},[85,15805,816],{"class":621},[85,15807,844],{"class":621},[10,15809,847],{},[76,15811,15812],{"className":576,"code":850,"language":578,"meta":81,"style":81},[14,15813,15814],{"__ignoreMap":81},[85,15815,15816,15818,15820,15822,15824],{"class":87,"line":88},[85,15817,798],{"class":585},[85,15819,859],{"class":621},[85,15821,862],{"class":588},[85,15823,865],{"class":621},[85,15825,868],{"class":621},[10,15827,15828,873],{},[14,15829,798],{},[312,15831,877],{"id":876},[10,15833,880],{},[76,15835,15836],{"className":576,"code":720,"language":578,"meta":81,"style":81},[14,15837,15838,15844],{"__ignoreMap":81},[85,15839,15840,15842],{"class":87,"line":88},[85,15841,50],{"class":585},[85,15843,589],{"class":588},[85,15845,15846,15848,15850,15852],{"class":87,"line":94},[85,15847,50],{"class":585},[85,15849,618],{"class":588},[85,15851,622],{"class":621},[85,15853,589],{"class":588},[10,15855,903],{},[19,15857,906],{"id":906},[312,15859,910],{"id":909},[10,15861,913,15862,917],{},[14,15863,916],{},[128,15865,15866,15870,15872],{},[45,15867,922,15868,925],{},[14,15869,633],{},[45,15871,928],{},[45,15873,931],{},[10,15875,934],{},[312,15877,938],{"id":937},[10,15879,941],{},[76,15881,15882],{"className":576,"code":669,"language":578,"meta":81,"style":81},[14,15883,15884],{"__ignoreMap":81},[85,15885,15886,15888],{"class":87,"line":88},[85,15887,50],{"class":585},[85,15889,589],{"class":588},[10,15891,954,15892,957,15894,960,15896,55],{},[14,15893,50],{},[14,15895,394],{},[14,15897,50],{},[312,15899,966],{"id":965},[10,15901,969],{},[76,15903,15904],{"className":576,"code":972,"language":578,"meta":81,"style":81},[14,15905,15906],{"__ignoreMap":81},[85,15907,15908,15910,15912,15914],{"class":87,"line":88},[85,15909,50],{"class":585},[85,15911,618],{"class":588},[85,15913,622],{"class":621},[85,15915,589],{"class":588},[10,15917,987,15918,990,15920,993,15922,996,15924,1000],{},[14,15919,50],{},[14,15921,394],{},[14,15923,493],{},[14,15925,999],{},[194,15927,1003],{},{"title":81,"searchDepth":94,"depth":94,"links":15929},[15930,15931,15932,15937,15942,15947],{"id":232,"depth":94,"text":232},{"id":248,"depth":94,"text":248},{"id":309,"depth":94,"text":310,"children":15933},[15934,15935,15936],{"id":314,"depth":100,"text":315},{"id":374,"depth":100,"text":375},{"id":561,"depth":100,"text":562},{"id":658,"depth":94,"text":659,"children":15938},[15939,15940,15941],{"id":662,"depth":100,"text":663},{"id":687,"depth":100,"text":688},{"id":713,"depth":100,"text":714},{"id":747,"depth":94,"text":748,"children":15943},[15944,15945,15946],{"id":754,"depth":100,"text":755},{"id":784,"depth":100,"text":785},{"id":876,"depth":100,"text":877},{"id":906,"depth":94,"text":906,"children":15948},[15949,15950,15951],{"id":909,"depth":100,"text":910},{"id":937,"depth":100,"text":938},{"id":965,"depth":100,"text":966},{},{"title":227,"description":81},[207,1036,1037],1786973363818]