[{"data":1,"prerenderedAt":15927},["ShallowReactive",2],{"post-python-source-to-output":3,"sidebar-posts":177,"post-related-source":9118},{"id":4,"title":5,"body":6,"category":161,"cover":162,"description":12,"extension":163,"meta":164,"navigation":165,"path":166,"pinned":167,"publishedAt":168,"seo":169,"slug":170,"stem":171,"summary":172,"tags":173,"updatedAt":168,"visible":165,"__hash__":176},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":8,"toc":150},"minimark",[9,13,17,20,23,30,37,40,56,59,62,78,81,89,92,95,112,115,126,129,137,140,143,146],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,31,32,36],{},[33,34,35],"code",{},".py"," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,38,39],{"id":39},"核心概念",[41,42,43,50,53],"ul",{},[44,45,46,47,49],"li",{},"源代码是人编写的文本，通常保存在 ",[33,48,35],{}," 文件中。",[44,51,52],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[44,54,55],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,57,58],{"id":58},"跟着示例运行",[10,60,61],{},"把下面代码保存到本课脚本并运行：",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-python shiki shiki-themes github-dark","print(\"你好，Python\")\n","python","",[33,70,71],{"__ignoreMap":68},[72,73,76],"span",{"class":74,"line":75},"line",1,[72,77,66],{},[10,79,80],{},"预期结果：",[63,82,87],{"className":83,"code":85,"language":86,"meta":68},[84],"language-text","你好，Python\n","text",[33,88,85],{"__ignoreMap":68},[10,90,91],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,93,94],{"id":94},"按执行顺序拆开看",[96,97,98,105],"ol",{},[44,99,100,101,104],{},"终端启动解释器后，解释器读取 ",[33,102,103],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[44,106,107,108,111],{},"字符串对象先准备好，再交给 ",[33,109,110],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,113,114],{"id":114},"初学者容易混淆的地方",[41,116,117,120],{},[44,118,119],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[44,121,122,123,125],{},"认为 ",[33,124,35],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,127,128],{"id":128},"练习",[96,130,131,134],{},[44,132,133],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[44,135,136],{},"把示例文字改成自己的学习目标并重新运行。",[10,138,139],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,141,142],{"id":142},"本篇边界",[10,144,145],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,148,149],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":151,"depth":151,"links":152},2,[153,154,155,156,157,158,159,160],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},"Python",null,"md",{},true,"\u002Fposts\u002F20260817\u002F01-python-source-to-output",false,"2026-08-17",{"title":5,"description":12},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[161,174,175],"编程入门","解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",[178,994,1332,1435,1587,1766,1954,2119,2303,2486,2679,2910,3094,3271,3428,3599,3764,3979,4208,4390,4554,4743,4931,5086,5246,5443,5640,5854,6021,6265,6446,6651,6846,7030,7231,7521,7713,7942,8137,8357,8597,8801],{"id":179,"title":180,"body":181,"category":161,"cover":162,"description":68,"extension":163,"meta":983,"navigation":165,"path":984,"pinned":167,"publishedAt":985,"seo":986,"slug":987,"stem":988,"summary":989,"tags":990,"updatedAt":985,"visible":165,"__hash__":993},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":182,"toc":959},[183,186,189,192,199,202,205,244,260,264,269,280,285,291,309,315,320,326,330,378,381,387,393,396,427,472,489,503,513,517,528,544,547,553,558,561,579,589,610,614,618,621,633,640,644,659,666,670,673,694,700,704,707,711,714,734,737,741,744,778,781,800,803,824,829,833,836,856,859,862,866,873,887,890,894,897,907,918,922,925,940,956],[14,184,185],{"id":185},"引言",[10,187,188],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,190,191],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,193,194,195,198],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,196,197],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,200,201],{"id":201},"扫盲",[10,203,204],{},"那么这里有几个概念：",[206,207,208,211],"blockquote",{},[10,209,210],{},"为什么需要安装python解释器？",[206,212,213,224,227,235,238],{},[10,214,215,216,219,220,223],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,217,218],{},"0","和",[33,221,222],{},"1","组成的机器指令。",[10,225,226],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,228,229,230,234],{},"这样，我们就能用",[231,232,233],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,236,237],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,239,240],{},[26,241],{"alt":242,"src":243},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[206,245,246,249],{},[10,247,248],{},"pip又是什么？",[206,250,251,254],{},[10,252,253],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,255,256],{},[26,257],{"alt":258,"src":259},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,261,263],{"id":262},"windows-安装","Windows 安装",[265,266,268],"h3",{"id":267},"_1-下载官方安装程序","1. 下载官方安装程序",[10,270,271,272,279],{},"打开 ",[273,274,278],"a",{"href":275,"rel":276},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[277],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[206,281,282],{},[10,283,284],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,286,287],{},[26,288],{"alt":289,"src":290},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[41,292,293,300,306],{},[44,294,295,296,299],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[231,297,298],{},"Windows installer (64-bit)","。",[44,301,302,303,299],{},"搭载 ARM 处理器的 Windows 设备选择 ",[231,304,305],{},"Windows installer (ARM64)",[44,307,308],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,310,311],{},[26,312],{"alt":313,"src":314},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[206,316,317],{},[10,318,319],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,321,322],{},[26,323],{"alt":324,"src":325},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[265,327,329],{"id":328},"_2-安装并加入-path","2. 安装并加入 PATH",[206,331,332,337,344,371],{},[206,333,334],{},[10,335,336],{},"PATH 环境变量",[10,338,339,340,343],{},"Windows 有一个特殊的变量叫 ",[231,341,342],{},"PATH","，它里面存了一串文件夹路径，比如：",[63,345,347],{"className":65,"code":346,"language":67,"meta":68,"style":68},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,348,349,354,359,365],{"__ignoreMap":68},[72,350,351],{"class":74,"line":75},[72,352,353],{},"D:\\Python313\\\n",[72,355,356],{"class":74,"line":151},[72,357,358],{},"D:\\Python313\\Scripts\\\n",[72,360,362],{"class":74,"line":361},3,[72,363,364],{},"C:\\Windows\\System32\\\n",[72,366,368],{"class":74,"line":367},4,[72,369,370],{},"...\n",[10,372,373,374,377],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[231,375,376],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,379,380],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,382,383,384,386],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,385,67],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,388,389],{},[26,390],{"alt":391,"src":392},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,394,395],{},"对安装界面最底部的两个勾选项分别解释 :",[206,397,398,401,406],{},[10,399,400],{},"Add python.exe to PATH",[10,402,403],{},[231,404,405],{},"把 Python 添加到系统环境变量",[206,407,408,414,420],{},[10,409,410,411,413],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,412,67],{}," 就能运行",[10,415,416,417,419],{},"不勾选的话，命令行输入 ",[33,418,67],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,421,422,423,426],{},"必须",[231,424,425],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[206,428,429,432,437],{},[10,430,431],{},"Use admin privileges when installing py.exe",[10,433,434],{},[231,435,436],{},"使用管理员权限安装 py.exe（Python 启动器）",[206,438,439,449,463,466],{},[10,440,441,444,445,448],{},[33,442,443],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,446,447],{},"py"," 来启动 Python。",[10,450,451,452,454,455,458,459,462],{},"勾选后，",[33,453,443],{}," 会安装到",[231,456,457],{},"系统级目录","，电脑上",[231,460,461],{},"所有用户账户","都能用",[10,464,465],{},"不勾选，只有当前用户能用",[10,467,468,471],{},[231,469,470],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[206,473,474,477],{},[10,475,476],{},"操作建议",[206,478,479,486],{},[10,480,481,482,485],{},"两个都勾上之后，再点 ",[231,483,484],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,487,488],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[206,490,491,497],{},[10,492,493,494],{},"Python 安装的",[231,495,496],{},"可选功能页",[10,498,499],{},[26,500],{"alt":501,"src":502},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[206,504,505,508],{},[10,506,507],{},"高级选项页",[10,509,510],{},[26,511],{"alt":501,"src":512},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[265,514,516],{"id":515},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,518,519,520,523,524,527],{},"按 ",[33,521,522],{},"Win + R","，输入 ",[33,525,526],{},"cmd"," 并回车，然后执行：",[63,529,533],{"className":530,"code":531,"language":532,"meta":68,"style":68},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,534,535],{"__ignoreMap":68},[72,536,537,540],{"class":74,"line":75},[72,538,67],{"class":539},"svObZ",[72,541,543],{"class":542},"sDLfK"," --version\n",[10,545,546],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[63,548,551],{"className":549,"code":550,"language":86,"meta":68},[84],"Python 3.x.x\n",[33,552,550],{"__ignoreMap":68},[10,554,555],{},[26,556],{"alt":501,"src":557},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,559,560],{},"继续检查 pip：",[63,562,564],{"className":530,"code":563,"language":532,"meta":68,"style":68},"python -m pip --version\n",[33,565,566],{"__ignoreMap":68},[72,567,568,570,573,577],{"class":74,"line":75},[72,569,67],{"class":539},[72,571,572],{"class":542}," -m",[72,574,576],{"class":575},"sU2Wk"," pip",[72,578,543],{"class":542},[10,580,581,582,584,585,588],{},"如果 ",[33,583,67],{}," 无法识别，但 ",[33,586,587],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[63,590,592],{"className":530,"code":591,"language":532,"meta":68,"style":68},"py --version\npy -m pip --version\n",[33,593,594,600],{"__ignoreMap":68},[72,595,596,598],{"class":74,"line":75},[72,597,447],{"class":539},[72,599,543],{"class":542},[72,601,602,604,606,608],{"class":74,"line":151},[72,603,447],{"class":539},[72,605,572],{"class":542},[72,607,576],{"class":575},[72,609,543],{"class":542},[14,611,613],{"id":612},"macos-安装","macOS 安装",[265,615,617],{"id":616},"_1-先检查现有环境","1. 先检查现有环境",[10,619,620],{},"打开“终端”应用，执行：",[63,622,624],{"className":530,"code":623,"language":532,"meta":68,"style":68},"python3 --version\n",[33,625,626],{"__ignoreMap":68},[72,627,628,631],{"class":74,"line":75},[72,629,630],{"class":539},"python3",[72,632,543],{"class":542},[10,634,635,636,639],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,637,638],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[265,641,643],{"id":642},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,645,271,646,651,652,299,655,658],{},[273,647,650],{"href":648,"rel":649},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[277],"Python macOS 下载页","，下载当前稳定版的 ",[231,653,654],{},"macOS 64-bit universal2 installer",[33,656,657],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,660,661,662,665],{},"下载完成后打开 ",[33,663,664],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[265,667,669],{"id":668},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,671,672],{},"安装完成后重新打开终端，执行：",[63,674,676],{"className":530,"code":675,"language":532,"meta":68,"style":68},"python3 --version\npython3 -m pip --version\n",[33,677,678,684],{"__ignoreMap":68},[72,679,680,682],{"class":74,"line":75},[72,681,630],{"class":539},[72,683,543],{"class":542},[72,685,686,688,690,692],{"class":74,"line":151},[72,687,630],{"class":539},[72,689,572],{"class":542},[72,691,576],{"class":575},[72,693,543],{"class":542},[10,695,696,697,699],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,698,630],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,701,703],{"id":702},"linux-安装","Linux 安装",[10,705,706],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[265,708,710],{"id":709},"_1-检查是否已经安装","1. 检查是否已经安装",[10,712,713],{},"打开终端，执行：",[63,715,716],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,717,718,724],{"__ignoreMap":68},[72,719,720,722],{"class":74,"line":75},[72,721,630],{"class":539},[72,723,543],{"class":542},[72,725,726,728,730,732],{"class":74,"line":151},[72,727,630],{"class":539},[72,729,572],{"class":542},[72,731,576],{"class":575},[72,733,543],{"class":542},[10,735,736],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[265,738,740],{"id":739},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,742,743],{},"Ubuntu 或 Debian：",[63,745,747],{"className":530,"code":746,"language":532,"meta":68,"style":68},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,748,749,760],{"__ignoreMap":68},[72,750,751,754,757],{"class":74,"line":75},[72,752,753],{"class":539},"sudo",[72,755,756],{"class":575}," apt",[72,758,759],{"class":575}," update\n",[72,761,762,764,766,769,772,775],{"class":74,"line":151},[72,763,753],{"class":539},[72,765,756],{"class":575},[72,767,768],{"class":575}," install",[72,770,771],{"class":575}," python3",[72,773,774],{"class":575}," python3-pip",[72,776,777],{"class":575}," python3-venv\n",[10,779,780],{},"Fedora：",[63,782,784],{"className":530,"code":783,"language":532,"meta":68,"style":68},"sudo dnf install python3 python3-pip\n",[33,785,786],{"__ignoreMap":68},[72,787,788,790,793,795,797],{"class":74,"line":75},[72,789,753],{"class":539},[72,791,792],{"class":575}," dnf",[72,794,768],{"class":575},[72,796,771],{"class":575},[72,798,799],{"class":575}," python3-pip\n",[10,801,802],{},"Arch Linux：",[63,804,806],{"className":530,"code":805,"language":532,"meta":68,"style":68},"sudo pacman -S python python-pip\n",[33,807,808],{"__ignoreMap":68},[72,809,810,812,815,818,821],{"class":74,"line":75},[72,811,753],{"class":539},[72,813,814],{"class":575}," pacman",[72,816,817],{"class":542}," -S",[72,819,820],{"class":575}," python",[72,822,823],{"class":575}," python-pip\n",[10,825,826,828],{},[33,827,753],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[265,830,832],{"id":831},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,834,835],{},"安装结束后执行：",[63,837,838],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,839,840,846],{"__ignoreMap":68},[72,841,842,844],{"class":74,"line":75},[72,843,630],{"class":539},[72,845,543],{"class":542},[72,847,848,850,852,854],{"class":74,"line":151},[72,849,630],{"class":539},[72,851,572],{"class":542},[72,853,576],{"class":575},[72,855,543],{"class":542},[10,857,858],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,860,861],{"id":861},"常见问题",[265,863,865],{"id":864},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,867,868,869,872],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,870,871],{},"python --version","。如果仍然失败，按下面的顺序检查：",[96,874,875,881,884],{},[44,876,877,878,880],{},"执行 ",[33,879,587],{},"，确认 Python Launcher 是否可用。",[44,882,883],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[44,885,886],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,888,889],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[265,891,893],{"id":892},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,895,896],{},"先尝试：",[63,898,899],{"className":530,"code":623,"language":532,"meta":68,"style":68},[33,900,901],{"__ignoreMap":68},[72,902,903,905],{"class":74,"line":75},[72,904,630],{"class":539},[72,906,543],{"class":542},[10,908,909,910,912,913,915,916,299],{},"在这两个系统中，只有 ",[33,911,630],{}," 命令而没有 ",[33,914,67],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,917,630],{},[265,919,921],{"id":920},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,923,924],{},"先使用模块方式检查：",[63,926,928],{"className":530,"code":927,"language":532,"meta":68,"style":68},"python3 -m pip --version\n",[33,929,930],{"__ignoreMap":68},[72,931,932,934,936,938],{"class":74,"line":75},[72,933,630],{"class":539},[72,935,572],{"class":542},[72,937,576],{"class":575},[72,939,543],{"class":542},[10,941,942,943,945,946,948,949,951,952,955],{},"Windows 用户将命令中的 ",[33,944,630],{}," 换成 ",[33,947,67],{}," 或 ",[33,950,447],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,953,954],{},"python3-pip","；不要直接使用其他系统的安装命令。",[147,957,958],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":151,"depth":151,"links":960},[961,962,963,968,973,978],{"id":185,"depth":151,"text":185},{"id":201,"depth":151,"text":201},{"id":262,"depth":151,"text":263,"children":964},[965,966,967],{"id":267,"depth":361,"text":268},{"id":328,"depth":361,"text":329},{"id":515,"depth":361,"text":516},{"id":612,"depth":151,"text":613,"children":969},[970,971,972],{"id":616,"depth":361,"text":617},{"id":642,"depth":361,"text":643},{"id":668,"depth":361,"text":669},{"id":702,"depth":151,"text":703,"children":974},[975,976,977],{"id":709,"depth":361,"text":710},{"id":739,"depth":361,"text":740},{"id":831,"depth":361,"text":832},{"id":861,"depth":151,"text":861,"children":979},[980,981,982],{"id":864,"depth":361,"text":865},{"id":892,"depth":361,"text":893},{"id":920,"depth":361,"text":921},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":180,"description":68},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[161,991,992],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":995,"title":996,"body":997,"category":161,"cover":1004,"description":68,"extension":163,"meta":1322,"navigation":165,"path":1323,"pinned":167,"publishedAt":1324,"seo":1325,"slug":1326,"stem":1327,"summary":1328,"tags":1329,"updatedAt":1324,"visible":165,"__hash__":1331},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":998,"toc":1307},[999,1005,1008,1011,1015,1018,1043,1046,1052,1055,1058,1094,1104,1108,1114,1117,1142,1145,1157,1160,1164,1167,1170,1173,1176,1179,1182,1185,1209,1212,1215,1221,1224,1227,1230,1234,1240,1243,1269,1272,1276,1279,1282,1286,1289,1292,1295,1298,1301,1304],[10,1000,1001],{},[26,1002],{"alt":1003,"src":1004},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1006,1007],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1009,1010],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1012,1014],{"id":1013},"python-代码是什么样的","Python 代码是什么样的",[10,1016,1017],{},"下面是一段简单的 Python 代码：",[63,1019,1021],{"className":65,"code":1020,"language":67,"meta":68,"style":68},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1022,1023,1028,1033,1038],{"__ignoreMap":68},[72,1024,1025],{"class":74,"line":75},[72,1026,1027],{},"name = \"Python\"\n",[72,1029,1030],{"class":74,"line":151},[72,1031,1032],{},"year = 2026\n",[72,1034,1035],{"class":74,"line":361},[72,1036,1037],{"emptyLinePlaceholder":165},"\n",[72,1039,1040],{"class":74,"line":367},[72,1041,1042],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1044,1045],{},"运行结果：",[63,1047,1050],{"className":1048,"code":1049,"language":86,"meta":68},[84],"正在学习 Python，当前年份是 2026\n",[33,1051,1049],{"__ignoreMap":68},[10,1053,1054],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1056,1057],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[63,1059,1061],{"className":65,"code":1060,"language":67,"meta":68,"style":68},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1062,1063,1068,1072,1077,1082,1088],{"__ignoreMap":68},[72,1064,1065],{"class":74,"line":75},[72,1066,1067],{},"score = 85\n",[72,1069,1070],{"class":74,"line":151},[72,1071,1037],{"emptyLinePlaceholder":165},[72,1073,1074],{"class":74,"line":361},[72,1075,1076],{},"if score >= 60:\n",[72,1078,1079],{"class":74,"line":367},[72,1080,1081],{},"    print(\"成绩合格\")\n",[72,1083,1085],{"class":74,"line":1084},5,[72,1086,1087],{},"else:\n",[72,1089,1091],{"class":74,"line":1090},6,[72,1092,1093],{},"    print(\"需要继续学习\")\n",[10,1095,1096,1099,1100,1103],{},[33,1097,1098],{},"if"," 和 ",[33,1101,1102],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1105,1107],{"id":1106},"python-如何运行代码","Python 如何运行代码",[10,1109,1110,1111,1113],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1112,35],{}," 文件，也可以进入交互式环境逐行执行代码。",[10,1115,1116],{},"交互式环境适合快速验证一个表达式：",[63,1118,1120],{"className":65,"code":1119,"language":67,"meta":68,"style":68},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1121,1122,1127,1132,1137],{"__ignoreMap":68},[72,1123,1124],{"class":74,"line":75},[72,1125,1126],{},">>> 10 + 20\n",[72,1128,1129],{"class":74,"line":151},[72,1130,1131],{},"30\n",[72,1133,1134],{"class":74,"line":361},[72,1135,1136],{},">>> \"Python\".lower()\n",[72,1138,1139],{"class":74,"line":367},[72,1140,1141],{},"'python'\n",[10,1143,1144],{},"需要保存和重复运行的程序，则可以写入文件：",[63,1146,1148],{"className":530,"code":1147,"language":532,"meta":68,"style":68},"python3 hello.py\n",[33,1149,1150],{"__ignoreMap":68},[72,1151,1152,1154],{"class":74,"line":75},[72,1153,630],{"class":539},[72,1155,1156],{"class":575}," hello.py\n",[10,1158,1159],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1161,1163],{"id":1162},"python-的特点","Python 的特点",[265,1165,1166],{"id":1166},"语法相对简洁",[10,1168,1169],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[265,1171,1172],{"id":1172},"支持多种编程方式",[10,1174,1175],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[265,1177,1178],{"id":1178},"标准库比较完整",[10,1180,1181],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1183,1184],{},"例如，获取当前时间：",[63,1186,1188],{"className":65,"code":1187,"language":67,"meta":68,"style":68},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1189,1190,1195,1199,1204],{"__ignoreMap":68},[72,1191,1192],{"class":74,"line":75},[72,1193,1194],{},"from datetime import datetime\n",[72,1196,1197],{"class":74,"line":151},[72,1198,1037],{"emptyLinePlaceholder":165},[72,1200,1201],{"class":74,"line":361},[72,1202,1203],{},"now = datetime.now()\n",[72,1205,1206],{"class":74,"line":367},[72,1207,1208],{},"print(now)\n",[10,1210,1211],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[265,1213,1214],{"id":1214},"第三方工具丰富",[10,1216,1217,1218,1220],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1219,197],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1222,1223],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[265,1225,1226],{"id":1226},"支持多个操作系统",[10,1228,1229],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1231,1233],{"id":1232},"python-可以做什么","Python 可以做什么",[10,1235,1236],{},[26,1237],{"alt":1238,"src":1239},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1241,1242],{},"Python 的应用范围比较广，常见方向包括：",[41,1244,1245,1248,1251,1254,1257,1260,1263,1266],{},[44,1246,1247],{},"编写自动化脚本，批量处理文件和重复任务；",[44,1249,1250],{},"开发网站后端和 API 服务；",[44,1252,1253],{},"进行数据清洗、统计分析和图表展示；",[44,1255,1256],{},"编写网络爬虫和信息采集工具；",[44,1258,1259],{},"开发自动化测试程序；",[44,1261,1262],{},"进行机器学习和人工智能开发；",[44,1264,1265],{},"编写运维、监控和辅助开发工具；",[44,1267,1268],{},"开发部分桌面应用和插件。",[10,1270,1271],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1273,1275],{"id":1274},"python-的发展","Python 的发展",[10,1277,1278],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1280,1281],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1283,1285],{"id":1284},"python-也有局限","Python 也有局限",[10,1287,1288],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1290,1291],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1293,1294],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1296,1297],{"id":1297},"写在最后",[10,1299,1300],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1302,1303],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[147,1305,1306],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}",{"title":68,"searchDepth":151,"depth":151,"links":1308},[1309,1310,1311,1318,1319,1320,1321],{"id":1013,"depth":151,"text":1014},{"id":1106,"depth":151,"text":1107},{"id":1162,"depth":151,"text":1163,"children":1312},[1313,1314,1315,1316,1317],{"id":1166,"depth":361,"text":1166},{"id":1172,"depth":361,"text":1172},{"id":1178,"depth":361,"text":1178},{"id":1214,"depth":361,"text":1214},{"id":1226,"depth":361,"text":1226},{"id":1232,"depth":151,"text":1233},{"id":1274,"depth":151,"text":1275},{"id":1284,"depth":151,"text":1285},{"id":1297,"depth":151,"text":1297},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":996,"description":68},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[161,174,1330],"基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":4,"title":5,"body":1333,"category":161,"cover":162,"description":12,"extension":163,"meta":1432,"navigation":165,"path":166,"pinned":167,"publishedAt":168,"seo":1433,"slug":170,"stem":171,"summary":172,"tags":1434,"updatedAt":168,"visible":165,"__hash__":176},{"type":7,"value":1334,"toc":1422},[1335,1337,1339,1341,1343,1347,1351,1353,1363,1365,1367,1375,1377,1382,1384,1386,1396,1398,1406,1408,1414,1416,1418,1420],[10,1336,12],{},[14,1338,16],{"id":16},[10,1340,19],{},[14,1342,22],{"id":22},[10,1344,1345],{},[26,1346],{"alt":28,"src":29},[10,1348,1349,36],{},[33,1350,35],{},[14,1352,39],{"id":39},[41,1354,1355,1359,1361],{},[44,1356,46,1357,49],{},[33,1358,35],{},[44,1360,52],{},[44,1362,55],{},[14,1364,58],{"id":58},[10,1366,61],{},[63,1368,1369],{"className":65,"code":66,"language":67,"meta":68,"style":68},[33,1370,1371],{"__ignoreMap":68},[72,1372,1373],{"class":74,"line":75},[72,1374,66],{},[10,1376,80],{},[63,1378,1380],{"className":1379,"code":85,"language":86,"meta":68},[84],[33,1381,85],{"__ignoreMap":68},[10,1383,91],{},[14,1385,94],{"id":94},[96,1387,1388,1392],{},[44,1389,100,1390,104],{},[33,1391,103],{},[44,1393,107,1394,111],{},[33,1395,110],{},[14,1397,114],{"id":114},[41,1399,1400,1402],{},[44,1401,119],{},[44,1403,122,1404,125],{},[33,1405,35],{},[14,1407,128],{"id":128},[96,1409,1410,1412],{},[44,1411,133],{},[44,1413,136],{},[10,1415,139],{},[14,1417,142],{"id":142},[10,1419,145],{},[147,1421,149],{},{"title":68,"searchDepth":151,"depth":151,"links":1423},[1424,1425,1426,1427,1428,1429,1430,1431],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5,"description":12},[161,174,175],{"id":1436,"title":1437,"body":1438,"category":161,"cover":162,"description":1442,"extension":163,"meta":1578,"navigation":165,"path":1579,"pinned":167,"publishedAt":168,"seo":1580,"slug":1581,"stem":1582,"summary":1583,"tags":1584,"updatedAt":168,"visible":165,"__hash__":1586},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1439,"toc":1568},[1440,1443,1445,1448,1450,1456,1462,1464,1479,1481,1484,1504,1506,1512,1514,1516,1529,1531,1545,1547,1558,1560,1562,1565],[10,1441,1442],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1444,16],{"id":16},[10,1446,1447],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1449,22],{"id":22},[10,1451,1452],{},[26,1453],{"alt":1454,"src":1455},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1457,1458,1459,1461],{},"终端收到 ",[33,1460,630],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1463,39],{"id":39},[41,1465,1466,1469,1472],{},[44,1467,1468],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[44,1470,1471],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[44,1473,1474,1475,1478],{},"检查 pip 时使用 ",[33,1476,1477],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1480,58],{"id":58},[10,1482,1483],{},"在 macOS 终端执行：",[63,1485,1486],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,1487,1488,1494],{"__ignoreMap":68},[72,1489,1490,1492],{"class":74,"line":75},[72,1491,630],{"class":539},[72,1493,543],{"class":542},[72,1495,1496,1498,1500,1502],{"class":74,"line":151},[72,1497,630],{"class":539},[72,1499,572],{"class":542},[72,1501,576],{"class":575},[72,1503,543],{"class":542},[10,1505,80],{},[63,1507,1510],{"className":1508,"code":1509,"language":86,"meta":68},[84],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1511,1509],{"__ignoreMap":68},[10,1513,91],{},[14,1515,94],{"id":94},[96,1517,1518,1524],{},[44,1519,1520,1523],{},[33,1521,1522],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[44,1525,1526,1528],{},[33,1527,638],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1530,114],{"id":114},[41,1532,1533,1539],{},[44,1534,1535,1536,1538],{},"看到系统已有 ",[33,1537,630],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[44,1540,1541,1542,1544],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1543,630],{},"，不修改系统自带工具。",[14,1546,128],{"id":128},[96,1548,1549,1555],{},[44,1550,877,1551,1554],{},[33,1552,1553],{},"which python3","，记录当前解释器路径。",[44,1556,1557],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1559,139],{},[14,1561,142],{"id":142},[10,1563,1564],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,1566,1567],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":151,"depth":151,"links":1569},[1570,1571,1572,1573,1574,1575,1576,1577],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1437,"description":1442},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[161,1585,991],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1588,"title":1589,"body":1590,"category":161,"cover":162,"description":1755,"extension":163,"meta":1756,"navigation":165,"path":1757,"pinned":167,"publishedAt":168,"seo":1758,"slug":1759,"stem":1760,"summary":1761,"tags":1762,"updatedAt":168,"visible":165,"__hash__":1765},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1591,"toc":1745},[1592,1598,1600,1603,1605,1611,1614,1616,1640,1642,1644,1671,1673,1679,1681,1683,1701,1703,1717,1719,1733,1735,1737,1743],[10,1593,1594,1595,1597],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1596,35],{}," 脚本。",[14,1599,16],{"id":16},[10,1601,1602],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1604,22],{"id":22},[10,1606,1607],{},[26,1608],{"alt":1609,"src":1610},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1612,1613],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1615,39],{"id":39},[41,1617,1618,1627,1634],{},[44,1619,1620,1621,1623,1624,299],{},"在终端输入 ",[33,1622,630],{}," 进入 REPL，提示符通常是 ",[33,1625,1626],{},">>>",[44,1628,1629,1630,1633],{},"输入 ",[33,1631,1632],{},"exit()"," 或按 Control-D 退出 REPL。",[44,1635,1636,1637,1639],{},"需要保存、复查或多次运行的代码应写入 ",[33,1638,35],{}," 文件。",[14,1641,58],{"id":58},[10,1643,61],{},[63,1645,1649],{"className":1646,"code":1647,"language":1648,"meta":68,"style":68},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1650,1651,1656,1661,1666],{"__ignoreMap":68},[72,1652,1653],{"class":74,"line":75},[72,1654,1655],{},">>> 2 + 3\n",[72,1657,1658],{"class":74,"line":151},[72,1659,1660],{},"5\n",[72,1662,1663],{"class":74,"line":361},[72,1664,1665],{},">>> \"python\".upper()\n",[72,1667,1668],{"class":74,"line":367},[72,1669,1670],{},"'PYTHON'\n",[10,1672,80],{},[63,1674,1677],{"className":1675,"code":1676,"language":86,"meta":68},[84],"REPL 会直接显示表达式结果\n",[33,1678,1676],{"__ignoreMap":68},[10,1680,91],{},[14,1682,94],{"id":94},[96,1684,1685,1695],{},[44,1686,1687,1688,1691,1692,299],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1689,1690],{},"2 + 3"," 能直接看到 ",[33,1693,1694],{},"5",[44,1696,1697,1698,1700],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1699,110],{}," 才会写到标准输出。",[14,1702,114],{"id":114},[41,1704,1705,1714],{},[44,1706,1707,1708,1710,1711,1713],{},"把提示符 ",[33,1709,1626],{}," 复制进 ",[33,1712,35],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[44,1715,1716],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1718,128],{"id":128},[96,1720,1721,1727],{},[44,1722,1723,1724,299],{},"在 REPL 计算 ",[33,1725,1726],{},"12 * 8",[44,1728,1729,1730,1732],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1731,110],{}," 时是否显示结果。",[10,1734,139],{},[14,1736,142],{"id":142},[10,1738,1739,1740,1742],{},"本篇目标是根据任务选择 REPL 或 ",[33,1741,35],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,1744,149],{},{"title":68,"searchDepth":151,"depth":151,"links":1746},[1747,1748,1749,1750,1751,1752,1753,1754],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1589,"description":1755},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[161,1763,1764],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1767,"title":1768,"body":1769,"category":161,"cover":162,"description":1773,"extension":163,"meta":1944,"navigation":165,"path":1945,"pinned":167,"publishedAt":168,"seo":1946,"slug":1947,"stem":1948,"summary":1949,"tags":1950,"updatedAt":168,"visible":165,"__hash__":1953},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1770,"toc":1934},[1771,1774,1776,1779,1781,1787,1793,1795,1813,1815,1817,1862,1864,1870,1872,1874,1896,1898,1910,1912,1924,1926,1928,1931],[10,1772,1773],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1775,16],{"id":16},[10,1777,1778],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1780,22],{"id":22},[10,1782,1783],{},[26,1784],{"alt":1785,"src":1786},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1788,1789,1792],{},[33,1790,1791],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1794,39],{"id":39},[41,1796,1797,1800,1810],{},[44,1798,1799],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[44,1801,1802,1805,1806,1809],{},[33,1803,1804],{},"pwd"," 显示当前目录，",[33,1807,1808],{},"ls"," 显示目录里的文件。",[44,1811,1812],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1814,58],{"id":58},[10,1816,1483],{},[63,1818,1820],{"className":530,"code":1819,"language":532,"meta":68,"style":68},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1821,1822,1830,1837,1842,1856],{"__ignoreMap":68},[72,1823,1824,1827],{"class":74,"line":75},[72,1825,1826],{"class":539},"mkdir",[72,1828,1829],{"class":575}," python-study\n",[72,1831,1832,1835],{"class":74,"line":151},[72,1833,1834],{"class":542},"cd",[72,1836,1829],{"class":575},[72,1838,1839],{"class":74,"line":361},[72,1840,1841],{"class":542},"pwd\n",[72,1843,1844,1847,1850,1854],{"class":74,"line":367},[72,1845,1846],{"class":542},"printf",[72,1848,1849],{"class":575}," 'print(\"项目已经运行\")\\n'",[72,1851,1853],{"class":1852},"snl16"," >",[72,1855,1156],{"class":575},[72,1857,1858,1860],{"class":74,"line":1084},[72,1859,630],{"class":539},[72,1861,1156],{"class":575},[10,1863,80],{},[63,1865,1868],{"className":1866,"code":1867,"language":86,"meta":68},[84],"项目已经运行\n",[33,1869,1867],{"__ignoreMap":68},[10,1871,91],{},[14,1873,94],{"id":94},[96,1875,1876,1887],{},[44,1877,1878,1880,1881,1883,1884,1886],{},[33,1879,1826],{}," 创建目录，",[33,1882,1834],{}," 改变终端当前目录，",[33,1885,1804],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[44,1888,1889,1891,1892,1895],{},[33,1890,1791],{}," 会在当前目录寻找 ",[33,1893,1894],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,1897,114],{"id":114},[41,1899,1900,1907],{},[44,1901,1902,1903,1099,1905,299],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,1904,1804],{},[33,1906,1808],{},[44,1908,1909],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,1911,128],{"id":128},[96,1913,1914,1921],{},[44,1915,1916,1917,1920],{},"新建 ",[33,1918,1919],{},"lesson01.py"," 并输出课程编号。",[44,1922,1923],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,1925,139],{},[14,1927,142],{"id":142},[10,1929,1930],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,1932,1933],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":68,"searchDepth":151,"depth":151,"links":1935},[1936,1937,1938,1939,1940,1941,1942,1943],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1768,"description":1773},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[161,1951,1952],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":1955,"title":1956,"body":1957,"category":161,"cover":162,"description":1961,"extension":163,"meta":2109,"navigation":165,"path":2110,"pinned":167,"publishedAt":168,"seo":2111,"slug":2112,"stem":2113,"summary":2114,"tags":2115,"updatedAt":168,"visible":165,"__hash__":2118},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":1958,"toc":2099},[1959,1962,1964,1967,1969,1975,1986,1988,2008,2010,2012,2032,2034,2040,2042,2044,2063,2065,2073,2075,2090,2092,2094,2097],[10,1960,1961],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,1963,16],{"id":16},[10,1965,1966],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1968,22],{"id":22},[10,1970,1971],{},[26,1972],{"alt":1973,"src":1974},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,1976,1977,1978,299,1980,1983,1984,299],{},"Python 先计算表达式，再把得到的对象交给 ",[33,1979,110],{},[33,1981,1982],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,1985,1690],{},[14,1987,39],{"id":39},[41,1989,1990,1996,2005],{},[44,1991,1992,1995],{},[33,1993,1994],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[44,1997,1998,2001,2002,299],{},[33,1999,2000],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2003,2004],{},"12",[44,2006,2007],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2009,58],{"id":58},[10,2011,61],{},[63,2013,2015],{"className":65,"code":2014,"language":67,"meta":68,"style":68},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2016,2017,2022,2027],{"__ignoreMap":68},[72,2018,2019],{"class":74,"line":75},[72,2020,2021],{},"print(42)\n",[72,2023,2024],{"class":74,"line":151},[72,2025,2026],{},"print(7 + 5)\n",[72,2028,2029],{"class":74,"line":361},[72,2030,2031],{},"print(\"Python 基础课\")\n",[10,2033,80],{},[63,2035,2038],{"className":2036,"code":2037,"language":86,"meta":68},[84],"42\n12\nPython 基础课\n",[33,2039,2037],{"__ignoreMap":68},[10,2041,91],{},[14,2043,94],{"id":94},[96,2045,2046,2054],{},[44,2047,2048,2051,2052,299],{},[33,2049,2050],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2053,2004],{},[44,2055,2056,2058,2059,2062],{},[33,2057,110],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2060,2061],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2064,114],{"id":114},[41,2066,2067,2070],{},[44,2068,2069],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[44,2071,2072],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2074,128],{"id":128},[96,2076,2077,2080],{},[44,2078,2079],{},"分别输出一个整数、一个小数和一段文本。",[44,2081,2082,2083,2085,2086,2089],{},"比较 ",[33,2084,1982],{}," 与 ",[33,2087,2088],{},"print(\"2 + 3\")"," 的结果。",[10,2091,139],{},[14,2093,142],{"id":142},[10,2095,2096],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,2098,149],{},{"title":68,"searchDepth":151,"depth":151,"links":2100},[2101,2102,2103,2104,2105,2106,2107,2108],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":1956,"description":1961},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[161,2116,2117],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2120,"title":2121,"body":2122,"category":161,"cover":162,"description":2126,"extension":163,"meta":2293,"navigation":165,"path":2294,"pinned":167,"publishedAt":168,"seo":2295,"slug":2296,"stem":2297,"summary":2298,"tags":2299,"updatedAt":168,"visible":165,"__hash__":2302},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2123,"toc":2283},[2124,2127,2129,2132,2134,2140,2143,2145,2171,2173,2175,2203,2205,2211,2213,2215,2239,2241,2257,2259,2274,2276,2278,2281],[10,2125,2126],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2128,16],{"id":16},[10,2130,2131],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2133,22],{"id":22},[10,2135,2136],{},[26,2137],{"alt":2138,"src":2139},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2141,2142],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2144,39],{"id":39},[41,2146,2147,2150,2160],{},[44,2148,2149],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[44,2151,2152,2153,2085,2156,2159],{},"变量名区分大小写，",[33,2154,2155],{},"score",[33,2157,2158],{},"Score"," 是两个名字。",[44,2161,2162,2163,2166,2167,2170],{},"使用能表达含义的名称；不要用 ",[33,2164,2165],{},"list","、",[33,2168,2169],{},"str"," 等内置名称作为普通变量名。",[14,2172,58],{"id":58},[10,2174,61],{},[63,2176,2178],{"className":65,"code":2177,"language":67,"meta":68,"style":68},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2179,2180,2185,2190,2194,2199],{"__ignoreMap":68},[72,2181,2182],{"class":74,"line":75},[72,2183,2184],{},"score = 90\n",[72,2186,2187],{"class":74,"line":151},[72,2188,2189],{},"print(score)\n",[72,2191,2192],{"class":74,"line":361},[72,2193,1037],{"emptyLinePlaceholder":165},[72,2195,2196],{"class":74,"line":367},[72,2197,2198],{},"score = 95\n",[72,2200,2201],{"class":74,"line":1084},[72,2202,2189],{},[10,2204,80],{},[63,2206,2209],{"className":2207,"code":2208,"language":86,"meta":68},[84],"90\n95\n",[33,2210,2208],{"__ignoreMap":68},[10,2212,91],{},[14,2214,94],{"id":94},[96,2216,2217,2226],{},[44,2218,877,2219,2222,2223,2225],{},[33,2220,2221],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2224,2155],{}," 再绑定到它。",[44,2227,877,2228,2231,2232,2235,2236,299],{},[33,2229,2230],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2233,2234],{},"90"," 没有被改造成 ",[33,2237,2238],{},"95",[14,2240,114],{"id":114},[41,2242,2243,2246],{},[44,2244,2245],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[44,2247,2248,2249,2166,2251,2166,2253,2256],{},"使用 ",[33,2250,2165],{},[33,2252,2169],{},[33,2254,2255],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2258,128],{"id":128},[96,2260,2261,2271],{},[44,2262,2263,2264,1099,2267,2270],{},"创建 ",[33,2265,2266],{},"course_name",[33,2268,2269],{},"lesson_count"," 两个变量并输出。",[44,2272,2273],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2275,139],{},[14,2277,142],{"id":142},[10,2279,2280],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,2282,149],{},{"title":68,"searchDepth":151,"depth":151,"links":2284},[2285,2286,2287,2288,2289,2290,2291,2292],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2121,"description":2126},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[161,2300,2301],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2304,"title":2305,"body":2306,"category":161,"cover":162,"description":2310,"extension":163,"meta":2476,"navigation":165,"path":2477,"pinned":167,"publishedAt":168,"seo":2478,"slug":2479,"stem":2480,"summary":2481,"tags":2482,"updatedAt":168,"visible":165,"__hash__":2485},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2307,"toc":2466},[2308,2311,2313,2316,2318,2324,2327,2329,2358,2360,2362,2408,2410,2416,2418,2420,2434,2436,2447,2449,2457,2459,2461,2464],[10,2309,2310],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2312,16],{"id":16},[10,2314,2315],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2317,22],{"id":22},[10,2319,2320],{},[26,2321],{"alt":2322,"src":2323},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2325,2326],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2328,39],{"id":39},[41,2330,2331,2341,2355],{},[44,2332,2333,2336,2337,2340],{},[33,2334,2335],{},"int"," 表示整数，",[33,2338,2339],{},"float"," 表示浮点数。",[44,2342,2343,2346,2347,2350,2351,2354],{},[33,2344,2345],{},"\u002F"," 总是进行真除法；",[33,2348,2349],{},"\u002F\u002F"," 是向下取整除法，",[33,2352,2353],{},"%"," 得到余数。",[44,2356,2357],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2359,58],{"id":58},[10,2361,61],{},[63,2363,2365],{"className":65,"code":2364,"language":67,"meta":68,"style":68},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2366,2367,2372,2377,2382,2386,2391,2396,2402],{"__ignoreMap":68},[72,2368,2369],{"class":74,"line":75},[72,2370,2371],{},"price = 25\n",[72,2373,2374],{"class":74,"line":151},[72,2375,2376],{},"count = 4\n",[72,2378,2379],{"class":74,"line":361},[72,2380,2381],{},"discount = 0.9\n",[72,2383,2384],{"class":74,"line":367},[72,2385,1037],{"emptyLinePlaceholder":165},[72,2387,2388],{"class":74,"line":1084},[72,2389,2390],{},"total = price * count * discount\n",[72,2392,2393],{"class":74,"line":1090},[72,2394,2395],{},"average = total \u002F count\n",[72,2397,2399],{"class":74,"line":2398},7,[72,2400,2401],{},"print(total)\n",[72,2403,2405],{"class":74,"line":2404},8,[72,2406,2407],{},"print(average)\n",[10,2409,80],{},[63,2411,2414],{"className":2412,"code":2413,"language":86,"meta":68},[84],"90.0\n22.5\n",[33,2415,2413],{"__ignoreMap":68},[10,2417,91],{},[14,2419,94],{"id":94},[96,2421,2422,2428],{},[44,2423,2424,2427],{},[33,2425,2426],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[44,2429,2430,2433],{},[33,2431,2432],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2435,114],{"id":114},[41,2437,2438,2444],{},[44,2439,2440,2441,299],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2442,2443],{},"decimal.Decimal",[44,2445,2446],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2448,128],{"id":128},[96,2450,2451,2454],{},[44,2452,2453],{},"计算 137 除以 10 的商和余数。",[44,2455,2456],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2458,139],{},[14,2460,142],{"id":142},[10,2462,2463],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,2465,149],{},{"title":68,"searchDepth":151,"depth":151,"links":2467},[2468,2469,2470,2471,2472,2473,2474,2475],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2305,"description":2310},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[161,2483,2484],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2487,"title":2488,"body":2489,"category":161,"cover":162,"description":2493,"extension":163,"meta":2669,"navigation":165,"path":2670,"pinned":167,"publishedAt":168,"seo":2671,"slug":2672,"stem":2673,"summary":2674,"tags":2675,"updatedAt":168,"visible":165,"__hash__":2678},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2490,"toc":2657},[2491,2494,2496,2499,2501,2507,2517,2519,2530,2532,2534,2564,2566,2572,2574,2576,2606,2609,2612,2618,2621,2623,2631,2633,2648,2650,2652,2655],[10,2492,2493],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2495,16],{"id":16},[10,2497,2498],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2500,22],{"id":22},[10,2502,2503],{},[26,2504],{"alt":2505,"src":2506},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2508,2509,2510,2513,2514,299],{},"切片 ",[33,2511,2512],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2515,2516],{},"stop - start",[14,2518,39],{"id":39},[41,2520,2521,2524,2527],{},[44,2522,2523],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[44,2525,2526],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[44,2528,2529],{},"切片会创建新的字符串，不会修改原字符串。",[14,2531,58],{"id":58},[10,2533,61],{},[63,2535,2537],{"className":65,"code":2536,"language":67,"meta":68,"style":68},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2538,2539,2544,2549,2554,2559],{"__ignoreMap":68},[72,2540,2541],{"class":74,"line":75},[72,2542,2543],{},"language = \"Python\"\n",[72,2545,2546],{"class":74,"line":151},[72,2547,2548],{},"print(language[0])\n",[72,2550,2551],{"class":74,"line":361},[72,2552,2553],{},"print(language[-1])\n",[72,2555,2556],{"class":74,"line":367},[72,2557,2558],{},"print(language[0:3])\n",[72,2560,2561],{"class":74,"line":1084},[72,2562,2563],{},"print(language + \" 3.14\")\n",[10,2565,80],{},[63,2567,2570],{"className":2568,"code":2569,"language":86,"meta":68},[84],"P\nn\nPyt\nPython 3.14\n",[33,2571,2569],{"__ignoreMap":68},[10,2573,91],{},[14,2575,94],{"id":94},[96,2577,2578,2592],{},[44,2579,2580,2581,2583,2584,2587,2588,2591],{},"字符串 ",[33,2582,161],{}," 的正索引从 ",[33,2585,2586],{},"P"," 的 0 开始，负索引从末尾 ",[33,2589,2590],{},"n"," 的 -1 开始。",[44,2593,2594,2597,2598,2601,2602,2605],{},[33,2595,2596],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2599,2600],{},"Pyt","；索引 3 的 ",[33,2603,2604],{},"h"," 不在结果中。",[265,2607,2608],{"id":2608},"再看一个具体细节",[10,2610,2611],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2613,2614],{},[26,2615],{"alt":2616,"src":2617},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2619,2620],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2622,114],{"id":114},[41,2624,2625,2628],{},[44,2626,2627],{},"把第一个字符写成索引 1，造成整体偏移一位。",[44,2629,2630],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2632,128],{"id":128},[96,2634,2635,2645],{},[44,2636,2637,2638,2641,2642,299],{},"从 ",[33,2639,2640],{},"\"programming\""," 中切出 ",[33,2643,2644],{},"\"gram\"",[44,2646,2647],{},"使用负索引取得字符串倒数第二个字符。",[10,2649,139],{},[14,2651,142],{"id":142},[10,2653,2654],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,2656,149],{},{"title":68,"searchDepth":151,"depth":151,"links":2658},[2659,2660,2661,2662,2663,2666,2667,2668],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":2664},[2665],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2488,"description":2493},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[161,2676,2677],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2680,"title":2681,"body":2682,"category":161,"cover":162,"description":2686,"extension":163,"meta":2900,"navigation":165,"path":2901,"pinned":167,"publishedAt":168,"seo":2902,"slug":2903,"stem":2904,"summary":2905,"tags":2906,"updatedAt":168,"visible":165,"__hash__":2909},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2683,"toc":2888},[2684,2687,2689,2692,2694,2700,2710,2712,2745,2747,2749,2793,2795,2801,2803,2805,2826,2828,2831,2837,2845,2847,2861,2863,2879,2881,2883,2886],[10,2685,2686],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2688,16],{"id":16},[10,2690,2691],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2693,22],{"id":22},[10,2695,2696],{},[26,2697],{"alt":2698,"src":2699},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2701,2702,2703,948,2706,2709],{},"比较表达式先产生 ",[33,2704,2705],{},"True",[33,2707,2708],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2711,39],{"id":39},[41,2713,2714,2728,2742],{},[44,2715,2716,2719,2720,2723,2724,2727],{},[33,2717,2718],{},"=="," 判断是否相等，",[33,2721,2722],{},"!="," 判断是否不等；单个 ",[33,2725,2726],{},"="," 是赋值。",[44,2729,2730,2733,2734,2737,2738,2741],{},[33,2731,2732],{},"and"," 要求两侧都为真，",[33,2735,2736],{},"or"," 只需一侧为真，",[33,2739,2740],{},"not"," 取反。",[44,2743,2744],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2746,58],{"id":58},[10,2748,61],{},[63,2750,2752],{"className":65,"code":2751,"language":67,"meta":68,"style":68},"age = 20\nhas_ticket = True\n\nis_adult = age >= 18\ncan_enter = is_adult and has_ticket\nprint(is_adult)\nprint(can_enter)\nprint(not has_ticket)\n",[33,2753,2754,2759,2764,2768,2773,2778,2783,2788],{"__ignoreMap":68},[72,2755,2756],{"class":74,"line":75},[72,2757,2758],{},"age = 20\n",[72,2760,2761],{"class":74,"line":151},[72,2762,2763],{},"has_ticket = True\n",[72,2765,2766],{"class":74,"line":361},[72,2767,1037],{"emptyLinePlaceholder":165},[72,2769,2770],{"class":74,"line":367},[72,2771,2772],{},"is_adult = age >= 18\n",[72,2774,2775],{"class":74,"line":1084},[72,2776,2777],{},"can_enter = is_adult and has_ticket\n",[72,2779,2780],{"class":74,"line":1090},[72,2781,2782],{},"print(is_adult)\n",[72,2784,2785],{"class":74,"line":2398},[72,2786,2787],{},"print(can_enter)\n",[72,2789,2790],{"class":74,"line":2404},[72,2791,2792],{},"print(not has_ticket)\n",[10,2794,80],{},[63,2796,2799],{"className":2797,"code":2798,"language":86,"meta":68},[84],"True\nTrue\nFalse\n",[33,2800,2798],{"__ignoreMap":68},[10,2802,91],{},[14,2804,94],{"id":94},[96,2806,2807,2817],{},[44,2808,2809,2812,2813,2816],{},[33,2810,2811],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2814,2815],{},"is_adult","，这一步没有任何分支跳转。",[44,2818,2819,2822,2823,2825],{},[33,2820,2821],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2824,2740],{}," 只对紧随其后的值取反。",[265,2827,2608],{"id":2608},[10,2829,2830],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2832,2833],{},[26,2834],{"alt":2835,"src":2836},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2838,2839,2841,2842,2844],{},[33,2840,2732],{}," 只有“真、真”得到真；",[33,2843,2736],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2846,114],{"id":114},[41,2848,2849,2858],{},[44,2850,2851,2852,2854,2855,2857],{},"用单个等号判断相等。",[33,2853,2726],{}," 是赋值，",[33,2856,2718],{}," 才是相等比较。",[44,2859,2860],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2862,128],{"id":128},[96,2864,2865,2872],{},[44,2866,2867,2868,2871],{},"判断数字 ",[33,2869,2870],{},"15"," 是否同时大于 10 且小于 20。",[44,2873,2874,2875,2878],{},"分别修改年龄和票据状态，记录 ",[33,2876,2877],{},"can_enter"," 的四种组合结果。",[10,2880,139],{},[14,2882,142],{"id":142},[10,2884,2885],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,2887,149],{},{"title":68,"searchDepth":151,"depth":151,"links":2889},[2890,2891,2892,2893,2894,2897,2898,2899],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":2895},[2896],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2681,"description":2686},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[161,2907,2908],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":2911,"title":2912,"body":2913,"category":161,"cover":162,"description":2917,"extension":163,"meta":3085,"navigation":165,"path":3086,"pinned":167,"publishedAt":168,"seo":3087,"slug":3088,"stem":3089,"summary":3090,"tags":3091,"updatedAt":168,"visible":165,"__hash__":3093},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":2914,"toc":3075},[2915,2918,2920,2923,2925,2931,2949,2951,2964,2966,2968,3002,3004,3010,3012,3014,3036,3038,3050,3052,3066,3068,3070,3073],[10,2916,2917],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,2919,16],{"id":16},[10,2921,2922],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2924,22],{"id":22},[10,2926,2927],{},[26,2928],{"alt":2929,"src":2930},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,2932,2933,2936,2937,2940,2941,2944,2945,2948],{},[33,2934,2935],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,2938,2939],{},"18","，程序首先得到的也是 ",[33,2942,2943],{},"\"18\"","，需要 ",[33,2946,2947],{},"int()"," 后才能按整数参与计算。",[14,2950,39],{"id":39},[41,2952,2953,2956,2961],{},[44,2954,2955],{},"提示文字应告诉用户需要输入什么。",[44,2957,2958,2960],{},[33,2959,2947],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[44,2962,2963],{},"输入转换和业务计算分开写，定位问题更直接。",[14,2965,58],{"id":58},[10,2967,61],{},[63,2969,2971],{"className":65,"code":2970,"language":67,"meta":68,"style":68},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,2972,2973,2978,2983,2988,2992,2997],{"__ignoreMap":68},[72,2974,2975],{"class":74,"line":75},[72,2976,2977],{},"name = input(\"请输入姓名：\")\n",[72,2979,2980],{"class":74,"line":151},[72,2981,2982],{},"age_text = input(\"请输入年龄：\")\n",[72,2984,2985],{"class":74,"line":361},[72,2986,2987],{},"age = int(age_text)\n",[72,2989,2990],{"class":74,"line":367},[72,2991,1037],{"emptyLinePlaceholder":165},[72,2993,2994],{"class":74,"line":1084},[72,2995,2996],{},"print(\"你好，\" + name)\n",[72,2998,2999],{"class":74,"line":1090},[72,3000,3001],{},"print(age + 1)\n",[10,3003,80],{},[63,3005,3008],{"className":3006,"code":3007,"language":86,"meta":68},[84],"根据输入显示姓名，并输出下一年的年龄\n",[33,3009,3007],{"__ignoreMap":68},[10,3011,91],{},[14,3013,94],{"id":94},[96,3015,3016,3026],{},[44,3017,3018,3019,3021,3022,3025],{},"两次 ",[33,3020,2935],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3023,3024],{},"age_text"," 用来提醒这仍是文本。",[44,3027,3028,3031,3032,3035],{},[33,3029,3030],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3033,3034],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3037,114],{"id":114},[41,3039,3040,3047],{},[44,3041,3042,3043,3046],{},"直接计算 ",[33,3044,3045],{},"input(...) + 1","，忽略输入结果是字符串。",[44,3048,3049],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3051,128],{"id":128},[96,3053,3054,3057],{},[44,3055,3056],{},"接收两个整数并输出它们的和。",[44,3058,1629,3059,3062,3063,3065],{},[33,3060,3061],{},"18.5"," 给 ",[33,3064,2947],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3067,139],{},[14,3069,142],{"id":142},[10,3071,3072],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3074,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3076},[3077,3078,3079,3080,3081,3082,3083,3084],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":2912,"description":2917},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[161,2255,3092],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3095,"title":3096,"body":3097,"category":161,"cover":162,"description":3101,"extension":163,"meta":3261,"navigation":165,"path":3262,"pinned":167,"publishedAt":168,"seo":3263,"slug":3264,"stem":3265,"summary":3266,"tags":3267,"updatedAt":168,"visible":165,"__hash__":3270},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3098,"toc":3251},[3099,3102,3104,3107,3109,3115,3122,3124,3138,3140,3142,3181,3183,3189,3191,3193,3212,3214,3229,3231,3242,3244,3246,3249],[10,3100,3101],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3103,16],{"id":16},[10,3105,3106],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3108,22],{"id":22},[10,3110,3111],{},[26,3112],{"alt":3113,"src":3114},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3116,3117,3118,3121],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3119,3120],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3123,39],{"id":39},[41,3125,3126,3129,3132],{},[44,3127,3128],{},"列表使用方括号，元素之间用逗号分隔。",[44,3130,3131],{},"列表可变，可以替换、追加和删除元素。",[44,3133,3134,3135,299],{},"访问不存在的索引会产生 ",[33,3136,3137],{},"IndexError",[14,3139,58],{"id":58},[10,3141,61],{},[63,3143,3145],{"className":65,"code":3144,"language":67,"meta":68,"style":68},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3146,3147,3152,3157,3161,3166,3171,3176],{"__ignoreMap":68},[72,3148,3149],{"class":74,"line":75},[72,3150,3151],{},"scores = [82, 90, 76]\n",[72,3153,3154],{"class":74,"line":151},[72,3155,3156],{},"print(scores[0])\n",[72,3158,3159],{"class":74,"line":361},[72,3160,1037],{"emptyLinePlaceholder":165},[72,3162,3163],{"class":74,"line":367},[72,3164,3165],{},"scores[1] = 95\n",[72,3167,3168],{"class":74,"line":1084},[72,3169,3170],{},"scores.append(88)\n",[72,3172,3173],{"class":74,"line":1090},[72,3174,3175],{},"print(scores)\n",[72,3177,3178],{"class":74,"line":2398},[72,3179,3180],{},"print(len(scores))\n",[10,3182,80],{},[63,3184,3187],{"className":3185,"code":3186,"language":86,"meta":68},[84],"82\n[82, 95, 76, 88]\n4\n",[33,3188,3186],{"__ignoreMap":68},[10,3190,91],{},[14,3192,94],{"id":94},[96,3194,3195,3198],{},[44,3196,3197],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[44,3199,3200,3203,3204,3207,3208,3211],{},[33,3201,3202],{},"scores[1] = 95"," 替换第二个位置，",[33,3205,3206],{},"append(88)"," 在末尾增加新位置，",[33,3209,3210],{},"len()"," 因而从 3 变为 4。",[14,3213,114],{"id":114},[41,3215,3216,3226],{},[44,3217,3218,3219,3222,3223,299],{},"访问 ",[33,3220,3221],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3224,3225],{},"len(scores) - 1",[44,3227,3228],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3230,128],{"id":128},[96,3232,3233,3236],{},[44,3234,3235],{},"建立三项学习任务列表，再追加第四项。",[44,3237,3238,3239,3241],{},"修改第二项，并用 ",[33,3240,3210],{}," 检查元素数量。",[10,3243,139],{},[14,3245,142],{"id":142},[10,3247,3248],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3250,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3252},[3253,3254,3255,3256,3257,3258,3259,3260],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3096,"description":3101},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[161,3268,3269],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3272,"title":3273,"body":3274,"category":161,"cover":162,"description":3278,"extension":163,"meta":3419,"navigation":165,"path":3420,"pinned":167,"publishedAt":168,"seo":3421,"slug":3422,"stem":3423,"summary":3424,"tags":3425,"updatedAt":168,"visible":165,"__hash__":3427},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3275,"toc":3409},[3276,3279,3281,3284,3286,3292,3295,3297,3308,3310,3312,3346,3348,3354,3356,3358,3372,3374,3386,3388,3400,3402,3404,3407],[10,3277,3278],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3280,16],{"id":16},[10,3282,3283],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3285,22],{"id":22},[10,3287,3288],{},[26,3289],{"alt":3290,"src":3291},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3293,3294],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3296,39],{"id":39},[41,3298,3299,3302,3305],{},[44,3300,3301],{},"元组常用来表达固定数量、固定含义的一组值。",[44,3303,3304],{},"只有一个元素的元组必须保留尾随逗号。",[44,3306,3307],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3309,58],{"id":58},[10,3311,61],{},[63,3313,3315],{"className":65,"code":3314,"language":67,"meta":68,"style":68},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3316,3317,3322,3327,3332,3336,3341],{"__ignoreMap":68},[72,3318,3319],{"class":74,"line":75},[72,3320,3321],{},"point = (120, 80)\n",[72,3323,3324],{"class":74,"line":151},[72,3325,3326],{},"print(point[0])\n",[72,3328,3329],{"class":74,"line":361},[72,3330,3331],{},"print(point[1])\n",[72,3333,3334],{"class":74,"line":367},[72,3335,1037],{"emptyLinePlaceholder":165},[72,3337,3338],{"class":74,"line":1084},[72,3339,3340],{},"single = (5,)\n",[72,3342,3343],{"class":74,"line":1090},[72,3344,3345],{},"print(single)\n",[10,3347,80],{},[63,3349,3352],{"className":3350,"code":3351,"language":86,"meta":68},[84],"120\n80\n(5,)\n",[33,3353,3351],{"__ignoreMap":68},[10,3355,91],{},[14,3357,94],{"id":94},[96,3359,3360,3366],{},[44,3361,3362,3365],{},[33,3363,3364],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[44,3367,3368,3371],{},[33,3369,3370],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3373,114],{"id":114},[41,3375,3376,3383],{},[44,3377,3378,3379,3382],{},"把 ",[33,3380,3381],{},"(5)"," 当作元组，实际它仍是整数。",[44,3384,3385],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3387,128],{"id":128},[96,3389,3390,3393],{},[44,3391,3392],{},"用元组表示宽度和高度。",[44,3394,2082,3395,2085,3397,3399],{},[33,3396,3381],{},[33,3398,3370],{}," 的类型。",[10,3401,139],{},[14,3403,142],{"id":142},[10,3405,3406],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3408,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3410},[3411,3412,3413,3414,3415,3416,3417,3418],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3273,"description":3278},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[161,3426,3269],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3429,"title":3430,"body":3431,"category":161,"cover":162,"description":3435,"extension":163,"meta":3590,"navigation":165,"path":3591,"pinned":167,"publishedAt":168,"seo":3592,"slug":3593,"stem":3594,"summary":3595,"tags":3596,"updatedAt":168,"visible":165,"__hash__":3598},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3432,"toc":3580},[3433,3436,3438,3441,3443,3449,3459,3461,3475,3477,3479,3513,3515,3521,3523,3525,3540,3542,3561,3563,3571,3573,3575,3578],[10,3434,3435],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3437,16],{"id":16},[10,3439,3440],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3442,22],{"id":22},[10,3444,3445],{},[26,3446],{"alt":3447,"src":3448},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3450,3451,3452,3455,3456,3458],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3453,3454],{},"student[\"score\"]"," 读取的是键 ",[33,3457,2155],{}," 对应的值，而不是“第几个元素”。",[14,3460,39],{"id":39},[41,3462,3463,3466,3472],{},[44,3464,3465],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[44,3467,2248,3468,3471],{},[33,3469,3470],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[44,3473,3474],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3476,58],{"id":58},[10,3478,61],{},[63,3480,3482],{"className":65,"code":3481,"language":67,"meta":68,"style":68},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3483,3484,3489,3494,3498,3503,3508],{"__ignoreMap":68},[72,3485,3486],{"class":74,"line":75},[72,3487,3488],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[72,3490,3491],{"class":74,"line":151},[72,3492,3493],{},"print(student[\"name\"])\n",[72,3495,3496],{"class":74,"line":361},[72,3497,1037],{"emptyLinePlaceholder":165},[72,3499,3500],{"class":74,"line":367},[72,3501,3502],{},"student[\"score\"] = 95\n",[72,3504,3505],{"class":74,"line":1084},[72,3506,3507],{},"student[\"city\"] = \"郑州\"\n",[72,3509,3510],{"class":74,"line":1090},[72,3511,3512],{},"print(student)\n",[10,3514,80],{},[63,3516,3519],{"className":3517,"code":3518,"language":86,"meta":68},[84],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3520,3518],{"__ignoreMap":68},[10,3522,91],{},[14,3524,94],{"id":94},[96,3526,3527,3530],{},[44,3528,3529],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[44,3531,3532,3533,3535,3536,3539],{},"给已有键 ",[33,3534,2155],{}," 赋值会更新映射，给新键 ",[33,3537,3538],{},"city"," 赋值会增加映射。",[14,3541,114],{"id":114},[41,3543,3544,3551],{},[44,3545,3546,3547,3550],{},"按位置理解字典并尝试 ",[33,3548,3549],{},"student[0]","，而实际键是字符串。",[44,3552,3553,3554,3557,3558,299],{},"直接读取不确定存在的键并忽略 ",[33,3555,3556],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3559,3560],{},"get()",[14,3562,128],{"id":128},[96,3564,3565,3568],{},[44,3566,3567],{},"建立一本书的标题、作者和页数字典。",[44,3569,3570],{},"添加分类键，再修改页数。",[10,3572,139],{},[14,3574,142],{"id":142},[10,3576,3577],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3579,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3581},[3582,3583,3584,3585,3586,3587,3588,3589],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3430,"description":3435},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[161,3597,3269],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3600,"title":3601,"body":3602,"category":161,"cover":162,"description":3606,"extension":163,"meta":3755,"navigation":165,"path":3756,"pinned":167,"publishedAt":168,"seo":3757,"slug":3758,"stem":3759,"summary":3760,"tags":3761,"updatedAt":168,"visible":165,"__hash__":3763},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3603,"toc":3745},[3604,3607,3609,3612,3614,3620,3623,3625,3644,3646,3648,3682,3684,3690,3692,3694,3709,3711,3723,3725,3736,3738,3740,3743],[10,3605,3606],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3608,16],{"id":16},[10,3610,3611],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3613,22],{"id":22},[10,3615,3616],{},[26,3617],{"alt":3618,"src":3619},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3621,3622],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3624,39],{"id":39},[41,3626,3627,3630,3633],{},[44,3628,3629],{},"集合中的元素不重复。",[44,3631,3632],{},"集合是无序容器，不要依赖打印顺序或索引。",[44,3634,3635,3636,3639,3640,3643],{},"创建空集合必须写 ",[33,3637,3638],{},"set()","；",[33,3641,3642],{},"{}"," 创建的是空字典。",[14,3645,58],{"id":58},[10,3647,61],{},[63,3649,3651],{"className":65,"code":3650,"language":67,"meta":68,"style":68},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3652,3653,3658,3663,3667,3672,3677],{"__ignoreMap":68},[72,3654,3655],{"class":74,"line":75},[72,3656,3657],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[72,3659,3660],{"class":74,"line":151},[72,3661,3662],{},"right = {\"Python\", \"Docker\"}\n",[72,3664,3665],{"class":74,"line":361},[72,3666,1037],{"emptyLinePlaceholder":165},[72,3668,3669],{"class":74,"line":367},[72,3670,3671],{},"print(left & right)\n",[72,3673,3674],{"class":74,"line":1084},[72,3675,3676],{},"print(left | right)\n",[72,3678,3679],{"class":74,"line":1090},[72,3680,3681],{},"print(\"Git\" in left)\n",[10,3683,80],{},[63,3685,3688],{"className":3686,"code":3687,"language":86,"meta":68},[84],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3689,3687],{"__ignoreMap":68},[10,3691,91],{},[14,3693,94],{"id":94},[96,3695,3696,3699],{},[44,3697,3698],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[44,3700,3701,3704,3705,3708],{},[33,3702,3703],{},"&"," 计算交集，",[33,3706,3707],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3710,114],{"id":114},[41,3712,3713,3720],{},[44,3714,2248,3715,3717,3718,299],{},[33,3716,3642],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3719,3638],{},[44,3721,3722],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3724,128],{"id":128},[96,3726,3727,3733],{},[44,3728,3729,3730,3732],{},"把包含重复标签的列表交给 ",[33,3731,3638],{}," 去重。",[44,3734,3735],{},"计算两组课程标签的交集和差集。",[10,3737,139],{},[14,3739,142],{"id":142},[10,3741,3742],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3744,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3746},[3747,3748,3749,3750,3751,3752,3753,3754],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3601,"description":3606},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[161,3762,3269],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3765,"title":3766,"body":3767,"category":161,"cover":162,"description":3771,"extension":163,"meta":3969,"navigation":165,"path":3970,"pinned":167,"publishedAt":168,"seo":3971,"slug":3972,"stem":3973,"summary":3974,"tags":3975,"updatedAt":168,"visible":165,"__hash__":3978},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3768,"toc":3957},[3769,3772,3774,3777,3779,3785,3795,3797,3814,3816,3818,3868,3870,3876,3878,3880,3902,3904,3907,3913,3916,3918,3931,3933,3948,3950,3952,3955],[10,3770,3771],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3773,16],{"id":16},[10,3775,3776],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3778,22],{"id":22},[10,3780,3781],{},[26,3782],{"alt":3783,"src":3784},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3786,3787,3790,3791,3794],{},[33,3788,3789],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3792,3793],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3796,39],{"id":39},[41,3798,3799,3808,3811],{},[44,3800,3801,3803,3804,3807],{},[33,3802,2718],{}," 比较内容是否相等，",[33,3805,3806],{},"is"," 比较是否为同一个对象。",[44,3809,3810],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[44,3812,3813],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3815,58],{"id":58},[10,3817,61],{},[63,3819,3821],{"className":65,"code":3820,"language":67,"meta":68,"style":68},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3822,3823,3828,3833,3838,3842,3847,3852,3857,3862],{"__ignoreMap":68},[72,3824,3825],{"class":74,"line":75},[72,3826,3827],{},"tasks = [\"变量\", \"字符串\"]\n",[72,3829,3830],{"class":74,"line":151},[72,3831,3832],{},"shared = tasks\n",[72,3834,3835],{"class":74,"line":361},[72,3836,3837],{},"backup = tasks.copy()\n",[72,3839,3840],{"class":74,"line":367},[72,3841,1037],{"emptyLinePlaceholder":165},[72,3843,3844],{"class":74,"line":1084},[72,3845,3846],{},"tasks.append(\"列表\")\n",[72,3848,3849],{"class":74,"line":1090},[72,3850,3851],{},"print(shared)\n",[72,3853,3854],{"class":74,"line":2398},[72,3855,3856],{},"print(backup)\n",[72,3858,3859],{"class":74,"line":2404},[72,3860,3861],{},"print(tasks is shared)\n",[72,3863,3865],{"class":74,"line":3864},9,[72,3866,3867],{},"print(tasks is backup)\n",[10,3869,80],{},[63,3871,3874],{"className":3872,"code":3873,"language":86,"meta":68},[84],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3875,3873],{"__ignoreMap":68},[10,3877,91],{},[14,3879,94],{"id":94},[96,3881,3882,3888],{},[44,3883,3884,3887],{},[33,3885,3886],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[44,3889,3890,3893,3894,3897,3898,3901],{},[33,3891,3892],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3895,3896],{},"shared"," 能观察到变化，",[33,3899,3900],{},"backup"," 不会。",[265,3903,2608],{"id":2608},[10,3905,3906],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,3908,3909],{},[26,3910],{"alt":3911,"src":3912},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,3914,3915],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,3917,114],{"id":114},[41,3919,3920,3928],{},[44,3921,3922,3923,3925,3926,299],{},"用 ",[33,3924,2718],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,3927,3806],{},[44,3929,3930],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,3932,128],{"id":128},[96,3934,3935,3938],{},[44,3936,3937],{},"让两个变量引用同一个字典并修改其中一个。",[44,3939,2248,3940,3943,3944,1099,3946,299],{},[33,3941,3942],{},"copy()"," 创建外层副本，再比较 ",[33,3945,3806],{},[33,3947,2718],{},[10,3949,139],{},[14,3951,142],{"id":142},[10,3953,3954],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,3956,149],{},{"title":68,"searchDepth":151,"depth":151,"links":3958},[3959,3960,3961,3962,3963,3966,3967,3968],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":3964},[3965],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3766,"description":3771},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[161,3976,3977],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":3980,"title":3981,"body":3982,"category":161,"cover":162,"description":3986,"extension":163,"meta":4199,"navigation":165,"path":4200,"pinned":167,"publishedAt":168,"seo":4201,"slug":4202,"stem":4203,"summary":4204,"tags":4205,"updatedAt":168,"visible":165,"__hash__":4207},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":3983,"toc":4186},[3984,3987,3989,3992,3994,4000,4010,4012,4023,4025,4027,4080,4082,4088,4090,4092,4110,4112,4115,4121,4129,4132,4135,4141,4147,4149,4167,4169,4177,4179,4181,4184],[10,3985,3986],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,3988,16],{"id":16},[10,3990,3991],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3993,22],{"id":22},[10,3995,3996],{},[26,3997],{"alt":3998,"src":3999},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4001,4002,2166,4004,2166,4007,4009],{},[33,4003,1098],{},[33,4005,4006],{},"elif",[33,4008,1102],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4011,39],{"id":39},[41,4013,4014,4017,4020],{},[44,4015,4016],{},"冒号表示接下来开始一个代码块。",[44,4018,4019],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[44,4021,4022],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4024,58],{"id":58},[10,4026,61],{},[63,4028,4030],{"className":65,"code":4029,"language":67,"meta":68,"style":68},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4031,4032,4037,4041,4046,4051,4056,4061,4065,4070,4074],{"__ignoreMap":68},[72,4033,4034],{"class":74,"line":75},[72,4035,4036],{},"score = int(input(\"请输入分数：\"))\n",[72,4038,4039],{"class":74,"line":151},[72,4040,1037],{"emptyLinePlaceholder":165},[72,4042,4043],{"class":74,"line":361},[72,4044,4045],{},"if score >= 90:\n",[72,4047,4048],{"class":74,"line":367},[72,4049,4050],{},"    level = \"优秀\"\n",[72,4052,4053],{"class":74,"line":1084},[72,4054,4055],{},"elif score >= 60:\n",[72,4057,4058],{"class":74,"line":1090},[72,4059,4060],{},"    level = \"合格\"\n",[72,4062,4063],{"class":74,"line":2398},[72,4064,1087],{},[72,4066,4067],{"class":74,"line":2404},[72,4068,4069],{},"    level = \"需要继续学习\"\n",[72,4071,4072],{"class":74,"line":3864},[72,4073,1037],{"emptyLinePlaceholder":165},[72,4075,4077],{"class":74,"line":4076},10,[72,4078,4079],{},"print(level)\n",[10,4081,80],{},[63,4083,4086],{"className":4084,"code":4085,"language":86,"meta":68},[84],"输入 85 时输出：合格\n",[33,4087,4085],{"__ignoreMap":68},[10,4089,91],{},[14,4091,94],{"id":94},[96,4093,4094,4101],{},[44,4095,4096,4097,4100],{},"输入先转换为整数，程序从 ",[33,4098,4099],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[44,4102,4103,4106,4107,4109],{},[33,4104,4105],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4108,1102],{}," 被跳过；最终三个分支只会选择一个。",[265,4111,2608],{"id":2608},[10,4113,4114],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4116,4117],{},[26,4118],{"alt":4119,"src":4120},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4122,4123,4125,4126,4128],{},[33,4124,4099],{}," 必须放在 ",[33,4127,4105],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[265,4130,2608],{"id":4131},"再看一个具体细节-1",[10,4133,4134],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4136,4137],{},[26,4138],{"alt":4139,"src":4140},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4142,4143,4144,4146],{},"同一缩进层级属于同一个代码块；回到 ",[33,4145,1098],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4148,114],{"id":114},[41,4150,4151,4157],{},[44,4152,4153,4154,4156],{},"先写 ",[33,4155,4105],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[44,4158,4159,4160,4162,4163,4166],{},"混用多个独立 ",[33,4161,1098],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4164,4165],{},"if\u002Felif\u002Felse"," 链。",[14,4168,128],{"id":128},[96,4170,4171,4174],{},[44,4172,4173],{},"根据温度输出“冷、适中、热”三个等级。",[44,4175,4176],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4178,139],{},[14,4180,142],{"id":142},[10,4182,4183],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,4185,149],{},{"title":68,"searchDepth":151,"depth":151,"links":4187},[4188,4189,4190,4191,4192,4196,4197,4198],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":4193},[4194,4195],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":3981,"description":3986},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[161,1098,4206],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4209,"title":4210,"body":4211,"category":161,"cover":162,"description":4215,"extension":163,"meta":4381,"navigation":165,"path":4382,"pinned":167,"publishedAt":168,"seo":4383,"slug":4384,"stem":4385,"summary":4386,"tags":4387,"updatedAt":168,"visible":165,"__hash__":4389},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4212,"toc":4369},[4213,4216,4218,4221,4223,4229,4235,4237,4252,4254,4256,4294,4296,4302,4304,4306,4321,4323,4326,4332,4338,4340,4348,4350,4360,4362,4364,4367],[10,4214,4215],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4217,16],{"id":16},[10,4219,4220],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4222,22],{"id":22},[10,4224,4225],{},[26,4226],{"alt":4227,"src":4228},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4230,4231,4234],{},[33,4232,4233],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4236,39],{"id":39},[41,4238,4239,4242,4245],{},[44,4240,4241],{},"进入循环前先准备参与条件判断的状态。",[44,4243,4244],{},"循环体中必须有机会让条件变为假。",[44,4246,4247,4248,4251],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4249,4250],{},"for"," 通常更直接。",[14,4253,58],{"id":58},[10,4255,61],{},[63,4257,4259],{"className":65,"code":4258,"language":67,"meta":68,"style":68},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4260,4261,4266,4270,4275,4280,4285,4289],{"__ignoreMap":68},[72,4262,4263],{"class":74,"line":75},[72,4264,4265],{},"count = 1\n",[72,4267,4268],{"class":74,"line":151},[72,4269,1037],{"emptyLinePlaceholder":165},[72,4271,4272],{"class":74,"line":361},[72,4273,4274],{},"while count \u003C= 3:\n",[72,4276,4277],{"class":74,"line":367},[72,4278,4279],{},"    print(\"第\", count, \"次练习\")\n",[72,4281,4282],{"class":74,"line":1084},[72,4283,4284],{},"    count = count + 1\n",[72,4286,4287],{"class":74,"line":1090},[72,4288,1037],{"emptyLinePlaceholder":165},[72,4290,4291],{"class":74,"line":2398},[72,4292,4293],{},"print(\"练习结束\")\n",[10,4295,80],{},[63,4297,4300],{"className":4298,"code":4299,"language":86,"meta":68},[84],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4301,4299],{"__ignoreMap":68},[10,4303,91],{},[14,4305,94],{"id":94},[96,4307,4308,4315],{},[44,4309,4310,4311,4314],{},"进入循环前 ",[33,4312,4313],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[44,4316,4317,4318,4320],{},"循环体末尾把 ",[33,4319,4313],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[265,4322,2608],{"id":2608},[10,4324,4325],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4327,4328],{},[26,4329],{"alt":4330,"src":4331},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4333,4334,4335,4337],{},"第4次检查时 ",[33,4336,4313],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4339,114],{"id":114},[41,4341,4342,4345],{},[44,4343,4344],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[44,4346,4347],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4349,128],{"id":128},[96,4351,4352,4357],{},[44,4353,2248,4354,4356],{},[33,4355,4233],{}," 输出 1 到 5。",[44,4358,4359],{},"计算 1 到 10 的累加和。",[10,4361,139],{},[14,4363,142],{"id":142},[10,4365,4366],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,4368,149],{},{"title":68,"searchDepth":151,"depth":151,"links":4370},[4371,4372,4373,4374,4375,4378,4379,4380],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":4376},[4377],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4210,"description":4215},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[161,4233,4388],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4391,"title":4392,"body":4393,"category":161,"cover":162,"description":4397,"extension":163,"meta":4545,"navigation":165,"path":4546,"pinned":167,"publishedAt":168,"seo":4547,"slug":4548,"stem":4549,"summary":4550,"tags":4551,"updatedAt":168,"visible":165,"__hash__":4553},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4394,"toc":4535},[4395,4398,4400,4403,4405,4411,4416,4418,4432,4434,4436,4474,4476,4482,4484,4486,4503,4505,4513,4515,4526,4528,4530,4533],[10,4396,4397],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4399,16],{"id":16},[10,4401,4402],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4404,22],{"id":22},[10,4406,4407],{},[26,4408],{"alt":4409,"src":4410},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4412,4413,4415],{},[33,4414,4250],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4417,39],{"id":39},[41,4419,4420,4426,4429],{},[44,4421,4422,4425],{},[33,4423,4424],{},"range(1, 4)"," 包含 1，不包含 4。",[44,4427,4428],{},"只需要元素时直接遍历元素，不必手工维护索引。",[44,4430,4431],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4433,58],{"id":58},[10,4435,61],{},[63,4437,4439],{"className":65,"code":4438,"language":67,"meta":68,"style":68},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4440,4441,4446,4450,4455,4460,4464,4469],{"__ignoreMap":68},[72,4442,4443],{"class":74,"line":75},[72,4444,4445],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[72,4447,4448],{"class":74,"line":151},[72,4449,1037],{"emptyLinePlaceholder":165},[72,4451,4452],{"class":74,"line":361},[72,4453,4454],{},"for course in courses:\n",[72,4456,4457],{"class":74,"line":367},[72,4458,4459],{},"    print(course)\n",[72,4461,4462],{"class":74,"line":1084},[72,4463,1037],{"emptyLinePlaceholder":165},[72,4465,4466],{"class":74,"line":1090},[72,4467,4468],{},"for number in range(1, 4):\n",[72,4470,4471],{"class":74,"line":2398},[72,4472,4473],{},"    print(number)\n",[10,4475,80],{},[63,4477,4480],{"className":4478,"code":4479,"language":86,"meta":68},[84],"变量\n字符串\n列表\n1\n2\n3\n",[33,4481,4479],{"__ignoreMap":68},[10,4483,91],{},[14,4485,94],{"id":94},[96,4487,4488,4498],{},[44,4489,4490,4491,4493,4494,4497],{},"第一个 ",[33,4492,4250],{}," 依次从列表取得字符串，循环变量 ",[33,4495,4496],{},"course"," 每轮重新绑定。",[44,4499,4500,4502],{},[33,4501,4424],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4504,114],{"id":114},[41,4506,4507,4510],{},[44,4508,4509],{},"只需要元素却手工维护索引，增加越界风险。",[44,4511,4512],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4514,128],{"id":128},[96,4516,4517,4520],{},[44,4518,4519],{},"逐项输出一个字符串中的字符。",[44,4521,2248,4522,4525],{},[33,4523,4524],{},"range()"," 输出 2、4、6、8。",[10,4527,139],{},[14,4529,142],{"id":142},[10,4531,4532],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,4534,149],{},{"title":68,"searchDepth":151,"depth":151,"links":4536},[4537,4538,4539,4540,4541,4542,4543,4544],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4392,"description":4397},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[161,4250,4552],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4555,"title":4556,"body":4557,"category":161,"cover":162,"description":4561,"extension":163,"meta":4735,"navigation":165,"path":4736,"pinned":167,"publishedAt":168,"seo":4737,"slug":4738,"stem":4739,"summary":4740,"tags":4741,"updatedAt":168,"visible":165,"__hash__":4742},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4558,"toc":4725},[4559,4562,4564,4567,4569,4575,4585,4587,4606,4608,4610,4662,4664,4670,4672,4674,4688,4690,4706,4708,4716,4718,4720,4723],[10,4560,4561],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4563,16],{"id":16},[10,4565,4566],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4568,22],{"id":22},[10,4570,4571],{},[26,4572],{"alt":4573,"src":4574},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4576,4577,4580,4581,4584],{},[33,4578,4579],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4582,4583],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4586,39],{"id":39},[41,4588,4589,4592,4600],{},[44,4590,4591],{},"先写普通循环，再在确有需要时加入流程控制语句。",[44,4593,4594,4596,4597,4599],{},[33,4595,4579],{}," 前要确认不会跳过 ",[33,4598,4233],{}," 循环中的状态更新。",[44,4601,4602,4603,4605],{},"多层嵌套中 ",[33,4604,4583],{}," 只结束它所在的最内层循环。",[14,4607,58],{"id":58},[10,4609,61],{},[63,4611,4613],{"className":65,"code":4612,"language":67,"meta":68,"style":68},"numbers = [3, -1, 0, 8, 12]\n\nfor number in numbers:\n    if number \u003C 0:\n        continue\n    if number == 0:\n        break\n    print(number)\n\nprint(\"循环结束\")\n",[33,4614,4615,4620,4624,4629,4634,4639,4644,4649,4653,4657],{"__ignoreMap":68},[72,4616,4617],{"class":74,"line":75},[72,4618,4619],{},"numbers = [3, -1, 0, 8, 12]\n",[72,4621,4622],{"class":74,"line":151},[72,4623,1037],{"emptyLinePlaceholder":165},[72,4625,4626],{"class":74,"line":361},[72,4627,4628],{},"for number in numbers:\n",[72,4630,4631],{"class":74,"line":367},[72,4632,4633],{},"    if number \u003C 0:\n",[72,4635,4636],{"class":74,"line":1084},[72,4637,4638],{},"        continue\n",[72,4640,4641],{"class":74,"line":1090},[72,4642,4643],{},"    if number == 0:\n",[72,4645,4646],{"class":74,"line":2398},[72,4647,4648],{},"        break\n",[72,4650,4651],{"class":74,"line":2404},[72,4652,4473],{},[72,4654,4655],{"class":74,"line":3864},[72,4656,1037],{"emptyLinePlaceholder":165},[72,4658,4659],{"class":74,"line":4076},[72,4660,4661],{},"print(\"循环结束\")\n",[10,4663,80],{},[63,4665,4668],{"className":4666,"code":4667,"language":86,"meta":68},[84],"3\n循环结束\n",[33,4669,4667],{"__ignoreMap":68},[10,4671,91],{},[14,4673,94],{"id":94},[96,4675,4676,4682],{},[44,4677,4678,4679,4681],{},"遇到 -1 时 ",[33,4680,4579],{}," 立即结束本轮，后面的判断和输出都不执行。",[44,4683,4684,4685,4687],{},"遇到 0 时 ",[33,4686,4583],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4689,114],{"id":114},[41,4691,4692,4697],{},[44,4693,3378,4694,4696],{},[33,4695,4579],{}," 当作结束循环，实际它只跳到下一轮。",[44,4698,4699,4700,4702,4703,4705],{},"在 ",[33,4701,4233],{}," 中把状态更新放在可能被 ",[33,4704,4579],{}," 跳过的位置，造成无限循环。",[14,4707,128],{"id":128},[96,4709,4710,4713],{},[44,4711,4712],{},"跳过列表中的空字符串并输出其他内容。",[44,4714,4715],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4717,139],{},[14,4719,142],{"id":142},[10,4721,4722],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,4724,149],{},{"title":68,"searchDepth":151,"depth":151,"links":4726},[4727,4728,4729,4730,4731,4732,4733,4734],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4556,"description":4561},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[161,4583,4579],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4744,"title":4745,"body":4746,"category":161,"cover":162,"description":4750,"extension":163,"meta":4921,"navigation":165,"path":4922,"pinned":167,"publishedAt":168,"seo":4923,"slug":4924,"stem":4925,"summary":4926,"tags":4927,"updatedAt":168,"visible":165,"__hash__":4930},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4747,"toc":4909},[4748,4751,4753,4756,4758,4764,4767,4769,4793,4795,4797,4831,4833,4839,4841,4843,4860,4862,4865,4871,4874,4876,4890,4892,4900,4902,4904,4907],[10,4749,4750],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4752,16],{"id":16},[10,4754,4755],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4757,22],{"id":22},[10,4759,4760],{},[26,4761],{"alt":4762,"src":4763},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4765,4766],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4768,39],{"id":39},[41,4770,4771,4774,4777],{},[44,4772,4773],{},"每增加一层嵌套，阅读成本都会上升。",[44,4775,4776],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[44,4778,4779,4780,2166,4783,4786,4787,2166,4790,299],{},"变量名使用 ",[33,4781,4782],{},"row",[33,4784,4785],{},"cell"," 等层级含义，避免全部写成 ",[33,4788,4789],{},"i",[33,4791,4792],{},"j",[14,4794,58],{"id":58},[10,4796,61],{},[63,4798,4800],{"className":65,"code":4799,"language":67,"meta":68,"style":68},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4801,4802,4807,4811,4816,4821,4826],{"__ignoreMap":68},[72,4803,4804],{"class":74,"line":75},[72,4805,4806],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[72,4808,4809],{"class":74,"line":151},[72,4810,1037],{"emptyLinePlaceholder":165},[72,4812,4813],{"class":74,"line":361},[72,4814,4815],{},"for row in table:\n",[72,4817,4818],{"class":74,"line":367},[72,4819,4820],{},"    for cell in row:\n",[72,4822,4823],{"class":74,"line":1084},[72,4824,4825],{},"        print(cell)\n",[72,4827,4828],{"class":74,"line":1090},[72,4829,4830],{},"    print(\"一行结束\")\n",[10,4832,80],{},[63,4834,4837],{"className":4835,"code":4836,"language":86,"meta":68},[84],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4838,4836],{"__ignoreMap":68},[10,4840,91],{},[14,4842,94],{"id":94},[96,4844,4845,4857],{},[44,4846,4847,4848,4850,4851,1099,4854,299],{},"外层变量 ",[33,4849,4782],{}," 先引用第一行列表，内层才依次处理 ",[33,4852,4853],{},"A1",[33,4855,4856],{},"A2",[44,4858,4859],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[265,4861,2608],{"id":2608},[10,4863,4864],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4866,4867],{},[26,4868],{"alt":4869,"src":4870},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4872,4873],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4875,114],{"id":114},[41,4877,4878,4887],{},[44,4879,4880,4881,948,4884,4886],{},"把两层循环变量都叫 ",[33,4882,4883],{},"item",[33,4885,4789],{},"，难以确认当前层级。",[44,4888,4889],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4891,128],{"id":128},[96,4893,4894,4897],{},[44,4895,4896],{},"打印一个 2×3 数字表。",[44,4898,4899],{},"在内层增加条件，只输出大于 3 的元素。",[10,4901,139],{},[14,4903,142],{"id":142},[10,4905,4906],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,4908,149],{},{"title":68,"searchDepth":151,"depth":151,"links":4910},[4911,4912,4913,4914,4915,4918,4919,4920],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":4916},[4917],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4745,"description":4750},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[161,4928,4929],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":4932,"title":4933,"body":4934,"category":161,"cover":162,"description":4938,"extension":163,"meta":5076,"navigation":165,"path":5077,"pinned":167,"publishedAt":168,"seo":5078,"slug":5079,"stem":5080,"summary":5081,"tags":5082,"updatedAt":168,"visible":165,"__hash__":5085},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":4935,"toc":5066},[4936,4939,4941,4944,4946,4952,4955,4957,4968,4970,4972,5010,5012,5018,5020,5022,5034,5036,5047,5049,5057,5059,5061,5064],[10,4937,4938],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,4940,16],{"id":16},[10,4942,4943],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4945,22],{"id":22},[10,4947,4948],{},[26,4949],{"alt":4950,"src":4951},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,4953,4954],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,4956,39],{"id":39},[41,4958,4959,4962,4965],{},[44,4960,4961],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[44,4963,4964],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[44,4966,4967],{},"推导式创建新列表，不修改输入列表。",[14,4969,58],{"id":58},[10,4971,61],{},[63,4973,4975],{"className":65,"code":4974,"language":67,"meta":68,"style":68},"numbers = [1, 2, 3, 4, 5]\n\nsquares = [number * number for number in numbers]\neven_squares = [number * number for number in numbers if number % 2 == 0]\n\nprint(squares)\nprint(even_squares)\n",[33,4976,4977,4982,4986,4991,4996,5000,5005],{"__ignoreMap":68},[72,4978,4979],{"class":74,"line":75},[72,4980,4981],{},"numbers = [1, 2, 3, 4, 5]\n",[72,4983,4984],{"class":74,"line":151},[72,4985,1037],{"emptyLinePlaceholder":165},[72,4987,4988],{"class":74,"line":361},[72,4989,4990],{},"squares = [number * number for number in numbers]\n",[72,4992,4993],{"class":74,"line":367},[72,4994,4995],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[72,4997,4998],{"class":74,"line":1084},[72,4999,1037],{"emptyLinePlaceholder":165},[72,5001,5002],{"class":74,"line":1090},[72,5003,5004],{},"print(squares)\n",[72,5006,5007],{"class":74,"line":2398},[72,5008,5009],{},"print(even_squares)\n",[10,5011,80],{},[63,5013,5016],{"className":5014,"code":5015,"language":86,"meta":68},[84],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5017,5015],{"__ignoreMap":68},[10,5019,91],{},[14,5021,94],{"id":94},[96,5023,5024,5027],{},[44,5025,5026],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[44,5028,5029,5030,5033],{},"第二条先用 ",[33,5031,5032],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5035,114],{"id":114},[41,5037,5038,5044],{},[44,5039,5040,5041,5043],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5042,4250],{}," 开始找输入。",[44,5045,5046],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5048,128],{"id":128},[96,5050,5051,5054],{},[44,5052,5053],{},"把字符串列表转换为长度列表。",[44,5055,5056],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5058,139],{},[14,5060,142],{"id":142},[10,5062,5063],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,5065,149],{},{"title":68,"searchDepth":151,"depth":151,"links":5067},[5068,5069,5070,5071,5072,5073,5074,5075],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":4933,"description":4938},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[161,5083,5084],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5087,"title":5088,"body":5089,"category":161,"cover":162,"description":5093,"extension":163,"meta":5236,"navigation":165,"path":5237,"pinned":167,"publishedAt":168,"seo":5238,"slug":5239,"stem":5240,"summary":5241,"tags":5242,"updatedAt":168,"visible":165,"__hash__":5245},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5090,"toc":5226},[5091,5094,5096,5099,5101,5107,5110,5112,5123,5125,5127,5166,5168,5174,5176,5178,5193,5195,5203,5205,5217,5219,5221,5224],[10,5092,5093],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5095,16],{"id":16},[10,5097,5098],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5100,22],{"id":22},[10,5102,5103],{},[26,5104],{"alt":5105,"src":5106},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5108,5109],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5111,39],{"id":39},[41,5113,5114,5117,5120],{},[44,5115,5116],{},"函数名描述动作，使用小写字母和下划线。",[44,5118,5119],{},"函数定义要先执行，之后才能调用。",[44,5121,5122],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5124,58],{"id":58},[10,5126,61],{},[63,5128,5130],{"className":65,"code":5129,"language":67,"meta":68,"style":68},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5131,5132,5137,5142,5147,5151,5156,5161],{"__ignoreMap":68},[72,5133,5134],{"class":74,"line":75},[72,5135,5136],{},"def show_progress():\n",[72,5138,5139],{"class":74,"line":151},[72,5140,5141],{},"    print(\"正在学习函数\")\n",[72,5143,5144],{"class":74,"line":361},[72,5145,5146],{},"    print(\"本节完成 50%\")\n",[72,5148,5149],{"class":74,"line":367},[72,5150,1037],{"emptyLinePlaceholder":165},[72,5152,5153],{"class":74,"line":1084},[72,5154,5155],{},"print(\"调用前\")\n",[72,5157,5158],{"class":74,"line":1090},[72,5159,5160],{},"show_progress()\n",[72,5162,5163],{"class":74,"line":2398},[72,5164,5165],{},"print(\"调用后\")\n",[10,5167,80],{},[63,5169,5172],{"className":5170,"code":5171,"language":86,"meta":68},[84],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5173,5171],{"__ignoreMap":68},[10,5175,91],{},[14,5177,94],{"id":94},[96,5179,5180,5186],{},[44,5181,877,5182,5185],{},[33,5183,5184],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[44,5187,5188,5189,5192],{},"运行到 ",[33,5190,5191],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5194,114],{"id":114},[41,5196,5197,5200],{},[44,5198,5199],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[44,5201,5202],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5204,128],{"id":128},[96,5206,5207,5214],{},[44,5208,5209,5210,5213],{},"定义 ",[33,5211,5212],{},"show_plan()"," 输出两行学习计划。",[44,5215,5216],{},"连续调用同一个函数两次，观察执行顺序。",[10,5218,139],{},[14,5220,142],{"id":142},[10,5222,5223],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,5225,149],{},{"title":68,"searchDepth":151,"depth":151,"links":5227},[5228,5229,5230,5231,5232,5233,5234,5235],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5088,"description":5093},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[161,5243,5244],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5247,"title":5248,"body":5249,"category":161,"cover":162,"description":5253,"extension":163,"meta":5433,"navigation":165,"path":5434,"pinned":167,"publishedAt":168,"seo":5435,"slug":5436,"stem":5437,"summary":5438,"tags":5439,"updatedAt":168,"visible":165,"__hash__":5442},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5250,"toc":5421},[5251,5254,5256,5259,5261,5267,5274,5276,5293,5295,5297,5331,5333,5339,5341,5343,5364,5366,5369,5375,5385,5387,5402,5404,5412,5414,5416,5419],[10,5252,5253],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5255,16],{"id":16},[10,5257,5258],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5260,22],{"id":22},[10,5262,5263],{},[26,5264],{"alt":5265,"src":5266},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5268,5269,5270,5273],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5271,5272],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5275,39],{"id":39},[41,5277,5278,5281,5284],{},[44,5279,5280],{},"形参出现在函数定义中，实参出现在函数调用中。",[44,5282,5283],{},"局部变量默认只在函数内部可见。",[44,5285,5286,5287,5289,5290,299],{},"没有显式 ",[33,5288,5272],{}," 的函数会返回 ",[33,5291,5292],{},"None",[14,5294,58],{"id":58},[10,5296,61],{},[63,5298,5300],{"className":65,"code":5299,"language":67,"meta":68,"style":68},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5301,5302,5307,5312,5317,5321,5326],{"__ignoreMap":68},[72,5303,5304],{"class":74,"line":75},[72,5305,5306],{},"def calculate_total(price, count):\n",[72,5308,5309],{"class":74,"line":151},[72,5310,5311],{},"    total = price * count\n",[72,5313,5314],{"class":74,"line":361},[72,5315,5316],{},"    return total\n",[72,5318,5319],{"class":74,"line":367},[72,5320,1037],{"emptyLinePlaceholder":165},[72,5322,5323],{"class":74,"line":1084},[72,5324,5325],{},"result = calculate_total(25, 4)\n",[72,5327,5328],{"class":74,"line":1090},[72,5329,5330],{},"print(result)\n",[10,5332,80],{},[63,5334,5337],{"className":5335,"code":5336,"language":86,"meta":68},[84],"100\n",[33,5338,5336],{"__ignoreMap":68},[10,5340,91],{},[14,5342,94],{"id":94},[96,5344,5345,5354],{},[44,5346,5347,5348,2166,5351,5353],{},"调用时 25 和 4 分别绑定到 ",[33,5349,5350],{},"price",[33,5352,4313],{},"，它们只在本次函数调用的局部范围中使用。",[44,5355,5356,5359,5360,5363],{},[33,5357,5358],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5361,5362],{},"result"," 并输出。",[265,5365,2608],{"id":2608},[10,5367,5368],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5370,5371],{},[26,5372],{"alt":5373,"src":5374},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5376,5377,2166,5379,1099,5381,5384],{},[33,5378,5350],{},[33,5380,4313],{},[33,5382,5383],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5386,114],{"id":114},[41,5388,5389,5396],{},[44,5390,5391,5392,5395],{},"在函数内部只 ",[33,5393,5394],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[44,5397,5398,5399,5401],{},"试图在函数外直接访问局部变量 ",[33,5400,5383],{},"，它的名字只在调用期间的局部作用域存在。",[14,5403,128],{"id":128},[96,5405,5406,5409],{},[44,5407,5408],{},"编写计算长方形面积的函数。",[44,5410,5411],{},"让函数返回结果后在调用方加上单位再输出。",[10,5413,139],{},[14,5415,142],{"id":142},[10,5417,5418],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,5420,149],{},{"title":68,"searchDepth":151,"depth":151,"links":5422},[5423,5424,5425,5426,5427,5430,5431,5432],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":5428},[5429],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5248,"description":5253},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[161,5440,5441],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5444,"title":5445,"body":5446,"category":161,"cover":162,"description":5450,"extension":163,"meta":5630,"navigation":165,"path":5631,"pinned":167,"publishedAt":168,"seo":5632,"slug":5633,"stem":5634,"summary":5635,"tags":5636,"updatedAt":168,"visible":165,"__hash__":5639},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5447,"toc":5618},[5448,5451,5453,5456,5458,5464,5467,5469,5486,5488,5490,5542,5544,5550,5552,5554,5572,5574,5577,5583,5586,5588,5599,5601,5609,5611,5613,5616],[10,5449,5450],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5452,16],{"id":16},[10,5454,5455],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5457,22],{"id":22},[10,5459,5460],{},[26,5461],{"alt":5462,"src":5463},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5465,5466],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5468,39],{"id":39},[41,5470,5471,5474,5480],{},[44,5472,5473],{},"必需参数应放在有默认值的参数之前。",[44,5475,5476,5479],{},[33,5477,5478],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[44,5481,5482,5485],{},[33,5483,5484],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5487,58],{"id":58},[10,5489,61],{},[63,5491,5493],{"className":65,"code":5492,"language":67,"meta":68,"style":68},"def build_title(name, level=\"基础\"):\n    return name + \"｜\" + level\n\nprint(build_title(\"Python\"))\nprint(build_title(name=\"异常处理\", level=\"进阶\"))\n\ndef total(*numbers):\n    return sum(numbers)\n\nprint(total(10, 20, 30))\n",[33,5494,5495,5500,5505,5509,5514,5519,5523,5528,5533,5537],{"__ignoreMap":68},[72,5496,5497],{"class":74,"line":75},[72,5498,5499],{},"def build_title(name, level=\"基础\"):\n",[72,5501,5502],{"class":74,"line":151},[72,5503,5504],{},"    return name + \"｜\" + level\n",[72,5506,5507],{"class":74,"line":361},[72,5508,1037],{"emptyLinePlaceholder":165},[72,5510,5511],{"class":74,"line":367},[72,5512,5513],{},"print(build_title(\"Python\"))\n",[72,5515,5516],{"class":74,"line":1084},[72,5517,5518],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[72,5520,5521],{"class":74,"line":1090},[72,5522,1037],{"emptyLinePlaceholder":165},[72,5524,5525],{"class":74,"line":2398},[72,5526,5527],{},"def total(*numbers):\n",[72,5529,5530],{"class":74,"line":2404},[72,5531,5532],{},"    return sum(numbers)\n",[72,5534,5535],{"class":74,"line":3864},[72,5536,1037],{"emptyLinePlaceholder":165},[72,5538,5539],{"class":74,"line":4076},[72,5540,5541],{},"print(total(10, 20, 30))\n",[10,5543,80],{},[63,5545,5548],{"className":5546,"code":5547,"language":86,"meta":68},[84],"Python｜基础\n异常处理｜进阶\n60\n",[33,5549,5547],{"__ignoreMap":68},[10,5551,91],{},[14,5553,94],{"id":94},[96,5555,5556,5563],{},[44,5557,5558,5559,5562],{},"第一次调用只提供必需参数，",[33,5560,5561],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[44,5564,5565,5568,5569,299],{},[33,5566,5567],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5570,5571],{},"sum()",[265,5573,2608],{"id":2608},[10,5575,5576],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5578,5579],{},[26,5580],{"alt":5581,"src":5582},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5584,5585],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5587,114],{"id":114},[41,5589,5590,5596],{},[44,5591,5592,5593,5595],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5594,5292],{}," 再在函数内创建。",[44,5597,5598],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5600,128],{"id":128},[96,5602,5603,5606],{},[44,5604,5605],{},"给问候函数增加默认称呼。",[44,5607,5608],{},"编写接收任意数量分数并返回总分的函数。",[10,5610,139],{},[14,5612,142],{"id":142},[10,5614,5615],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,5617,149],{},{"title":68,"searchDepth":151,"depth":151,"links":5619},[5620,5621,5622,5623,5624,5627,5628,5629],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":5625},[5626],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5445,"description":5450},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[161,5637,5638],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5641,"title":5642,"body":5643,"category":161,"cover":162,"description":5647,"extension":163,"meta":5844,"navigation":165,"path":5845,"pinned":167,"publishedAt":168,"seo":5846,"slug":5847,"stem":5848,"summary":5849,"tags":5850,"updatedAt":168,"visible":165,"__hash__":5853},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5644,"toc":5832},[5645,5648,5650,5653,5655,5661,5664,5666,5683,5685,5687,5750,5752,5758,5760,5762,5789,5791,5794,5800,5803,5805,5813,5815,5823,5825,5827,5830],[10,5646,5647],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5649,16],{"id":16},[10,5651,5652],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5654,22],{"id":22},[10,5656,5657],{},[26,5658],{"alt":5659,"src":5660},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5662,5663],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5665,39],{"id":39},[41,5667,5668,5671,5674],{},[44,5669,5670],{},"函数内部赋值默认创建局部变量。",[44,5672,5673],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[44,5675,5676,2085,5679,5682],{},[33,5677,5678],{},"global",[33,5680,5681],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5684,58],{"id":58},[10,5686,61],{},[63,5688,5690],{"className":65,"code":5689,"language":67,"meta":68,"style":68},"course = \"Python\"\n\ndef outer():\n    level = \"基础\"\n\n    def show():\n        lesson = \"作用域\"\n        print(course, level, lesson)\n\n    show()\n\nouter()\n",[33,5691,5692,5697,5701,5706,5711,5715,5720,5725,5730,5734,5739,5744],{"__ignoreMap":68},[72,5693,5694],{"class":74,"line":75},[72,5695,5696],{},"course = \"Python\"\n",[72,5698,5699],{"class":74,"line":151},[72,5700,1037],{"emptyLinePlaceholder":165},[72,5702,5703],{"class":74,"line":361},[72,5704,5705],{},"def outer():\n",[72,5707,5708],{"class":74,"line":367},[72,5709,5710],{},"    level = \"基础\"\n",[72,5712,5713],{"class":74,"line":1084},[72,5714,1037],{"emptyLinePlaceholder":165},[72,5716,5717],{"class":74,"line":1090},[72,5718,5719],{},"    def show():\n",[72,5721,5722],{"class":74,"line":2398},[72,5723,5724],{},"        lesson = \"作用域\"\n",[72,5726,5727],{"class":74,"line":2404},[72,5728,5729],{},"        print(course, level, lesson)\n",[72,5731,5732],{"class":74,"line":3864},[72,5733,1037],{"emptyLinePlaceholder":165},[72,5735,5736],{"class":74,"line":4076},[72,5737,5738],{},"    show()\n",[72,5740,5742],{"class":74,"line":5741},11,[72,5743,1037],{"emptyLinePlaceholder":165},[72,5745,5747],{"class":74,"line":5746},12,[72,5748,5749],{},"outer()\n",[10,5751,80],{},[63,5753,5756],{"className":5754,"code":5755,"language":86,"meta":68},[84],"Python 基础 作用域\n",[33,5757,5755],{"__ignoreMap":68},[10,5759,91],{},[14,5761,94],{"id":94},[96,5763,5764,5781],{},[44,5765,5766,5769,5770,5773,5774,5776,5777,5780],{},[33,5767,5768],{},"show()"," 中查找 ",[33,5771,5772],{},"lesson"," 时先在局部找到，查找 ",[33,5775,5561],{}," 时到外层 ",[33,5778,5779],{},"outer()"," 找到。",[44,5782,5783,5785,5786,5788],{},[33,5784,4496],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5787,2117],{}," 最后在内置作用域找到。",[265,5790,2608],{"id":2608},[10,5792,5793],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5795,5796],{},[26,5797],{"alt":5798,"src":5799},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5801,5802],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5804,114],{"id":114},[41,5806,5807,5810],{},[44,5808,5809],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[44,5811,5812],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5814,128],{"id":128},[96,5816,5817,5820],{},[44,5818,5819],{},"在内外层定义同名变量，观察最近作用域优先。",[44,5821,5822],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5824,139],{},[14,5826,142],{"id":142},[10,5828,5829],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,5831,149],{},{"title":68,"searchDepth":151,"depth":151,"links":5833},[5834,5835,5836,5837,5838,5841,5842,5843],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":5839},[5840],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5642,"description":5647},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[161,5851,5852],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5855,"title":5856,"body":5857,"category":161,"cover":162,"description":5861,"extension":163,"meta":6011,"navigation":165,"path":6012,"pinned":167,"publishedAt":168,"seo":6013,"slug":6014,"stem":6015,"summary":6016,"tags":6017,"updatedAt":168,"visible":165,"__hash__":6020},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5858,"toc":6001},[5859,5862,5864,5867,5869,5875,5878,5880,5899,5901,5903,5937,5939,5945,5947,5949,5964,5966,5978,5980,5992,5994,5996,5999],[10,5860,5861],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5863,16],{"id":16},[10,5865,5866],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5868,22],{"id":22},[10,5870,5871],{},[26,5872],{"alt":5873,"src":5874},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5876,5877],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5879,39],{"id":39},[41,5881,5882,5885,5888],{},[44,5883,5884],{},"文档字符串紧跟在函数定义后的第一条语句。",[44,5886,5887],{},"注解表达接口意图，不代替输入校验和测试。",[44,5889,5890,5891,2166,5893,2166,5895,5898],{},"基础注解优先使用 ",[33,5892,2169],{},[33,5894,2335],{},[33,5896,5897],{},"list[str]"," 等直接写法。",[14,5900,58],{"id":58},[10,5902,61],{},[63,5904,5906],{"className":65,"code":5905,"language":67,"meta":68,"style":68},"def format_score(name: str, score: int) -> str:\n    \"\"\"返回带姓名的分数文本。\"\"\"\n    return name + \"：\" + str(score)\n\nprint(format_score(\"小郑\", 95))\nprint(format_score.__doc__)\n",[33,5907,5908,5913,5918,5923,5927,5932],{"__ignoreMap":68},[72,5909,5910],{"class":74,"line":75},[72,5911,5912],{},"def format_score(name: str, score: int) -> str:\n",[72,5914,5915],{"class":74,"line":151},[72,5916,5917],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[72,5919,5920],{"class":74,"line":361},[72,5921,5922],{},"    return name + \"：\" + str(score)\n",[72,5924,5925],{"class":74,"line":367},[72,5926,1037],{"emptyLinePlaceholder":165},[72,5928,5929],{"class":74,"line":1084},[72,5930,5931],{},"print(format_score(\"小郑\", 95))\n",[72,5933,5934],{"class":74,"line":1090},[72,5935,5936],{},"print(format_score.__doc__)\n",[10,5938,80],{},[63,5940,5943],{"className":5941,"code":5942,"language":86,"meta":68},[84],"小郑：95\n返回带姓名的分数文本。\n",[33,5944,5942],{"__ignoreMap":68},[10,5946,91],{},[14,5948,94],{"id":94},[96,5950,5951,5961],{},[44,5952,5953,5954,5957,5958,5960],{},"函数签名说明 ",[33,5955,5956],{},"name"," 预期为字符串、",[33,5959,2155],{}," 预期为整数，返回值预期为字符串。",[44,5962,5963],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,5965,114],{"id":114},[41,5967,5968,5975],{},[44,5969,5970,5971,5974],{},"认为加了 ",[33,5972,5973],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[44,5976,5977],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,5979,128],{"id":128},[96,5981,5982,5985],{},[44,5983,5984],{},"为面积函数补充参数和返回值注解。",[44,5986,5987,5988,5991],{},"通过 ",[33,5989,5990],{},"函数名.__doc__"," 查看文档字符串。",[10,5993,139],{},[14,5995,142],{"id":142},[10,5997,5998],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,6000,149],{},{"title":68,"searchDepth":151,"depth":151,"links":6002},[6003,6004,6005,6006,6007,6008,6009,6010],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5856,"description":5861},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[161,6018,6019],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6022,"title":6023,"body":6024,"category":161,"cover":162,"description":6028,"extension":163,"meta":6255,"navigation":165,"path":6256,"pinned":167,"publishedAt":168,"seo":6257,"slug":6258,"stem":6259,"summary":6260,"tags":6261,"updatedAt":168,"visible":165,"__hash__":6264},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6025,"toc":6243},[6026,6029,6031,6037,6039,6045,6056,6058,6076,6078,6085,6114,6121,6140,6149,6151,6157,6159,6161,6184,6186,6189,6195,6201,6203,6219,6221,6234,6236,6238,6241],[10,6027,6028],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6030,16],{"id":16},[10,6032,6033,6034,6036],{},"本篇只处理“模块、import 与 ",[231,6035,5956],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6038,22],{"id":22},[10,6040,6041],{},[26,6042],{"alt":6043,"src":6044},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6046,6047,6048,6051,6052,6055],{},"同一个文件直接运行时 ",[33,6049,6050],{},"__name__"," 等于 ",[33,6053,6054],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6057,39],{"id":39},[41,6059,6060,6066,6069],{},[44,6061,6062,6063,6065],{},"一个 ",[33,6064,35],{}," 文件就是一个模块。",[44,6067,6068],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[44,6070,6071,6072,6075],{},"避免使用 ",[33,6073,6074],{},"from module import *","，它会让名字来源不清楚。",[14,6077,58],{"id":58},[10,6079,6080,6081,6084],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6082,6083],{},"calculator.py","：",[63,6086,6088],{"className":65,"code":6087,"language":67,"meta":68,"style":68},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6089,6090,6095,6100,6104,6109],{"__ignoreMap":68},[72,6091,6092],{"class":74,"line":75},[72,6093,6094],{},"def add(left, right):\n",[72,6096,6097],{"class":74,"line":151},[72,6098,6099],{},"    return left + right\n",[72,6101,6102],{"class":74,"line":361},[72,6103,1037],{"emptyLinePlaceholder":165},[72,6105,6106],{"class":74,"line":367},[72,6107,6108],{},"if __name__ == \"__main__\":\n",[72,6110,6111],{"class":74,"line":1084},[72,6112,6113],{},"    print(add(2, 3))\n",[10,6115,6116,6117,6120],{},"再创建 ",[33,6118,6119],{},"app.py","，从模块中导入函数：",[63,6122,6124],{"className":65,"code":6123,"language":67,"meta":68,"style":68},"from calculator import add\n\nprint(add(10, 20))\n",[33,6125,6126,6131,6135],{"__ignoreMap":68},[72,6127,6128],{"class":74,"line":75},[72,6129,6130],{},"from calculator import add\n",[72,6132,6133],{"class":74,"line":151},[72,6134,1037],{"emptyLinePlaceholder":165},[72,6136,6137],{"class":74,"line":361},[72,6138,6139],{},"print(add(10, 20))\n",[10,6141,6142,6143,1099,6146,299],{},"分别执行 ",[33,6144,6145],{},"python3 calculator.py",[33,6147,6148],{},"python3 app.py",[10,6150,80],{},[63,6152,6155],{"className":6153,"code":6154,"language":86,"meta":68},[84],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6156,6154],{"__ignoreMap":68},[10,6158,91],{},[14,6160,94],{"id":94},[96,6162,6163,6173],{},[44,6164,6165,6166,6168,6169,6172],{},"直接运行 ",[33,6167,6083],{}," 时，模块名是 ",[33,6170,6171],{},"__main__","，入口代码输出 5。",[44,6174,6175,6177,6178,6180,6181,6183],{},[33,6176,6119],{}," 导入模块时，",[33,6179,6083],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6182,6119],{}," 调用函数输出 30。",[265,6185,2608],{"id":2608},[10,6187,6188],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6190,6191],{},[26,6192],{"alt":6193,"src":6194},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6196,6197,6198,6200],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6199,6171],{}," 保护下的演示代码。",[14,6202,114],{"id":114},[41,6204,6205,6212],{},[44,6206,6207,6208,1099,6210,299],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6209,6083],{},[33,6211,6119],{},[44,6213,6214,6215,6218],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6216,6217],{},"json.py","，导致导入目标被遮蔽。",[14,6220,128],{"id":128},[96,6222,6223,6229],{},[44,6224,2263,6225,6228],{},[33,6226,6227],{},"text_tools.py"," 并导出一个格式化函数。",[44,6230,6231,6232,299],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6233,6050],{},[10,6235,139],{},[14,6237,142],{"id":142},[10,6239,6240],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,6242,149],{},{"title":68,"searchDepth":151,"depth":151,"links":6244},[6245,6246,6247,6248,6249,6252,6253,6254],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":6250},[6251],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6023,"description":6028},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[161,6262,6263],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6266,"title":6267,"body":6268,"category":161,"cover":162,"description":6272,"extension":163,"meta":6437,"navigation":165,"path":6438,"pinned":167,"publishedAt":168,"seo":6439,"slug":6440,"stem":6441,"summary":6442,"tags":6443,"updatedAt":168,"visible":165,"__hash__":6445},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6269,"toc":6427},[6270,6273,6275,6278,6280,6286,6289,6291,6305,6307,6309,6355,6357,6363,6365,6367,6393,6395,6405,6407,6418,6420,6422,6425],[10,6271,6272],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6274,16],{"id":16},[10,6276,6277],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6279,22],{"id":22},[10,6281,6282],{},[26,6283],{"alt":6284,"src":6285},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6287,6288],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6290,39],{"id":39},[41,6292,6293,6299,6302],{},[44,6294,6295,6298],{},[33,6296,6297],{},".venv"," 是常见目录名，不应提交到 Git。",[44,6300,6301],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[44,6303,6304],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6306,58],{"id":58},[10,6308,1483],{},[63,6310,6312],{"className":530,"code":6311,"language":532,"meta":68,"style":68},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6313,6314,6326,6334,6340,6350],{"__ignoreMap":68},[72,6315,6316,6318,6320,6323],{"class":74,"line":75},[72,6317,630],{"class":539},[72,6319,572],{"class":542},[72,6321,6322],{"class":575}," venv",[72,6324,6325],{"class":575}," .venv\n",[72,6327,6328,6331],{"class":74,"line":151},[72,6329,6330],{"class":542},"source",[72,6332,6333],{"class":575}," .venv\u002Fbin\u002Factivate\n",[72,6335,6336,6338],{"class":74,"line":361},[72,6337,67],{"class":539},[72,6339,543],{"class":542},[72,6341,6342,6344,6346,6348],{"class":74,"line":367},[72,6343,67],{"class":539},[72,6345,572],{"class":542},[72,6347,576],{"class":575},[72,6349,543],{"class":542},[72,6351,6352],{"class":74,"line":1084},[72,6353,6354],{"class":539},"deactivate\n",[10,6356,80],{},[63,6358,6361],{"className":6359,"code":6360,"language":86,"meta":68},[84],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6362,6360],{"__ignoreMap":68},[10,6364,91],{},[14,6366,94],{"id":94},[96,6368,6369,6378],{},[44,6370,6371,6374,6375,6377],{},[33,6372,6373],{},"venv"," 根据当前 ",[33,6376,630],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[44,6379,6380,6381,2085,6383,6386,6387,3639,6389,6392],{},"激活后 ",[33,6382,67],{},[33,6384,6385],{},"python -m pip"," 优先指向 ",[33,6388,6297],{},[33,6390,6391],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6394,114],{"id":114},[41,6396,6397,6400],{},[44,6398,6399],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[44,6401,3378,6402,6404],{},[33,6403,6297],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6406,128],{"id":128},[96,6408,6409,6415],{},[44,6410,6411,6412,299],{},"创建虚拟环境并记录激活前后的 ",[33,6413,6414],{},"which python",[44,6416,6417],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6419,139],{},[14,6421,142],{"id":142},[10,6423,6424],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,6426,1567],{},{"title":68,"searchDepth":151,"depth":151,"links":6428},[6429,6430,6431,6432,6433,6434,6435,6436],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6267,"description":6272},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[161,6444,197],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6447,"title":6448,"body":6449,"category":161,"cover":162,"description":6453,"extension":163,"meta":6641,"navigation":165,"path":6642,"pinned":167,"publishedAt":168,"seo":6643,"slug":6644,"stem":6645,"summary":6646,"tags":6647,"updatedAt":168,"visible":165,"__hash__":6650},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6450,"toc":6631},[6451,6454,6456,6459,6461,6467,6476,6478,6502,6504,6506,6559,6561,6567,6569,6571,6587,6589,6608,6610,6622,6624,6626,6629],[10,6452,6453],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6455,16],{"id":16},[10,6457,6458],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6460,22],{"id":22},[10,6462,6463],{},[26,6464],{"alt":6465,"src":6466},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6468,6469,6472,6473,6475],{},[33,6470,6471],{},"Path"," 使用 ",[33,6474,2345],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6477,39],{"id":39},[41,6479,6480,6483,6495],{},[44,6481,6482],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[44,6484,6485,2166,6488,2166,6491,6494],{},[33,6486,6487],{},"exists()",[33,6489,6490],{},"is_file()",[33,6492,6493],{},"is_dir()"," 检查真实文件系统状态。",[44,6496,6497,6498,6501],{},"创建目录前明确目标；",[33,6499,6500],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6503,58],{"id":58},[10,6505,61],{},[63,6507,6509],{"className":65,"code":6508,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nproject = Path.cwd()\ndata_dir = project \u002F \"data\"\nfile_path = data_dir \u002F \"records.json\"\n\nprint(project)\nprint(file_path.name)\nprint(file_path.suffix)\nprint(file_path.exists())\n",[33,6510,6511,6516,6520,6525,6530,6535,6539,6544,6549,6554],{"__ignoreMap":68},[72,6512,6513],{"class":74,"line":75},[72,6514,6515],{},"from pathlib import Path\n",[72,6517,6518],{"class":74,"line":151},[72,6519,1037],{"emptyLinePlaceholder":165},[72,6521,6522],{"class":74,"line":361},[72,6523,6524],{},"project = Path.cwd()\n",[72,6526,6527],{"class":74,"line":367},[72,6528,6529],{},"data_dir = project \u002F \"data\"\n",[72,6531,6532],{"class":74,"line":1084},[72,6533,6534],{},"file_path = data_dir \u002F \"records.json\"\n",[72,6536,6537],{"class":74,"line":1090},[72,6538,1037],{"emptyLinePlaceholder":165},[72,6540,6541],{"class":74,"line":2398},[72,6542,6543],{},"print(project)\n",[72,6545,6546],{"class":74,"line":2404},[72,6547,6548],{},"print(file_path.name)\n",[72,6550,6551],{"class":74,"line":3864},[72,6552,6553],{},"print(file_path.suffix)\n",[72,6555,6556],{"class":74,"line":4076},[72,6557,6558],{},"print(file_path.exists())\n",[10,6560,80],{},[63,6562,6565],{"className":6563,"code":6564,"language":86,"meta":68},[84],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6566,6564],{"__ignoreMap":68},[10,6568,91],{},[14,6570,94],{"id":94},[96,6572,6573,6579],{},[44,6574,6575,6578],{},[33,6576,6577],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[44,6580,2248,6581,6583,6584,6586],{},[33,6582,2345],{}," 组合路径片段只创建新的 ",[33,6585,6471],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6588,114],{"id":114},[41,6590,6591,6599],{},[44,6592,3378,6593,6595,6596,6598],{},[33,6594,6471],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6597,6487],{}," 等方法确认。",[44,6600,6601,6602,948,6604,6607],{},"手工拼接 ",[33,6603,2345],{},[33,6605,6606],{},"\\"," 分隔符，降低跨平台可读性。",[14,6609,128],{"id":128},[96,6611,6612,6619],{},[44,6613,6614,6615,6618],{},"组合 ",[33,6616,6617],{},"output\u002Freport.txt"," 路径但先不创建文件。",[44,6620,6621],{},"输出路径的父目录、文件名和扩展名。",[10,6623,139],{},[14,6625,142],{"id":142},[10,6627,6628],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,6630,149],{},{"title":68,"searchDepth":151,"depth":151,"links":6632},[6633,6634,6635,6636,6637,6638,6639,6640],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6448,"description":6453},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[161,6648,6649],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6652,"title":6653,"body":6654,"category":161,"cover":162,"description":6658,"extension":163,"meta":6836,"navigation":165,"path":6837,"pinned":167,"publishedAt":168,"seo":6838,"slug":6839,"stem":6840,"summary":6841,"tags":6842,"updatedAt":168,"visible":165,"__hash__":6845},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6655,"toc":6826},[6656,6659,6661,6664,6666,6672,6675,6677,6705,6707,6709,6766,6768,6774,6776,6778,6789,6791,6804,6806,6817,6819,6821,6824],[10,6657,6658],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6660,16],{"id":16},[10,6662,6663],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6665,22],{"id":22},[10,6667,6668],{},[26,6669],{"alt":6670,"src":6671},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6673,6674],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6676,39],{"id":39},[41,6678,6679,6685,6694],{},[44,6680,6681,6684],{},[33,6682,6683],{},"w"," 模式会截断原文件，写入前必须确认目标。",[44,6686,6687,6690,6691,299],{},[33,6688,6689],{},"r"," 模式读取不存在文件会产生 ",[33,6692,6693],{},"FileNotFoundError",[44,6695,6696,6697,6700,6701,6704],{},"本篇显式调用 ",[33,6698,6699],{},"close()","；第 34 篇会用 ",[33,6702,6703],{},"with"," 更可靠地管理关闭动作。",[14,6706,58],{"id":58},[10,6708,61],{},[63,6710,6712],{"className":65,"code":6711,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\nwriter = file_path.open(\"w\", encoding=\"utf-8\")\nwriter.write(\"变量\\n循环\\n函数\\n\")\nwriter.close()\n\nreader = file_path.open(\"r\", encoding=\"utf-8\")\ncontent = reader.read()\nreader.close()\nprint(content)\n",[33,6713,6714,6718,6722,6727,6732,6737,6742,6746,6751,6756,6761],{"__ignoreMap":68},[72,6715,6716],{"class":74,"line":75},[72,6717,6515],{},[72,6719,6720],{"class":74,"line":151},[72,6721,1037],{"emptyLinePlaceholder":165},[72,6723,6724],{"class":74,"line":361},[72,6725,6726],{},"file_path = Path(\"notes.txt\")\n",[72,6728,6729],{"class":74,"line":367},[72,6730,6731],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[72,6733,6734],{"class":74,"line":1084},[72,6735,6736],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[72,6738,6739],{"class":74,"line":1090},[72,6740,6741],{},"writer.close()\n",[72,6743,6744],{"class":74,"line":2398},[72,6745,1037],{"emptyLinePlaceholder":165},[72,6747,6748],{"class":74,"line":2404},[72,6749,6750],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[72,6752,6753],{"class":74,"line":3864},[72,6754,6755],{},"content = reader.read()\n",[72,6757,6758],{"class":74,"line":4076},[72,6759,6760],{},"reader.close()\n",[72,6762,6763],{"class":74,"line":5741},[72,6764,6765],{},"print(content)\n",[10,6767,80],{},[63,6769,6772],{"className":6770,"code":6771,"language":86,"meta":68},[84],"变量\n循环\n函数\n",[33,6773,6771],{"__ignoreMap":68},[10,6775,91],{},[14,6777,94],{"id":94},[96,6779,6780,6786],{},[44,6781,6782,6783,6785],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6784,6699],{}," 确保缓冲内容交给文件系统。",[44,6787,6788],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6790,114],{"id":114},[41,6792,6793,6798],{},[44,6794,2248,6795,6797],{},[33,6796,6683],{}," 模式打开重要文件却未确认覆盖风险。",[44,6799,6800,6801,299],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6802,6803],{},"encoding=\"utf-8\"",[14,6805,128],{"id":128},[96,6807,6808,6811],{},[44,6809,6810],{},"写入三行学习记录并读取。",[44,6812,6813,6814,6816],{},"改用 ",[33,6815,273],{}," 模式追加一行，确认原内容仍保留。",[10,6818,139],{},[14,6820,142],{"id":142},[10,6822,6823],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,6825,149],{},{"title":68,"searchDepth":151,"depth":151,"links":6827},[6828,6829,6830,6831,6832,6833,6834,6835],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6653,"description":6658},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[161,6843,6844],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6847,"title":6848,"body":6849,"category":161,"cover":162,"description":6853,"extension":163,"meta":7020,"navigation":165,"path":7021,"pinned":167,"publishedAt":168,"seo":7022,"slug":7023,"stem":7024,"summary":7025,"tags":7026,"updatedAt":168,"visible":165,"__hash__":7029},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6850,"toc":7010},[6851,6854,6856,6859,6861,6867,6877,6879,6893,6895,6897,6957,6959,6965,6967,6969,6981,6983,6991,6993,7001,7003,7005,7008],[10,6852,6853],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6855,16],{"id":16},[10,6857,6858],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6860,22],{"id":22},[10,6862,6863],{},[26,6864],{"alt":6865,"src":6866},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6868,6869,6872,6873,6876],{},[33,6870,6871],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6874,6875],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6878,39],{"id":39},[41,6880,6881,6884,6890],{},[44,6882,6883],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[44,6885,6886,6889],{},[33,6887,6888],{},"ensure_ascii=False"," 让中文以可读字符写入。",[44,6891,6892],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6894,58],{"id":58},[10,6896,61],{},[63,6898,6900],{"className":65,"code":6899,"language":67,"meta":68,"style":68},"import json\n\nrecord = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n\nwriter = open(\"record.json\", \"w\", encoding=\"utf-8\")\njson.dump(record, writer, ensure_ascii=False, indent=2)\nwriter.close()\n\nreader = open(\"record.json\", \"r\", encoding=\"utf-8\")\nloaded = json.load(reader)\nreader.close()\nprint(loaded[\"course\"], loaded[\"progress\"])\n",[33,6901,6902,6907,6911,6916,6920,6925,6930,6934,6938,6943,6948,6952],{"__ignoreMap":68},[72,6903,6904],{"class":74,"line":75},[72,6905,6906],{},"import json\n",[72,6908,6909],{"class":74,"line":151},[72,6910,1037],{"emptyLinePlaceholder":165},[72,6912,6913],{"class":74,"line":361},[72,6914,6915],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[72,6917,6918],{"class":74,"line":367},[72,6919,1037],{"emptyLinePlaceholder":165},[72,6921,6922],{"class":74,"line":1084},[72,6923,6924],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[72,6926,6927],{"class":74,"line":1090},[72,6928,6929],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[72,6931,6932],{"class":74,"line":2398},[72,6933,6741],{},[72,6935,6936],{"class":74,"line":2404},[72,6937,1037],{"emptyLinePlaceholder":165},[72,6939,6940],{"class":74,"line":3864},[72,6941,6942],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[72,6944,6945],{"class":74,"line":4076},[72,6946,6947],{},"loaded = json.load(reader)\n",[72,6949,6950],{"class":74,"line":5741},[72,6951,6760],{},[72,6953,6954],{"class":74,"line":5746},[72,6955,6956],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,6958,80],{},[63,6960,6963],{"className":6961,"code":6962,"language":86,"meta":68},[84],"Python 60\n",[33,6964,6962],{"__ignoreMap":68},[10,6966,91],{},[14,6968,94],{"id":94},[96,6970,6971,6976],{},[44,6972,6973,6975],{},[33,6974,6871],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[44,6977,6978,6980],{},[33,6979,6875],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,6982,114],{"id":114},[41,6984,6985,6988],{},[44,6986,6987],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[44,6989,6990],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,6992,128],{"id":128},[96,6994,6995,6998],{},[44,6996,6997],{},"保存包含两条学习记录的列表。",[44,6999,7000],{},"读取后修改进度，再重新写回文件。",[10,7002,139],{},[14,7004,142],{"id":142},[10,7006,7007],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,7009,149],{},{"title":68,"searchDepth":151,"depth":151,"links":7011},[7012,7013,7014,7015,7016,7017,7018,7019],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6848,"description":6853},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[161,7027,7028],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":7031,"title":7032,"body":7033,"category":161,"cover":162,"description":7037,"extension":163,"meta":7221,"navigation":165,"path":7222,"pinned":167,"publishedAt":168,"seo":7223,"slug":7224,"stem":7225,"summary":7226,"tags":7227,"updatedAt":168,"visible":165,"__hash__":7230},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":7034,"toc":7211},[7035,7038,7040,7043,7045,7051,7057,7059,7081,7083,7085,7148,7150,7156,7158,7160,7176,7178,7192,7194,7202,7204,7206,7209],[10,7036,7037],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,7039,16],{"id":16},[10,7041,7042],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7044,22],{"id":22},[10,7046,7047],{},[26,7048],{"alt":7049,"src":7050},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,7052,7053,7056],{},[33,7054,7055],{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,7058,39],{"id":39},[41,7060,7061,7071,7078],{},[44,7062,2248,7063,7066,7067,7070],{},[33,7064,7065],{},"newline=\"\""," 让 ",[33,7068,7069],{},"csv"," 模块正确处理换行。",[44,7072,7073,7074,7077],{},"字段顺序由 ",[33,7075,7076],{},"fieldnames"," 决定，字典键需要与字段名一致。",[44,7079,7080],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,7082,58],{"id":58},[10,7084,61],{},[63,7086,7088],{"className":65,"code":7087,"language":67,"meta":68,"style":68},"import csv\n\nwriter_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\nwriter = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\nwriter.writeheader()\nwriter.writerow({\"name\": \"小郑\", \"score\": 95})\nwriter_file.close()\n\nreader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\nfor row in csv.DictReader(reader_file):\n    print(row[\"name\"], row[\"score\"])\nreader_file.close()\n",[33,7089,7090,7095,7099,7104,7109,7114,7119,7124,7128,7133,7138,7143],{"__ignoreMap":68},[72,7091,7092],{"class":74,"line":75},[72,7093,7094],{},"import csv\n",[72,7096,7097],{"class":74,"line":151},[72,7098,1037],{"emptyLinePlaceholder":165},[72,7100,7101],{"class":74,"line":361},[72,7102,7103],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[72,7105,7106],{"class":74,"line":367},[72,7107,7108],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[72,7110,7111],{"class":74,"line":1084},[72,7112,7113],{},"writer.writeheader()\n",[72,7115,7116],{"class":74,"line":1090},[72,7117,7118],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[72,7120,7121],{"class":74,"line":2398},[72,7122,7123],{},"writer_file.close()\n",[72,7125,7126],{"class":74,"line":2404},[72,7127,1037],{"emptyLinePlaceholder":165},[72,7129,7130],{"class":74,"line":3864},[72,7131,7132],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[72,7134,7135],{"class":74,"line":4076},[72,7136,7137],{},"for row in csv.DictReader(reader_file):\n",[72,7139,7140],{"class":74,"line":5741},[72,7141,7142],{},"    print(row[\"name\"], row[\"score\"])\n",[72,7144,7145],{"class":74,"line":5746},[72,7146,7147],{},"reader_file.close()\n",[10,7149,80],{},[63,7151,7154],{"className":7152,"code":7153,"language":86,"meta":68},[84],"小郑 95\n",[33,7155,7153],{"__ignoreMap":68},[10,7157,91],{},[14,7159,94],{"id":94},[96,7161,7162,7171],{},[44,7163,7164,7167,7168,7170],{},[33,7165,7166],{},"DictWriter"," 按 ",[33,7169,7076],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[44,7172,7173,7175],{},[33,7174,7055],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,7177,114],{"id":114},[41,7179,7180,7183],{},[44,7181,7182],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[44,7184,7185,7186,7188,7189,7191],{},"在 macOS 以外环境忽略 ",[33,7187,7065],{}," 可能出现额外空行；统一交给 ",[33,7190,7069],{}," 模块管理换行。",[14,7193,128],{"id":128},[96,7195,7196,7199],{},[44,7197,7198],{},"写入三名学习者的课程和分数。",[44,7200,7201],{},"读取 CSV 后把分数字符串转换为整数。",[10,7203,139],{},[14,7205,142],{"id":142},[10,7207,7208],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,7210,149],{},{"title":68,"searchDepth":151,"depth":151,"links":7212},[7213,7214,7215,7216,7217,7218,7219,7220],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",{"title":7032,"description":7037},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[161,7228,7229],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",{"id":7232,"title":7233,"body":7234,"category":161,"cover":162,"description":7238,"extension":163,"meta":7511,"navigation":165,"path":7512,"pinned":167,"publishedAt":168,"seo":7513,"slug":7514,"stem":7515,"summary":7516,"tags":7517,"updatedAt":168,"visible":165,"__hash__":7520},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7235,"toc":7498},[7236,7239,7241,7244,7246,7252,7263,7265,7282,7284,7286,7361,7363,7369,7371,7373,7398,7400,7409,7415,7426,7428,7434,7440,7449,7451,7466,7468,7489,7491,7493,7496],[10,7237,7238],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7240,16],{"id":16},[10,7242,7243],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7245,22],{"id":22},[10,7247,7248],{},[26,7249],{"alt":7250,"src":7251},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7253,7254,7255,7258,7259,7262],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7256,7257],{},"except","；无论是否异常，",[33,7260,7261],{},"finally"," 都会在离开结构前执行。",[14,7264,39],{"id":39},[41,7266,7267,7273,7279],{},[44,7268,7269,7270,7272],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7271,7257],{}," 吞掉全部错误。",[44,7274,7275,7278],{},[33,7276,7277],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[44,7280,7281],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7283,58],{"id":58},[10,7285,61],{},[63,7287,7289],{"className":65,"code":7288,"language":67,"meta":68,"style":68},"def parse_age(text):\n    age = int(text)\n    if age \u003C 0:\n        raise ValueError(\"年龄不能为负数\")\n    return age\n\ntry:\n    age = parse_age(\"18\")\nexcept ValueError as error:\n    print(\"输入错误：\", error)\nelse:\n    print(\"年龄：\", age)\nfinally:\n    print(\"处理结束\")\n",[33,7290,7291,7296,7301,7306,7311,7316,7320,7325,7330,7335,7340,7344,7349,7355],{"__ignoreMap":68},[72,7292,7293],{"class":74,"line":75},[72,7294,7295],{},"def parse_age(text):\n",[72,7297,7298],{"class":74,"line":151},[72,7299,7300],{},"    age = int(text)\n",[72,7302,7303],{"class":74,"line":361},[72,7304,7305],{},"    if age \u003C 0:\n",[72,7307,7308],{"class":74,"line":367},[72,7309,7310],{},"        raise ValueError(\"年龄不能为负数\")\n",[72,7312,7313],{"class":74,"line":1084},[72,7314,7315],{},"    return age\n",[72,7317,7318],{"class":74,"line":1090},[72,7319,1037],{"emptyLinePlaceholder":165},[72,7321,7322],{"class":74,"line":2398},[72,7323,7324],{},"try:\n",[72,7326,7327],{"class":74,"line":2404},[72,7328,7329],{},"    age = parse_age(\"18\")\n",[72,7331,7332],{"class":74,"line":3864},[72,7333,7334],{},"except ValueError as error:\n",[72,7336,7337],{"class":74,"line":4076},[72,7338,7339],{},"    print(\"输入错误：\", error)\n",[72,7341,7342],{"class":74,"line":5741},[72,7343,1087],{},[72,7345,7346],{"class":74,"line":5746},[72,7347,7348],{},"    print(\"年龄：\", age)\n",[72,7350,7352],{"class":74,"line":7351},13,[72,7353,7354],{},"finally:\n",[72,7356,7358],{"class":74,"line":7357},14,[72,7359,7360],{},"    print(\"处理结束\")\n",[10,7362,80],{},[63,7364,7367],{"className":7365,"code":7366,"language":86,"meta":68},[84],"年龄： 18\n处理结束\n",[33,7368,7366],{"__ignoreMap":68},[10,7370,91],{},[14,7372,94],{"id":94},[96,7374,7375,7387],{},[44,7376,7377,7379,7380,7382,7383,7386],{},[33,7378,2947],{}," 或主动 ",[33,7381,7277],{}," 都可能产生 ",[33,7384,7385],{},"ValueError","，控制流立即离开当前正常路径。",[44,7388,7389,7390,7392,7393,7395,7396,299],{},"有异常时进入匹配的 ",[33,7391,7257],{},"；没有异常时执行 ",[33,7394,1102],{},"；两种情况最后都会执行 ",[33,7397,7261],{},[265,7399,2608],{"id":2608},[10,7401,7402,2166,7404,1099,7406,7408],{},[33,7403,7257],{},[33,7405,1102],{},[33,7407,7261],{}," 的职责不同，不能只看它们出现的顺序。",[10,7410,7411],{},[26,7412],{"alt":7413,"src":7414},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7416,7417,7419,7420,7422,7423,7425],{},[33,7418,7257],{}," 处理匹配异常，",[33,7421,1102],{}," 只在无异常时运行，",[33,7424,7261],{}," 负责两条路径都需要的清理动作。",[265,7427,2608],{"id":4131},[10,7429,7430,7433],{},[33,7431,7432],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7435,7436],{},[26,7437],{"alt":7438,"src":7439},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7441,7442,7443,7445,7446,7448],{},"只把可能产生预期异常的操作放进 ",[33,7444,7432],{},"，后续正常业务放进 ",[33,7447,1102],{},"，错误边界会更清楚。",[14,7450,114],{"id":114},[41,7452,7453,7460],{},[44,7454,7455,7456,7459],{},"使用裸 ",[33,7457,7458],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[44,7461,7462,7463,7465],{},"把整个程序包在一个巨大 ",[33,7464,7432],{}," 中，无法判断究竟哪一步允许失败。",[14,7467,128],{"id":128},[96,7469,7470,7483],{},[44,7471,7472,7473,7476,7477,1099,7480,299],{},"让 ",[33,7474,7475],{},"parse_age"," 分别处理 ",[33,7478,7479],{},"\"abc\"",[33,7481,7482],{},"\"-1\"",[44,7484,7485,7486,7488],{},"为文件读取捕获 ",[33,7487,6693],{}," 并给出清晰提示。",[10,7490,139],{},[14,7492,142],{"id":142},[10,7494,7495],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,7497,149],{},{"title":68,"searchDepth":151,"depth":151,"links":7499},[7500,7501,7502,7503,7504,7508,7509,7510],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":7505},[7506,7507],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7233,"description":7238},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[161,7518,7519],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7522,"title":7523,"body":7524,"category":161,"cover":162,"description":7528,"extension":163,"meta":7704,"navigation":165,"path":7705,"pinned":167,"publishedAt":168,"seo":7706,"slug":7707,"stem":7708,"summary":7709,"tags":7710,"updatedAt":168,"visible":165,"__hash__":7712},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7525,"toc":7694},[7526,7529,7531,7534,7536,7542,7548,7550,7566,7568,7570,7624,7626,7632,7634,7636,7649,7651,7664,7666,7685,7687,7689,7692],[10,7527,7528],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7530,16],{"id":16},[10,7532,7533],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7535,22],{"id":22},[10,7537,7538],{},[26,7539],{"alt":7540,"src":7541},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7543,7544,7545,7547],{},"进入 ",[33,7546,6703],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7549,39],{"id":39},[41,7551,7552,7557,7563],{},[44,7553,7554,7556],{},[33,7555,6703],{}," 把资源获取和释放配成一个清晰边界。",[44,7558,7559,7562],{},[33,7560,7561],{},"as file"," 得到的是上下文返回的资源对象。",[44,7564,7565],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7567,58],{"id":58},[10,7569,61],{},[63,7571,7573],{"className":65,"code":7572,"language":67,"meta":68,"style":68},"from pathlib import Path\n\nfile_path = Path(\"notes.txt\")\n\nwith file_path.open(\"w\", encoding=\"utf-8\") as file:\n    file.write(\"上下文管理器\\n\")\n\nwith file_path.open(\"r\", encoding=\"utf-8\") as file:\n    print(file.read())\n\nprint(file.closed)\n",[33,7574,7575,7579,7583,7587,7591,7596,7601,7605,7610,7615,7619],{"__ignoreMap":68},[72,7576,7577],{"class":74,"line":75},[72,7578,6515],{},[72,7580,7581],{"class":74,"line":151},[72,7582,1037],{"emptyLinePlaceholder":165},[72,7584,7585],{"class":74,"line":361},[72,7586,6726],{},[72,7588,7589],{"class":74,"line":367},[72,7590,1037],{"emptyLinePlaceholder":165},[72,7592,7593],{"class":74,"line":1084},[72,7594,7595],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,7597,7598],{"class":74,"line":1090},[72,7599,7600],{},"    file.write(\"上下文管理器\\n\")\n",[72,7602,7603],{"class":74,"line":2398},[72,7604,1037],{"emptyLinePlaceholder":165},[72,7606,7607],{"class":74,"line":2404},[72,7608,7609],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[72,7611,7612],{"class":74,"line":3864},[72,7613,7614],{},"    print(file.read())\n",[72,7616,7617],{"class":74,"line":4076},[72,7618,1037],{"emptyLinePlaceholder":165},[72,7620,7621],{"class":74,"line":5741},[72,7622,7623],{},"print(file.closed)\n",[10,7625,80],{},[63,7627,7630],{"className":7628,"code":7629,"language":86,"meta":68},[84],"上下文管理器\n\nTrue\n",[33,7631,7629],{"__ignoreMap":68},[10,7633,91],{},[14,7635,94],{"id":94},[96,7637,7638,7646],{},[44,7639,7544,7640,7642,7643,299],{},[33,7641,6703],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7644,7645],{},"file",[44,7647,7648],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7650,114],{"id":114},[41,7652,7653,7658],{},[44,7654,4699,7655,7657],{},[33,7656,6703],{}," 代码块外继续读写已经关闭的文件对象。",[44,7659,7660,7661,7663],{},"误以为 ",[33,7662,6703],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7665,128],{"id":128},[96,7667,7668,7677],{},[44,7669,7670,7671,7674,7675,299],{},"把第 30 篇的手动 ",[33,7672,7673],{},"open\u002Fclose"," 改写为 ",[33,7676,6703],{},[44,7678,4699,7679,7681,7682,299],{},[33,7680,6703],{}," 块后检查 ",[33,7683,7684],{},"file.closed",[10,7686,139],{},[14,7688,142],{"id":142},[10,7690,7691],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,7693,149],{},{"title":68,"searchDepth":151,"depth":151,"links":7695},[7696,7697,7698,7699,7700,7701,7702,7703],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7523,"description":7528},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[161,6703,7711],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7714,"title":7715,"body":7716,"category":161,"cover":162,"description":7720,"extension":163,"meta":7932,"navigation":165,"path":7933,"pinned":167,"publishedAt":168,"seo":7934,"slug":7935,"stem":7936,"summary":7937,"tags":7938,"updatedAt":168,"visible":165,"__hash__":7941},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7717,"toc":7920},[7718,7721,7723,7726,7728,7734,7737,7739,7756,7758,7760,7828,7830,7836,7838,7840,7865,7867,7870,7876,7885,7887,7898,7900,7911,7913,7915,7918],[10,7719,7720],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7722,16],{"id":16},[10,7724,7725],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7727,22],{"id":22},[10,7729,7730],{},[26,7731],{"alt":7732,"src":7733},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7735,7736],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7738,39],{"id":39},[41,7740,7741,7747,7753],{},[44,7742,7743,7746],{},[33,7744,7745],{},"self"," 表示当前实例，由方法调用自动传入。",[44,7748,7749,7752],{},[33,7750,7751],{},"__init__"," 在实例创建过程中初始化属性。",[44,7754,7755],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7757,58],{"id":58},[10,7759,61],{},[63,7761,7763],{"className":65,"code":7762,"language":67,"meta":68,"style":68},"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",[33,7764,7765,7770,7775,7780,7785,7789,7794,7799,7804,7809,7813,7818,7823],{"__ignoreMap":68},[72,7766,7767],{"class":74,"line":75},[72,7768,7769],{},"class LearningRecord:\n",[72,7771,7772],{"class":74,"line":151},[72,7773,7774],{},"    def __init__(self, course, progress=0):\n",[72,7776,7777],{"class":74,"line":361},[72,7778,7779],{},"        self.course = course\n",[72,7781,7782],{"class":74,"line":367},[72,7783,7784],{},"        self.progress = progress\n",[72,7786,7787],{"class":74,"line":1084},[72,7788,1037],{"emptyLinePlaceholder":165},[72,7790,7791],{"class":74,"line":1090},[72,7792,7793],{},"    def advance(self, amount):\n",[72,7795,7796],{"class":74,"line":2398},[72,7797,7798],{},"        self.progress = self.progress + amount\n",[72,7800,7801],{"class":74,"line":2404},[72,7802,7803],{},"        if self.progress > 100:\n",[72,7805,7806],{"class":74,"line":3864},[72,7807,7808],{},"            self.progress = 100\n",[72,7810,7811],{"class":74,"line":4076},[72,7812,1037],{"emptyLinePlaceholder":165},[72,7814,7815],{"class":74,"line":5741},[72,7816,7817],{},"record = LearningRecord(\"Python\", 40)\n",[72,7819,7820],{"class":74,"line":5746},[72,7821,7822],{},"record.advance(15)\n",[72,7824,7825],{"class":74,"line":7351},[72,7826,7827],{},"print(record.course, record.progress)\n",[10,7829,80],{},[63,7831,7834],{"className":7832,"code":7833,"language":86,"meta":68},[84],"Python 55\n",[33,7835,7833],{"__ignoreMap":68},[10,7837,91],{},[14,7839,94],{"id":94},[96,7841,7842,7852],{},[44,7843,7844,7845,7848,7849,7851],{},"调用 ",[33,7846,7847],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7850,7751],{}," 把课程和进度保存在该实例属性中。",[44,7853,7854,7857,7858,7861,7862,7864],{},[33,7855,7856],{},"record.advance(15)"," 自动把 ",[33,7859,7860],{},"record"," 作为 ",[33,7863,7745],{},"，方法更新同一实例的进度并限制上限。",[265,7866,2608],{"id":2608},[10,7868,7869],{},"类是共同定义，实例则各自保存状态。",[10,7871,7872],{},[26,7873],{"alt":7874,"src":7875},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7877,7878,7879,1099,7881,7884],{},"两个实例共享同一套方法定义，但 ",[33,7880,4496],{},[33,7882,7883],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7886,114],{"id":114},[41,7888,7889,7895],{},[44,7890,7891,7892,7894],{},"调用实例方法时手工再传一次 ",[33,7893,7745],{},"。通过实例调用时 Python 会自动绑定。",[44,7896,7897],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7899,128],{"id":128},[96,7901,7902,7908],{},[44,7903,5209,7904,7907],{},[33,7905,7906],{},"Book"," 类，保存标题和阅读页数。",[44,7909,7910],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7912,139],{},[14,7914,142],{"id":142},[10,7916,7917],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,7919,149],{},{"title":68,"searchDepth":151,"depth":151,"links":7921},[7922,7923,7924,7925,7926,7929,7930,7931],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":7927},[7928],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7715,"description":7720},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[161,7939,7940],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7943,"title":7944,"body":7945,"category":161,"cover":162,"description":7949,"extension":163,"meta":8127,"navigation":165,"path":8128,"pinned":167,"publishedAt":168,"seo":8129,"slug":8130,"stem":8131,"summary":8132,"tags":8133,"updatedAt":168,"visible":165,"__hash__":8136},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7946,"toc":8117},[7947,7950,7952,7955,7957,7963,7966,7968,7979,7981,7983,8050,8052,8058,8060,8062,8081,8083,8091,8093,8108,8110,8112,8115],[10,7948,7949],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,7951,16],{"id":16},[10,7953,7954],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7956,22],{"id":22},[10,7958,7959],{},[26,7960],{"alt":7961,"src":7962},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,7964,7965],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,7967,39],{"id":39},[41,7969,7970,7973,7976],{},[44,7971,7972],{},"封装让对象通过方法维护自己的有效状态。",[44,7974,7975],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[44,7977,7978],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,7980,58],{"id":58},[10,7982,61],{},[63,7984,7986],{"className":65,"code":7985,"language":67,"meta":68,"style":68},"class Storage:\n    def save(self, text):\n        print(\"保存：\", text)\n\nclass LearningService:\n    def __init__(self, storage):\n        self.storage = storage\n\n    def finish_lesson(self, title):\n        self.storage.save(title)\n\nservice = LearningService(Storage())\nservice.finish_lesson(\"异常处理\")\n",[33,7987,7988,7993,7998,8003,8007,8012,8017,8022,8026,8031,8036,8040,8045],{"__ignoreMap":68},[72,7989,7990],{"class":74,"line":75},[72,7991,7992],{},"class Storage:\n",[72,7994,7995],{"class":74,"line":151},[72,7996,7997],{},"    def save(self, text):\n",[72,7999,8000],{"class":74,"line":361},[72,8001,8002],{},"        print(\"保存：\", text)\n",[72,8004,8005],{"class":74,"line":367},[72,8006,1037],{"emptyLinePlaceholder":165},[72,8008,8009],{"class":74,"line":1084},[72,8010,8011],{},"class LearningService:\n",[72,8013,8014],{"class":74,"line":1090},[72,8015,8016],{},"    def __init__(self, storage):\n",[72,8018,8019],{"class":74,"line":2398},[72,8020,8021],{},"        self.storage = storage\n",[72,8023,8024],{"class":74,"line":2404},[72,8025,1037],{"emptyLinePlaceholder":165},[72,8027,8028],{"class":74,"line":3864},[72,8029,8030],{},"    def finish_lesson(self, title):\n",[72,8032,8033],{"class":74,"line":4076},[72,8034,8035],{},"        self.storage.save(title)\n",[72,8037,8038],{"class":74,"line":5741},[72,8039,1037],{"emptyLinePlaceholder":165},[72,8041,8042],{"class":74,"line":5746},[72,8043,8044],{},"service = LearningService(Storage())\n",[72,8046,8047],{"class":74,"line":7351},[72,8048,8049],{},"service.finish_lesson(\"异常处理\")\n",[10,8051,80],{},[63,8053,8056],{"className":8054,"code":8055,"language":86,"meta":68},[84],"保存： 异常处理\n",[33,8057,8055],{"__ignoreMap":68},[10,8059,91],{},[14,8061,94],{"id":94},[96,8063,8064,8074],{},[44,8065,8066,8069,8070,8073],{},[33,8067,8068],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8071,8072],{},"save()"," 的协作对象。",[44,8075,8076,8077,8080],{},"调用业务方法时，服务把保存动作委托给 ",[33,8078,8079],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8082,114],{"id":114},[41,8084,8085,8088],{},[44,8086,8087],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[44,8089,8090],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8092,128],{"id":128},[96,8094,8095,8105],{},[44,8096,8097,8098,8101,8102,299],{},"用组合让 ",[33,8099,8100],{},"OrderService"," 使用一个 ",[33,8103,8104],{},"Notifier",[44,8106,8107],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8109,139],{},[14,8111,142],{"id":142},[10,8113,8114],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,8116,149],{},{"title":68,"searchDepth":151,"depth":151,"links":8118},[8119,8120,8121,8122,8123,8124,8125,8126],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7944,"description":7949},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[161,8134,8135],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8138,"title":8139,"body":8140,"category":161,"cover":162,"description":8144,"extension":163,"meta":8347,"navigation":165,"path":8348,"pinned":167,"publishedAt":168,"seo":8349,"slug":8350,"stem":8351,"summary":8352,"tags":8353,"updatedAt":168,"visible":165,"__hash__":8356},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8141,"toc":8335},[8142,8145,8147,8150,8152,8158,8165,8167,8192,8194,8196,8248,8250,8256,8258,8260,8281,8283,8289,8295,8301,8303,8311,8313,8326,8328,8330,8333],[10,8143,8144],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8146,16],{"id":16},[10,8148,8149],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8151,22],{"id":22},[10,8153,8154],{},[26,8155],{"alt":8156,"src":8157},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8159,8160,8161,8164],{},"生成器运行到 ",[33,8162,8163],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8166,39],{"id":39},[41,8168,8169,8179,8189],{},[44,8170,8171,8174,8175,8178],{},[33,8172,8173],{},"iter()"," 从可迭代对象取得迭代器，",[33,8176,8177],{},"next()"," 请求下一个值。",[44,8180,8181,8182,8185,8186,8188],{},"没有更多值时迭代器抛出 ",[33,8183,8184],{},"StopIteration","，",[33,8187,4250],{}," 会自动处理。",[44,8190,8191],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8193,58],{"id":58},[10,8195,61],{},[63,8197,8199],{"className":65,"code":8198,"language":67,"meta":68,"style":68},"def countdown(start):\n    current = start\n    while current > 0:\n        yield current\n        current = current - 1\n\niterator = countdown(3)\nprint(next(iterator))\nprint(next(iterator))\nprint(next(iterator))\n",[33,8200,8201,8206,8211,8216,8221,8226,8230,8235,8240,8244],{"__ignoreMap":68},[72,8202,8203],{"class":74,"line":75},[72,8204,8205],{},"def countdown(start):\n",[72,8207,8208],{"class":74,"line":151},[72,8209,8210],{},"    current = start\n",[72,8212,8213],{"class":74,"line":361},[72,8214,8215],{},"    while current > 0:\n",[72,8217,8218],{"class":74,"line":367},[72,8219,8220],{},"        yield current\n",[72,8222,8223],{"class":74,"line":1084},[72,8224,8225],{},"        current = current - 1\n",[72,8227,8228],{"class":74,"line":1090},[72,8229,1037],{"emptyLinePlaceholder":165},[72,8231,8232],{"class":74,"line":2398},[72,8233,8234],{},"iterator = countdown(3)\n",[72,8236,8237],{"class":74,"line":2404},[72,8238,8239],{},"print(next(iterator))\n",[72,8241,8242],{"class":74,"line":3864},[72,8243,8239],{},[72,8245,8246],{"class":74,"line":4076},[72,8247,8239],{},[10,8249,80],{},[63,8251,8254],{"className":8252,"code":8253,"language":86,"meta":68},[84],"3\n2\n1\n",[33,8255,8253],{"__ignoreMap":68},[10,8257,91],{},[14,8259,94],{"id":94},[96,8261,8262,8268],{},[44,8263,7844,8264,8267],{},[33,8265,8266],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[44,8269,8270,8271,8273,8274,8276,8277,8280],{},"每次 ",[33,8272,8177],{}," 运行到下一个 ",[33,8275,8163],{}," 并暂停，局部变量 ",[33,8278,8279],{},"current"," 和执行位置被保留。",[265,8282,2608],{"id":2608},[10,8284,8285,8286,8288],{},"生成器的暂停位置可以展开成多次 ",[33,8287,8177],{}," 的时间线。",[10,8290,8291],{},[26,8292],{"alt":8293,"src":8294},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8296,8297,8298,8300],{},"每次请求只推进到下一个 ",[33,8299,8163],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8302,114],{"id":114},[41,8304,8305,8308],{},[44,8306,8307],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[44,8309,8310],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8312,128],{"id":128},[96,8314,8315,8318],{},[44,8316,8317],{},"编写产生 1 到指定上限偶数的生成器。",[44,8319,3922,8320,8322,8323,8325],{},[33,8321,4250],{}," 遍历生成器，比较手动 ",[33,8324,8177],{}," 的差异。",[10,8327,139],{},[14,8329,142],{"id":142},[10,8331,8332],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,8334,149],{},{"title":68,"searchDepth":151,"depth":151,"links":8336},[8337,8338,8339,8340,8341,8344,8345,8346],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":8342},[8343],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8139,"description":8144},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[161,8354,8355],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8358,"title":8359,"body":8360,"category":161,"cover":162,"description":8364,"extension":163,"meta":8588,"navigation":165,"path":8589,"pinned":167,"publishedAt":168,"seo":8590,"slug":8591,"stem":8592,"summary":8593,"tags":8594,"updatedAt":168,"visible":165,"__hash__":8596},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8361,"toc":8576},[8362,8365,8367,8370,8372,8378,8381,8383,8403,8405,8407,8489,8491,8497,8499,8501,8523,8525,8528,8534,8541,8543,8553,8555,8567,8569,8571,8574],[10,8363,8364],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8366,16],{"id":16},[10,8368,8369],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8371,22],{"id":22},[10,8373,8374],{},[26,8375],{"alt":8376,"src":8377},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8379,8380],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8382,39],{"id":39},[41,8384,8385,8394,8397],{},[44,8386,8387,8390,8391,299],{},[33,8388,8389],{},"@trace"," 等价于 ",[33,8392,8393],{},"add = trace(add)",[44,8395,8396],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[44,8398,8399,8402],{},[33,8400,8401],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8404,58],{"id":58},[10,8406,61],{},[63,8408,8410],{"className":65,"code":8409,"language":67,"meta":68,"style":68},"from functools import wraps\n\ndef trace(function):\n    @wraps(function)\n    def wrapper(*args, **kwargs):\n        print(\"开始：\", function.__name__)\n        result = function(*args, **kwargs)\n        print(\"结束：\", function.__name__)\n        return result\n    return wrapper\n\n@trace\ndef add(left, right):\n    return left + right\n\nprint(add(2, 3))\n",[33,8411,8412,8417,8421,8426,8431,8436,8441,8446,8451,8456,8461,8465,8470,8474,8478,8483],{"__ignoreMap":68},[72,8413,8414],{"class":74,"line":75},[72,8415,8416],{},"from functools import wraps\n",[72,8418,8419],{"class":74,"line":151},[72,8420,1037],{"emptyLinePlaceholder":165},[72,8422,8423],{"class":74,"line":361},[72,8424,8425],{},"def trace(function):\n",[72,8427,8428],{"class":74,"line":367},[72,8429,8430],{},"    @wraps(function)\n",[72,8432,8433],{"class":74,"line":1084},[72,8434,8435],{},"    def wrapper(*args, **kwargs):\n",[72,8437,8438],{"class":74,"line":1090},[72,8439,8440],{},"        print(\"开始：\", function.__name__)\n",[72,8442,8443],{"class":74,"line":2398},[72,8444,8445],{},"        result = function(*args, **kwargs)\n",[72,8447,8448],{"class":74,"line":2404},[72,8449,8450],{},"        print(\"结束：\", function.__name__)\n",[72,8452,8453],{"class":74,"line":3864},[72,8454,8455],{},"        return result\n",[72,8457,8458],{"class":74,"line":4076},[72,8459,8460],{},"    return wrapper\n",[72,8462,8463],{"class":74,"line":5741},[72,8464,1037],{"emptyLinePlaceholder":165},[72,8466,8467],{"class":74,"line":5746},[72,8468,8469],{},"@trace\n",[72,8471,8472],{"class":74,"line":7351},[72,8473,6094],{},[72,8475,8476],{"class":74,"line":7357},[72,8477,6099],{},[72,8479,8481],{"class":74,"line":8480},15,[72,8482,1037],{"emptyLinePlaceholder":165},[72,8484,8486],{"class":74,"line":8485},16,[72,8487,8488],{},"print(add(2, 3))\n",[10,8490,80],{},[63,8492,8495],{"className":8493,"code":8494,"language":86,"meta":68},[84],"开始： add\n结束： add\n5\n",[33,8496,8494],{"__ignoreMap":68},[10,8498,91],{},[14,8500,94],{"id":94},[96,8502,8503,8520],{},[44,8504,8505,8506,8509,8510,8513,8514,8517,8518,299],{},"解释器执行定义时，把原 ",[33,8507,8508],{},"add"," 函数交给 ",[33,8511,8512],{},"trace","，返回的 ",[33,8515,8516],{},"wrapper"," 重新绑定到名字 ",[33,8519,8508],{},[44,8521,8522],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[265,8524,2608],{"id":2608},[10,8526,8527],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8529,8530],{},[26,8531],{"alt":8532,"src":8533},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8535,8536,8538,8539,299],{},[33,8537,8389],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8540,8393],{},[14,8542,114],{"id":114},[41,8544,8545,8550],{},[44,8546,8547,8548,299],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8549,5292],{},[44,8551,8552],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8554,128],{"id":128},[96,8556,8557,8560],{},[44,8558,8559],{},"编写只记录调用次数的简单装饰器。",[44,8561,8562,8563,8566],{},"删除包装函数的 ",[33,8564,8565],{},"return result","，观察调用方得到什么。",[10,8568,139],{},[14,8570,142],{"id":142},[10,8572,8573],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,8575,149],{},{"title":68,"searchDepth":151,"depth":151,"links":8577},[8578,8579,8580,8581,8582,8585,8586,8587],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":8583},[8584],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8359,"description":8364},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[161,8595,5243],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8598,"title":8599,"body":8600,"category":161,"cover":162,"description":8604,"extension":163,"meta":8791,"navigation":165,"path":8792,"pinned":167,"publishedAt":168,"seo":8793,"slug":8794,"stem":8795,"summary":8796,"tags":8797,"updatedAt":168,"visible":165,"__hash__":8800},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8601,"toc":8779},[8602,8605,8607,8610,8612,8618,8621,8623,8634,8636,8638,8713,8715,8721,8723,8725,8736,8738,8741,8747,8750,8752,8760,8762,8770,8772,8774,8777],[10,8603,8604],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8606,16],{"id":16},[10,8608,8609],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8611,22],{"id":22},[10,8613,8614],{},[26,8615],{"alt":8616,"src":8617},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8619,8620],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8622,39],{"id":39},[41,8624,8625,8628,8631],{},[44,8626,8627],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[44,8629,8630],{},"日志记录运行状态，测试判断结果是否符合约定。",[44,8632,8633],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8635,58],{"id":58},[10,8637,61],{},[63,8639,8641],{"className":65,"code":8640,"language":67,"meta":68,"style":68},"import logging\nimport unittest\n\nlogging.basicConfig(level=logging.INFO)\n\ndef clamp_progress(value):\n    logging.info(\"检查进度：%s\", value)\n    return max(0, min(100, value))\n\nclass ProgressTest(unittest.TestCase):\n    def test_upper_limit(self):\n        self.assertEqual(clamp_progress(120), 100)\n\nif __name__ == \"__main__\":\n    unittest.main()\n",[33,8642,8643,8648,8653,8657,8662,8666,8671,8676,8681,8685,8690,8695,8700,8704,8708],{"__ignoreMap":68},[72,8644,8645],{"class":74,"line":75},[72,8646,8647],{},"import logging\n",[72,8649,8650],{"class":74,"line":151},[72,8651,8652],{},"import unittest\n",[72,8654,8655],{"class":74,"line":361},[72,8656,1037],{"emptyLinePlaceholder":165},[72,8658,8659],{"class":74,"line":367},[72,8660,8661],{},"logging.basicConfig(level=logging.INFO)\n",[72,8663,8664],{"class":74,"line":1084},[72,8665,1037],{"emptyLinePlaceholder":165},[72,8667,8668],{"class":74,"line":1090},[72,8669,8670],{},"def clamp_progress(value):\n",[72,8672,8673],{"class":74,"line":2398},[72,8674,8675],{},"    logging.info(\"检查进度：%s\", value)\n",[72,8677,8678],{"class":74,"line":2404},[72,8679,8680],{},"    return max(0, min(100, value))\n",[72,8682,8683],{"class":74,"line":3864},[72,8684,1037],{"emptyLinePlaceholder":165},[72,8686,8687],{"class":74,"line":4076},[72,8688,8689],{},"class ProgressTest(unittest.TestCase):\n",[72,8691,8692],{"class":74,"line":5741},[72,8693,8694],{},"    def test_upper_limit(self):\n",[72,8696,8697],{"class":74,"line":5746},[72,8698,8699],{},"        self.assertEqual(clamp_progress(120), 100)\n",[72,8701,8702],{"class":74,"line":7351},[72,8703,1037],{"emptyLinePlaceholder":165},[72,8705,8706],{"class":74,"line":7357},[72,8707,6108],{},[72,8709,8710],{"class":74,"line":8480},[72,8711,8712],{},"    unittest.main()\n",[10,8714,80],{},[63,8716,8719],{"className":8717,"code":8718,"language":86,"meta":68},[84],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8720,8718],{"__ignoreMap":68},[10,8722,91],{},[14,8724,94],{"id":94},[96,8726,8727,8733],{},[44,8728,8729,8732],{},[33,8730,8731],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[44,8734,8735],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[265,8737,2608],{"id":2608},[10,8739,8740],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8742,8743],{},[26,8744],{"alt":8745,"src":8746},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8748,8749],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8751,114],{"id":114},[41,8753,8754,8757],{},[44,8755,8756],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[44,8758,8759],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8761,128],{"id":128},[96,8763,8764,8767],{},[44,8765,8766],{},"为负数进度增加测试。",[44,8768,8769],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8771,139],{},[14,8773,142],{"id":142},[10,8775,8776],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,8778,149],{},{"title":68,"searchDepth":151,"depth":151,"links":8780},[8781,8782,8783,8784,8785,8788,8789,8790],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":8786},[8787],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8599,"description":8604},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[161,8798,8799],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8802,"title":8803,"body":8804,"category":161,"cover":162,"description":8808,"extension":163,"meta":9108,"navigation":165,"path":9109,"pinned":167,"publishedAt":168,"seo":9110,"slug":9111,"stem":9112,"summary":9113,"tags":9114,"updatedAt":168,"visible":165,"__hash__":9117},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8805,"toc":9095},[8806,8809,8811,8814,8816,8822,8825,8827,8842,8844,8846,8993,8995,9001,9003,9005,9018,9020,9023,9029,9032,9034,9037,9043,9050,9052,9063,9065,9086,9088,9090,9093],[10,8807,8808],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8810,16],{"id":16},[10,8812,8813],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8815,22],{"id":22},[10,8817,8818],{},[26,8819],{"alt":8820,"src":8821},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8823,8824],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8826,39],{"id":39},[41,8828,8829,8832,8835],{},[44,8830,8831],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[44,8833,8834],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[44,8836,8837,8838,8841],{},"实际扩展前先为 ",[33,8839,8840],{},"add()"," 和存储边界补充测试。",[14,8843,58],{"id":58},[10,8845,61],{},[63,8847,8849],{"className":65,"code":8848,"language":67,"meta":68,"style":68},"import json\nfrom pathlib import Path\n\nclass LearningRecords:\n    def __init__(self, file_path):\n        self.file_path = Path(file_path)\n        self.items = []\n\n    def add(self, title):\n        title = title.strip()\n        if not title:\n            raise ValueError(\"课程名称不能为空\")\n        self.items.append({\"title\": title, \"done\": False})\n\n    def save(self):\n        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n            json.dump(self.items, file, ensure_ascii=False, indent=2)\n\nrecords = LearningRecords(\"learning-records.json\")\n\ntry:\n    title = input(\"输入已学习课程：\")\n    records.add(title)\n    records.save()\nexcept ValueError as error:\n    print(\"无法保存：\", error)\nelse:\n    print(\"已保存 1 条学习记录\")\n",[33,8850,8851,8855,8859,8863,8868,8873,8878,8883,8887,8892,8897,8902,8907,8912,8916,8921,8926,8932,8937,8943,8948,8953,8959,8965,8971,8976,8982,8987],{"__ignoreMap":68},[72,8852,8853],{"class":74,"line":75},[72,8854,6906],{},[72,8856,8857],{"class":74,"line":151},[72,8858,6515],{},[72,8860,8861],{"class":74,"line":361},[72,8862,1037],{"emptyLinePlaceholder":165},[72,8864,8865],{"class":74,"line":367},[72,8866,8867],{},"class LearningRecords:\n",[72,8869,8870],{"class":74,"line":1084},[72,8871,8872],{},"    def __init__(self, file_path):\n",[72,8874,8875],{"class":74,"line":1090},[72,8876,8877],{},"        self.file_path = Path(file_path)\n",[72,8879,8880],{"class":74,"line":2398},[72,8881,8882],{},"        self.items = []\n",[72,8884,8885],{"class":74,"line":2404},[72,8886,1037],{"emptyLinePlaceholder":165},[72,8888,8889],{"class":74,"line":3864},[72,8890,8891],{},"    def add(self, title):\n",[72,8893,8894],{"class":74,"line":4076},[72,8895,8896],{},"        title = title.strip()\n",[72,8898,8899],{"class":74,"line":5741},[72,8900,8901],{},"        if not title:\n",[72,8903,8904],{"class":74,"line":5746},[72,8905,8906],{},"            raise ValueError(\"课程名称不能为空\")\n",[72,8908,8909],{"class":74,"line":7351},[72,8910,8911],{},"        self.items.append({\"title\": title, \"done\": False})\n",[72,8913,8914],{"class":74,"line":7357},[72,8915,1037],{"emptyLinePlaceholder":165},[72,8917,8918],{"class":74,"line":8480},[72,8919,8920],{},"    def save(self):\n",[72,8922,8923],{"class":74,"line":8485},[72,8924,8925],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[72,8927,8929],{"class":74,"line":8928},17,[72,8930,8931],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[72,8933,8935],{"class":74,"line":8934},18,[72,8936,1037],{"emptyLinePlaceholder":165},[72,8938,8940],{"class":74,"line":8939},19,[72,8941,8942],{},"records = LearningRecords(\"learning-records.json\")\n",[72,8944,8946],{"class":74,"line":8945},20,[72,8947,1037],{"emptyLinePlaceholder":165},[72,8949,8951],{"class":74,"line":8950},21,[72,8952,7324],{},[72,8954,8956],{"class":74,"line":8955},22,[72,8957,8958],{},"    title = input(\"输入已学习课程：\")\n",[72,8960,8962],{"class":74,"line":8961},23,[72,8963,8964],{},"    records.add(title)\n",[72,8966,8968],{"class":74,"line":8967},24,[72,8969,8970],{},"    records.save()\n",[72,8972,8974],{"class":74,"line":8973},25,[72,8975,7334],{},[72,8977,8979],{"class":74,"line":8978},26,[72,8980,8981],{},"    print(\"无法保存：\", error)\n",[72,8983,8985],{"class":74,"line":8984},27,[72,8986,1087],{},[72,8988,8990],{"class":74,"line":8989},28,[72,8991,8992],{},"    print(\"已保存 1 条学习记录\")\n",[10,8994,80],{},[63,8996,8999],{"className":8997,"code":8998,"language":86,"meta":68},[84],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9000,8998],{"__ignoreMap":68},[10,9002,91],{},[14,9004,94],{"id":94},[96,9006,9007,9013],{},[44,9008,9009,9010,9012],{},"输入层取得课程名后，",[33,9011,8840],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[44,9014,9015,9017],{},[33,9016,8072],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[265,9019,2608],{"id":2608},[10,9021,9022],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9024,9025],{},[26,9026],{"alt":9027,"src":9028},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9030,9031],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[265,9033,2608],{"id":4131},[10,9035,9036],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9038,9039],{},[26,9040],{"alt":9041,"src":9042},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9044,9045,9046,9049],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9047,9048],{},"load()"," 把文件状态恢复到内存。",[14,9051,114],{"id":114},[41,9053,9054,9057],{},[44,9055,9056],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[44,9058,9059,9060,9062],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9061,9048],{}," 是下一项必要扩展。",[14,9064,128],{"id":128},[96,9066,9067,9073,9076],{},[44,9068,9069,9070,9072],{},"增加 ",[33,9071,9048],{},"，文件不存在时从空列表开始。",[44,9074,9075],{},"增加按序号标记完成的功能，并校验序号范围。",[44,9077,9078,9079,9082,9083,9085],{},"把输入循环放进 ",[33,9080,9081],{},"main()","，通过 ",[33,9084,6050],{}," 控制程序入口。",[10,9087,139],{},[14,9089,142],{"id":142},[10,9091,9092],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[147,9094,149],{},{"title":68,"searchDepth":151,"depth":151,"links":9096},[9097,9098,9099,9100,9101,9105,9106,9107],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":9102},[9103,9104],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8803,"description":8808},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[161,9115,9116],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9119,9222,9341,9472,9615,9740,9877,10014,10155,10324,10461,10594,10717,10846,10973,11136,11312,11453,11582,11731,11874,11995,12118,12267,12420,12585,12712,12893,13036,13193,13344,13491,13646,13864,14019,14194,14345,14512,14699,14862,15104,15344],{"id":4,"title":5,"body":9120,"category":161,"cover":162,"description":12,"extension":163,"meta":9219,"navigation":165,"path":166,"pinned":167,"publishedAt":168,"seo":9220,"slug":170,"stem":171,"summary":172,"tags":9221,"updatedAt":168,"visible":165,"__hash__":176},{"type":7,"value":9121,"toc":9209},[9122,9124,9126,9128,9130,9134,9138,9140,9150,9152,9154,9162,9164,9169,9171,9173,9183,9185,9193,9195,9201,9203,9205,9207],[10,9123,12],{},[14,9125,16],{"id":16},[10,9127,19],{},[14,9129,22],{"id":22},[10,9131,9132],{},[26,9133],{"alt":28,"src":29},[10,9135,9136,36],{},[33,9137,35],{},[14,9139,39],{"id":39},[41,9141,9142,9146,9148],{},[44,9143,46,9144,49],{},[33,9145,35],{},[44,9147,52],{},[44,9149,55],{},[14,9151,58],{"id":58},[10,9153,61],{},[63,9155,9156],{"className":65,"code":66,"language":67,"meta":68,"style":68},[33,9157,9158],{"__ignoreMap":68},[72,9159,9160],{"class":74,"line":75},[72,9161,66],{},[10,9163,80],{},[63,9165,9167],{"className":9166,"code":85,"language":86,"meta":68},[84],[33,9168,85],{"__ignoreMap":68},[10,9170,91],{},[14,9172,94],{"id":94},[96,9174,9175,9179],{},[44,9176,100,9177,104],{},[33,9178,103],{},[44,9180,107,9181,111],{},[33,9182,110],{},[14,9184,114],{"id":114},[41,9186,9187,9189],{},[44,9188,119],{},[44,9190,122,9191,125],{},[33,9192,35],{},[14,9194,128],{"id":128},[96,9196,9197,9199],{},[44,9198,133],{},[44,9200,136],{},[10,9202,139],{},[14,9204,142],{"id":142},[10,9206,145],{},[147,9208,149],{},{"title":68,"searchDepth":151,"depth":151,"links":9210},[9211,9212,9213,9214,9215,9216,9217,9218],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5,"description":12},[161,174,175],{"id":1436,"title":1437,"body":9223,"category":161,"cover":162,"description":1442,"extension":163,"meta":9338,"navigation":165,"path":1579,"pinned":167,"publishedAt":168,"seo":9339,"slug":1581,"stem":1582,"summary":1583,"tags":9340,"updatedAt":168,"visible":165,"__hash__":1586},{"type":7,"value":9224,"toc":9328},[9225,9227,9229,9231,9233,9237,9241,9243,9253,9255,9257,9277,9279,9284,9286,9288,9298,9300,9310,9312,9320,9322,9324,9326],[10,9226,1442],{},[14,9228,16],{"id":16},[10,9230,1447],{},[14,9232,22],{"id":22},[10,9234,9235],{},[26,9236],{"alt":1454,"src":1455},[10,9238,1458,9239,1461],{},[33,9240,630],{},[14,9242,39],{"id":39},[41,9244,9245,9247,9249],{},[44,9246,1468],{},[44,9248,1471],{},[44,9250,1474,9251,1478],{},[33,9252,1477],{},[14,9254,58],{"id":58},[10,9256,1483],{},[63,9258,9259],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,9260,9261,9267],{"__ignoreMap":68},[72,9262,9263,9265],{"class":74,"line":75},[72,9264,630],{"class":539},[72,9266,543],{"class":542},[72,9268,9269,9271,9273,9275],{"class":74,"line":151},[72,9270,630],{"class":539},[72,9272,572],{"class":542},[72,9274,576],{"class":575},[72,9276,543],{"class":542},[10,9278,80],{},[63,9280,9282],{"className":9281,"code":1509,"language":86,"meta":68},[84],[33,9283,1509],{"__ignoreMap":68},[10,9285,91],{},[14,9287,94],{"id":94},[96,9289,9290,9294],{},[44,9291,9292,1523],{},[33,9293,1522],{},[44,9295,9296,1528],{},[33,9297,638],{},[14,9299,114],{"id":114},[41,9301,9302,9306],{},[44,9303,1535,9304,1538],{},[33,9305,630],{},[44,9307,1541,9308,1544],{},[33,9309,630],{},[14,9311,128],{"id":128},[96,9313,9314,9318],{},[44,9315,877,9316,1554],{},[33,9317,1553],{},[44,9319,1557],{},[10,9321,139],{},[14,9323,142],{"id":142},[10,9325,1564],{},[147,9327,1567],{},{"title":68,"searchDepth":151,"depth":151,"links":9329},[9330,9331,9332,9333,9334,9335,9336,9337],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":1437,"description":1442},[161,1585,991],{"id":1588,"title":1589,"body":9342,"category":161,"cover":162,"description":1755,"extension":163,"meta":9469,"navigation":165,"path":1757,"pinned":167,"publishedAt":168,"seo":9470,"slug":1759,"stem":1760,"summary":1761,"tags":9471,"updatedAt":168,"visible":165,"__hash__":1765},{"type":7,"value":9343,"toc":9459},[9344,9348,9350,9352,9354,9358,9360,9362,9378,9380,9382,9402,9404,9409,9411,9413,9425,9427,9437,9439,9449,9451,9453,9457],[10,9345,1594,9346,1597],{},[33,9347,35],{},[14,9349,16],{"id":16},[10,9351,1602],{},[14,9353,22],{"id":22},[10,9355,9356],{},[26,9357],{"alt":1609,"src":1610},[10,9359,1613],{},[14,9361,39],{"id":39},[41,9363,9364,9370,9374],{},[44,9365,1620,9366,1623,9368,299],{},[33,9367,630],{},[33,9369,1626],{},[44,9371,1629,9372,1633],{},[33,9373,1632],{},[44,9375,1636,9376,1639],{},[33,9377,35],{},[14,9379,58],{"id":58},[10,9381,61],{},[63,9383,9384],{"className":1646,"code":1647,"language":1648,"meta":68,"style":68},[33,9385,9386,9390,9394,9398],{"__ignoreMap":68},[72,9387,9388],{"class":74,"line":75},[72,9389,1655],{},[72,9391,9392],{"class":74,"line":151},[72,9393,1660],{},[72,9395,9396],{"class":74,"line":361},[72,9397,1665],{},[72,9399,9400],{"class":74,"line":367},[72,9401,1670],{},[10,9403,80],{},[63,9405,9407],{"className":9406,"code":1676,"language":86,"meta":68},[84],[33,9408,1676],{"__ignoreMap":68},[10,9410,91],{},[14,9412,94],{"id":94},[96,9414,9415,9421],{},[44,9416,1687,9417,1691,9419,299],{},[33,9418,1690],{},[33,9420,1694],{},[44,9422,1697,9423,1700],{},[33,9424,110],{},[14,9426,114],{"id":114},[41,9428,9429,9435],{},[44,9430,1707,9431,1710,9433,1713],{},[33,9432,1626],{},[33,9434,35],{},[44,9436,1716],{},[14,9438,128],{"id":128},[96,9440,9441,9445],{},[44,9442,1723,9443,299],{},[33,9444,1726],{},[44,9446,1729,9447,1732],{},[33,9448,110],{},[10,9450,139],{},[14,9452,142],{"id":142},[10,9454,1739,9455,1742],{},[33,9456,35],{},[147,9458,149],{},{"title":68,"searchDepth":151,"depth":151,"links":9460},[9461,9462,9463,9464,9465,9466,9467,9468],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":1589,"description":1755},[161,1763,1764],{"id":1767,"title":1768,"body":9473,"category":161,"cover":162,"description":1773,"extension":163,"meta":9612,"navigation":165,"path":1945,"pinned":167,"publishedAt":168,"seo":9613,"slug":1947,"stem":1948,"summary":1949,"tags":9614,"updatedAt":168,"visible":165,"__hash__":1953},{"type":7,"value":9474,"toc":9602},[9475,9477,9479,9481,9483,9487,9491,9493,9505,9507,9509,9545,9547,9552,9554,9556,9572,9574,9584,9586,9594,9596,9598,9600],[10,9476,1773],{},[14,9478,16],{"id":16},[10,9480,1778],{},[14,9482,22],{"id":22},[10,9484,9485],{},[26,9486],{"alt":1785,"src":1786},[10,9488,9489,1792],{},[33,9490,1791],{},[14,9492,39],{"id":39},[41,9494,9495,9497,9503],{},[44,9496,1799],{},[44,9498,9499,1805,9501,1809],{},[33,9500,1804],{},[33,9502,1808],{},[44,9504,1812],{},[14,9506,58],{"id":58},[10,9508,1483],{},[63,9510,9511],{"className":530,"code":1819,"language":532,"meta":68,"style":68},[33,9512,9513,9519,9525,9529,9539],{"__ignoreMap":68},[72,9514,9515,9517],{"class":74,"line":75},[72,9516,1826],{"class":539},[72,9518,1829],{"class":575},[72,9520,9521,9523],{"class":74,"line":151},[72,9522,1834],{"class":542},[72,9524,1829],{"class":575},[72,9526,9527],{"class":74,"line":361},[72,9528,1841],{"class":542},[72,9530,9531,9533,9535,9537],{"class":74,"line":367},[72,9532,1846],{"class":542},[72,9534,1849],{"class":575},[72,9536,1853],{"class":1852},[72,9538,1156],{"class":575},[72,9540,9541,9543],{"class":74,"line":1084},[72,9542,630],{"class":539},[72,9544,1156],{"class":575},[10,9546,80],{},[63,9548,9550],{"className":9549,"code":1867,"language":86,"meta":68},[84],[33,9551,1867],{"__ignoreMap":68},[10,9553,91],{},[14,9555,94],{"id":94},[96,9557,9558,9566],{},[44,9559,9560,1880,9562,1883,9564,1886],{},[33,9561,1826],{},[33,9563,1834],{},[33,9565,1804],{},[44,9567,9568,1891,9570,1895],{},[33,9569,1791],{},[33,9571,1894],{},[14,9573,114],{"id":114},[41,9575,9576,9582],{},[44,9577,1902,9578,1099,9580,299],{},[33,9579,1804],{},[33,9581,1808],{},[44,9583,1909],{},[14,9585,128],{"id":128},[96,9587,9588,9592],{},[44,9589,1916,9590,1920],{},[33,9591,1919],{},[44,9593,1923],{},[10,9595,139],{},[14,9597,142],{"id":142},[10,9599,1930],{},[147,9601,1933],{},{"title":68,"searchDepth":151,"depth":151,"links":9603},[9604,9605,9606,9607,9608,9609,9610,9611],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":1768,"description":1773},[161,1951,1952],{"id":1955,"title":1956,"body":9616,"category":161,"cover":162,"description":1961,"extension":163,"meta":9737,"navigation":165,"path":2110,"pinned":167,"publishedAt":168,"seo":9738,"slug":2112,"stem":2113,"summary":2114,"tags":9739,"updatedAt":168,"visible":165,"__hash__":2118},{"type":7,"value":9617,"toc":9727},[9618,9620,9622,9624,9626,9630,9638,9640,9654,9656,9658,9674,9676,9681,9683,9685,9699,9701,9707,9709,9719,9721,9723,9725],[10,9619,1961],{},[14,9621,16],{"id":16},[10,9623,1966],{},[14,9625,22],{"id":22},[10,9627,9628],{},[26,9629],{"alt":1973,"src":1974},[10,9631,1977,9632,299,9634,1983,9636,299],{},[33,9633,110],{},[33,9635,1982],{},[33,9637,1690],{},[14,9639,39],{"id":39},[41,9641,9642,9646,9652],{},[44,9643,9644,1995],{},[33,9645,1994],{},[44,9647,9648,2001,9650,299],{},[33,9649,2000],{},[33,9651,2004],{},[44,9653,2007],{},[14,9655,58],{"id":58},[10,9657,61],{},[63,9659,9660],{"className":65,"code":2014,"language":67,"meta":68,"style":68},[33,9661,9662,9666,9670],{"__ignoreMap":68},[72,9663,9664],{"class":74,"line":75},[72,9665,2021],{},[72,9667,9668],{"class":74,"line":151},[72,9669,2026],{},[72,9671,9672],{"class":74,"line":361},[72,9673,2031],{},[10,9675,80],{},[63,9677,9679],{"className":9678,"code":2037,"language":86,"meta":68},[84],[33,9680,2037],{"__ignoreMap":68},[10,9682,91],{},[14,9684,94],{"id":94},[96,9686,9687,9693],{},[44,9688,9689,2051,9691,299],{},[33,9690,2050],{},[33,9692,2004],{},[44,9694,9695,2058,9697,2062],{},[33,9696,110],{},[33,9698,2061],{},[14,9700,114],{"id":114},[41,9702,9703,9705],{},[44,9704,2069],{},[44,9706,2072],{},[14,9708,128],{"id":128},[96,9710,9711,9713],{},[44,9712,2079],{},[44,9714,2082,9715,2085,9717,2089],{},[33,9716,1982],{},[33,9718,2088],{},[10,9720,139],{},[14,9722,142],{"id":142},[10,9724,2096],{},[147,9726,149],{},{"title":68,"searchDepth":151,"depth":151,"links":9728},[9729,9730,9731,9732,9733,9734,9735,9736],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":1956,"description":1961},[161,2116,2117],{"id":2120,"title":2121,"body":9741,"category":161,"cover":162,"description":2126,"extension":163,"meta":9874,"navigation":165,"path":2294,"pinned":167,"publishedAt":168,"seo":9875,"slug":2296,"stem":2297,"summary":2298,"tags":9876,"updatedAt":168,"visible":165,"__hash__":2302},{"type":7,"value":9742,"toc":9864},[9743,9745,9747,9749,9751,9755,9757,9759,9775,9777,9779,9803,9805,9810,9812,9814,9830,9832,9844,9846,9856,9858,9860,9862],[10,9744,2126],{},[14,9746,16],{"id":16},[10,9748,2131],{},[14,9750,22],{"id":22},[10,9752,9753],{},[26,9754],{"alt":2138,"src":2139},[10,9756,2142],{},[14,9758,39],{"id":39},[41,9760,9761,9763,9769],{},[44,9762,2149],{},[44,9764,2152,9765,2085,9767,2159],{},[33,9766,2155],{},[33,9768,2158],{},[44,9770,2162,9771,2166,9773,2170],{},[33,9772,2165],{},[33,9774,2169],{},[14,9776,58],{"id":58},[10,9778,61],{},[63,9780,9781],{"className":65,"code":2177,"language":67,"meta":68,"style":68},[33,9782,9783,9787,9791,9795,9799],{"__ignoreMap":68},[72,9784,9785],{"class":74,"line":75},[72,9786,2184],{},[72,9788,9789],{"class":74,"line":151},[72,9790,2189],{},[72,9792,9793],{"class":74,"line":361},[72,9794,1037],{"emptyLinePlaceholder":165},[72,9796,9797],{"class":74,"line":367},[72,9798,2198],{},[72,9800,9801],{"class":74,"line":1084},[72,9802,2189],{},[10,9804,80],{},[63,9806,9808],{"className":9807,"code":2208,"language":86,"meta":68},[84],[33,9809,2208],{"__ignoreMap":68},[10,9811,91],{},[14,9813,94],{"id":94},[96,9815,9816,9822],{},[44,9817,877,9818,2222,9820,2225],{},[33,9819,2221],{},[33,9821,2155],{},[44,9823,877,9824,2231,9826,2235,9828,299],{},[33,9825,2230],{},[33,9827,2234],{},[33,9829,2238],{},[14,9831,114],{"id":114},[41,9833,9834,9836],{},[44,9835,2245],{},[44,9837,2248,9838,2166,9840,2166,9842,2256],{},[33,9839,2165],{},[33,9841,2169],{},[33,9843,2255],{},[14,9845,128],{"id":128},[96,9847,9848,9854],{},[44,9849,2263,9850,1099,9852,2270],{},[33,9851,2266],{},[33,9853,2269],{},[44,9855,2273],{},[10,9857,139],{},[14,9859,142],{"id":142},[10,9861,2280],{},[147,9863,149],{},{"title":68,"searchDepth":151,"depth":151,"links":9865},[9866,9867,9868,9869,9870,9871,9872,9873],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":2121,"description":2126},[161,2300,2301],{"id":2304,"title":2305,"body":9878,"category":161,"cover":162,"description":2310,"extension":163,"meta":10011,"navigation":165,"path":2477,"pinned":167,"publishedAt":168,"seo":10012,"slug":2479,"stem":2480,"summary":2481,"tags":10013,"updatedAt":168,"visible":165,"__hash__":2485},{"type":7,"value":9879,"toc":10001},[9880,9882,9884,9886,9888,9892,9894,9896,9914,9916,9918,9954,9956,9961,9963,9965,9975,9977,9985,9987,9993,9995,9997,9999],[10,9881,2310],{},[14,9883,16],{"id":16},[10,9885,2315],{},[14,9887,22],{"id":22},[10,9889,9890],{},[26,9891],{"alt":2322,"src":2323},[10,9893,2326],{},[14,9895,39],{"id":39},[41,9897,9898,9904,9912],{},[44,9899,9900,2336,9902,2340],{},[33,9901,2335],{},[33,9903,2339],{},[44,9905,9906,2346,9908,2350,9910,2354],{},[33,9907,2345],{},[33,9909,2349],{},[33,9911,2353],{},[44,9913,2357],{},[14,9915,58],{"id":58},[10,9917,61],{},[63,9919,9920],{"className":65,"code":2364,"language":67,"meta":68,"style":68},[33,9921,9922,9926,9930,9934,9938,9942,9946,9950],{"__ignoreMap":68},[72,9923,9924],{"class":74,"line":75},[72,9925,2371],{},[72,9927,9928],{"class":74,"line":151},[72,9929,2376],{},[72,9931,9932],{"class":74,"line":361},[72,9933,2381],{},[72,9935,9936],{"class":74,"line":367},[72,9937,1037],{"emptyLinePlaceholder":165},[72,9939,9940],{"class":74,"line":1084},[72,9941,2390],{},[72,9943,9944],{"class":74,"line":1090},[72,9945,2395],{},[72,9947,9948],{"class":74,"line":2398},[72,9949,2401],{},[72,9951,9952],{"class":74,"line":2404},[72,9953,2407],{},[10,9955,80],{},[63,9957,9959],{"className":9958,"code":2413,"language":86,"meta":68},[84],[33,9960,2413],{"__ignoreMap":68},[10,9962,91],{},[14,9964,94],{"id":94},[96,9966,9967,9971],{},[44,9968,9969,2427],{},[33,9970,2426],{},[44,9972,9973,2433],{},[33,9974,2432],{},[14,9976,114],{"id":114},[41,9978,9979,9983],{},[44,9980,2440,9981,299],{},[33,9982,2443],{},[44,9984,2446],{},[14,9986,128],{"id":128},[96,9988,9989,9991],{},[44,9990,2453],{},[44,9992,2456],{},[10,9994,139],{},[14,9996,142],{"id":142},[10,9998,2463],{},[147,10000,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10002},[10003,10004,10005,10006,10007,10008,10009,10010],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":2305,"description":2310},[161,2483,2484],{"id":2487,"title":2488,"body":10015,"category":161,"cover":162,"description":2493,"extension":163,"meta":10152,"navigation":165,"path":2670,"pinned":167,"publishedAt":168,"seo":10153,"slug":2672,"stem":2673,"summary":2674,"tags":10154,"updatedAt":168,"visible":165,"__hash__":2678},{"type":7,"value":10016,"toc":10140},[10017,10019,10021,10023,10025,10029,10035,10037,10045,10047,10049,10073,10075,10080,10082,10084,10102,10104,10106,10110,10112,10114,10120,10122,10132,10134,10136,10138],[10,10018,2493],{},[14,10020,16],{"id":16},[10,10022,2498],{},[14,10024,22],{"id":22},[10,10026,10027],{},[26,10028],{"alt":2505,"src":2506},[10,10030,2509,10031,2513,10033,299],{},[33,10032,2512],{},[33,10034,2516],{},[14,10036,39],{"id":39},[41,10038,10039,10041,10043],{},[44,10040,2523],{},[44,10042,2526],{},[44,10044,2529],{},[14,10046,58],{"id":58},[10,10048,61],{},[63,10050,10051],{"className":65,"code":2536,"language":67,"meta":68,"style":68},[33,10052,10053,10057,10061,10065,10069],{"__ignoreMap":68},[72,10054,10055],{"class":74,"line":75},[72,10056,2543],{},[72,10058,10059],{"class":74,"line":151},[72,10060,2548],{},[72,10062,10063],{"class":74,"line":361},[72,10064,2553],{},[72,10066,10067],{"class":74,"line":367},[72,10068,2558],{},[72,10070,10071],{"class":74,"line":1084},[72,10072,2563],{},[10,10074,80],{},[63,10076,10078],{"className":10077,"code":2569,"language":86,"meta":68},[84],[33,10079,2569],{"__ignoreMap":68},[10,10081,91],{},[14,10083,94],{"id":94},[96,10085,10086,10094],{},[44,10087,2580,10088,2583,10090,2587,10092,2591],{},[33,10089,161],{},[33,10091,2586],{},[33,10093,2590],{},[44,10095,10096,2597,10098,2601,10100,2605],{},[33,10097,2596],{},[33,10099,2600],{},[33,10101,2604],{},[265,10103,2608],{"id":2608},[10,10105,2611],{},[10,10107,10108],{},[26,10109],{"alt":2616,"src":2617},[10,10111,2620],{},[14,10113,114],{"id":114},[41,10115,10116,10118],{},[44,10117,2627],{},[44,10119,2630],{},[14,10121,128],{"id":128},[96,10123,10124,10130],{},[44,10125,2637,10126,2641,10128,299],{},[33,10127,2640],{},[33,10129,2644],{},[44,10131,2647],{},[10,10133,139],{},[14,10135,142],{"id":142},[10,10137,2654],{},[147,10139,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10141},[10142,10143,10144,10145,10146,10149,10150,10151],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":10147},[10148],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":2488,"description":2493},[161,2676,2677],{"id":2680,"title":2681,"body":10156,"category":161,"cover":162,"description":2686,"extension":163,"meta":10321,"navigation":165,"path":2901,"pinned":167,"publishedAt":168,"seo":10322,"slug":2903,"stem":2904,"summary":2905,"tags":10323,"updatedAt":168,"visible":165,"__hash__":2909},{"type":7,"value":10157,"toc":10309},[10158,10160,10162,10164,10166,10170,10176,10178,10198,10200,10202,10238,10240,10245,10247,10249,10263,10265,10267,10271,10277,10279,10289,10291,10301,10303,10305,10307],[10,10159,2686],{},[14,10161,16],{"id":16},[10,10163,2691],{},[14,10165,22],{"id":22},[10,10167,10168],{},[26,10169],{"alt":2698,"src":2699},[10,10171,2702,10172,948,10174,2709],{},[33,10173,2705],{},[33,10175,2708],{},[14,10177,39],{"id":39},[41,10179,10180,10188,10196],{},[44,10181,10182,2719,10184,2723,10186,2727],{},[33,10183,2718],{},[33,10185,2722],{},[33,10187,2726],{},[44,10189,10190,2733,10192,2737,10194,2741],{},[33,10191,2732],{},[33,10193,2736],{},[33,10195,2740],{},[44,10197,2744],{},[14,10199,58],{"id":58},[10,10201,61],{},[63,10203,10204],{"className":65,"code":2751,"language":67,"meta":68,"style":68},[33,10205,10206,10210,10214,10218,10222,10226,10230,10234],{"__ignoreMap":68},[72,10207,10208],{"class":74,"line":75},[72,10209,2758],{},[72,10211,10212],{"class":74,"line":151},[72,10213,2763],{},[72,10215,10216],{"class":74,"line":361},[72,10217,1037],{"emptyLinePlaceholder":165},[72,10219,10220],{"class":74,"line":367},[72,10221,2772],{},[72,10223,10224],{"class":74,"line":1084},[72,10225,2777],{},[72,10227,10228],{"class":74,"line":1090},[72,10229,2782],{},[72,10231,10232],{"class":74,"line":2398},[72,10233,2787],{},[72,10235,10236],{"class":74,"line":2404},[72,10237,2792],{},[10,10239,80],{},[63,10241,10243],{"className":10242,"code":2798,"language":86,"meta":68},[84],[33,10244,2798],{"__ignoreMap":68},[10,10246,91],{},[14,10248,94],{"id":94},[96,10250,10251,10257],{},[44,10252,10253,2812,10255,2816],{},[33,10254,2811],{},[33,10256,2815],{},[44,10258,10259,2822,10261,2825],{},[33,10260,2821],{},[33,10262,2740],{},[265,10264,2608],{"id":2608},[10,10266,2830],{},[10,10268,10269],{},[26,10270],{"alt":2835,"src":2836},[10,10272,10273,2841,10275,2844],{},[33,10274,2732],{},[33,10276,2736],{},[14,10278,114],{"id":114},[41,10280,10281,10287],{},[44,10282,2851,10283,2854,10285,2857],{},[33,10284,2726],{},[33,10286,2718],{},[44,10288,2860],{},[14,10290,128],{"id":128},[96,10292,10293,10297],{},[44,10294,2867,10295,2871],{},[33,10296,2870],{},[44,10298,2874,10299,2878],{},[33,10300,2877],{},[10,10302,139],{},[14,10304,142],{"id":142},[10,10306,2885],{},[147,10308,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10310},[10311,10312,10313,10314,10315,10318,10319,10320],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":10316},[10317],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":2681,"description":2686},[161,2907,2908],{"id":2911,"title":2912,"body":10325,"category":161,"cover":162,"description":2917,"extension":163,"meta":10458,"navigation":165,"path":3086,"pinned":167,"publishedAt":168,"seo":10459,"slug":3088,"stem":3089,"summary":3090,"tags":10460,"updatedAt":168,"visible":165,"__hash__":3093},{"type":7,"value":10326,"toc":10448},[10327,10329,10331,10333,10335,10339,10349,10351,10361,10363,10365,10393,10395,10400,10402,10404,10418,10420,10428,10430,10440,10442,10444,10446],[10,10328,2917],{},[14,10330,16],{"id":16},[10,10332,2922],{},[14,10334,22],{"id":22},[10,10336,10337],{},[26,10338],{"alt":2929,"src":2930},[10,10340,10341,2936,10343,2940,10345,2944,10347,2948],{},[33,10342,2935],{},[33,10344,2939],{},[33,10346,2943],{},[33,10348,2947],{},[14,10350,39],{"id":39},[41,10352,10353,10355,10359],{},[44,10354,2955],{},[44,10356,10357,2960],{},[33,10358,2947],{},[44,10360,2963],{},[14,10362,58],{"id":58},[10,10364,61],{},[63,10366,10367],{"className":65,"code":2970,"language":67,"meta":68,"style":68},[33,10368,10369,10373,10377,10381,10385,10389],{"__ignoreMap":68},[72,10370,10371],{"class":74,"line":75},[72,10372,2977],{},[72,10374,10375],{"class":74,"line":151},[72,10376,2982],{},[72,10378,10379],{"class":74,"line":361},[72,10380,2987],{},[72,10382,10383],{"class":74,"line":367},[72,10384,1037],{"emptyLinePlaceholder":165},[72,10386,10387],{"class":74,"line":1084},[72,10388,2996],{},[72,10390,10391],{"class":74,"line":1090},[72,10392,3001],{},[10,10394,80],{},[63,10396,10398],{"className":10397,"code":3007,"language":86,"meta":68},[84],[33,10399,3007],{"__ignoreMap":68},[10,10401,91],{},[14,10403,94],{"id":94},[96,10405,10406,10412],{},[44,10407,3018,10408,3021,10410,3025],{},[33,10409,2935],{},[33,10411,3024],{},[44,10413,10414,3031,10416,3035],{},[33,10415,3030],{},[33,10417,3034],{},[14,10419,114],{"id":114},[41,10421,10422,10426],{},[44,10423,3042,10424,3046],{},[33,10425,3045],{},[44,10427,3049],{},[14,10429,128],{"id":128},[96,10431,10432,10434],{},[44,10433,3056],{},[44,10435,1629,10436,3062,10438,3065],{},[33,10437,3061],{},[33,10439,2947],{},[10,10441,139],{},[14,10443,142],{"id":142},[10,10445,3072],{},[147,10447,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10449},[10450,10451,10452,10453,10454,10455,10456,10457],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":2912,"description":2917},[161,2255,3092],{"id":3095,"title":3096,"body":10462,"category":161,"cover":162,"description":3101,"extension":163,"meta":10591,"navigation":165,"path":3262,"pinned":167,"publishedAt":168,"seo":10592,"slug":3264,"stem":3265,"summary":3266,"tags":10593,"updatedAt":168,"visible":165,"__hash__":3270},{"type":7,"value":10463,"toc":10581},[10464,10466,10468,10470,10472,10476,10480,10482,10492,10494,10496,10528,10530,10535,10537,10539,10551,10553,10563,10565,10573,10575,10577,10579],[10,10465,3101],{},[14,10467,16],{"id":16},[10,10469,3106],{},[14,10471,22],{"id":22},[10,10473,10474],{},[26,10475],{"alt":3113,"src":3114},[10,10477,3117,10478,3121],{},[33,10479,3120],{},[14,10481,39],{"id":39},[41,10483,10484,10486,10488],{},[44,10485,3128],{},[44,10487,3131],{},[44,10489,3134,10490,299],{},[33,10491,3137],{},[14,10493,58],{"id":58},[10,10495,61],{},[63,10497,10498],{"className":65,"code":3144,"language":67,"meta":68,"style":68},[33,10499,10500,10504,10508,10512,10516,10520,10524],{"__ignoreMap":68},[72,10501,10502],{"class":74,"line":75},[72,10503,3151],{},[72,10505,10506],{"class":74,"line":151},[72,10507,3156],{},[72,10509,10510],{"class":74,"line":361},[72,10511,1037],{"emptyLinePlaceholder":165},[72,10513,10514],{"class":74,"line":367},[72,10515,3165],{},[72,10517,10518],{"class":74,"line":1084},[72,10519,3170],{},[72,10521,10522],{"class":74,"line":1090},[72,10523,3175],{},[72,10525,10526],{"class":74,"line":2398},[72,10527,3180],{},[10,10529,80],{},[63,10531,10533],{"className":10532,"code":3186,"language":86,"meta":68},[84],[33,10534,3186],{"__ignoreMap":68},[10,10536,91],{},[14,10538,94],{"id":94},[96,10540,10541,10543],{},[44,10542,3197],{},[44,10544,10545,3203,10547,3207,10549,3211],{},[33,10546,3202],{},[33,10548,3206],{},[33,10550,3210],{},[14,10552,114],{"id":114},[41,10554,10555,10561],{},[44,10556,3218,10557,3222,10559,299],{},[33,10558,3221],{},[33,10560,3225],{},[44,10562,3228],{},[14,10564,128],{"id":128},[96,10566,10567,10569],{},[44,10568,3235],{},[44,10570,3238,10571,3241],{},[33,10572,3210],{},[10,10574,139],{},[14,10576,142],{"id":142},[10,10578,3248],{},[147,10580,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10582},[10583,10584,10585,10586,10587,10588,10589,10590],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3096,"description":3101},[161,3268,3269],{"id":3272,"title":3273,"body":10595,"category":161,"cover":162,"description":3278,"extension":163,"meta":10714,"navigation":165,"path":3420,"pinned":167,"publishedAt":168,"seo":10715,"slug":3422,"stem":3423,"summary":3424,"tags":10716,"updatedAt":168,"visible":165,"__hash__":3427},{"type":7,"value":10596,"toc":10704},[10597,10599,10601,10603,10605,10609,10611,10613,10621,10623,10625,10653,10655,10660,10662,10664,10674,10676,10684,10686,10696,10698,10700,10702],[10,10598,3278],{},[14,10600,16],{"id":16},[10,10602,3283],{},[14,10604,22],{"id":22},[10,10606,10607],{},[26,10608],{"alt":3290,"src":3291},[10,10610,3294],{},[14,10612,39],{"id":39},[41,10614,10615,10617,10619],{},[44,10616,3301],{},[44,10618,3304],{},[44,10620,3307],{},[14,10622,58],{"id":58},[10,10624,61],{},[63,10626,10627],{"className":65,"code":3314,"language":67,"meta":68,"style":68},[33,10628,10629,10633,10637,10641,10645,10649],{"__ignoreMap":68},[72,10630,10631],{"class":74,"line":75},[72,10632,3321],{},[72,10634,10635],{"class":74,"line":151},[72,10636,3326],{},[72,10638,10639],{"class":74,"line":361},[72,10640,3331],{},[72,10642,10643],{"class":74,"line":367},[72,10644,1037],{"emptyLinePlaceholder":165},[72,10646,10647],{"class":74,"line":1084},[72,10648,3340],{},[72,10650,10651],{"class":74,"line":1090},[72,10652,3345],{},[10,10654,80],{},[63,10656,10658],{"className":10657,"code":3351,"language":86,"meta":68},[84],[33,10659,3351],{"__ignoreMap":68},[10,10661,91],{},[14,10663,94],{"id":94},[96,10665,10666,10670],{},[44,10667,10668,3365],{},[33,10669,3364],{},[44,10671,10672,3371],{},[33,10673,3370],{},[14,10675,114],{"id":114},[41,10677,10678,10682],{},[44,10679,3378,10680,3382],{},[33,10681,3381],{},[44,10683,3385],{},[14,10685,128],{"id":128},[96,10687,10688,10690],{},[44,10689,3392],{},[44,10691,2082,10692,2085,10694,3399],{},[33,10693,3381],{},[33,10695,3370],{},[10,10697,139],{},[14,10699,142],{"id":142},[10,10701,3406],{},[147,10703,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10705},[10706,10707,10708,10709,10710,10711,10712,10713],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3273,"description":3278},[161,3426,3269],{"id":3429,"title":3430,"body":10718,"category":161,"cover":162,"description":3435,"extension":163,"meta":10843,"navigation":165,"path":3591,"pinned":167,"publishedAt":168,"seo":10844,"slug":3593,"stem":3594,"summary":3595,"tags":10845,"updatedAt":168,"visible":165,"__hash__":3598},{"type":7,"value":10719,"toc":10833},[10720,10722,10724,10726,10728,10732,10738,10740,10750,10752,10754,10782,10784,10789,10791,10793,10803,10805,10817,10819,10825,10827,10829,10831],[10,10721,3435],{},[14,10723,16],{"id":16},[10,10725,3440],{},[14,10727,22],{"id":22},[10,10729,10730],{},[26,10731],{"alt":3447,"src":3448},[10,10733,3451,10734,3455,10736,3458],{},[33,10735,3454],{},[33,10737,2155],{},[14,10739,39],{"id":39},[41,10741,10742,10744,10748],{},[44,10743,3465],{},[44,10745,2248,10746,3471],{},[33,10747,3470],{},[44,10749,3474],{},[14,10751,58],{"id":58},[10,10753,61],{},[63,10755,10756],{"className":65,"code":3481,"language":67,"meta":68,"style":68},[33,10757,10758,10762,10766,10770,10774,10778],{"__ignoreMap":68},[72,10759,10760],{"class":74,"line":75},[72,10761,3488],{},[72,10763,10764],{"class":74,"line":151},[72,10765,3493],{},[72,10767,10768],{"class":74,"line":361},[72,10769,1037],{"emptyLinePlaceholder":165},[72,10771,10772],{"class":74,"line":367},[72,10773,3502],{},[72,10775,10776],{"class":74,"line":1084},[72,10777,3507],{},[72,10779,10780],{"class":74,"line":1090},[72,10781,3512],{},[10,10783,80],{},[63,10785,10787],{"className":10786,"code":3518,"language":86,"meta":68},[84],[33,10788,3518],{"__ignoreMap":68},[10,10790,91],{},[14,10792,94],{"id":94},[96,10794,10795,10797],{},[44,10796,3529],{},[44,10798,3532,10799,3535,10801,3539],{},[33,10800,2155],{},[33,10802,3538],{},[14,10804,114],{"id":114},[41,10806,10807,10811],{},[44,10808,3546,10809,3550],{},[33,10810,3549],{},[44,10812,3553,10813,3557,10815,299],{},[33,10814,3556],{},[33,10816,3560],{},[14,10818,128],{"id":128},[96,10820,10821,10823],{},[44,10822,3567],{},[44,10824,3570],{},[10,10826,139],{},[14,10828,142],{"id":142},[10,10830,3577],{},[147,10832,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10834},[10835,10836,10837,10838,10839,10840,10841,10842],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3430,"description":3435},[161,3597,3269],{"id":3600,"title":3601,"body":10847,"category":161,"cover":162,"description":3606,"extension":163,"meta":10970,"navigation":165,"path":3756,"pinned":167,"publishedAt":168,"seo":10971,"slug":3758,"stem":3759,"summary":3760,"tags":10972,"updatedAt":168,"visible":165,"__hash__":3763},{"type":7,"value":10848,"toc":10960},[10849,10851,10853,10855,10857,10861,10863,10865,10877,10879,10881,10909,10911,10916,10918,10920,10930,10932,10942,10944,10952,10954,10956,10958],[10,10850,3606],{},[14,10852,16],{"id":16},[10,10854,3611],{},[14,10856,22],{"id":22},[10,10858,10859],{},[26,10860],{"alt":3618,"src":3619},[10,10862,3622],{},[14,10864,39],{"id":39},[41,10866,10867,10869,10871],{},[44,10868,3629],{},[44,10870,3632],{},[44,10872,3635,10873,3639,10875,3643],{},[33,10874,3638],{},[33,10876,3642],{},[14,10878,58],{"id":58},[10,10880,61],{},[63,10882,10883],{"className":65,"code":3650,"language":67,"meta":68,"style":68},[33,10884,10885,10889,10893,10897,10901,10905],{"__ignoreMap":68},[72,10886,10887],{"class":74,"line":75},[72,10888,3657],{},[72,10890,10891],{"class":74,"line":151},[72,10892,3662],{},[72,10894,10895],{"class":74,"line":361},[72,10896,1037],{"emptyLinePlaceholder":165},[72,10898,10899],{"class":74,"line":367},[72,10900,3671],{},[72,10902,10903],{"class":74,"line":1084},[72,10904,3676],{},[72,10906,10907],{"class":74,"line":1090},[72,10908,3681],{},[10,10910,80],{},[63,10912,10914],{"className":10913,"code":3687,"language":86,"meta":68},[84],[33,10915,3687],{"__ignoreMap":68},[10,10917,91],{},[14,10919,94],{"id":94},[96,10921,10922,10924],{},[44,10923,3698],{},[44,10925,10926,3704,10928,3708],{},[33,10927,3703],{},[33,10929,3707],{},[14,10931,114],{"id":114},[41,10933,10934,10940],{},[44,10935,2248,10936,3717,10938,299],{},[33,10937,3642],{},[33,10939,3638],{},[44,10941,3722],{},[14,10943,128],{"id":128},[96,10945,10946,10950],{},[44,10947,3729,10948,3732],{},[33,10949,3638],{},[44,10951,3735],{},[10,10953,139],{},[14,10955,142],{"id":142},[10,10957,3742],{},[147,10959,149],{},{"title":68,"searchDepth":151,"depth":151,"links":10961},[10962,10963,10964,10965,10966,10967,10968,10969],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3601,"description":3606},[161,3762,3269],{"id":3765,"title":3766,"body":10974,"category":161,"cover":162,"description":3771,"extension":163,"meta":11133,"navigation":165,"path":3970,"pinned":167,"publishedAt":168,"seo":11134,"slug":3972,"stem":3973,"summary":3974,"tags":11135,"updatedAt":168,"visible":165,"__hash__":3978},{"type":7,"value":10975,"toc":11121},[10976,10978,10980,10982,10984,10988,10994,10996,11008,11010,11012,11052,11054,11059,11061,11063,11077,11079,11081,11085,11087,11089,11099,11101,11113,11115,11117,11119],[10,10977,3771],{},[14,10979,16],{"id":16},[10,10981,3776],{},[14,10983,22],{"id":22},[10,10985,10986],{},[26,10987],{"alt":3783,"src":3784},[10,10989,10990,3790,10992,3794],{},[33,10991,3789],{},[33,10993,3793],{},[14,10995,39],{"id":39},[41,10997,10998,11004,11006],{},[44,10999,11000,3803,11002,3807],{},[33,11001,2718],{},[33,11003,3806],{},[44,11005,3810],{},[44,11007,3813],{},[14,11009,58],{"id":58},[10,11011,61],{},[63,11013,11014],{"className":65,"code":3820,"language":67,"meta":68,"style":68},[33,11015,11016,11020,11024,11028,11032,11036,11040,11044,11048],{"__ignoreMap":68},[72,11017,11018],{"class":74,"line":75},[72,11019,3827],{},[72,11021,11022],{"class":74,"line":151},[72,11023,3832],{},[72,11025,11026],{"class":74,"line":361},[72,11027,3837],{},[72,11029,11030],{"class":74,"line":367},[72,11031,1037],{"emptyLinePlaceholder":165},[72,11033,11034],{"class":74,"line":1084},[72,11035,3846],{},[72,11037,11038],{"class":74,"line":1090},[72,11039,3851],{},[72,11041,11042],{"class":74,"line":2398},[72,11043,3856],{},[72,11045,11046],{"class":74,"line":2404},[72,11047,3861],{},[72,11049,11050],{"class":74,"line":3864},[72,11051,3867],{},[10,11053,80],{},[63,11055,11057],{"className":11056,"code":3873,"language":86,"meta":68},[84],[33,11058,3873],{"__ignoreMap":68},[10,11060,91],{},[14,11062,94],{"id":94},[96,11064,11065,11069],{},[44,11066,11067,3887],{},[33,11068,3886],{},[44,11070,11071,3893,11073,3897,11075,3901],{},[33,11072,3892],{},[33,11074,3896],{},[33,11076,3900],{},[265,11078,2608],{"id":2608},[10,11080,3906],{},[10,11082,11083],{},[26,11084],{"alt":3911,"src":3912},[10,11086,3915],{},[14,11088,114],{"id":114},[41,11090,11091,11097],{},[44,11092,3922,11093,3925,11095,299],{},[33,11094,2718],{},[33,11096,3806],{},[44,11098,3930],{},[14,11100,128],{"id":128},[96,11102,11103,11105],{},[44,11104,3937],{},[44,11106,2248,11107,3943,11109,1099,11111,299],{},[33,11108,3942],{},[33,11110,3806],{},[33,11112,2718],{},[10,11114,139],{},[14,11116,142],{"id":142},[10,11118,3954],{},[147,11120,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11122},[11123,11124,11125,11126,11127,11130,11131,11132],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":11128},[11129],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3766,"description":3771},[161,3976,3977],{"id":3980,"title":3981,"body":11137,"category":161,"cover":162,"description":3986,"extension":163,"meta":11309,"navigation":165,"path":4200,"pinned":167,"publishedAt":168,"seo":11310,"slug":4202,"stem":4203,"summary":4204,"tags":11311,"updatedAt":168,"visible":165,"__hash__":4207},{"type":7,"value":11138,"toc":11296},[11139,11141,11143,11145,11147,11151,11159,11161,11169,11171,11173,11217,11219,11224,11226,11228,11240,11242,11244,11248,11254,11256,11258,11262,11266,11268,11280,11282,11288,11290,11292,11294],[10,11140,3986],{},[14,11142,16],{"id":16},[10,11144,3991],{},[14,11146,22],{"id":22},[10,11148,11149],{},[26,11150],{"alt":3998,"src":3999},[10,11152,11153,2166,11155,2166,11157,4009],{},[33,11154,1098],{},[33,11156,4006],{},[33,11158,1102],{},[14,11160,39],{"id":39},[41,11162,11163,11165,11167],{},[44,11164,4016],{},[44,11166,4019],{},[44,11168,4022],{},[14,11170,58],{"id":58},[10,11172,61],{},[63,11174,11175],{"className":65,"code":4029,"language":67,"meta":68,"style":68},[33,11176,11177,11181,11185,11189,11193,11197,11201,11205,11209,11213],{"__ignoreMap":68},[72,11178,11179],{"class":74,"line":75},[72,11180,4036],{},[72,11182,11183],{"class":74,"line":151},[72,11184,1037],{"emptyLinePlaceholder":165},[72,11186,11187],{"class":74,"line":361},[72,11188,4045],{},[72,11190,11191],{"class":74,"line":367},[72,11192,4050],{},[72,11194,11195],{"class":74,"line":1084},[72,11196,4055],{},[72,11198,11199],{"class":74,"line":1090},[72,11200,4060],{},[72,11202,11203],{"class":74,"line":2398},[72,11204,1087],{},[72,11206,11207],{"class":74,"line":2404},[72,11208,4069],{},[72,11210,11211],{"class":74,"line":3864},[72,11212,1037],{"emptyLinePlaceholder":165},[72,11214,11215],{"class":74,"line":4076},[72,11216,4079],{},[10,11218,80],{},[63,11220,11222],{"className":11221,"code":4085,"language":86,"meta":68},[84],[33,11223,4085],{"__ignoreMap":68},[10,11225,91],{},[14,11227,94],{"id":94},[96,11229,11230,11234],{},[44,11231,4096,11232,4100],{},[33,11233,4099],{},[44,11235,11236,4106,11238,4109],{},[33,11237,4105],{},[33,11239,1102],{},[265,11241,2608],{"id":2608},[10,11243,4114],{},[10,11245,11246],{},[26,11247],{"alt":4119,"src":4120},[10,11249,11250,4125,11252,4128],{},[33,11251,4099],{},[33,11253,4105],{},[265,11255,2608],{"id":4131},[10,11257,4134],{},[10,11259,11260],{},[26,11261],{"alt":4139,"src":4140},[10,11263,4143,11264,4146],{},[33,11265,1098],{},[14,11267,114],{"id":114},[41,11269,11270,11274],{},[44,11271,4153,11272,4156],{},[33,11273,4105],{},[44,11275,4159,11276,4162,11278,4166],{},[33,11277,1098],{},[33,11279,4165],{},[14,11281,128],{"id":128},[96,11283,11284,11286],{},[44,11285,4173],{},[44,11287,4176],{},[10,11289,139],{},[14,11291,142],{"id":142},[10,11293,4183],{},[147,11295,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11297},[11298,11299,11300,11301,11302,11306,11307,11308],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":11303},[11304,11305],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":3981,"description":3986},[161,1098,4206],{"id":4209,"title":4210,"body":11313,"category":161,"cover":162,"description":4215,"extension":163,"meta":11450,"navigation":165,"path":4382,"pinned":167,"publishedAt":168,"seo":11451,"slug":4384,"stem":4385,"summary":4386,"tags":11452,"updatedAt":168,"visible":165,"__hash__":4389},{"type":7,"value":11314,"toc":11438},[11315,11317,11319,11321,11323,11327,11331,11333,11343,11345,11347,11379,11381,11386,11388,11390,11400,11402,11404,11408,11412,11414,11420,11422,11430,11432,11434,11436],[10,11316,4215],{},[14,11318,16],{"id":16},[10,11320,4220],{},[14,11322,22],{"id":22},[10,11324,11325],{},[26,11326],{"alt":4227,"src":4228},[10,11328,11329,4234],{},[33,11330,4233],{},[14,11332,39],{"id":39},[41,11334,11335,11337,11339],{},[44,11336,4241],{},[44,11338,4244],{},[44,11340,4247,11341,4251],{},[33,11342,4250],{},[14,11344,58],{"id":58},[10,11346,61],{},[63,11348,11349],{"className":65,"code":4258,"language":67,"meta":68,"style":68},[33,11350,11351,11355,11359,11363,11367,11371,11375],{"__ignoreMap":68},[72,11352,11353],{"class":74,"line":75},[72,11354,4265],{},[72,11356,11357],{"class":74,"line":151},[72,11358,1037],{"emptyLinePlaceholder":165},[72,11360,11361],{"class":74,"line":361},[72,11362,4274],{},[72,11364,11365],{"class":74,"line":367},[72,11366,4279],{},[72,11368,11369],{"class":74,"line":1084},[72,11370,4284],{},[72,11372,11373],{"class":74,"line":1090},[72,11374,1037],{"emptyLinePlaceholder":165},[72,11376,11377],{"class":74,"line":2398},[72,11378,4293],{},[10,11380,80],{},[63,11382,11384],{"className":11383,"code":4299,"language":86,"meta":68},[84],[33,11385,4299],{"__ignoreMap":68},[10,11387,91],{},[14,11389,94],{"id":94},[96,11391,11392,11396],{},[44,11393,4310,11394,4314],{},[33,11395,4313],{},[44,11397,4317,11398,4320],{},[33,11399,4313],{},[265,11401,2608],{"id":2608},[10,11403,4325],{},[10,11405,11406],{},[26,11407],{"alt":4330,"src":4331},[10,11409,4334,11410,4337],{},[33,11411,4313],{},[14,11413,114],{"id":114},[41,11415,11416,11418],{},[44,11417,4344],{},[44,11419,4347],{},[14,11421,128],{"id":128},[96,11423,11424,11428],{},[44,11425,2248,11426,4356],{},[33,11427,4233],{},[44,11429,4359],{},[10,11431,139],{},[14,11433,142],{"id":142},[10,11435,4366],{},[147,11437,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11439},[11440,11441,11442,11443,11444,11447,11448,11449],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":11445},[11446],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":4210,"description":4215},[161,4233,4388],{"id":4391,"title":4392,"body":11454,"category":161,"cover":162,"description":4397,"extension":163,"meta":11579,"navigation":165,"path":4546,"pinned":167,"publishedAt":168,"seo":11580,"slug":4548,"stem":4549,"summary":4550,"tags":11581,"updatedAt":168,"visible":165,"__hash__":4553},{"type":7,"value":11455,"toc":11569},[11456,11458,11460,11462,11464,11468,11472,11474,11484,11486,11488,11520,11522,11527,11529,11531,11543,11545,11551,11553,11561,11563,11565,11567],[10,11457,4397],{},[14,11459,16],{"id":16},[10,11461,4402],{},[14,11463,22],{"id":22},[10,11465,11466],{},[26,11467],{"alt":4409,"src":4410},[10,11469,11470,4415],{},[33,11471,4250],{},[14,11473,39],{"id":39},[41,11475,11476,11480,11482],{},[44,11477,11478,4425],{},[33,11479,4424],{},[44,11481,4428],{},[44,11483,4431],{},[14,11485,58],{"id":58},[10,11487,61],{},[63,11489,11490],{"className":65,"code":4438,"language":67,"meta":68,"style":68},[33,11491,11492,11496,11500,11504,11508,11512,11516],{"__ignoreMap":68},[72,11493,11494],{"class":74,"line":75},[72,11495,4445],{},[72,11497,11498],{"class":74,"line":151},[72,11499,1037],{"emptyLinePlaceholder":165},[72,11501,11502],{"class":74,"line":361},[72,11503,4454],{},[72,11505,11506],{"class":74,"line":367},[72,11507,4459],{},[72,11509,11510],{"class":74,"line":1084},[72,11511,1037],{"emptyLinePlaceholder":165},[72,11513,11514],{"class":74,"line":1090},[72,11515,4468],{},[72,11517,11518],{"class":74,"line":2398},[72,11519,4473],{},[10,11521,80],{},[63,11523,11525],{"className":11524,"code":4479,"language":86,"meta":68},[84],[33,11526,4479],{"__ignoreMap":68},[10,11528,91],{},[14,11530,94],{"id":94},[96,11532,11533,11539],{},[44,11534,4490,11535,4493,11537,4497],{},[33,11536,4250],{},[33,11538,4496],{},[44,11540,11541,4502],{},[33,11542,4424],{},[14,11544,114],{"id":114},[41,11546,11547,11549],{},[44,11548,4509],{},[44,11550,4512],{},[14,11552,128],{"id":128},[96,11554,11555,11557],{},[44,11556,4519],{},[44,11558,2248,11559,4525],{},[33,11560,4524],{},[10,11562,139],{},[14,11564,142],{"id":142},[10,11566,4532],{},[147,11568,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11570},[11571,11572,11573,11574,11575,11576,11577,11578],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":4392,"description":4397},[161,4250,4552],{"id":4555,"title":4556,"body":11583,"category":161,"cover":162,"description":4561,"extension":163,"meta":11728,"navigation":165,"path":4736,"pinned":167,"publishedAt":168,"seo":11729,"slug":4738,"stem":4739,"summary":4740,"tags":11730,"updatedAt":168,"visible":165,"__hash__":4742},{"type":7,"value":11584,"toc":11718},[11585,11587,11589,11591,11593,11597,11603,11605,11619,11621,11623,11667,11669,11674,11676,11678,11688,11690,11702,11704,11710,11712,11714,11716],[10,11586,4561],{},[14,11588,16],{"id":16},[10,11590,4566],{},[14,11592,22],{"id":22},[10,11594,11595],{},[26,11596],{"alt":4573,"src":4574},[10,11598,11599,4580,11601,4584],{},[33,11600,4579],{},[33,11602,4583],{},[14,11604,39],{"id":39},[41,11606,11607,11609,11615],{},[44,11608,4591],{},[44,11610,11611,4596,11613,4599],{},[33,11612,4579],{},[33,11614,4233],{},[44,11616,4602,11617,4605],{},[33,11618,4583],{},[14,11620,58],{"id":58},[10,11622,61],{},[63,11624,11625],{"className":65,"code":4612,"language":67,"meta":68,"style":68},[33,11626,11627,11631,11635,11639,11643,11647,11651,11655,11659,11663],{"__ignoreMap":68},[72,11628,11629],{"class":74,"line":75},[72,11630,4619],{},[72,11632,11633],{"class":74,"line":151},[72,11634,1037],{"emptyLinePlaceholder":165},[72,11636,11637],{"class":74,"line":361},[72,11638,4628],{},[72,11640,11641],{"class":74,"line":367},[72,11642,4633],{},[72,11644,11645],{"class":74,"line":1084},[72,11646,4638],{},[72,11648,11649],{"class":74,"line":1090},[72,11650,4643],{},[72,11652,11653],{"class":74,"line":2398},[72,11654,4648],{},[72,11656,11657],{"class":74,"line":2404},[72,11658,4473],{},[72,11660,11661],{"class":74,"line":3864},[72,11662,1037],{"emptyLinePlaceholder":165},[72,11664,11665],{"class":74,"line":4076},[72,11666,4661],{},[10,11668,80],{},[63,11670,11672],{"className":11671,"code":4667,"language":86,"meta":68},[84],[33,11673,4667],{"__ignoreMap":68},[10,11675,91],{},[14,11677,94],{"id":94},[96,11679,11680,11684],{},[44,11681,4678,11682,4681],{},[33,11683,4579],{},[44,11685,4684,11686,4687],{},[33,11687,4583],{},[14,11689,114],{"id":114},[41,11691,11692,11696],{},[44,11693,3378,11694,4696],{},[33,11695,4579],{},[44,11697,4699,11698,4702,11700,4705],{},[33,11699,4233],{},[33,11701,4579],{},[14,11703,128],{"id":128},[96,11705,11706,11708],{},[44,11707,4712],{},[44,11709,4715],{},[10,11711,139],{},[14,11713,142],{"id":142},[10,11715,4722],{},[147,11717,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11719},[11720,11721,11722,11723,11724,11725,11726,11727],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":4556,"description":4561},[161,4583,4579],{"id":4744,"title":4745,"body":11732,"category":161,"cover":162,"description":4750,"extension":163,"meta":11871,"navigation":165,"path":4922,"pinned":167,"publishedAt":168,"seo":11872,"slug":4924,"stem":4925,"summary":4926,"tags":11873,"updatedAt":168,"visible":165,"__hash__":4930},{"type":7,"value":11733,"toc":11859},[11734,11736,11738,11740,11742,11746,11748,11750,11766,11768,11770,11798,11800,11805,11807,11809,11821,11823,11825,11829,11831,11833,11843,11845,11851,11853,11855,11857],[10,11735,4750],{},[14,11737,16],{"id":16},[10,11739,4755],{},[14,11741,22],{"id":22},[10,11743,11744],{},[26,11745],{"alt":4762,"src":4763},[10,11747,4766],{},[14,11749,39],{"id":39},[41,11751,11752,11754,11756],{},[44,11753,4773],{},[44,11755,4776],{},[44,11757,4779,11758,2166,11760,4786,11762,2166,11764,299],{},[33,11759,4782],{},[33,11761,4785],{},[33,11763,4789],{},[33,11765,4792],{},[14,11767,58],{"id":58},[10,11769,61],{},[63,11771,11772],{"className":65,"code":4799,"language":67,"meta":68,"style":68},[33,11773,11774,11778,11782,11786,11790,11794],{"__ignoreMap":68},[72,11775,11776],{"class":74,"line":75},[72,11777,4806],{},[72,11779,11780],{"class":74,"line":151},[72,11781,1037],{"emptyLinePlaceholder":165},[72,11783,11784],{"class":74,"line":361},[72,11785,4815],{},[72,11787,11788],{"class":74,"line":367},[72,11789,4820],{},[72,11791,11792],{"class":74,"line":1084},[72,11793,4825],{},[72,11795,11796],{"class":74,"line":1090},[72,11797,4830],{},[10,11799,80],{},[63,11801,11803],{"className":11802,"code":4836,"language":86,"meta":68},[84],[33,11804,4836],{"__ignoreMap":68},[10,11806,91],{},[14,11808,94],{"id":94},[96,11810,11811,11819],{},[44,11812,4847,11813,4850,11815,1099,11817,299],{},[33,11814,4782],{},[33,11816,4853],{},[33,11818,4856],{},[44,11820,4859],{},[265,11822,2608],{"id":2608},[10,11824,4864],{},[10,11826,11827],{},[26,11828],{"alt":4869,"src":4870},[10,11830,4873],{},[14,11832,114],{"id":114},[41,11834,11835,11841],{},[44,11836,4880,11837,948,11839,4886],{},[33,11838,4883],{},[33,11840,4789],{},[44,11842,4889],{},[14,11844,128],{"id":128},[96,11846,11847,11849],{},[44,11848,4896],{},[44,11850,4899],{},[10,11852,139],{},[14,11854,142],{"id":142},[10,11856,4906],{},[147,11858,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11860},[11861,11862,11863,11864,11865,11868,11869,11870],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":11866},[11867],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":4745,"description":4750},[161,4928,4929],{"id":4932,"title":4933,"body":11875,"category":161,"cover":162,"description":4938,"extension":163,"meta":11992,"navigation":165,"path":5077,"pinned":167,"publishedAt":168,"seo":11993,"slug":5079,"stem":5080,"summary":5081,"tags":11994,"updatedAt":168,"visible":165,"__hash__":5085},{"type":7,"value":11876,"toc":11982},[11877,11879,11881,11883,11885,11889,11891,11893,11901,11903,11905,11937,11939,11944,11946,11948,11956,11958,11966,11968,11974,11976,11978,11980],[10,11878,4938],{},[14,11880,16],{"id":16},[10,11882,4943],{},[14,11884,22],{"id":22},[10,11886,11887],{},[26,11888],{"alt":4950,"src":4951},[10,11890,4954],{},[14,11892,39],{"id":39},[41,11894,11895,11897,11899],{},[44,11896,4961],{},[44,11898,4964],{},[44,11900,4967],{},[14,11902,58],{"id":58},[10,11904,61],{},[63,11906,11907],{"className":65,"code":4974,"language":67,"meta":68,"style":68},[33,11908,11909,11913,11917,11921,11925,11929,11933],{"__ignoreMap":68},[72,11910,11911],{"class":74,"line":75},[72,11912,4981],{},[72,11914,11915],{"class":74,"line":151},[72,11916,1037],{"emptyLinePlaceholder":165},[72,11918,11919],{"class":74,"line":361},[72,11920,4990],{},[72,11922,11923],{"class":74,"line":367},[72,11924,4995],{},[72,11926,11927],{"class":74,"line":1084},[72,11928,1037],{"emptyLinePlaceholder":165},[72,11930,11931],{"class":74,"line":1090},[72,11932,5004],{},[72,11934,11935],{"class":74,"line":2398},[72,11936,5009],{},[10,11938,80],{},[63,11940,11942],{"className":11941,"code":5015,"language":86,"meta":68},[84],[33,11943,5015],{"__ignoreMap":68},[10,11945,91],{},[14,11947,94],{"id":94},[96,11949,11950,11952],{},[44,11951,5026],{},[44,11953,5029,11954,5033],{},[33,11955,5032],{},[14,11957,114],{"id":114},[41,11959,11960,11964],{},[44,11961,5040,11962,5043],{},[33,11963,4250],{},[44,11965,5046],{},[14,11967,128],{"id":128},[96,11969,11970,11972],{},[44,11971,5053],{},[44,11973,5056],{},[10,11975,139],{},[14,11977,142],{"id":142},[10,11979,5063],{},[147,11981,149],{},{"title":68,"searchDepth":151,"depth":151,"links":11983},[11984,11985,11986,11987,11988,11989,11990,11991],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":4933,"description":4938},[161,5083,5084],{"id":5087,"title":5088,"body":11996,"category":161,"cover":162,"description":5093,"extension":163,"meta":12115,"navigation":165,"path":5237,"pinned":167,"publishedAt":168,"seo":12116,"slug":5239,"stem":5240,"summary":5241,"tags":12117,"updatedAt":168,"visible":165,"__hash__":5245},{"type":7,"value":11997,"toc":12105},[11998,12000,12002,12004,12006,12010,12012,12014,12022,12024,12026,12058,12060,12065,12067,12069,12079,12081,12087,12089,12097,12099,12101,12103],[10,11999,5093],{},[14,12001,16],{"id":16},[10,12003,5098],{},[14,12005,22],{"id":22},[10,12007,12008],{},[26,12009],{"alt":5105,"src":5106},[10,12011,5109],{},[14,12013,39],{"id":39},[41,12015,12016,12018,12020],{},[44,12017,5116],{},[44,12019,5119],{},[44,12021,5122],{},[14,12023,58],{"id":58},[10,12025,61],{},[63,12027,12028],{"className":65,"code":5129,"language":67,"meta":68,"style":68},[33,12029,12030,12034,12038,12042,12046,12050,12054],{"__ignoreMap":68},[72,12031,12032],{"class":74,"line":75},[72,12033,5136],{},[72,12035,12036],{"class":74,"line":151},[72,12037,5141],{},[72,12039,12040],{"class":74,"line":361},[72,12041,5146],{},[72,12043,12044],{"class":74,"line":367},[72,12045,1037],{"emptyLinePlaceholder":165},[72,12047,12048],{"class":74,"line":1084},[72,12049,5155],{},[72,12051,12052],{"class":74,"line":1090},[72,12053,5160],{},[72,12055,12056],{"class":74,"line":2398},[72,12057,5165],{},[10,12059,80],{},[63,12061,12063],{"className":12062,"code":5171,"language":86,"meta":68},[84],[33,12064,5171],{"__ignoreMap":68},[10,12066,91],{},[14,12068,94],{"id":94},[96,12070,12071,12075],{},[44,12072,877,12073,5185],{},[33,12074,5184],{},[44,12076,5188,12077,5192],{},[33,12078,5191],{},[14,12080,114],{"id":114},[41,12082,12083,12085],{},[44,12084,5199],{},[44,12086,5202],{},[14,12088,128],{"id":128},[96,12090,12091,12095],{},[44,12092,5209,12093,5213],{},[33,12094,5212],{},[44,12096,5216],{},[10,12098,139],{},[14,12100,142],{"id":142},[10,12102,5223],{},[147,12104,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12106},[12107,12108,12109,12110,12111,12112,12113,12114],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5088,"description":5093},[161,5243,5244],{"id":5247,"title":5248,"body":12119,"category":161,"cover":162,"description":5253,"extension":163,"meta":12264,"navigation":165,"path":5434,"pinned":167,"publishedAt":168,"seo":12265,"slug":5436,"stem":5437,"summary":5438,"tags":12266,"updatedAt":168,"visible":165,"__hash__":5442},{"type":7,"value":12120,"toc":12252},[12121,12123,12125,12127,12129,12133,12137,12139,12151,12153,12155,12183,12185,12190,12192,12194,12208,12210,12212,12216,12224,12226,12236,12238,12244,12246,12248,12250],[10,12122,5253],{},[14,12124,16],{"id":16},[10,12126,5258],{},[14,12128,22],{"id":22},[10,12130,12131],{},[26,12132],{"alt":5265,"src":5266},[10,12134,5269,12135,5273],{},[33,12136,5272],{},[14,12138,39],{"id":39},[41,12140,12141,12143,12145],{},[44,12142,5280],{},[44,12144,5283],{},[44,12146,5286,12147,5289,12149,299],{},[33,12148,5272],{},[33,12150,5292],{},[14,12152,58],{"id":58},[10,12154,61],{},[63,12156,12157],{"className":65,"code":5299,"language":67,"meta":68,"style":68},[33,12158,12159,12163,12167,12171,12175,12179],{"__ignoreMap":68},[72,12160,12161],{"class":74,"line":75},[72,12162,5306],{},[72,12164,12165],{"class":74,"line":151},[72,12166,5311],{},[72,12168,12169],{"class":74,"line":361},[72,12170,5316],{},[72,12172,12173],{"class":74,"line":367},[72,12174,1037],{"emptyLinePlaceholder":165},[72,12176,12177],{"class":74,"line":1084},[72,12178,5325],{},[72,12180,12181],{"class":74,"line":1090},[72,12182,5330],{},[10,12184,80],{},[63,12186,12188],{"className":12187,"code":5336,"language":86,"meta":68},[84],[33,12189,5336],{"__ignoreMap":68},[10,12191,91],{},[14,12193,94],{"id":94},[96,12195,12196,12202],{},[44,12197,5347,12198,2166,12200,5353],{},[33,12199,5350],{},[33,12201,4313],{},[44,12203,12204,5359,12206,5363],{},[33,12205,5358],{},[33,12207,5362],{},[265,12209,2608],{"id":2608},[10,12211,5368],{},[10,12213,12214],{},[26,12215],{"alt":5373,"src":5374},[10,12217,12218,2166,12220,1099,12222,5384],{},[33,12219,5350],{},[33,12221,4313],{},[33,12223,5383],{},[14,12225,114],{"id":114},[41,12227,12228,12232],{},[44,12229,5391,12230,5395],{},[33,12231,5394],{},[44,12233,5398,12234,5401],{},[33,12235,5383],{},[14,12237,128],{"id":128},[96,12239,12240,12242],{},[44,12241,5408],{},[44,12243,5411],{},[10,12245,139],{},[14,12247,142],{"id":142},[10,12249,5418],{},[147,12251,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12253},[12254,12255,12256,12257,12258,12261,12262,12263],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":12259},[12260],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5248,"description":5253},[161,5440,5441],{"id":5444,"title":5445,"body":12268,"category":161,"cover":162,"description":5450,"extension":163,"meta":12417,"navigation":165,"path":5631,"pinned":167,"publishedAt":168,"seo":12418,"slug":5633,"stem":5634,"summary":5635,"tags":12419,"updatedAt":168,"visible":165,"__hash__":5639},{"type":7,"value":12269,"toc":12405},[12270,12272,12274,12276,12278,12282,12284,12286,12298,12300,12302,12346,12348,12353,12355,12357,12369,12371,12373,12377,12379,12381,12389,12391,12397,12399,12401,12403],[10,12271,5450],{},[14,12273,16],{"id":16},[10,12275,5455],{},[14,12277,22],{"id":22},[10,12279,12280],{},[26,12281],{"alt":5462,"src":5463},[10,12283,5466],{},[14,12285,39],{"id":39},[41,12287,12288,12290,12294],{},[44,12289,5473],{},[44,12291,12292,5479],{},[33,12293,5478],{},[44,12295,12296,5485],{},[33,12297,5484],{},[14,12299,58],{"id":58},[10,12301,61],{},[63,12303,12304],{"className":65,"code":5492,"language":67,"meta":68,"style":68},[33,12305,12306,12310,12314,12318,12322,12326,12330,12334,12338,12342],{"__ignoreMap":68},[72,12307,12308],{"class":74,"line":75},[72,12309,5499],{},[72,12311,12312],{"class":74,"line":151},[72,12313,5504],{},[72,12315,12316],{"class":74,"line":361},[72,12317,1037],{"emptyLinePlaceholder":165},[72,12319,12320],{"class":74,"line":367},[72,12321,5513],{},[72,12323,12324],{"class":74,"line":1084},[72,12325,5518],{},[72,12327,12328],{"class":74,"line":1090},[72,12329,1037],{"emptyLinePlaceholder":165},[72,12331,12332],{"class":74,"line":2398},[72,12333,5527],{},[72,12335,12336],{"class":74,"line":2404},[72,12337,5532],{},[72,12339,12340],{"class":74,"line":3864},[72,12341,1037],{"emptyLinePlaceholder":165},[72,12343,12344],{"class":74,"line":4076},[72,12345,5541],{},[10,12347,80],{},[63,12349,12351],{"className":12350,"code":5547,"language":86,"meta":68},[84],[33,12352,5547],{"__ignoreMap":68},[10,12354,91],{},[14,12356,94],{"id":94},[96,12358,12359,12363],{},[44,12360,5558,12361,5562],{},[33,12362,5561],{},[44,12364,12365,5568,12367,299],{},[33,12366,5567],{},[33,12368,5571],{},[265,12370,2608],{"id":2608},[10,12372,5576],{},[10,12374,12375],{},[26,12376],{"alt":5581,"src":5582},[10,12378,5585],{},[14,12380,114],{"id":114},[41,12382,12383,12387],{},[44,12384,5592,12385,5595],{},[33,12386,5292],{},[44,12388,5598],{},[14,12390,128],{"id":128},[96,12392,12393,12395],{},[44,12394,5605],{},[44,12396,5608],{},[10,12398,139],{},[14,12400,142],{"id":142},[10,12402,5615],{},[147,12404,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12406},[12407,12408,12409,12410,12411,12414,12415,12416],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":12412},[12413],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5445,"description":5450},[161,5637,5638],{"id":5641,"title":5642,"body":12421,"category":161,"cover":162,"description":5647,"extension":163,"meta":12582,"navigation":165,"path":5845,"pinned":167,"publishedAt":168,"seo":12583,"slug":5847,"stem":5848,"summary":5849,"tags":12584,"updatedAt":168,"visible":165,"__hash__":5853},{"type":7,"value":12422,"toc":12570},[12423,12425,12427,12429,12431,12435,12437,12439,12451,12453,12455,12507,12509,12514,12516,12518,12536,12538,12540,12544,12546,12548,12554,12556,12562,12564,12566,12568],[10,12424,5647],{},[14,12426,16],{"id":16},[10,12428,5652],{},[14,12430,22],{"id":22},[10,12432,12433],{},[26,12434],{"alt":5659,"src":5660},[10,12436,5663],{},[14,12438,39],{"id":39},[41,12440,12441,12443,12445],{},[44,12442,5670],{},[44,12444,5673],{},[44,12446,12447,2085,12449,5682],{},[33,12448,5678],{},[33,12450,5681],{},[14,12452,58],{"id":58},[10,12454,61],{},[63,12456,12457],{"className":65,"code":5689,"language":67,"meta":68,"style":68},[33,12458,12459,12463,12467,12471,12475,12479,12483,12487,12491,12495,12499,12503],{"__ignoreMap":68},[72,12460,12461],{"class":74,"line":75},[72,12462,5696],{},[72,12464,12465],{"class":74,"line":151},[72,12466,1037],{"emptyLinePlaceholder":165},[72,12468,12469],{"class":74,"line":361},[72,12470,5705],{},[72,12472,12473],{"class":74,"line":367},[72,12474,5710],{},[72,12476,12477],{"class":74,"line":1084},[72,12478,1037],{"emptyLinePlaceholder":165},[72,12480,12481],{"class":74,"line":1090},[72,12482,5719],{},[72,12484,12485],{"class":74,"line":2398},[72,12486,5724],{},[72,12488,12489],{"class":74,"line":2404},[72,12490,5729],{},[72,12492,12493],{"class":74,"line":3864},[72,12494,1037],{"emptyLinePlaceholder":165},[72,12496,12497],{"class":74,"line":4076},[72,12498,5738],{},[72,12500,12501],{"class":74,"line":5741},[72,12502,1037],{"emptyLinePlaceholder":165},[72,12504,12505],{"class":74,"line":5746},[72,12506,5749],{},[10,12508,80],{},[63,12510,12512],{"className":12511,"code":5755,"language":86,"meta":68},[84],[33,12513,5755],{"__ignoreMap":68},[10,12515,91],{},[14,12517,94],{"id":94},[96,12519,12520,12530],{},[44,12521,12522,5769,12524,5773,12526,5776,12528,5780],{},[33,12523,5768],{},[33,12525,5772],{},[33,12527,5561],{},[33,12529,5779],{},[44,12531,12532,5785,12534,5788],{},[33,12533,4496],{},[33,12535,2117],{},[265,12537,2608],{"id":2608},[10,12539,5793],{},[10,12541,12542],{},[26,12543],{"alt":5798,"src":5799},[10,12545,5802],{},[14,12547,114],{"id":114},[41,12549,12550,12552],{},[44,12551,5809],{},[44,12553,5812],{},[14,12555,128],{"id":128},[96,12557,12558,12560],{},[44,12559,5819],{},[44,12561,5822],{},[10,12563,139],{},[14,12565,142],{"id":142},[10,12567,5829],{},[147,12569,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12571},[12572,12573,12574,12575,12576,12579,12580,12581],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":12577},[12578],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5642,"description":5647},[161,5851,5852],{"id":5855,"title":5856,"body":12586,"category":161,"cover":162,"description":5861,"extension":163,"meta":12709,"navigation":165,"path":6012,"pinned":167,"publishedAt":168,"seo":12710,"slug":6014,"stem":6015,"summary":6016,"tags":12711,"updatedAt":168,"visible":165,"__hash__":6020},{"type":7,"value":12587,"toc":12699},[12588,12590,12592,12594,12596,12600,12602,12604,12618,12620,12622,12650,12652,12657,12659,12661,12671,12673,12681,12683,12691,12693,12695,12697],[10,12589,5861],{},[14,12591,16],{"id":16},[10,12593,5866],{},[14,12595,22],{"id":22},[10,12597,12598],{},[26,12599],{"alt":5873,"src":5874},[10,12601,5877],{},[14,12603,39],{"id":39},[41,12605,12606,12608,12610],{},[44,12607,5884],{},[44,12609,5887],{},[44,12611,5890,12612,2166,12614,2166,12616,5898],{},[33,12613,2169],{},[33,12615,2335],{},[33,12617,5897],{},[14,12619,58],{"id":58},[10,12621,61],{},[63,12623,12624],{"className":65,"code":5905,"language":67,"meta":68,"style":68},[33,12625,12626,12630,12634,12638,12642,12646],{"__ignoreMap":68},[72,12627,12628],{"class":74,"line":75},[72,12629,5912],{},[72,12631,12632],{"class":74,"line":151},[72,12633,5917],{},[72,12635,12636],{"class":74,"line":361},[72,12637,5922],{},[72,12639,12640],{"class":74,"line":367},[72,12641,1037],{"emptyLinePlaceholder":165},[72,12643,12644],{"class":74,"line":1084},[72,12645,5931],{},[72,12647,12648],{"class":74,"line":1090},[72,12649,5936],{},[10,12651,80],{},[63,12653,12655],{"className":12654,"code":5942,"language":86,"meta":68},[84],[33,12656,5942],{"__ignoreMap":68},[10,12658,91],{},[14,12660,94],{"id":94},[96,12662,12663,12669],{},[44,12664,5953,12665,5957,12667,5960],{},[33,12666,5956],{},[33,12668,2155],{},[44,12670,5963],{},[14,12672,114],{"id":114},[41,12674,12675,12679],{},[44,12676,5970,12677,5974],{},[33,12678,5973],{},[44,12680,5977],{},[14,12682,128],{"id":128},[96,12684,12685,12687],{},[44,12686,5984],{},[44,12688,5987,12689,5991],{},[33,12690,5990],{},[10,12692,139],{},[14,12694,142],{"id":142},[10,12696,5998],{},[147,12698,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12700},[12701,12702,12703,12704,12705,12706,12707,12708],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":5856,"description":5861},[161,6018,6019],{"id":6022,"title":6023,"body":12713,"category":161,"cover":162,"description":6028,"extension":163,"meta":12890,"navigation":165,"path":6256,"pinned":167,"publishedAt":168,"seo":12891,"slug":6258,"stem":6259,"summary":6260,"tags":12892,"updatedAt":168,"visible":165,"__hash__":6264},{"type":7,"value":12714,"toc":12878},[12715,12717,12719,12723,12725,12729,12735,12737,12749,12751,12755,12779,12783,12799,12805,12807,12812,12814,12816,12832,12834,12836,12840,12844,12846,12858,12860,12870,12872,12874,12876],[10,12716,6028],{},[14,12718,16],{"id":16},[10,12720,6033,12721,6036],{},[231,12722,5956],{},[14,12724,22],{"id":22},[10,12726,12727],{},[26,12728],{"alt":6043,"src":6044},[10,12730,6047,12731,6051,12733,6055],{},[33,12732,6050],{},[33,12734,6054],{},[14,12736,39],{"id":39},[41,12738,12739,12743,12745],{},[44,12740,6062,12741,6065],{},[33,12742,35],{},[44,12744,6068],{},[44,12746,6071,12747,6075],{},[33,12748,6074],{},[14,12750,58],{"id":58},[10,12752,6080,12753,6084],{},[33,12754,6083],{},[63,12756,12757],{"className":65,"code":6087,"language":67,"meta":68,"style":68},[33,12758,12759,12763,12767,12771,12775],{"__ignoreMap":68},[72,12760,12761],{"class":74,"line":75},[72,12762,6094],{},[72,12764,12765],{"class":74,"line":151},[72,12766,6099],{},[72,12768,12769],{"class":74,"line":361},[72,12770,1037],{"emptyLinePlaceholder":165},[72,12772,12773],{"class":74,"line":367},[72,12774,6108],{},[72,12776,12777],{"class":74,"line":1084},[72,12778,6113],{},[10,12780,6116,12781,6120],{},[33,12782,6119],{},[63,12784,12785],{"className":65,"code":6123,"language":67,"meta":68,"style":68},[33,12786,12787,12791,12795],{"__ignoreMap":68},[72,12788,12789],{"class":74,"line":75},[72,12790,6130],{},[72,12792,12793],{"class":74,"line":151},[72,12794,1037],{"emptyLinePlaceholder":165},[72,12796,12797],{"class":74,"line":361},[72,12798,6139],{},[10,12800,6142,12801,1099,12803,299],{},[33,12802,6145],{},[33,12804,6148],{},[10,12806,80],{},[63,12808,12810],{"className":12809,"code":6154,"language":86,"meta":68},[84],[33,12811,6154],{"__ignoreMap":68},[10,12813,91],{},[14,12815,94],{"id":94},[96,12817,12818,12824],{},[44,12819,6165,12820,6168,12822,6172],{},[33,12821,6083],{},[33,12823,6171],{},[44,12825,12826,6177,12828,6180,12830,6183],{},[33,12827,6119],{},[33,12829,6083],{},[33,12831,6119],{},[265,12833,2608],{"id":2608},[10,12835,6188],{},[10,12837,12838],{},[26,12839],{"alt":6193,"src":6194},[10,12841,6197,12842,6200],{},[33,12843,6171],{},[14,12845,114],{"id":114},[41,12847,12848,12854],{},[44,12849,6207,12850,1099,12852,299],{},[33,12851,6083],{},[33,12853,6119],{},[44,12855,6214,12856,6218],{},[33,12857,6217],{},[14,12859,128],{"id":128},[96,12861,12862,12866],{},[44,12863,2263,12864,6228],{},[33,12865,6227],{},[44,12867,6231,12868,299],{},[33,12869,6050],{},[10,12871,139],{},[14,12873,142],{"id":142},[10,12875,6240],{},[147,12877,149],{},{"title":68,"searchDepth":151,"depth":151,"links":12879},[12880,12881,12882,12883,12884,12887,12888,12889],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":12885},[12886],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":6023,"description":6028},[161,6262,6263],{"id":6266,"title":6267,"body":12894,"category":161,"cover":162,"description":6272,"extension":163,"meta":13033,"navigation":165,"path":6438,"pinned":167,"publishedAt":168,"seo":13034,"slug":6440,"stem":6441,"summary":6442,"tags":13035,"updatedAt":168,"visible":165,"__hash__":6445},{"type":7,"value":12895,"toc":13023},[12896,12898,12900,12902,12904,12908,12910,12912,12922,12924,12926,12966,12968,12973,12975,12977,12995,12997,13005,13007,13015,13017,13019,13021],[10,12897,6272],{},[14,12899,16],{"id":16},[10,12901,6277],{},[14,12903,22],{"id":22},[10,12905,12906],{},[26,12907],{"alt":6284,"src":6285},[10,12909,6288],{},[14,12911,39],{"id":39},[41,12913,12914,12918,12920],{},[44,12915,12916,6298],{},[33,12917,6297],{},[44,12919,6301],{},[44,12921,6304],{},[14,12923,58],{"id":58},[10,12925,1483],{},[63,12927,12928],{"className":530,"code":6311,"language":532,"meta":68,"style":68},[33,12929,12930,12940,12946,12952,12962],{"__ignoreMap":68},[72,12931,12932,12934,12936,12938],{"class":74,"line":75},[72,12933,630],{"class":539},[72,12935,572],{"class":542},[72,12937,6322],{"class":575},[72,12939,6325],{"class":575},[72,12941,12942,12944],{"class":74,"line":151},[72,12943,6330],{"class":542},[72,12945,6333],{"class":575},[72,12947,12948,12950],{"class":74,"line":361},[72,12949,67],{"class":539},[72,12951,543],{"class":542},[72,12953,12954,12956,12958,12960],{"class":74,"line":367},[72,12955,67],{"class":539},[72,12957,572],{"class":542},[72,12959,576],{"class":575},[72,12961,543],{"class":542},[72,12963,12964],{"class":74,"line":1084},[72,12965,6354],{"class":539},[10,12967,80],{},[63,12969,12971],{"className":12970,"code":6360,"language":86,"meta":68},[84],[33,12972,6360],{"__ignoreMap":68},[10,12974,91],{},[14,12976,94],{"id":94},[96,12978,12979,12985],{},[44,12980,12981,6374,12983,6377],{},[33,12982,6373],{},[33,12984,630],{},[44,12986,6380,12987,2085,12989,6386,12991,3639,12993,6392],{},[33,12988,67],{},[33,12990,6385],{},[33,12992,6297],{},[33,12994,6391],{},[14,12996,114],{"id":114},[41,12998,12999,13001],{},[44,13000,6399],{},[44,13002,3378,13003,6404],{},[33,13004,6297],{},[14,13006,128],{"id":128},[96,13008,13009,13013],{},[44,13010,6411,13011,299],{},[33,13012,6414],{},[44,13014,6417],{},[10,13016,139],{},[14,13018,142],{"id":142},[10,13020,6424],{},[147,13022,1567],{},{"title":68,"searchDepth":151,"depth":151,"links":13024},[13025,13026,13027,13028,13029,13030,13031,13032],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":6267,"description":6272},[161,6444,197],{"id":6447,"title":6448,"body":13037,"category":161,"cover":162,"description":6453,"extension":163,"meta":13190,"navigation":165,"path":6642,"pinned":167,"publishedAt":168,"seo":13191,"slug":6644,"stem":6645,"summary":6646,"tags":13192,"updatedAt":168,"visible":165,"__hash__":6650},{"type":7,"value":13038,"toc":13180},[13039,13041,13043,13045,13047,13051,13057,13059,13075,13077,13079,13123,13125,13130,13132,13134,13146,13148,13162,13164,13172,13174,13176,13178],[10,13040,6453],{},[14,13042,16],{"id":16},[10,13044,6458],{},[14,13046,22],{"id":22},[10,13048,13049],{},[26,13050],{"alt":6465,"src":6466},[10,13052,13053,6472,13055,6475],{},[33,13054,6471],{},[33,13056,2345],{},[14,13058,39],{"id":39},[41,13060,13061,13063,13071],{},[44,13062,6482],{},[44,13064,13065,2166,13067,2166,13069,6494],{},[33,13066,6487],{},[33,13068,6490],{},[33,13070,6493],{},[44,13072,6497,13073,6501],{},[33,13074,6500],{},[14,13076,58],{"id":58},[10,13078,61],{},[63,13080,13081],{"className":65,"code":6508,"language":67,"meta":68,"style":68},[33,13082,13083,13087,13091,13095,13099,13103,13107,13111,13115,13119],{"__ignoreMap":68},[72,13084,13085],{"class":74,"line":75},[72,13086,6515],{},[72,13088,13089],{"class":74,"line":151},[72,13090,1037],{"emptyLinePlaceholder":165},[72,13092,13093],{"class":74,"line":361},[72,13094,6524],{},[72,13096,13097],{"class":74,"line":367},[72,13098,6529],{},[72,13100,13101],{"class":74,"line":1084},[72,13102,6534],{},[72,13104,13105],{"class":74,"line":1090},[72,13106,1037],{"emptyLinePlaceholder":165},[72,13108,13109],{"class":74,"line":2398},[72,13110,6543],{},[72,13112,13113],{"class":74,"line":2404},[72,13114,6548],{},[72,13116,13117],{"class":74,"line":3864},[72,13118,6553],{},[72,13120,13121],{"class":74,"line":4076},[72,13122,6558],{},[10,13124,80],{},[63,13126,13128],{"className":13127,"code":6564,"language":86,"meta":68},[84],[33,13129,6564],{"__ignoreMap":68},[10,13131,91],{},[14,13133,94],{"id":94},[96,13135,13136,13140],{},[44,13137,13138,6578],{},[33,13139,6577],{},[44,13141,2248,13142,6583,13144,6586],{},[33,13143,2345],{},[33,13145,6471],{},[14,13147,114],{"id":114},[41,13149,13150,13156],{},[44,13151,3378,13152,6595,13154,6598],{},[33,13153,6471],{},[33,13155,6487],{},[44,13157,6601,13158,948,13160,6607],{},[33,13159,2345],{},[33,13161,6606],{},[14,13163,128],{"id":128},[96,13165,13166,13170],{},[44,13167,6614,13168,6618],{},[33,13169,6617],{},[44,13171,6621],{},[10,13173,139],{},[14,13175,142],{"id":142},[10,13177,6628],{},[147,13179,149],{},{"title":68,"searchDepth":151,"depth":151,"links":13181},[13182,13183,13184,13185,13186,13187,13188,13189],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":6448,"description":6453},[161,6648,6649],{"id":6652,"title":6653,"body":13194,"category":161,"cover":162,"description":6658,"extension":163,"meta":13341,"navigation":165,"path":6837,"pinned":167,"publishedAt":168,"seo":13342,"slug":6839,"stem":6840,"summary":6841,"tags":13343,"updatedAt":168,"visible":165,"__hash__":6845},{"type":7,"value":13195,"toc":13331},[13196,13198,13200,13202,13204,13208,13210,13212,13230,13232,13234,13282,13284,13289,13291,13293,13301,13303,13313,13315,13323,13325,13327,13329],[10,13197,6658],{},[14,13199,16],{"id":16},[10,13201,6663],{},[14,13203,22],{"id":22},[10,13205,13206],{},[26,13207],{"alt":6670,"src":6671},[10,13209,6674],{},[14,13211,39],{"id":39},[41,13213,13214,13218,13224],{},[44,13215,13216,6684],{},[33,13217,6683],{},[44,13219,13220,6690,13222,299],{},[33,13221,6689],{},[33,13223,6693],{},[44,13225,6696,13226,6700,13228,6704],{},[33,13227,6699],{},[33,13229,6703],{},[14,13231,58],{"id":58},[10,13233,61],{},[63,13235,13236],{"className":65,"code":6711,"language":67,"meta":68,"style":68},[33,13237,13238,13242,13246,13250,13254,13258,13262,13266,13270,13274,13278],{"__ignoreMap":68},[72,13239,13240],{"class":74,"line":75},[72,13241,6515],{},[72,13243,13244],{"class":74,"line":151},[72,13245,1037],{"emptyLinePlaceholder":165},[72,13247,13248],{"class":74,"line":361},[72,13249,6726],{},[72,13251,13252],{"class":74,"line":367},[72,13253,6731],{},[72,13255,13256],{"class":74,"line":1084},[72,13257,6736],{},[72,13259,13260],{"class":74,"line":1090},[72,13261,6741],{},[72,13263,13264],{"class":74,"line":2398},[72,13265,1037],{"emptyLinePlaceholder":165},[72,13267,13268],{"class":74,"line":2404},[72,13269,6750],{},[72,13271,13272],{"class":74,"line":3864},[72,13273,6755],{},[72,13275,13276],{"class":74,"line":4076},[72,13277,6760],{},[72,13279,13280],{"class":74,"line":5741},[72,13281,6765],{},[10,13283,80],{},[63,13285,13287],{"className":13286,"code":6771,"language":86,"meta":68},[84],[33,13288,6771],{"__ignoreMap":68},[10,13290,91],{},[14,13292,94],{"id":94},[96,13294,13295,13299],{},[44,13296,6782,13297,6785],{},[33,13298,6699],{},[44,13300,6788],{},[14,13302,114],{"id":114},[41,13304,13305,13309],{},[44,13306,2248,13307,6797],{},[33,13308,6683],{},[44,13310,6800,13311,299],{},[33,13312,6803],{},[14,13314,128],{"id":128},[96,13316,13317,13319],{},[44,13318,6810],{},[44,13320,6813,13321,6816],{},[33,13322,273],{},[10,13324,139],{},[14,13326,142],{"id":142},[10,13328,6823],{},[147,13330,149],{},{"title":68,"searchDepth":151,"depth":151,"links":13332},[13333,13334,13335,13336,13337,13338,13339,13340],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":6653,"description":6658},[161,6843,6844],{"id":6847,"title":6848,"body":13345,"category":161,"cover":162,"description":6853,"extension":163,"meta":13488,"navigation":165,"path":7021,"pinned":167,"publishedAt":168,"seo":13489,"slug":7023,"stem":7024,"summary":7025,"tags":13490,"updatedAt":168,"visible":165,"__hash__":7029},{"type":7,"value":13346,"toc":13478},[13347,13349,13351,13353,13355,13359,13365,13367,13377,13379,13381,13433,13435,13440,13442,13444,13454,13456,13462,13464,13470,13472,13474,13476],[10,13348,6853],{},[14,13350,16],{"id":16},[10,13352,6858],{},[14,13354,22],{"id":22},[10,13356,13357],{},[26,13358],{"alt":6865,"src":6866},[10,13360,13361,6872,13363,6876],{},[33,13362,6871],{},[33,13364,6875],{},[14,13366,39],{"id":39},[41,13368,13369,13371,13375],{},[44,13370,6883],{},[44,13372,13373,6889],{},[33,13374,6888],{},[44,13376,6892],{},[14,13378,58],{"id":58},[10,13380,61],{},[63,13382,13383],{"className":65,"code":6899,"language":67,"meta":68,"style":68},[33,13384,13385,13389,13393,13397,13401,13405,13409,13413,13417,13421,13425,13429],{"__ignoreMap":68},[72,13386,13387],{"class":74,"line":75},[72,13388,6906],{},[72,13390,13391],{"class":74,"line":151},[72,13392,1037],{"emptyLinePlaceholder":165},[72,13394,13395],{"class":74,"line":361},[72,13396,6915],{},[72,13398,13399],{"class":74,"line":367},[72,13400,1037],{"emptyLinePlaceholder":165},[72,13402,13403],{"class":74,"line":1084},[72,13404,6924],{},[72,13406,13407],{"class":74,"line":1090},[72,13408,6929],{},[72,13410,13411],{"class":74,"line":2398},[72,13412,6741],{},[72,13414,13415],{"class":74,"line":2404},[72,13416,1037],{"emptyLinePlaceholder":165},[72,13418,13419],{"class":74,"line":3864},[72,13420,6942],{},[72,13422,13423],{"class":74,"line":4076},[72,13424,6947],{},[72,13426,13427],{"class":74,"line":5741},[72,13428,6760],{},[72,13430,13431],{"class":74,"line":5746},[72,13432,6956],{},[10,13434,80],{},[63,13436,13438],{"className":13437,"code":6962,"language":86,"meta":68},[84],[33,13439,6962],{"__ignoreMap":68},[10,13441,91],{},[14,13443,94],{"id":94},[96,13445,13446,13450],{},[44,13447,13448,6975],{},[33,13449,6871],{},[44,13451,13452,6980],{},[33,13453,6875],{},[14,13455,114],{"id":114},[41,13457,13458,13460],{},[44,13459,6987],{},[44,13461,6990],{},[14,13463,128],{"id":128},[96,13465,13466,13468],{},[44,13467,6997],{},[44,13469,7000],{},[10,13471,139],{},[14,13473,142],{"id":142},[10,13475,7007],{},[147,13477,149],{},{"title":68,"searchDepth":151,"depth":151,"links":13479},[13480,13481,13482,13483,13484,13485,13486,13487],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":6848,"description":6853},[161,7027,7028],{"id":7031,"title":7032,"body":13492,"category":161,"cover":162,"description":7037,"extension":163,"meta":13643,"navigation":165,"path":7222,"pinned":167,"publishedAt":168,"seo":13644,"slug":7224,"stem":7225,"summary":7226,"tags":13645,"updatedAt":168,"visible":165,"__hash__":7230},{"type":7,"value":13493,"toc":13633},[13494,13496,13498,13500,13502,13506,13510,13512,13526,13528,13530,13582,13584,13589,13591,13593,13605,13607,13617,13619,13625,13627,13629,13631],[10,13495,7037],{},[14,13497,16],{"id":16},[10,13499,7042],{},[14,13501,22],{"id":22},[10,13503,13504],{},[26,13505],{"alt":7049,"src":7050},[10,13507,13508,7056],{},[33,13509,7055],{},[14,13511,39],{"id":39},[41,13513,13514,13520,13524],{},[44,13515,2248,13516,7066,13518,7070],{},[33,13517,7065],{},[33,13519,7069],{},[44,13521,7073,13522,7077],{},[33,13523,7076],{},[44,13525,7080],{},[14,13527,58],{"id":58},[10,13529,61],{},[63,13531,13532],{"className":65,"code":7087,"language":67,"meta":68,"style":68},[33,13533,13534,13538,13542,13546,13550,13554,13558,13562,13566,13570,13574,13578],{"__ignoreMap":68},[72,13535,13536],{"class":74,"line":75},[72,13537,7094],{},[72,13539,13540],{"class":74,"line":151},[72,13541,1037],{"emptyLinePlaceholder":165},[72,13543,13544],{"class":74,"line":361},[72,13545,7103],{},[72,13547,13548],{"class":74,"line":367},[72,13549,7108],{},[72,13551,13552],{"class":74,"line":1084},[72,13553,7113],{},[72,13555,13556],{"class":74,"line":1090},[72,13557,7118],{},[72,13559,13560],{"class":74,"line":2398},[72,13561,7123],{},[72,13563,13564],{"class":74,"line":2404},[72,13565,1037],{"emptyLinePlaceholder":165},[72,13567,13568],{"class":74,"line":3864},[72,13569,7132],{},[72,13571,13572],{"class":74,"line":4076},[72,13573,7137],{},[72,13575,13576],{"class":74,"line":5741},[72,13577,7142],{},[72,13579,13580],{"class":74,"line":5746},[72,13581,7147],{},[10,13583,80],{},[63,13585,13587],{"className":13586,"code":7153,"language":86,"meta":68},[84],[33,13588,7153],{"__ignoreMap":68},[10,13590,91],{},[14,13592,94],{"id":94},[96,13594,13595,13601],{},[44,13596,13597,7167,13599,7170],{},[33,13598,7166],{},[33,13600,7076],{},[44,13602,13603,7175],{},[33,13604,7055],{},[14,13606,114],{"id":114},[41,13608,13609,13611],{},[44,13610,7182],{},[44,13612,7185,13613,7188,13615,7191],{},[33,13614,7065],{},[33,13616,7069],{},[14,13618,128],{"id":128},[96,13620,13621,13623],{},[44,13622,7198],{},[44,13624,7201],{},[10,13626,139],{},[14,13628,142],{"id":142},[10,13630,7208],{},[147,13632,149],{},{"title":68,"searchDepth":151,"depth":151,"links":13634},[13635,13636,13637,13638,13639,13640,13641,13642],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":7032,"description":7037},[161,7228,7229],{"id":7232,"title":7233,"body":13647,"category":161,"cover":162,"description":7238,"extension":163,"meta":13861,"navigation":165,"path":7512,"pinned":167,"publishedAt":168,"seo":13862,"slug":7514,"stem":7515,"summary":7516,"tags":13863,"updatedAt":168,"visible":165,"__hash__":7520},{"type":7,"value":13648,"toc":13848},[13649,13651,13653,13655,13657,13661,13667,13669,13681,13683,13685,13745,13747,13752,13754,13756,13774,13776,13784,13788,13796,13798,13802,13806,13812,13814,13824,13826,13840,13842,13844,13846],[10,13650,7238],{},[14,13652,16],{"id":16},[10,13654,7243],{},[14,13656,22],{"id":22},[10,13658,13659],{},[26,13660],{"alt":7250,"src":7251},[10,13662,7254,13663,7258,13665,7262],{},[33,13664,7257],{},[33,13666,7261],{},[14,13668,39],{"id":39},[41,13670,13671,13675,13679],{},[44,13672,7269,13673,7272],{},[33,13674,7257],{},[44,13676,13677,7278],{},[33,13678,7277],{},[44,13680,7281],{},[14,13682,58],{"id":58},[10,13684,61],{},[63,13686,13687],{"className":65,"code":7288,"language":67,"meta":68,"style":68},[33,13688,13689,13693,13697,13701,13705,13709,13713,13717,13721,13725,13729,13733,13737,13741],{"__ignoreMap":68},[72,13690,13691],{"class":74,"line":75},[72,13692,7295],{},[72,13694,13695],{"class":74,"line":151},[72,13696,7300],{},[72,13698,13699],{"class":74,"line":361},[72,13700,7305],{},[72,13702,13703],{"class":74,"line":367},[72,13704,7310],{},[72,13706,13707],{"class":74,"line":1084},[72,13708,7315],{},[72,13710,13711],{"class":74,"line":1090},[72,13712,1037],{"emptyLinePlaceholder":165},[72,13714,13715],{"class":74,"line":2398},[72,13716,7324],{},[72,13718,13719],{"class":74,"line":2404},[72,13720,7329],{},[72,13722,13723],{"class":74,"line":3864},[72,13724,7334],{},[72,13726,13727],{"class":74,"line":4076},[72,13728,7339],{},[72,13730,13731],{"class":74,"line":5741},[72,13732,1087],{},[72,13734,13735],{"class":74,"line":5746},[72,13736,7348],{},[72,13738,13739],{"class":74,"line":7351},[72,13740,7354],{},[72,13742,13743],{"class":74,"line":7357},[72,13744,7360],{},[10,13746,80],{},[63,13748,13750],{"className":13749,"code":7366,"language":86,"meta":68},[84],[33,13751,7366],{"__ignoreMap":68},[10,13753,91],{},[14,13755,94],{"id":94},[96,13757,13758,13766],{},[44,13759,13760,7379,13762,7382,13764,7386],{},[33,13761,2947],{},[33,13763,7277],{},[33,13765,7385],{},[44,13767,7389,13768,7392,13770,7395,13772,299],{},[33,13769,7257],{},[33,13771,1102],{},[33,13773,7261],{},[265,13775,2608],{"id":2608},[10,13777,13778,2166,13780,1099,13782,7408],{},[33,13779,7257],{},[33,13781,1102],{},[33,13783,7261],{},[10,13785,13786],{},[26,13787],{"alt":7413,"src":7414},[10,13789,13790,7419,13792,7422,13794,7425],{},[33,13791,7257],{},[33,13793,1102],{},[33,13795,7261],{},[265,13797,2608],{"id":4131},[10,13799,13800,7433],{},[33,13801,7432],{},[10,13803,13804],{},[26,13805],{"alt":7438,"src":7439},[10,13807,7442,13808,7445,13810,7448],{},[33,13809,7432],{},[33,13811,1102],{},[14,13813,114],{"id":114},[41,13815,13816,13820],{},[44,13817,7455,13818,7459],{},[33,13819,7458],{},[44,13821,7462,13822,7465],{},[33,13823,7432],{},[14,13825,128],{"id":128},[96,13827,13828,13836],{},[44,13829,7472,13830,7476,13832,1099,13834,299],{},[33,13831,7475],{},[33,13833,7479],{},[33,13835,7482],{},[44,13837,7485,13838,7488],{},[33,13839,6693],{},[10,13841,139],{},[14,13843,142],{"id":142},[10,13845,7495],{},[147,13847,149],{},{"title":68,"searchDepth":151,"depth":151,"links":13849},[13850,13851,13852,13853,13854,13858,13859,13860],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":13855},[13856,13857],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":7233,"description":7238},[161,7518,7519],{"id":7522,"title":7523,"body":13865,"category":161,"cover":162,"description":7528,"extension":163,"meta":14016,"navigation":165,"path":7705,"pinned":167,"publishedAt":168,"seo":14017,"slug":7707,"stem":7708,"summary":7709,"tags":14018,"updatedAt":168,"visible":165,"__hash__":7712},{"type":7,"value":13866,"toc":14006},[13867,13869,13871,13873,13875,13879,13883,13885,13897,13899,13901,13949,13951,13956,13958,13960,13970,13972,13982,13984,13998,14000,14002,14004],[10,13868,7528],{},[14,13870,16],{"id":16},[10,13872,7533],{},[14,13874,22],{"id":22},[10,13876,13877],{},[26,13878],{"alt":7540,"src":7541},[10,13880,7544,13881,7547],{},[33,13882,6703],{},[14,13884,39],{"id":39},[41,13886,13887,13891,13895],{},[44,13888,13889,7556],{},[33,13890,6703],{},[44,13892,13893,7562],{},[33,13894,7561],{},[44,13896,7565],{},[14,13898,58],{"id":58},[10,13900,61],{},[63,13902,13903],{"className":65,"code":7572,"language":67,"meta":68,"style":68},[33,13904,13905,13909,13913,13917,13921,13925,13929,13933,13937,13941,13945],{"__ignoreMap":68},[72,13906,13907],{"class":74,"line":75},[72,13908,6515],{},[72,13910,13911],{"class":74,"line":151},[72,13912,1037],{"emptyLinePlaceholder":165},[72,13914,13915],{"class":74,"line":361},[72,13916,6726],{},[72,13918,13919],{"class":74,"line":367},[72,13920,1037],{"emptyLinePlaceholder":165},[72,13922,13923],{"class":74,"line":1084},[72,13924,7595],{},[72,13926,13927],{"class":74,"line":1090},[72,13928,7600],{},[72,13930,13931],{"class":74,"line":2398},[72,13932,1037],{"emptyLinePlaceholder":165},[72,13934,13935],{"class":74,"line":2404},[72,13936,7609],{},[72,13938,13939],{"class":74,"line":3864},[72,13940,7614],{},[72,13942,13943],{"class":74,"line":4076},[72,13944,1037],{"emptyLinePlaceholder":165},[72,13946,13947],{"class":74,"line":5741},[72,13948,7623],{},[10,13950,80],{},[63,13952,13954],{"className":13953,"code":7629,"language":86,"meta":68},[84],[33,13955,7629],{"__ignoreMap":68},[10,13957,91],{},[14,13959,94],{"id":94},[96,13961,13962,13968],{},[44,13963,7544,13964,7642,13966,299],{},[33,13965,6703],{},[33,13967,7645],{},[44,13969,7648],{},[14,13971,114],{"id":114},[41,13973,13974,13978],{},[44,13975,4699,13976,7657],{},[33,13977,6703],{},[44,13979,7660,13980,7663],{},[33,13981,6703],{},[14,13983,128],{"id":128},[96,13985,13986,13992],{},[44,13987,7670,13988,7674,13990,299],{},[33,13989,7673],{},[33,13991,6703],{},[44,13993,4699,13994,7681,13996,299],{},[33,13995,6703],{},[33,13997,7684],{},[10,13999,139],{},[14,14001,142],{"id":142},[10,14003,7691],{},[147,14005,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14007},[14008,14009,14010,14011,14012,14013,14014,14015],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":7523,"description":7528},[161,6703,7711],{"id":7714,"title":7715,"body":14020,"category":161,"cover":162,"description":7720,"extension":163,"meta":14191,"navigation":165,"path":7933,"pinned":167,"publishedAt":168,"seo":14192,"slug":7935,"stem":7936,"summary":7937,"tags":14193,"updatedAt":168,"visible":165,"__hash__":7941},{"type":7,"value":14021,"toc":14179},[14022,14024,14026,14028,14030,14034,14036,14038,14050,14052,14054,14110,14112,14117,14119,14121,14137,14139,14141,14145,14151,14153,14161,14163,14171,14173,14175,14177],[10,14023,7720],{},[14,14025,16],{"id":16},[10,14027,7725],{},[14,14029,22],{"id":22},[10,14031,14032],{},[26,14033],{"alt":7732,"src":7733},[10,14035,7736],{},[14,14037,39],{"id":39},[41,14039,14040,14044,14048],{},[44,14041,14042,7746],{},[33,14043,7745],{},[44,14045,14046,7752],{},[33,14047,7751],{},[44,14049,7755],{},[14,14051,58],{"id":58},[10,14053,61],{},[63,14055,14056],{"className":65,"code":7762,"language":67,"meta":68,"style":68},[33,14057,14058,14062,14066,14070,14074,14078,14082,14086,14090,14094,14098,14102,14106],{"__ignoreMap":68},[72,14059,14060],{"class":74,"line":75},[72,14061,7769],{},[72,14063,14064],{"class":74,"line":151},[72,14065,7774],{},[72,14067,14068],{"class":74,"line":361},[72,14069,7779],{},[72,14071,14072],{"class":74,"line":367},[72,14073,7784],{},[72,14075,14076],{"class":74,"line":1084},[72,14077,1037],{"emptyLinePlaceholder":165},[72,14079,14080],{"class":74,"line":1090},[72,14081,7793],{},[72,14083,14084],{"class":74,"line":2398},[72,14085,7798],{},[72,14087,14088],{"class":74,"line":2404},[72,14089,7803],{},[72,14091,14092],{"class":74,"line":3864},[72,14093,7808],{},[72,14095,14096],{"class":74,"line":4076},[72,14097,1037],{"emptyLinePlaceholder":165},[72,14099,14100],{"class":74,"line":5741},[72,14101,7817],{},[72,14103,14104],{"class":74,"line":5746},[72,14105,7822],{},[72,14107,14108],{"class":74,"line":7351},[72,14109,7827],{},[10,14111,80],{},[63,14113,14115],{"className":14114,"code":7833,"language":86,"meta":68},[84],[33,14116,7833],{"__ignoreMap":68},[10,14118,91],{},[14,14120,94],{"id":94},[96,14122,14123,14129],{},[44,14124,7844,14125,7848,14127,7851],{},[33,14126,7847],{},[33,14128,7751],{},[44,14130,14131,7857,14133,7861,14135,7864],{},[33,14132,7856],{},[33,14134,7860],{},[33,14136,7745],{},[265,14138,2608],{"id":2608},[10,14140,7869],{},[10,14142,14143],{},[26,14144],{"alt":7874,"src":7875},[10,14146,7878,14147,1099,14149,7884],{},[33,14148,4496],{},[33,14150,7883],{},[14,14152,114],{"id":114},[41,14154,14155,14159],{},[44,14156,7891,14157,7894],{},[33,14158,7745],{},[44,14160,7897],{},[14,14162,128],{"id":128},[96,14164,14165,14169],{},[44,14166,5209,14167,7907],{},[33,14168,7906],{},[44,14170,7910],{},[10,14172,139],{},[14,14174,142],{"id":142},[10,14176,7917],{},[147,14178,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14180},[14181,14182,14183,14184,14185,14188,14189,14190],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":14186},[14187],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":7715,"description":7720},[161,7939,7940],{"id":7943,"title":7944,"body":14195,"category":161,"cover":162,"description":7949,"extension":163,"meta":14342,"navigation":165,"path":8128,"pinned":167,"publishedAt":168,"seo":14343,"slug":8130,"stem":8131,"summary":8132,"tags":14344,"updatedAt":168,"visible":165,"__hash__":8136},{"type":7,"value":14196,"toc":14332},[14197,14199,14201,14203,14205,14209,14211,14213,14221,14223,14225,14281,14283,14288,14290,14292,14304,14306,14312,14314,14324,14326,14328,14330],[10,14198,7949],{},[14,14200,16],{"id":16},[10,14202,7954],{},[14,14204,22],{"id":22},[10,14206,14207],{},[26,14208],{"alt":7961,"src":7962},[10,14210,7965],{},[14,14212,39],{"id":39},[41,14214,14215,14217,14219],{},[44,14216,7972],{},[44,14218,7975],{},[44,14220,7978],{},[14,14222,58],{"id":58},[10,14224,61],{},[63,14226,14227],{"className":65,"code":7985,"language":67,"meta":68,"style":68},[33,14228,14229,14233,14237,14241,14245,14249,14253,14257,14261,14265,14269,14273,14277],{"__ignoreMap":68},[72,14230,14231],{"class":74,"line":75},[72,14232,7992],{},[72,14234,14235],{"class":74,"line":151},[72,14236,7997],{},[72,14238,14239],{"class":74,"line":361},[72,14240,8002],{},[72,14242,14243],{"class":74,"line":367},[72,14244,1037],{"emptyLinePlaceholder":165},[72,14246,14247],{"class":74,"line":1084},[72,14248,8011],{},[72,14250,14251],{"class":74,"line":1090},[72,14252,8016],{},[72,14254,14255],{"class":74,"line":2398},[72,14256,8021],{},[72,14258,14259],{"class":74,"line":2404},[72,14260,1037],{"emptyLinePlaceholder":165},[72,14262,14263],{"class":74,"line":3864},[72,14264,8030],{},[72,14266,14267],{"class":74,"line":4076},[72,14268,8035],{},[72,14270,14271],{"class":74,"line":5741},[72,14272,1037],{"emptyLinePlaceholder":165},[72,14274,14275],{"class":74,"line":5746},[72,14276,8044],{},[72,14278,14279],{"class":74,"line":7351},[72,14280,8049],{},[10,14282,80],{},[63,14284,14286],{"className":14285,"code":8055,"language":86,"meta":68},[84],[33,14287,8055],{"__ignoreMap":68},[10,14289,91],{},[14,14291,94],{"id":94},[96,14293,14294,14300],{},[44,14295,14296,8069,14298,8073],{},[33,14297,8068],{},[33,14299,8072],{},[44,14301,8076,14302,8080],{},[33,14303,8079],{},[14,14305,114],{"id":114},[41,14307,14308,14310],{},[44,14309,8087],{},[44,14311,8090],{},[14,14313,128],{"id":128},[96,14315,14316,14322],{},[44,14317,8097,14318,8101,14320,299],{},[33,14319,8100],{},[33,14321,8104],{},[44,14323,8107],{},[10,14325,139],{},[14,14327,142],{"id":142},[10,14329,8114],{},[147,14331,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14333},[14334,14335,14336,14337,14338,14339,14340,14341],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":7944,"description":7949},[161,8134,8135],{"id":8138,"title":8139,"body":14346,"category":161,"cover":162,"description":8144,"extension":163,"meta":14509,"navigation":165,"path":8348,"pinned":167,"publishedAt":168,"seo":14510,"slug":8350,"stem":8351,"summary":8352,"tags":14511,"updatedAt":168,"visible":165,"__hash__":8356},{"type":7,"value":14347,"toc":14497},[14348,14350,14352,14354,14356,14360,14364,14366,14382,14384,14386,14430,14432,14437,14439,14441,14455,14457,14461,14465,14469,14471,14477,14479,14489,14491,14493,14495],[10,14349,8144],{},[14,14351,16],{"id":16},[10,14353,8149],{},[14,14355,22],{"id":22},[10,14357,14358],{},[26,14359],{"alt":8156,"src":8157},[10,14361,8160,14362,8164],{},[33,14363,8163],{},[14,14365,39],{"id":39},[41,14367,14368,14374,14380],{},[44,14369,14370,8174,14372,8178],{},[33,14371,8173],{},[33,14373,8177],{},[44,14375,8181,14376,8185,14378,8188],{},[33,14377,8184],{},[33,14379,4250],{},[44,14381,8191],{},[14,14383,58],{"id":58},[10,14385,61],{},[63,14387,14388],{"className":65,"code":8198,"language":67,"meta":68,"style":68},[33,14389,14390,14394,14398,14402,14406,14410,14414,14418,14422,14426],{"__ignoreMap":68},[72,14391,14392],{"class":74,"line":75},[72,14393,8205],{},[72,14395,14396],{"class":74,"line":151},[72,14397,8210],{},[72,14399,14400],{"class":74,"line":361},[72,14401,8215],{},[72,14403,14404],{"class":74,"line":367},[72,14405,8220],{},[72,14407,14408],{"class":74,"line":1084},[72,14409,8225],{},[72,14411,14412],{"class":74,"line":1090},[72,14413,1037],{"emptyLinePlaceholder":165},[72,14415,14416],{"class":74,"line":2398},[72,14417,8234],{},[72,14419,14420],{"class":74,"line":2404},[72,14421,8239],{},[72,14423,14424],{"class":74,"line":3864},[72,14425,8239],{},[72,14427,14428],{"class":74,"line":4076},[72,14429,8239],{},[10,14431,80],{},[63,14433,14435],{"className":14434,"code":8253,"language":86,"meta":68},[84],[33,14436,8253],{"__ignoreMap":68},[10,14438,91],{},[14,14440,94],{"id":94},[96,14442,14443,14447],{},[44,14444,7844,14445,8267],{},[33,14446,8266],{},[44,14448,8270,14449,8273,14451,8276,14453,8280],{},[33,14450,8177],{},[33,14452,8163],{},[33,14454,8279],{},[265,14456,2608],{"id":2608},[10,14458,8285,14459,8288],{},[33,14460,8177],{},[10,14462,14463],{},[26,14464],{"alt":8293,"src":8294},[10,14466,8297,14467,8300],{},[33,14468,8163],{},[14,14470,114],{"id":114},[41,14472,14473,14475],{},[44,14474,8307],{},[44,14476,8310],{},[14,14478,128],{"id":128},[96,14480,14481,14483],{},[44,14482,8317],{},[44,14484,3922,14485,8322,14487,8325],{},[33,14486,4250],{},[33,14488,8177],{},[10,14490,139],{},[14,14492,142],{"id":142},[10,14494,8332],{},[147,14496,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14498},[14499,14500,14501,14502,14503,14506,14507,14508],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":14504},[14505],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":8139,"description":8144},[161,8354,8355],{"id":8358,"title":8359,"body":14513,"category":161,"cover":162,"description":8364,"extension":163,"meta":14696,"navigation":165,"path":8589,"pinned":167,"publishedAt":168,"seo":14697,"slug":8591,"stem":8592,"summary":8593,"tags":14698,"updatedAt":168,"visible":165,"__hash__":8596},{"type":7,"value":14514,"toc":14684},[14515,14517,14519,14521,14523,14527,14529,14531,14545,14547,14549,14617,14619,14624,14626,14628,14642,14644,14646,14650,14656,14658,14666,14668,14676,14678,14680,14682],[10,14516,8364],{},[14,14518,16],{"id":16},[10,14520,8369],{},[14,14522,22],{"id":22},[10,14524,14525],{},[26,14526],{"alt":8376,"src":8377},[10,14528,8380],{},[14,14530,39],{"id":39},[41,14532,14533,14539,14541],{},[44,14534,14535,8390,14537,299],{},[33,14536,8389],{},[33,14538,8393],{},[44,14540,8396],{},[44,14542,14543,8402],{},[33,14544,8401],{},[14,14546,58],{"id":58},[10,14548,61],{},[63,14550,14551],{"className":65,"code":8409,"language":67,"meta":68,"style":68},[33,14552,14553,14557,14561,14565,14569,14573,14577,14581,14585,14589,14593,14597,14601,14605,14609,14613],{"__ignoreMap":68},[72,14554,14555],{"class":74,"line":75},[72,14556,8416],{},[72,14558,14559],{"class":74,"line":151},[72,14560,1037],{"emptyLinePlaceholder":165},[72,14562,14563],{"class":74,"line":361},[72,14564,8425],{},[72,14566,14567],{"class":74,"line":367},[72,14568,8430],{},[72,14570,14571],{"class":74,"line":1084},[72,14572,8435],{},[72,14574,14575],{"class":74,"line":1090},[72,14576,8440],{},[72,14578,14579],{"class":74,"line":2398},[72,14580,8445],{},[72,14582,14583],{"class":74,"line":2404},[72,14584,8450],{},[72,14586,14587],{"class":74,"line":3864},[72,14588,8455],{},[72,14590,14591],{"class":74,"line":4076},[72,14592,8460],{},[72,14594,14595],{"class":74,"line":5741},[72,14596,1037],{"emptyLinePlaceholder":165},[72,14598,14599],{"class":74,"line":5746},[72,14600,8469],{},[72,14602,14603],{"class":74,"line":7351},[72,14604,6094],{},[72,14606,14607],{"class":74,"line":7357},[72,14608,6099],{},[72,14610,14611],{"class":74,"line":8480},[72,14612,1037],{"emptyLinePlaceholder":165},[72,14614,14615],{"class":74,"line":8485},[72,14616,8488],{},[10,14618,80],{},[63,14620,14622],{"className":14621,"code":8494,"language":86,"meta":68},[84],[33,14623,8494],{"__ignoreMap":68},[10,14625,91],{},[14,14627,94],{"id":94},[96,14629,14630,14640],{},[44,14631,8505,14632,8509,14634,8513,14636,8517,14638,299],{},[33,14633,8508],{},[33,14635,8512],{},[33,14637,8516],{},[33,14639,8508],{},[44,14641,8522],{},[265,14643,2608],{"id":2608},[10,14645,8527],{},[10,14647,14648],{},[26,14649],{"alt":8532,"src":8533},[10,14651,14652,8538,14654,299],{},[33,14653,8389],{},[33,14655,8393],{},[14,14657,114],{"id":114},[41,14659,14660,14664],{},[44,14661,8547,14662,299],{},[33,14663,5292],{},[44,14665,8552],{},[14,14667,128],{"id":128},[96,14669,14670,14672],{},[44,14671,8559],{},[44,14673,8562,14674,8566],{},[33,14675,8565],{},[10,14677,139],{},[14,14679,142],{"id":142},[10,14681,8573],{},[147,14683,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14685},[14686,14687,14688,14689,14690,14693,14694,14695],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":14691},[14692],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":8359,"description":8364},[161,8595,5243],{"id":8598,"title":8599,"body":14700,"category":161,"cover":162,"description":8604,"extension":163,"meta":14859,"navigation":165,"path":8792,"pinned":167,"publishedAt":168,"seo":14860,"slug":8794,"stem":8795,"summary":8796,"tags":14861,"updatedAt":168,"visible":165,"__hash__":8800},{"type":7,"value":14701,"toc":14847},[14702,14704,14706,14708,14710,14714,14716,14718,14726,14728,14730,14794,14796,14801,14803,14805,14813,14815,14817,14821,14823,14825,14831,14833,14839,14841,14843,14845],[10,14703,8604],{},[14,14705,16],{"id":16},[10,14707,8609],{},[14,14709,22],{"id":22},[10,14711,14712],{},[26,14713],{"alt":8616,"src":8617},[10,14715,8620],{},[14,14717,39],{"id":39},[41,14719,14720,14722,14724],{},[44,14721,8627],{},[44,14723,8630],{},[44,14725,8633],{},[14,14727,58],{"id":58},[10,14729,61],{},[63,14731,14732],{"className":65,"code":8640,"language":67,"meta":68,"style":68},[33,14733,14734,14738,14742,14746,14750,14754,14758,14762,14766,14770,14774,14778,14782,14786,14790],{"__ignoreMap":68},[72,14735,14736],{"class":74,"line":75},[72,14737,8647],{},[72,14739,14740],{"class":74,"line":151},[72,14741,8652],{},[72,14743,14744],{"class":74,"line":361},[72,14745,1037],{"emptyLinePlaceholder":165},[72,14747,14748],{"class":74,"line":367},[72,14749,8661],{},[72,14751,14752],{"class":74,"line":1084},[72,14753,1037],{"emptyLinePlaceholder":165},[72,14755,14756],{"class":74,"line":1090},[72,14757,8670],{},[72,14759,14760],{"class":74,"line":2398},[72,14761,8675],{},[72,14763,14764],{"class":74,"line":2404},[72,14765,8680],{},[72,14767,14768],{"class":74,"line":3864},[72,14769,1037],{"emptyLinePlaceholder":165},[72,14771,14772],{"class":74,"line":4076},[72,14773,8689],{},[72,14775,14776],{"class":74,"line":5741},[72,14777,8694],{},[72,14779,14780],{"class":74,"line":5746},[72,14781,8699],{},[72,14783,14784],{"class":74,"line":7351},[72,14785,1037],{"emptyLinePlaceholder":165},[72,14787,14788],{"class":74,"line":7357},[72,14789,6108],{},[72,14791,14792],{"class":74,"line":8480},[72,14793,8712],{},[10,14795,80],{},[63,14797,14799],{"className":14798,"code":8718,"language":86,"meta":68},[84],[33,14800,8718],{"__ignoreMap":68},[10,14802,91],{},[14,14804,94],{"id":94},[96,14806,14807,14811],{},[44,14808,14809,8732],{},[33,14810,8731],{},[44,14812,8735],{},[265,14814,2608],{"id":2608},[10,14816,8740],{},[10,14818,14819],{},[26,14820],{"alt":8745,"src":8746},[10,14822,8749],{},[14,14824,114],{"id":114},[41,14826,14827,14829],{},[44,14828,8756],{},[44,14830,8759],{},[14,14832,128],{"id":128},[96,14834,14835,14837],{},[44,14836,8766],{},[44,14838,8769],{},[10,14840,139],{},[14,14842,142],{"id":142},[10,14844,8776],{},[147,14846,149],{},{"title":68,"searchDepth":151,"depth":151,"links":14848},[14849,14850,14851,14852,14853,14856,14857,14858],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":14854},[14855],{"id":2608,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":8599,"description":8604},[161,8798,8799],{"id":8802,"title":8803,"body":14863,"category":161,"cover":162,"description":8808,"extension":163,"meta":15101,"navigation":165,"path":9109,"pinned":167,"publishedAt":168,"seo":15102,"slug":9111,"stem":9112,"summary":9113,"tags":15103,"updatedAt":168,"visible":165,"__hash__":9117},{"type":7,"value":14864,"toc":15088},[14865,14867,14869,14871,14873,14877,14879,14881,14891,14893,14895,15011,15013,15018,15020,15022,15032,15034,15036,15040,15042,15044,15046,15050,15054,15056,15064,15066,15080,15082,15084,15086],[10,14866,8808],{},[14,14868,16],{"id":16},[10,14870,8813],{},[14,14872,22],{"id":22},[10,14874,14875],{},[26,14876],{"alt":8820,"src":8821},[10,14878,8824],{},[14,14880,39],{"id":39},[41,14882,14883,14885,14887],{},[44,14884,8831],{},[44,14886,8834],{},[44,14888,8837,14889,8841],{},[33,14890,8840],{},[14,14892,58],{"id":58},[10,14894,61],{},[63,14896,14897],{"className":65,"code":8848,"language":67,"meta":68,"style":68},[33,14898,14899,14903,14907,14911,14915,14919,14923,14927,14931,14935,14939,14943,14947,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007],{"__ignoreMap":68},[72,14900,14901],{"class":74,"line":75},[72,14902,6906],{},[72,14904,14905],{"class":74,"line":151},[72,14906,6515],{},[72,14908,14909],{"class":74,"line":361},[72,14910,1037],{"emptyLinePlaceholder":165},[72,14912,14913],{"class":74,"line":367},[72,14914,8867],{},[72,14916,14917],{"class":74,"line":1084},[72,14918,8872],{},[72,14920,14921],{"class":74,"line":1090},[72,14922,8877],{},[72,14924,14925],{"class":74,"line":2398},[72,14926,8882],{},[72,14928,14929],{"class":74,"line":2404},[72,14930,1037],{"emptyLinePlaceholder":165},[72,14932,14933],{"class":74,"line":3864},[72,14934,8891],{},[72,14936,14937],{"class":74,"line":4076},[72,14938,8896],{},[72,14940,14941],{"class":74,"line":5741},[72,14942,8901],{},[72,14944,14945],{"class":74,"line":5746},[72,14946,8906],{},[72,14948,14949],{"class":74,"line":7351},[72,14950,8911],{},[72,14952,14953],{"class":74,"line":7357},[72,14954,1037],{"emptyLinePlaceholder":165},[72,14956,14957],{"class":74,"line":8480},[72,14958,8920],{},[72,14960,14961],{"class":74,"line":8485},[72,14962,8925],{},[72,14964,14965],{"class":74,"line":8928},[72,14966,8931],{},[72,14968,14969],{"class":74,"line":8934},[72,14970,1037],{"emptyLinePlaceholder":165},[72,14972,14973],{"class":74,"line":8939},[72,14974,8942],{},[72,14976,14977],{"class":74,"line":8945},[72,14978,1037],{"emptyLinePlaceholder":165},[72,14980,14981],{"class":74,"line":8950},[72,14982,7324],{},[72,14984,14985],{"class":74,"line":8955},[72,14986,8958],{},[72,14988,14989],{"class":74,"line":8961},[72,14990,8964],{},[72,14992,14993],{"class":74,"line":8967},[72,14994,8970],{},[72,14996,14997],{"class":74,"line":8973},[72,14998,7334],{},[72,15000,15001],{"class":74,"line":8978},[72,15002,8981],{},[72,15004,15005],{"class":74,"line":8984},[72,15006,1087],{},[72,15008,15009],{"class":74,"line":8989},[72,15010,8992],{},[10,15012,80],{},[63,15014,15016],{"className":15015,"code":8998,"language":86,"meta":68},[84],[33,15017,8998],{"__ignoreMap":68},[10,15019,91],{},[14,15021,94],{"id":94},[96,15023,15024,15028],{},[44,15025,9009,15026,9012],{},[33,15027,8840],{},[44,15029,15030,9017],{},[33,15031,8072],{},[265,15033,2608],{"id":2608},[10,15035,9022],{},[10,15037,15038],{},[26,15039],{"alt":9027,"src":9028},[10,15041,9031],{},[265,15043,2608],{"id":4131},[10,15045,9036],{},[10,15047,15048],{},[26,15049],{"alt":9041,"src":9042},[10,15051,9045,15052,9049],{},[33,15053,9048],{},[14,15055,114],{"id":114},[41,15057,15058,15060],{},[44,15059,9056],{},[44,15061,9059,15062,9062],{},[33,15063,9048],{},[14,15065,128],{"id":128},[96,15067,15068,15072,15074],{},[44,15069,9069,15070,9072],{},[33,15071,9048],{},[44,15073,9075],{},[44,15075,9078,15076,9082,15078,9085],{},[33,15077,9081],{},[33,15079,6050],{},[10,15081,139],{},[14,15083,142],{"id":142},[10,15085,9092],{},[147,15087,149],{},{"title":68,"searchDepth":151,"depth":151,"links":15089},[15090,15091,15092,15093,15094,15098,15099,15100],{"id":16,"depth":151,"text":16},{"id":22,"depth":151,"text":22},{"id":39,"depth":151,"text":39},{"id":58,"depth":151,"text":58},{"id":94,"depth":151,"text":94,"children":15095},[15096,15097],{"id":2608,"depth":361,"text":2608},{"id":4131,"depth":361,"text":2608},{"id":114,"depth":151,"text":114},{"id":128,"depth":151,"text":128},{"id":142,"depth":151,"text":142},{},{"title":8803,"description":8808},[161,9115,9116],{"id":995,"title":996,"body":15105,"category":161,"cover":1004,"description":68,"extension":163,"meta":15341,"navigation":165,"path":1323,"pinned":167,"publishedAt":1324,"seo":15342,"slug":1326,"stem":1327,"summary":1328,"tags":15343,"updatedAt":1324,"visible":165,"__hash__":1331},{"type":7,"value":15106,"toc":15326},[15107,15111,15113,15115,15117,15119,15139,15141,15146,15148,15150,15178,15184,15186,15190,15192,15212,15214,15224,15226,15228,15230,15232,15234,15236,15238,15240,15242,15262,15264,15266,15270,15272,15274,15276,15278,15282,15284,15302,15304,15306,15308,15310,15312,15314,15316,15318,15320,15322,15324],[10,15108,15109],{},[26,15110],{"alt":1003,"src":1004},[10,15112,1007],{},[10,15114,1010],{},[14,15116,1014],{"id":1013},[10,15118,1017],{},[63,15120,15121],{"className":65,"code":1020,"language":67,"meta":68,"style":68},[33,15122,15123,15127,15131,15135],{"__ignoreMap":68},[72,15124,15125],{"class":74,"line":75},[72,15126,1027],{},[72,15128,15129],{"class":74,"line":151},[72,15130,1032],{},[72,15132,15133],{"class":74,"line":361},[72,15134,1037],{"emptyLinePlaceholder":165},[72,15136,15137],{"class":74,"line":367},[72,15138,1042],{},[10,15140,1045],{},[63,15142,15144],{"className":15143,"code":1049,"language":86,"meta":68},[84],[33,15145,1049],{"__ignoreMap":68},[10,15147,1054],{},[10,15149,1057],{},[63,15151,15152],{"className":65,"code":1060,"language":67,"meta":68,"style":68},[33,15153,15154,15158,15162,15166,15170,15174],{"__ignoreMap":68},[72,15155,15156],{"class":74,"line":75},[72,15157,1067],{},[72,15159,15160],{"class":74,"line":151},[72,15161,1037],{"emptyLinePlaceholder":165},[72,15163,15164],{"class":74,"line":361},[72,15165,1076],{},[72,15167,15168],{"class":74,"line":367},[72,15169,1081],{},[72,15171,15172],{"class":74,"line":1084},[72,15173,1087],{},[72,15175,15176],{"class":74,"line":1090},[72,15177,1093],{},[10,15179,15180,1099,15182,1103],{},[33,15181,1098],{},[33,15183,1102],{},[14,15185,1107],{"id":1106},[10,15187,1110,15188,1113],{},[33,15189,35],{},[10,15191,1116],{},[63,15193,15194],{"className":65,"code":1119,"language":67,"meta":68,"style":68},[33,15195,15196,15200,15204,15208],{"__ignoreMap":68},[72,15197,15198],{"class":74,"line":75},[72,15199,1126],{},[72,15201,15202],{"class":74,"line":151},[72,15203,1131],{},[72,15205,15206],{"class":74,"line":361},[72,15207,1136],{},[72,15209,15210],{"class":74,"line":367},[72,15211,1141],{},[10,15213,1144],{},[63,15215,15216],{"className":530,"code":1147,"language":532,"meta":68,"style":68},[33,15217,15218],{"__ignoreMap":68},[72,15219,15220,15222],{"class":74,"line":75},[72,15221,630],{"class":539},[72,15223,1156],{"class":575},[10,15225,1159],{},[14,15227,1163],{"id":1162},[265,15229,1166],{"id":1166},[10,15231,1169],{},[265,15233,1172],{"id":1172},[10,15235,1175],{},[265,15237,1178],{"id":1178},[10,15239,1181],{},[10,15241,1184],{},[63,15243,15244],{"className":65,"code":1187,"language":67,"meta":68,"style":68},[33,15245,15246,15250,15254,15258],{"__ignoreMap":68},[72,15247,15248],{"class":74,"line":75},[72,15249,1194],{},[72,15251,15252],{"class":74,"line":151},[72,15253,1037],{"emptyLinePlaceholder":165},[72,15255,15256],{"class":74,"line":361},[72,15257,1203],{},[72,15259,15260],{"class":74,"line":367},[72,15261,1208],{},[10,15263,1211],{},[265,15265,1214],{"id":1214},[10,15267,1217,15268,1220],{},[33,15269,197],{},[10,15271,1223],{},[265,15273,1226],{"id":1226},[10,15275,1229],{},[14,15277,1233],{"id":1232},[10,15279,15280],{},[26,15281],{"alt":1238,"src":1239},[10,15283,1242],{},[41,15285,15286,15288,15290,15292,15294,15296,15298,15300],{},[44,15287,1247],{},[44,15289,1250],{},[44,15291,1253],{},[44,15293,1256],{},[44,15295,1259],{},[44,15297,1262],{},[44,15299,1265],{},[44,15301,1268],{},[10,15303,1271],{},[14,15305,1275],{"id":1274},[10,15307,1278],{},[10,15309,1281],{},[14,15311,1285],{"id":1284},[10,15313,1288],{},[10,15315,1291],{},[10,15317,1294],{},[14,15319,1297],{"id":1297},[10,15321,1300],{},[10,15323,1303],{},[147,15325,1306],{},{"title":68,"searchDepth":151,"depth":151,"links":15327},[15328,15329,15330,15337,15338,15339,15340],{"id":1013,"depth":151,"text":1014},{"id":1106,"depth":151,"text":1107},{"id":1162,"depth":151,"text":1163,"children":15331},[15332,15333,15334,15335,15336],{"id":1166,"depth":361,"text":1166},{"id":1172,"depth":361,"text":1172},{"id":1178,"depth":361,"text":1178},{"id":1214,"depth":361,"text":1214},{"id":1226,"depth":361,"text":1226},{"id":1232,"depth":151,"text":1233},{"id":1274,"depth":151,"text":1275},{"id":1284,"depth":151,"text":1285},{"id":1297,"depth":151,"text":1297},{},{"title":996,"description":68},[161,174,1330],{"id":179,"title":180,"body":15345,"category":161,"cover":162,"description":68,"extension":163,"meta":15924,"navigation":165,"path":984,"pinned":167,"publishedAt":985,"seo":15925,"slug":987,"stem":988,"summary":989,"tags":15926,"updatedAt":985,"visible":165,"__hash__":993},{"type":7,"value":15346,"toc":15900},[15347,15349,15351,15353,15357,15359,15361,15385,15397,15399,15401,15406,15410,15414,15426,15430,15434,15438,15440,15474,15476,15480,15484,15486,15508,15538,15550,15560,15568,15570,15576,15586,15588,15593,15597,15599,15613,15619,15639,15641,15643,15645,15655,15659,15661,15670,15674,15676,15678,15698,15702,15704,15706,15708,15710,15730,15732,15734,15736,15762,15764,15780,15782,15798,15802,15804,15806,15826,15828,15830,15832,15836,15846,15848,15850,15852,15862,15870,15872,15874,15888,15898],[14,15348,185],{"id":185},[10,15350,188],{},[10,15352,191],{},[10,15354,194,15355,198],{},[33,15356,197],{},[14,15358,201],{"id":201},[10,15360,204],{},[206,15362,15363,15365],{},[10,15364,210],{},[206,15366,15367,15373,15375,15379,15381],{},[10,15368,215,15369,219,15371,223],{},[33,15370,218],{},[33,15372,222],{},[10,15374,226],{},[10,15376,229,15377,234],{},[231,15378,233],{},[10,15380,237],{},[10,15382,15383],{},[26,15384],{"alt":242,"src":243},[206,15386,15387,15389],{},[10,15388,248],{},[206,15390,15391,15393],{},[10,15392,253],{},[10,15394,15395],{},[26,15396],{"alt":258,"src":259},[14,15398,263],{"id":262},[265,15400,268],{"id":267},[10,15402,271,15403,279],{},[273,15404,278],{"href":275,"rel":15405},[277],[206,15407,15408],{},[10,15409,284],{},[10,15411,15412],{},[26,15413],{"alt":289,"src":290},[41,15415,15416,15420,15424],{},[44,15417,295,15418,299],{},[231,15419,298],{},[44,15421,302,15422,299],{},[231,15423,305],{},[44,15425,308],{},[10,15427,15428],{},[26,15429],{"alt":313,"src":314},[206,15431,15432],{},[10,15433,319],{},[10,15435,15436],{},[26,15437],{"alt":324,"src":325},[265,15439,329],{"id":328},[206,15441,15442,15446,15450,15470],{},[206,15443,15444],{},[10,15445,336],{},[10,15447,339,15448,343],{},[231,15449,342],{},[63,15451,15452],{"className":65,"code":346,"language":67,"meta":68,"style":68},[33,15453,15454,15458,15462,15466],{"__ignoreMap":68},[72,15455,15456],{"class":74,"line":75},[72,15457,353],{},[72,15459,15460],{"class":74,"line":151},[72,15461,358],{},[72,15463,15464],{"class":74,"line":361},[72,15465,364],{},[72,15467,15468],{"class":74,"line":367},[72,15469,370],{},[10,15471,373,15472,377],{},[231,15473,376],{},[10,15475,380],{},[10,15477,383,15478,386],{},[33,15479,67],{},[10,15481,15482],{},[26,15483],{"alt":391,"src":392},[10,15485,395],{},[206,15487,15488,15490,15494],{},[10,15489,400],{},[10,15491,15492],{},[231,15493,405],{},[206,15495,15496,15500,15504],{},[10,15497,410,15498,413],{},[33,15499,67],{},[10,15501,416,15502,419],{},[33,15503,67],{},[10,15505,422,15506,426],{},[231,15507,425],{},[206,15509,15510,15512,15516],{},[10,15511,431],{},[10,15513,15514],{},[231,15515,436],{},[206,15517,15518,15524,15532,15534],{},[10,15519,15520,444,15522,448],{},[33,15521,443],{},[33,15523,447],{},[10,15525,451,15526,454,15528,458,15530,462],{},[33,15527,443],{},[231,15529,457],{},[231,15531,461],{},[10,15533,465],{},[10,15535,15536,471],{},[231,15537,470],{},[206,15539,15540,15542],{},[10,15541,476],{},[206,15543,15544,15548],{},[10,15545,481,15546,485],{},[231,15547,484],{},[10,15549,488],{},[206,15551,15552,15556],{},[10,15553,493,15554],{},[231,15555,496],{},[10,15557,15558],{},[26,15559],{"alt":501,"src":502},[206,15561,15562,15564],{},[10,15563,507],{},[10,15565,15566],{},[26,15567],{"alt":501,"src":512},[265,15569,516],{"id":515},[10,15571,519,15572,523,15574,527],{},[33,15573,522],{},[33,15575,526],{},[63,15577,15578],{"className":530,"code":531,"language":532,"meta":68,"style":68},[33,15579,15580],{"__ignoreMap":68},[72,15581,15582,15584],{"class":74,"line":75},[72,15583,67],{"class":539},[72,15585,543],{"class":542},[10,15587,546],{},[63,15589,15591],{"className":15590,"code":550,"language":86,"meta":68},[84],[33,15592,550],{"__ignoreMap":68},[10,15594,15595],{},[26,15596],{"alt":501,"src":557},[10,15598,560],{},[63,15600,15601],{"className":530,"code":563,"language":532,"meta":68,"style":68},[33,15602,15603],{"__ignoreMap":68},[72,15604,15605,15607,15609,15611],{"class":74,"line":75},[72,15606,67],{"class":539},[72,15608,572],{"class":542},[72,15610,576],{"class":575},[72,15612,543],{"class":542},[10,15614,581,15615,584,15617,588],{},[33,15616,67],{},[33,15618,587],{},[63,15620,15621],{"className":530,"code":591,"language":532,"meta":68,"style":68},[33,15622,15623,15629],{"__ignoreMap":68},[72,15624,15625,15627],{"class":74,"line":75},[72,15626,447],{"class":539},[72,15628,543],{"class":542},[72,15630,15631,15633,15635,15637],{"class":74,"line":151},[72,15632,447],{"class":539},[72,15634,572],{"class":542},[72,15636,576],{"class":575},[72,15638,543],{"class":542},[14,15640,613],{"id":612},[265,15642,617],{"id":616},[10,15644,620],{},[63,15646,15647],{"className":530,"code":623,"language":532,"meta":68,"style":68},[33,15648,15649],{"__ignoreMap":68},[72,15650,15651,15653],{"class":74,"line":75},[72,15652,630],{"class":539},[72,15654,543],{"class":542},[10,15656,635,15657,639],{},[33,15658,638],{},[265,15660,643],{"id":642},[10,15662,271,15663,651,15666,299,15668,658],{},[273,15664,650],{"href":648,"rel":15665},[277],[231,15667,654],{},[33,15669,657],{},[10,15671,661,15672,665],{},[33,15673,664],{},[265,15675,669],{"id":668},[10,15677,672],{},[63,15679,15680],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,15681,15682,15688],{"__ignoreMap":68},[72,15683,15684,15686],{"class":74,"line":75},[72,15685,630],{"class":539},[72,15687,543],{"class":542},[72,15689,15690,15692,15694,15696],{"class":74,"line":151},[72,15691,630],{"class":539},[72,15693,572],{"class":542},[72,15695,576],{"class":575},[72,15697,543],{"class":542},[10,15699,696,15700,699],{},[33,15701,630],{},[14,15703,703],{"id":702},[10,15705,706],{},[265,15707,710],{"id":709},[10,15709,713],{},[63,15711,15712],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,15713,15714,15720],{"__ignoreMap":68},[72,15715,15716,15718],{"class":74,"line":75},[72,15717,630],{"class":539},[72,15719,543],{"class":542},[72,15721,15722,15724,15726,15728],{"class":74,"line":151},[72,15723,630],{"class":539},[72,15725,572],{"class":542},[72,15727,576],{"class":575},[72,15729,543],{"class":542},[10,15731,736],{},[265,15733,740],{"id":739},[10,15735,743],{},[63,15737,15738],{"className":530,"code":746,"language":532,"meta":68,"style":68},[33,15739,15740,15748],{"__ignoreMap":68},[72,15741,15742,15744,15746],{"class":74,"line":75},[72,15743,753],{"class":539},[72,15745,756],{"class":575},[72,15747,759],{"class":575},[72,15749,15750,15752,15754,15756,15758,15760],{"class":74,"line":151},[72,15751,753],{"class":539},[72,15753,756],{"class":575},[72,15755,768],{"class":575},[72,15757,771],{"class":575},[72,15759,774],{"class":575},[72,15761,777],{"class":575},[10,15763,780],{},[63,15765,15766],{"className":530,"code":783,"language":532,"meta":68,"style":68},[33,15767,15768],{"__ignoreMap":68},[72,15769,15770,15772,15774,15776,15778],{"class":74,"line":75},[72,15771,753],{"class":539},[72,15773,792],{"class":575},[72,15775,768],{"class":575},[72,15777,771],{"class":575},[72,15779,799],{"class":575},[10,15781,802],{},[63,15783,15784],{"className":530,"code":805,"language":532,"meta":68,"style":68},[33,15785,15786],{"__ignoreMap":68},[72,15787,15788,15790,15792,15794,15796],{"class":74,"line":75},[72,15789,753],{"class":539},[72,15791,814],{"class":575},[72,15793,817],{"class":542},[72,15795,820],{"class":575},[72,15797,823],{"class":575},[10,15799,15800,828],{},[33,15801,753],{},[265,15803,832],{"id":831},[10,15805,835],{},[63,15807,15808],{"className":530,"code":675,"language":532,"meta":68,"style":68},[33,15809,15810,15816],{"__ignoreMap":68},[72,15811,15812,15814],{"class":74,"line":75},[72,15813,630],{"class":539},[72,15815,543],{"class":542},[72,15817,15818,15820,15822,15824],{"class":74,"line":151},[72,15819,630],{"class":539},[72,15821,572],{"class":542},[72,15823,576],{"class":575},[72,15825,543],{"class":542},[10,15827,858],{},[14,15829,861],{"id":861},[265,15831,865],{"id":864},[10,15833,868,15834,872],{},[33,15835,871],{},[96,15837,15838,15842,15844],{},[44,15839,877,15840,880],{},[33,15841,587],{},[44,15843,883],{},[44,15845,886],{},[10,15847,889],{},[265,15849,893],{"id":892},[10,15851,896],{},[63,15853,15854],{"className":530,"code":623,"language":532,"meta":68,"style":68},[33,15855,15856],{"__ignoreMap":68},[72,15857,15858,15860],{"class":74,"line":75},[72,15859,630],{"class":539},[72,15861,543],{"class":542},[10,15863,909,15864,912,15866,915,15868,299],{},[33,15865,630],{},[33,15867,67],{},[33,15869,630],{},[265,15871,921],{"id":920},[10,15873,924],{},[63,15875,15876],{"className":530,"code":927,"language":532,"meta":68,"style":68},[33,15877,15878],{"__ignoreMap":68},[72,15879,15880,15882,15884,15886],{"class":74,"line":75},[72,15881,630],{"class":539},[72,15883,572],{"class":542},[72,15885,576],{"class":575},[72,15887,543],{"class":542},[10,15889,942,15890,945,15892,948,15894,951,15896,955],{},[33,15891,630],{},[33,15893,67],{},[33,15895,447],{},[33,15897,954],{},[147,15899,958],{},{"title":68,"searchDepth":151,"depth":151,"links":15901},[15902,15903,15904,15909,15914,15919],{"id":185,"depth":151,"text":185},{"id":201,"depth":151,"text":201},{"id":262,"depth":151,"text":263,"children":15905},[15906,15907,15908],{"id":267,"depth":361,"text":268},{"id":328,"depth":361,"text":329},{"id":515,"depth":361,"text":516},{"id":612,"depth":151,"text":613,"children":15910},[15911,15912,15913],{"id":616,"depth":361,"text":617},{"id":642,"depth":361,"text":643},{"id":668,"depth":361,"text":669},{"id":702,"depth":151,"text":703,"children":15915},[15916,15917,15918],{"id":709,"depth":361,"text":710},{"id":739,"depth":361,"text":740},{"id":831,"depth":361,"text":832},{"id":861,"depth":151,"text":861,"children":15920},[15921,15922,15923],{"id":864,"depth":361,"text":865},{"id":892,"depth":361,"text":893},{"id":920,"depth":361,"text":921},{},{"title":180,"description":68},[161,991,992],1786973363805]