[{"data":1,"prerenderedAt":15979},["ShallowReactive",2],{"post-python-csv-tables":3,"sidebar-posts":254,"post-related-source":9170},{"id":4,"title":5,"body":6,"category":239,"cover":240,"description":12,"extension":241,"meta":242,"navigation":93,"path":243,"pinned":244,"publishedAt":245,"seo":246,"slug":247,"stem":248,"summary":249,"tags":250,"updatedAt":245,"visible":93,"__hash__":253},"posts\u002Fposts\u002F20260817\u002F32-python-csv-tables.md","32｜使用 CSV 读写表格数据",{"type":7,"value":8,"toc":229},"minimark",[9,13,17,20,23,30,37,40,65,68,71,154,157,165,168,171,188,191,205,208,216,219,222,225],[10,11,12],"p",{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、13、30 篇。学完后，你应该能够按表头字段读写简单二维数据。",[14,15,16],"h2",{"id":16},"本篇要解决的问题",[10,18,19],{},"本篇只处理“使用 CSV 读写表格数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,21,22],{"id":22},"先看清一个容易误解的细节",[10,24,25],{},[26,27],"img",{"alt":28,"src":29},"CSV 表头映射每行字段","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F32-csv-rows.svg",[10,31,32,36],{},[33,34,35],"code",{},"DictReader"," 使用第一行表头作为键，把后续每一行映射成字典。CSV 单元格读入后默认都是字符串。",[14,38,39],{"id":39},"核心概念",[41,42,43,55,62],"ul",{},[44,45,46,47,50,51,54],"li",{},"使用 ",[33,48,49],{},"newline=\"\""," 让 ",[33,52,53],{},"csv"," 模块正确处理换行。",[44,56,57,58,61],{},"字段顺序由 ",[33,59,60],{},"fieldnames"," 决定，字典键需要与字段名一致。",[44,63,64],{},"复杂嵌套数据更适合 JSON，规则二维表更适合 CSV。",[14,66,67],{"id":67},"跟着示例运行",[10,69,70],{},"把下面代码保存到本课脚本并运行：",[72,73,78],"pre",{"className":74,"code":75,"language":76,"meta":77,"style":77},"language-python shiki shiki-themes github-dark","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","python","",[33,79,80,88,95,101,107,113,119,125,130,136,142,148],{"__ignoreMap":77},[81,82,85],"span",{"class":83,"line":84},"line",1,[81,86,87],{},"import csv\n",[81,89,91],{"class":83,"line":90},2,[81,92,94],{"emptyLinePlaceholder":93},true,"\n",[81,96,98],{"class":83,"line":97},3,[81,99,100],{},"writer_file = open(\"scores.csv\", \"w\", encoding=\"utf-8\", newline=\"\")\n",[81,102,104],{"class":83,"line":103},4,[81,105,106],{},"writer = csv.DictWriter(writer_file, fieldnames=[\"name\", \"score\"])\n",[81,108,110],{"class":83,"line":109},5,[81,111,112],{},"writer.writeheader()\n",[81,114,116],{"class":83,"line":115},6,[81,117,118],{},"writer.writerow({\"name\": \"小郑\", \"score\": 95})\n",[81,120,122],{"class":83,"line":121},7,[81,123,124],{},"writer_file.close()\n",[81,126,128],{"class":83,"line":127},8,[81,129,94],{"emptyLinePlaceholder":93},[81,131,133],{"class":83,"line":132},9,[81,134,135],{},"reader_file = open(\"scores.csv\", \"r\", encoding=\"utf-8\", newline=\"\")\n",[81,137,139],{"class":83,"line":138},10,[81,140,141],{},"for row in csv.DictReader(reader_file):\n",[81,143,145],{"class":83,"line":144},11,[81,146,147],{},"    print(row[\"name\"], row[\"score\"])\n",[81,149,151],{"class":83,"line":150},12,[81,152,153],{},"reader_file.close()\n",[10,155,156],{},"预期结果：",[72,158,163],{"className":159,"code":161,"language":162,"meta":77},[160],"language-text","小郑 95\n","text",[33,164,161],{"__ignoreMap":77},[10,166,167],{},"输出中包含环境路径、集合元素或日志格式时，具体文字和顺序可能随本机环境变化；判断是否成功应以本篇说明的关键结果为准。",[14,169,170],{"id":170},"按执行顺序拆开看",[172,173,174,183],"ol",{},[44,175,176,179,180,182],{},[33,177,178],{},"DictWriter"," 按 ",[33,181,60],{}," 写表头，再按同一字段顺序取出字典值形成数据行。",[44,184,185,187],{},[33,186,35],{}," 读取表头，并把每行单元格映射为字符串值的字典。",[14,189,190],{"id":190},"初学者容易混淆的地方",[41,192,193,196],{},[44,194,195],{},"假设分数字段读取后自动成为整数，CSV 没有这种类型信息。",[44,197,198,199,201,202,204],{},"在 macOS 以外环境忽略 ",[33,200,49],{}," 可能出现额外空行；统一交给 ",[33,203,53],{}," 模块管理换行。",[14,206,207],{"id":207},"练习",[172,209,210,213],{},[44,211,212],{},"写入三名学习者的课程和分数。",[44,214,215],{},"读取 CSV 后把分数字符串转换为整数。",[10,217,218],{},"练习应先独立完成，再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力，不要求提前搜索复杂写法。",[14,220,221],{"id":221},"本篇边界",[10,223,224],{},"本篇目标是按表头字段读写简单二维数据。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,227,228],"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":77,"searchDepth":90,"depth":90,"links":230},[231,232,233,234,235,236,237,238],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},"Python",null,"md",{},"\u002Fposts\u002F20260817\u002F32-python-csv-tables",false,"2026-08-17",{"title":5,"description":12},"python-csv-tables","posts\u002F20260817\u002F32-python-csv-tables","面向按顺序学习 Python 的初学者，本篇在第 11、13、30 篇知识上，帮助读者按表头字段读写简单二维数据。",[239,251,252],"CSV","表格数据","60GY8huX9TNwur3EjQ2eQNuZAfg16XjFP7H_4hGk_K8",[255,1069,1406,1540,1692,1871,2059,2224,2407,2588,2781,3012,3196,3373,3530,3701,3866,4080,4308,4490,4654,4843,5031,5186,5346,5543,5740,5952,6119,6363,6544,6749,6944,7128,7283,7573,7765,7994,8189,8409,8649,8853],{"id":256,"title":257,"body":258,"category":239,"cover":240,"description":77,"extension":241,"meta":1058,"navigation":93,"path":1059,"pinned":244,"publishedAt":1060,"seo":1061,"slug":1062,"stem":1063,"summary":1064,"tags":1065,"updatedAt":1060,"visible":93,"__hash__":1068},"posts\u002Fposts\u002F20260717\u002Fpython-environment-installation.md","Python 环境安装",{"type":7,"value":259,"toc":1034},[260,263,266,269,276,279,282,321,337,341,346,357,362,368,386,392,397,403,407,453,456,462,468,471,502,547,564,578,588,592,603,619,622,628,633,636,654,664,685,689,693,696,708,715,719,734,741,745,748,769,775,779,782,786,789,809,812,816,819,853,856,875,878,899,904,908,911,931,934,937,941,948,962,965,969,972,982,993,997,1000,1015,1031],[14,261,262],{"id":262},"引言",[10,264,265],{},"这一节面向 Python 初学者，介绍在 Windows、macOS、Linux 三个平台上安装 Python 解释器的方法。",[10,267,268],{},"学习 Python 的第一步，就是先准备好一个能运行代码的环境。在这之前，你写的任何代码都没办法跑起来，所以这一步非常关键。",[10,270,271,272,275],{},"安装完成后，我们会打开终端，输入一条命令验证 Python 是否安装成功，同时确认 ",[33,273,274],{},"pip"," 这个包管理工具也能正常使用——后续安装各种库，都要靠它来完成。",[14,277,278],{"id":278},"扫盲",[10,280,281],{},"那么这里有几个概念：",[283,284,285,288],"blockquote",{},[10,286,287],{},"为什么需要安装python解释器？",[283,289,290,301,304,312,315],{},[10,291,292,293,296,297,300],{},"我们写的代码，电脑其实看不懂，电脑只认识",[33,294,295],{},"0","和",[33,298,299],{},"1","组成的机器指令。",[10,302,303],{},"那么python解释器的作用就是充当中间的翻译官，当我们在电脑上运行python代码，python解释器充当翻译官，当我们执行脚本，翻译官就会将python代码翻译成机器的0和1。",[10,305,306,307,311],{},"这样，我们就能用",[308,309,310],"strong",{},"人类能读懂的语言","来写代码，再由 Python 这个翻译官，把它翻译成机器能听懂的指令去执行——我们和计算机之间的\"语言障碍\"，就这么被解决了。",[10,313,314],{},"相当于我们的电脑要打开表格，需要安装excel。",[10,316,317],{},[26,318],{"alt":319,"src":320},"图1","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161622-%E5%9B%BE1.png",[283,322,323,326],{},[10,324,325],{},"pip又是什么？",[283,327,328,331],{},[10,329,330],{},"pip相当于插件市场，python除了我们自己写代码，还可以下载别人的代码库，来直接调用别人写好的优秀的方法。比如安装了requests库，未来我们就可以用程序模拟浏览器去访问网页。",[10,332,333],{},[26,334],{"alt":335,"src":336},"图2","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717172846-%E5%9B%BE2.png",[14,338,340],{"id":339},"windows-安装","Windows 安装",[342,343,345],"h3",{"id":344},"_1-下载官方安装程序","1. 下载官方安装程序",[10,347,348,349,356],{},"打开 ",[350,351,355],"a",{"href":352,"rel":353},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fwindows\u002F",[354],"nofollow","Python Windows 下载页","，选择当前稳定版对应的 Windows installer：",[283,358,359],{},[10,360,361],{},"本次以 Python 3 稳定版下载流程为准。Python 官网会持续更新补丁版本，安装时选择下载页当前提供的最新 Python 3 稳定版即可",[10,363,364],{},[26,365],{"alt":366,"src":367},"Python Windows 下载页面","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717123049-image.png",[41,369,370,377,383],{},[44,371,372,373,376],{},"大多数 Intel 或 AMD 处理器的电脑选择 ",[308,374,375],{},"Windows installer (64-bit)","。",[44,378,379,380,376],{},"搭载 ARM 处理器的 Windows 设备选择 ",[308,381,382],{},"Windows installer (ARM64)",[44,384,385],{},"只有明确使用 32 位 Windows 时才选择 32 位安装程序。",[10,387,388],{},[26,389],{"alt":390,"src":391},"Windows 安装程序类型","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120221-image.png",[283,393,394],{},[10,395,396],{},"我的电脑是 64 位，所以下载 Windows installer (64-bit)。",[10,398,399],{},[26,400],{"alt":401,"src":402},"Windows 64 位安装程序下载入口","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717120550-image.png",[342,404,406],{"id":405},"_2-安装并加入-path","2. 安装并加入 PATH",[283,408,409,414,421,446],{},[283,410,411],{},[10,412,413],{},"PATH 环境变量",[10,415,416,417,420],{},"Windows 有一个特殊的变量叫 ",[308,418,419],{},"PATH","，它里面存了一串文件夹路径，比如：",[72,422,424],{"className":74,"code":423,"language":76,"meta":77,"style":77},"D:\\Python313\\\nD:\\Python313\\Scripts\\\nC:\\Windows\\System32\\\n...\n",[33,425,426,431,436,441],{"__ignoreMap":77},[81,427,428],{"class":83,"line":84},[81,429,430],{},"D:\\Python313\\\n",[81,432,433],{"class":83,"line":90},[81,434,435],{},"D:\\Python313\\Scripts\\\n",[81,437,438],{"class":83,"line":97},[81,439,440],{},"C:\\Windows\\System32\\\n",[81,442,443],{"class":83,"line":103},[81,444,445],{},"...\n",[10,447,448,449,452],{},"我们每次在终端输一个命令，Windows 就拿着这个名字，",[308,450,451],{},"挨个去 PATH 里的文件夹翻","，找到了就执行，找不到就报错。",[10,454,455],{},"双击下载的安装程序。在安装界面中，勾选 底部两个选项，然后选择自定义安装。",[10,457,458,459,461],{},"PATH 是系统查找可执行程序时使用的一组目录。勾选后，Windows 才能在新的终端窗口中直接找到 ",[33,460,76],{}," 命令。不同 Python 安装器的界面文字可能略有差异，但目标都是让 Python 命令进入 PATH。",[10,463,464],{},[26,465],{"alt":466,"src":467},"未命名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717154915-%E6%9C%AA%E5%91%BD%E5%90%8D.png",[10,469,470],{},"对安装界面最底部的两个勾选项分别解释 :",[283,472,473,476,481],{},[10,474,475],{},"Add python.exe to PATH",[10,477,478],{},[308,479,480],{},"把 Python 添加到系统环境变量",[283,482,483,489,495],{},[10,484,485,486,488],{},"勾选后，你可以在命令行任意位置直接输入 ",[33,487,76],{}," 就能运行",[10,490,491,492,494],{},"不勾选的话，命令行输入 ",[33,493,76],{}," 会提示**\"找不到命令\"**，非常麻烦",[10,496,497,498,501],{},"必须",[308,499,500],{},"勾选","，这是最重要的一个选项，新手最容易忘记打勾",[283,503,504,507,512],{},[10,505,506],{},"Use admin privileges when installing py.exe",[10,508,509],{},[308,510,511],{},"使用管理员权限安装 py.exe（Python 启动器）",[283,513,514,524,538,541],{},[10,515,516,519,520,523],{},[33,517,518],{},"py.exe"," 是 Windows 专属的 Python 启动器，可以让你在命令行输入 ",[33,521,522],{},"py"," 来启动 Python。",[10,525,526,527,529,530,533,534,537],{},"勾选后，",[33,528,518],{}," 会安装到",[308,531,532],{},"系统级目录","，电脑上",[308,535,536],{},"所有用户账户","都能用",[10,539,540],{},"不勾选，只有当前用户能用",[10,542,543,546],{},[308,544,545],{},"建议勾选","，权限更完整，避免后续出现奇怪的权限问题",[283,548,549,552],{},[10,550,551],{},"操作建议",[283,553,554,561],{},[10,555,556,557,560],{},"两个都勾上之后，再点 ",[308,558,559],{},"\"Customize installation\""," 去修改安装路径到 D 盘，不要直接点 \"Install Now\"，否则会装到 C 盘。",[10,562,563],{},"系统文件归 C 盘，自己装的软件和项目归 D 盘，分类清晰，以后管理方便。",[283,565,566,572],{},[10,567,568,569],{},"Python 安装的",[308,570,571],{},"可选功能页",[10,573,574],{},[26,575],{"alt":576,"src":577},"image","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161424-image.png",[283,579,580,583],{},[10,581,582],{},"高级选项页",[10,584,585],{},[26,586],{"alt":576,"src":587},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717161340-image.png",[342,589,591],{"id":590},"_3-检查-windows-环境","3. 检查 Windows 环境",[10,593,594,595,598,599,602],{},"按 ",[33,596,597],{},"Win + R","，输入 ",[33,600,601],{},"cmd"," 并回车，然后执行：",[72,604,608],{"className":605,"code":606,"language":607,"meta":77,"style":77},"language-bash shiki shiki-themes github-dark","python --version\n","bash",[33,609,610],{"__ignoreMap":77},[81,611,612,615],{"class":83,"line":84},[81,613,76],{"class":614},"svObZ",[81,616,618],{"class":617},"sDLfK"," --version\n",[10,620,621],{},"正常情况下会看到类似下面的输出，具体补丁版本以实际安装结果为准：",[72,623,626],{"className":624,"code":625,"language":162,"meta":77},[160],"Python 3.x.x\n",[33,627,625],{"__ignoreMap":77},[10,629,630],{},[26,631],{"alt":576,"src":632},"https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260717\u002F20260717155647-image.png",[10,634,635],{},"继续检查 pip：",[72,637,639],{"className":605,"code":638,"language":607,"meta":77,"style":77},"python -m pip --version\n",[33,640,641],{"__ignoreMap":77},[81,642,643,645,648,652],{"class":83,"line":84},[81,644,76],{"class":614},[81,646,647],{"class":617}," -m",[81,649,651],{"class":650},"sU2Wk"," pip",[81,653,618],{"class":617},[10,655,656,657,659,660,663],{},"如果 ",[33,658,76],{}," 无法识别，但 ",[33,661,662],{},"py --version"," 可以输出版本号，后续也可以使用 Windows Python Launcher：",[72,665,667],{"className":605,"code":666,"language":607,"meta":77,"style":77},"py --version\npy -m pip --version\n",[33,668,669,675],{"__ignoreMap":77},[81,670,671,673],{"class":83,"line":84},[81,672,522],{"class":614},[81,674,618],{"class":617},[81,676,677,679,681,683],{"class":83,"line":90},[81,678,522],{"class":614},[81,680,647],{"class":617},[81,682,651],{"class":650},[81,684,618],{"class":617},[14,686,688],{"id":687},"macos-安装","macOS 安装",[342,690,692],{"id":691},"_1-先检查现有环境","1. 先检查现有环境",[10,694,695],{},"打开“终端”应用，执行：",[72,697,699],{"className":605,"code":698,"language":607,"meta":77,"style":77},"python3 --version\n",[33,700,701],{"__ignoreMap":77},[81,702,703,706],{"class":83,"line":84},[81,704,705],{"class":614},"python3",[81,707,618],{"class":617},[10,709,710,711,714],{},"如果已经输出符合学习要求的 Python 3 版本，可以继续执行 ",[33,712,713],{},"python3 -m pip --version","。两条命令都正常时，无需重复安装。",[342,716,718],{"id":717},"_2-下载-macos-官方安装包","2. 下载 macOS 官方安装包",[10,720,348,721,726,727,376,730,733],{},[350,722,725],{"href":723,"rel":724},"https:\u002F\u002Fwww.python.org\u002Fdownloads\u002Fmacos\u002F",[354],"Python macOS 下载页","，下载当前稳定版的 ",[308,728,729],{},"macOS 64-bit universal2 installer",[33,731,732],{},"universal2"," 安装包同时支持 Apple 芯片和 Intel 芯片 Mac。",[10,735,736,737,740],{},"下载完成后打开 ",[33,738,739],{},".pkg"," 文件，按照安装器提示完成安装。使用官网安装包时，系统可能要求输入当前 macOS 用户的登录密码，用于授权写入系统级安装目录。",[342,742,744],{"id":743},"_3-检查-macos-环境","3. 检查 macOS 环境",[10,746,747],{},"安装完成后重新打开终端，执行：",[72,749,751],{"className":605,"code":750,"language":607,"meta":77,"style":77},"python3 --version\npython3 -m pip --version\n",[33,752,753,759],{"__ignoreMap":77},[81,754,755,757],{"class":83,"line":84},[81,756,705],{"class":614},[81,758,618],{"class":617},[81,760,761,763,765,767],{"class":83,"line":90},[81,762,705],{"class":614},[81,764,647],{"class":617},[81,766,651],{"class":650},[81,768,618],{"class":617},[10,770,771,772,774],{},"正常情况下，两条命令都会显示版本信息。macOS 中建议始终使用 ",[33,773,705],{},"，不要为了缩短命令而修改或覆盖系统自带工具。",[14,776,778],{"id":777},"linux-安装","Linux 安装",[10,780,781],{},"Linux 发行版通常通过系统包管理器维护 Python。仓库中的版本可能落后于 Python 官网的最新补丁版，但会与当前系统的软件依赖和安全更新保持一致。对于本系列的入门代码，优先使用发行版仓库版本，安装和维护都更稳妥。",[342,783,785],{"id":784},"_1-检查是否已经安装","1. 检查是否已经安装",[10,787,788],{},"打开终端，执行：",[72,790,791],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,792,793,799],{"__ignoreMap":77},[81,794,795,797],{"class":83,"line":84},[81,796,705],{"class":614},[81,798,618],{"class":617},[81,800,801,803,805,807],{"class":83,"line":90},[81,802,705],{"class":614},[81,804,647],{"class":617},[81,806,651],{"class":650},[81,808,618],{"class":617},[10,810,811],{},"不少 Linux 系统已经包含 Python 3。如果第一条命令有输出、第二条命令提示没有 pip，只安装 pip 和虚拟环境支持即可。",[342,813,815],{"id":814},"_2-使用发行版包管理器安装","2. 使用发行版包管理器安装",[10,817,818],{},"Ubuntu 或 Debian：",[72,820,822],{"className":605,"code":821,"language":607,"meta":77,"style":77},"sudo apt update\nsudo apt install python3 python3-pip python3-venv\n",[33,823,824,835],{"__ignoreMap":77},[81,825,826,829,832],{"class":83,"line":84},[81,827,828],{"class":614},"sudo",[81,830,831],{"class":650}," apt",[81,833,834],{"class":650}," update\n",[81,836,837,839,841,844,847,850],{"class":83,"line":90},[81,838,828],{"class":614},[81,840,831],{"class":650},[81,842,843],{"class":650}," install",[81,845,846],{"class":650}," python3",[81,848,849],{"class":650}," python3-pip",[81,851,852],{"class":650}," python3-venv\n",[10,854,855],{},"Fedora：",[72,857,859],{"className":605,"code":858,"language":607,"meta":77,"style":77},"sudo dnf install python3 python3-pip\n",[33,860,861],{"__ignoreMap":77},[81,862,863,865,868,870,872],{"class":83,"line":84},[81,864,828],{"class":614},[81,866,867],{"class":650}," dnf",[81,869,843],{"class":650},[81,871,846],{"class":650},[81,873,874],{"class":650}," python3-pip\n",[10,876,877],{},"Arch Linux：",[72,879,881],{"className":605,"code":880,"language":607,"meta":77,"style":77},"sudo pacman -S python python-pip\n",[33,882,883],{"__ignoreMap":77},[81,884,885,887,890,893,896],{"class":83,"line":84},[81,886,828],{"class":614},[81,888,889],{"class":650}," pacman",[81,891,892],{"class":617}," -S",[81,894,895],{"class":650}," python",[81,897,898],{"class":650}," python-pip\n",[10,900,901,903],{},[33,902,828],{}," 会要求输入当前 Linux 用户的密码。执行前应确认该用户具备管理员权限，不要从来历不明的网页复制带有删除或覆盖操作的命令。",[342,905,907],{"id":906},"_3-检查-linux-环境","3. 检查 Linux 环境",[10,909,910],{},"安装结束后执行：",[72,912,913],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,914,915,921],{"__ignoreMap":77},[81,916,917,919],{"class":83,"line":84},[81,918,705],{"class":614},[81,920,618],{"class":617},[81,922,923,925,927,929],{"class":83,"line":90},[81,924,705],{"class":614},[81,926,647],{"class":617},[81,928,651],{"class":650},[81,930,618],{"class":617},[10,932,933],{},"看到 Python 3 和 pip 的版本信息，说明基础环境已经可用。",[14,935,936],{"id":936},"常见问题",[342,938,940],{"id":939},"windows-提示python-不是内部或外部命令","Windows 提示“python 不是内部或外部命令”",[10,942,943,944,947],{},"先关闭当前命令提示符并重新打开，再执行 ",[33,945,946],{},"python --version","。如果仍然失败，按下面的顺序检查：",[172,949,950,956,959],{},[44,951,952,953,955],{},"执行 ",[33,954,662],{},"，确认 Python Launcher 是否可用。",[44,957,958],{},"在 Windows 的“已安装的应用”中确认 Python 已经安装。",[44,960,961],{},"重新运行官方安装程序，选择修改安装，并启用将 Python 加入 PATH 的选项。",[10,963,964],{},"不要仅为解决命令问题而从非官方网站重新下载 Python。",[342,966,968],{"id":967},"macos-或-linux-提示python-command-not-found","macOS 或 Linux 提示“python: command not found”",[10,970,971],{},"先尝试：",[72,973,974],{"className":605,"code":698,"language":607,"meta":77,"style":77},[33,975,976],{"__ignoreMap":77},[81,977,978,980],{"class":83,"line":84},[81,979,705],{"class":614},[81,981,618],{"class":617},[10,983,984,985,987,988,990,991,376],{},"在这两个系统中，只有 ",[33,986,705],{}," 命令而没有 ",[33,989,76],{}," 命令通常是正常情况。本系列在 macOS 和 Linux 上统一使用 ",[33,992,705],{},[342,994,996],{"id":995},"python-有版本输出但-pip-不可用","Python 有版本输出，但 pip 不可用",[10,998,999],{},"先使用模块方式检查：",[72,1001,1003],{"className":605,"code":1002,"language":607,"meta":77,"style":77},"python3 -m pip --version\n",[33,1004,1005],{"__ignoreMap":77},[81,1006,1007,1009,1011,1013],{"class":83,"line":84},[81,1008,705],{"class":614},[81,1010,647],{"class":617},[81,1012,651],{"class":650},[81,1014,618],{"class":617},[10,1016,1017,1018,1020,1021,1023,1024,1026,1027,1030],{},"Windows 用户将命令中的 ",[33,1019,705],{}," 换成 ",[33,1022,76],{}," 或 ",[33,1025,522],{},"。Linux 用户如果仍然提示缺少 pip，可以通过当前发行版的包管理器安装 ",[33,1028,1029],{},"python3-pip","；不要直接使用其他系统的安装命令。",[226,1032,1033],{},"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":77,"searchDepth":90,"depth":90,"links":1035},[1036,1037,1038,1043,1048,1053],{"id":262,"depth":90,"text":262},{"id":278,"depth":90,"text":278},{"id":339,"depth":90,"text":340,"children":1039},[1040,1041,1042],{"id":344,"depth":97,"text":345},{"id":405,"depth":97,"text":406},{"id":590,"depth":97,"text":591},{"id":687,"depth":90,"text":688,"children":1044},[1045,1046,1047],{"id":691,"depth":97,"text":692},{"id":717,"depth":97,"text":718},{"id":743,"depth":97,"text":744},{"id":777,"depth":90,"text":778,"children":1049},[1050,1051,1052],{"id":784,"depth":97,"text":785},{"id":814,"depth":97,"text":815},{"id":906,"depth":97,"text":907},{"id":936,"depth":90,"text":936,"children":1054},[1055,1056,1057],{"id":939,"depth":97,"text":940},{"id":967,"depth":97,"text":968},{"id":995,"depth":97,"text":996},{},"\u002Fposts\u002F20260717\u002Fpython-environment-installation","2026-07-17",{"title":257,"description":77},"python-environment-installation","posts\u002F20260717\u002Fpython-environment-installation","面向准备学习 Python 和爬虫的零基础读者，介绍 Windows、macOS 与常见 Linux 发行版的 Python 安装方法，并通过版本和 pip 命令检查环境是否可用。",[239,1066,1067],"环境搭建","爬虫入门","7N6OEzHY07pQJSD-Dpbm4vAePZra5Hx37AfZ4hvD_Uk",{"id":1070,"title":1071,"body":1072,"category":239,"cover":1079,"description":77,"extension":241,"meta":1395,"navigation":93,"path":1396,"pinned":244,"publishedAt":1397,"seo":1398,"slug":1399,"stem":1400,"summary":1401,"tags":1402,"updatedAt":1397,"visible":93,"__hash__":1405},"posts\u002Fposts\u002F20260815\u002Fpython-introduction.md","Python介绍",{"type":7,"value":1073,"toc":1380},[1074,1080,1083,1086,1090,1093,1117,1120,1126,1129,1132,1166,1176,1180,1187,1190,1215,1218,1230,1233,1237,1240,1243,1246,1249,1252,1255,1258,1282,1285,1288,1294,1297,1300,1303,1307,1313,1316,1342,1345,1349,1352,1355,1359,1362,1365,1368,1371,1374,1377],[10,1075,1076],{},[26,1077],{"alt":1078,"src":1079},"Python 编程语言介绍","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fcovers\u002Fpython-introduction.png",[10,1081,1082],{},"如果只用一句话介绍 Python，可以这样说：它是一门语法简洁、应用范围广，而且比较容易上手的编程语言。",[10,1084,1085],{},"Python 不要求开发者一开始就处理复杂的底层细节。编写代码时，我们通常更关注“程序需要完成什么”，例如整理文件、处理数据或者调用接口，而不必过早考虑内存分配和机器指令。这种设计降低了入门难度，也提高了开发效率。",[14,1087,1089],{"id":1088},"python-代码是什么样的","Python 代码是什么样的",[10,1091,1092],{},"下面是一段简单的 Python 代码：",[72,1094,1096],{"className":74,"code":1095,"language":76,"meta":77,"style":77},"name = \"Python\"\nyear = 2026\n\nprint(f\"正在学习 {name}，当前年份是 {year}\")\n",[33,1097,1098,1103,1108,1112],{"__ignoreMap":77},[81,1099,1100],{"class":83,"line":84},[81,1101,1102],{},"name = \"Python\"\n",[81,1104,1105],{"class":83,"line":90},[81,1106,1107],{},"year = 2026\n",[81,1109,1110],{"class":83,"line":97},[81,1111,94],{"emptyLinePlaceholder":93},[81,1113,1114],{"class":83,"line":103},[81,1115,1116],{},"print(f\"正在学习 {name}，当前年份是 {year}\")\n",[10,1118,1119],{},"运行结果：",[72,1121,1124],{"className":1122,"code":1123,"language":162,"meta":77},[160],"正在学习 Python，当前年份是 2026\n",[33,1125,1123],{"__ignoreMap":77},[10,1127,1128],{},"从这段代码可以看到，Python 不需要在每条语句结尾添加分号，也不需要提前声明变量类型。它使用换行和缩进组织代码，整体结构比较清楚。",[10,1130,1131],{},"缩进在 Python 中不仅用于排版，也是语法的一部分。例如：",[72,1133,1135],{"className":74,"code":1134,"language":76,"meta":77,"style":77},"score = 85\n\nif score >= 60:\n    print(\"成绩合格\")\nelse:\n    print(\"需要继续学习\")\n",[33,1136,1137,1142,1146,1151,1156,1161],{"__ignoreMap":77},[81,1138,1139],{"class":83,"line":84},[81,1140,1141],{},"score = 85\n",[81,1143,1144],{"class":83,"line":90},[81,1145,94],{"emptyLinePlaceholder":93},[81,1147,1148],{"class":83,"line":97},[81,1149,1150],{},"if score >= 60:\n",[81,1152,1153],{"class":83,"line":103},[81,1154,1155],{},"    print(\"成绩合格\")\n",[81,1157,1158],{"class":83,"line":109},[81,1159,1160],{},"else:\n",[81,1162,1163],{"class":83,"line":115},[81,1164,1165],{},"    print(\"需要继续学习\")\n",[10,1167,1168,1171,1172,1175],{},[33,1169,1170],{},"if"," 和 ",[33,1173,1174],{},"else"," 下面的代码必须保持正确缩进，否则程序可能无法运行。",[14,1177,1179],{"id":1178},"python-如何运行代码","Python 如何运行代码",[10,1181,1182,1183,1186],{},"Python 通常被称为解释型语言。安装 Python 解释器后，可以直接在终端中运行 ",[33,1184,1185],{},".py"," 文件，也可以进入交互式环境逐行执行代码。",[10,1188,1189],{},"交互式环境适合快速验证一个表达式：",[72,1191,1193],{"className":74,"code":1192,"language":76,"meta":77,"style":77},">>> 10 + 20\n30\n>>> \"Python\".lower()\n'python'\n",[33,1194,1195,1200,1205,1210],{"__ignoreMap":77},[81,1196,1197],{"class":83,"line":84},[81,1198,1199],{},">>> 10 + 20\n",[81,1201,1202],{"class":83,"line":90},[81,1203,1204],{},"30\n",[81,1206,1207],{"class":83,"line":97},[81,1208,1209],{},">>> \"Python\".lower()\n",[81,1211,1212],{"class":83,"line":103},[81,1213,1214],{},"'python'\n",[10,1216,1217],{},"需要保存和重复运行的程序，则可以写入文件：",[72,1219,1221],{"className":605,"code":1220,"language":607,"meta":77,"style":77},"python3 hello.py\n",[33,1222,1223],{"__ignoreMap":77},[81,1224,1225,1227],{"class":83,"line":84},[81,1226,705],{"class":614},[81,1228,1229],{"class":650}," hello.py\n",[10,1231,1232],{},"以常见的 CPython 解释器为例，源代码在运行过程中会先转换为字节码，再由 Python 虚拟机执行。这个过程通常由解释器自动完成，开发者不需要手动编译。",[14,1234,1236],{"id":1235},"python-的特点","Python 的特点",[342,1238,1239],{"id":1239},"语法相对简洁",[10,1241,1242],{},"Python 使用较少的代码就能完成许多常见任务。它的关键字和代码结构比较直观，阅读一段规范编写的 Python 程序时，通常能够较快判断程序正在做什么。",[342,1244,1245],{"id":1245},"支持多种编程方式",[10,1247,1248],{},"Python 支持面向过程、面向对象和函数式编程。小型脚本可以直接按照执行顺序编写，项目规模扩大后，也可以使用函数、类和模块拆分代码。",[342,1250,1251],{"id":1251},"标准库比较完整",[10,1253,1254],{},"Python 自带一批常用模块，可以处理文件、路径、日期时间、JSON 数据、日志、压缩文件和网络通信等任务。",[10,1256,1257],{},"例如，获取当前时间：",[72,1259,1261],{"className":74,"code":1260,"language":76,"meta":77,"style":77},"from datetime import datetime\n\nnow = datetime.now()\nprint(now)\n",[33,1262,1263,1268,1272,1277],{"__ignoreMap":77},[81,1264,1265],{"class":83,"line":84},[81,1266,1267],{},"from datetime import datetime\n",[81,1269,1270],{"class":83,"line":90},[81,1271,94],{"emptyLinePlaceholder":93},[81,1273,1274],{"class":83,"line":97},[81,1275,1276],{},"now = datetime.now()\n",[81,1278,1279],{"class":83,"line":103},[81,1280,1281],{},"print(now)\n",[10,1283,1284],{},"这段代码使用的是标准库，不需要另外安装第三方依赖。",[342,1286,1287],{"id":1287},"第三方工具丰富",[10,1289,1290,1291,1293],{},"除了标准库，Python 还拥有数量庞大的第三方软件包。开发者可以通过 ",[33,1292,274],{}," 安装所需工具，用于 Web 开发、数据分析、自动化测试、网络爬虫和人工智能等场景。",[10,1295,1296],{},"第三方包为开发带来了便利，但也需要管理好版本和项目环境。实际开发时，通常会为每个项目创建独立的虚拟环境，避免依赖互相影响。",[342,1298,1299],{"id":1299},"支持多个操作系统",[10,1301,1302],{},"Python 可以运行在 macOS、Linux、Windows 等主流操作系统上。大部分不依赖系统特性的代码可以跨平台使用，但涉及文件路径、系统命令和底层组件时，仍然需要根据运行环境进行调整。",[14,1304,1306],{"id":1305},"python-可以做什么","Python 可以做什么",[10,1308,1309],{},[26,1310],{"alt":1311,"src":1312},"Python 的常见应用方向","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260815\u002Fpython-application-fields.png",[10,1314,1315],{},"Python 的应用范围比较广，常见方向包括：",[41,1317,1318,1321,1324,1327,1330,1333,1336,1339],{},[44,1319,1320],{},"编写自动化脚本，批量处理文件和重复任务；",[44,1322,1323],{},"开发网站后端和 API 服务；",[44,1325,1326],{},"进行数据清洗、统计分析和图表展示；",[44,1328,1329],{},"编写网络爬虫和信息采集工具；",[44,1331,1332],{},"开发自动化测试程序；",[44,1334,1335],{},"进行机器学习和人工智能开发；",[44,1337,1338],{},"编写运维、监控和辅助开发工具；",[44,1340,1341],{},"开发部分桌面应用和插件。",[10,1343,1344],{},"Python 是这些开发方向的基础语言，具体项目通常还需要配合相应的框架或第三方库。例如，Web 开发可以使用 Django、Flask 或 FastAPI，数据处理可以使用 NumPy 和 pandas，机器学习领域则经常使用 PyTorch、TensorFlow 或 scikit-learn。",[14,1346,1348],{"id":1347},"python-的发展","Python 的发展",[10,1350,1351],{},"Python 由 Guido van Rossum 创建，最初的开发工作开始于 20 世纪 80 年代末。",[10,1353,1354],{},"Python 2.0 于 2000 年发布，Python 3.0 于 2008 年发布。Python 3 对语言进行了较大调整，并不完全兼容 Python 2。Python 2 已经结束官方支持，因此现在学习和开发新项目时，应当直接使用 Python 3。",[14,1356,1358],{"id":1357},"python-也有局限","Python 也有局限",[10,1360,1361],{},"Python 的优势主要是代码清晰、开发效率较高和工具生态丰富，但它并不适合所有任务。",[10,1363,1364],{},"在大量计算或对运行速度要求很高的场景中，纯 Python 代码的执行速度可能不如 C、C++ 等编译型语言。移动端原生应用、浏览器前端和部分底层系统开发，也不是 Python 最常见的使用方向。",[10,1366,1367],{},"实际项目中，经常会根据任务特点组合多种语言。Python 负责业务逻辑、数据处理或工具开发，对性能要求较高的部分则可以交给 C、C++ 或其他技术实现。",[14,1369,1370],{"id":1370},"写在最后",[10,1372,1373],{},"Python 容易让初学者快速写出能够运行的程序，同时又具备支撑实际项目的能力。它的价值不只是“语法简单”，还在于标准库完善、第三方生态成熟，并且能够覆盖自动化、Web、数据处理和人工智能等多个方向。",[10,1375,1376],{},"学习 Python 时，可以先掌握变量、数据类型、条件判断、循环和函数，再通过一个具体项目逐步熟悉模块、异常处理和第三方依赖。这样比只记语法更容易形成完整的编程思路。",[226,1378,1379],{},"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":77,"searchDepth":90,"depth":90,"links":1381},[1382,1383,1384,1391,1392,1393,1394],{"id":1088,"depth":90,"text":1089},{"id":1178,"depth":90,"text":1179},{"id":1235,"depth":90,"text":1236,"children":1385},[1386,1387,1388,1389,1390],{"id":1239,"depth":97,"text":1239},{"id":1245,"depth":97,"text":1245},{"id":1251,"depth":97,"text":1251},{"id":1287,"depth":97,"text":1287},{"id":1299,"depth":97,"text":1299},{"id":1305,"depth":90,"text":1306},{"id":1347,"depth":90,"text":1348},{"id":1357,"depth":90,"text":1358},{"id":1370,"depth":90,"text":1370},{},"\u002Fposts\u002F20260815\u002Fpython-introduction","2026-08-15",{"title":1071,"description":77},"python-introduction","posts\u002F20260815\u002Fpython-introduction","面向刚接触编程的读者，介绍 Python 的代码特点、运行方式、常见应用和适用边界，帮助读者建立对这门语言的整体认识。",[239,1403,1404],"编程入门","基础知识","Axa7hQfxA4rShWPXTEcuusziI3hLLaS4NlUR2zrOYls",{"id":1407,"title":1408,"body":1409,"category":239,"cover":240,"description":1413,"extension":241,"meta":1531,"navigation":93,"path":1532,"pinned":244,"publishedAt":245,"seo":1533,"slug":1534,"stem":1535,"summary":1536,"tags":1537,"updatedAt":245,"visible":93,"__hash__":1539},"posts\u002Fposts\u002F20260817\u002F01-python-source-to-output.md","01｜Python 程序从源码到输出经历了什么",{"type":7,"value":1410,"toc":1521},[1411,1414,1416,1419,1421,1427,1432,1434,1448,1450,1452,1461,1463,1469,1471,1473,1489,1491,1502,1504,1512,1514,1516,1519],[10,1412,1413],{},"这套课程按知识依赖排列。本篇的前置知识是：无。学完后，你应该能够理解源代码、解释器和输出之间的关系。",[14,1415,16],{"id":16},[10,1417,1418],{},"本篇只处理“Python 程序从源码到输出经历了什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1420,22],{"id":22},[10,1422,1423],{},[26,1424],{"alt":1425,"src":1426},"源码怎样变成输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F01-source-to-output.svg",[10,1428,1429,1431],{},[33,1430,1185],{}," 文件不会自己执行，它要交给 Python 解释器读取。图中的箭头只表示执行方向：源码进入解释器，解释器按语言规则执行语句，结果才显示在终端。",[14,1433,39],{"id":39},[41,1435,1436,1442,1445],{},[44,1437,1438,1439,1441],{},"源代码是人编写的文本，通常保存在 ",[33,1440,1185],{}," 文件中。",[44,1443,1444],{},"解释器是运行 Python 代码的程序；本课程以 CPython 3.14 为准。",[44,1446,1447],{},"终端只是输入命令和查看输出的界面，不等于 Python 本身。",[14,1449,67],{"id":67},[10,1451,70],{},[72,1453,1455],{"className":74,"code":1454,"language":76,"meta":77,"style":77},"print(\"你好，Python\")\n",[33,1456,1457],{"__ignoreMap":77},[81,1458,1459],{"class":83,"line":84},[81,1460,1454],{},[10,1462,156],{},[72,1464,1467],{"className":1465,"code":1466,"language":162,"meta":77},[160],"你好，Python\n",[33,1468,1466],{"__ignoreMap":77},[10,1470,167],{},[14,1472,170],{"id":170},[172,1474,1475,1482],{},[44,1476,1477,1478,1481],{},"终端启动解释器后，解释器读取 ",[33,1479,1480],{},"print(\"你好，Python\")","，识别函数调用、字符串字面量和右括号。",[44,1483,1484,1485,1488],{},"字符串对象先准备好，再交给 ",[33,1486,1487],{},"print()"," 写到标准输出；终端负责把这段输出显示出来。",[14,1490,190],{"id":190},[41,1492,1493,1496],{},[44,1494,1495],{},"把终端、编辑器和 Python 当成同一个程序。它们分别负责输入命令、编辑文本和执行代码。",[44,1497,1498,1499,1501],{},"认为 ",[33,1500,1185],{}," 文件双击后一定能运行。稳定做法是先在终端明确调用对应解释器。",[14,1503,207],{"id":207},[172,1505,1506,1509],{},[44,1507,1508],{},"指出“源代码、解释器、终端输出”在执行链路中的先后顺序。",[44,1510,1511],{},"把示例文字改成自己的学习目标并重新运行。",[10,1513,218],{},[14,1515,221],{"id":221},[10,1517,1518],{},"本篇目标是理解源代码、解释器和输出之间的关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,1520,228],{},{"title":77,"searchDepth":90,"depth":90,"links":1522},[1523,1524,1525,1526,1527,1528,1529,1530],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F01-python-source-to-output",{"title":1408,"description":1413},"python-source-to-output","posts\u002F20260817\u002F01-python-source-to-output","面向按顺序学习 Python 的初学者，本篇在零基础上，帮助读者理解源代码、解释器和输出之间的关系。",[239,1403,1538],"解释器","GTRMiEOeg14C0nE2QUE2P408mg12X3wSZ8Mh_7JV2nM",{"id":1541,"title":1542,"body":1543,"category":239,"cover":240,"description":1547,"extension":241,"meta":1683,"navigation":93,"path":1684,"pinned":244,"publishedAt":245,"seo":1685,"slug":1686,"stem":1687,"summary":1688,"tags":1689,"updatedAt":245,"visible":93,"__hash__":1691},"posts\u002Fposts\u002F20260817\u002F02-python-macos-installation.md","02｜在 macOS 安装并确认 Python 3 环境",{"type":7,"value":1544,"toc":1673},[1545,1548,1550,1553,1555,1561,1567,1569,1584,1586,1589,1609,1611,1617,1619,1621,1634,1636,1650,1652,1663,1665,1667,1670],[10,1546,1547],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01 篇。学完后，你应该能够在 macOS 中确认 Python 3.14 和 pip 是否可用。",[14,1549,16],{"id":16},[10,1551,1552],{},"本篇只处理“在 macOS 安装并确认 Python 3 环境”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1554,22],{"id":22},[10,1556,1557],{},[26,1558],{"alt":1559,"src":1560},"终端如何找到 Python","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F02-path-interpreter.svg",[10,1562,1563,1564,1566],{},"终端收到 ",[33,1565,705],{}," 后，会按照 PATH 中登记的目录顺序寻找可执行文件。找到哪个解释器，后续代码就由哪个解释器运行。",[14,1568,39],{"id":39},[41,1570,1571,1574,1577],{},[44,1572,1573],{},"先执行版本命令；已有合适的 Python 3 时不必重复安装。",[44,1575,1576],{},"使用 python.org 的 macOS 安装器时，Apple 芯片和 Intel 芯片都可使用 universal2 安装包。",[44,1578,1579,1580,1583],{},"检查 pip 时使用 ",[33,1581,1582],{},"python3 -m pip","，可以明确 pip 属于当前这个解释器。",[14,1585,67],{"id":67},[10,1587,1588],{},"在 macOS 终端执行：",[72,1590,1591],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,1592,1593,1599],{"__ignoreMap":77},[81,1594,1595,1597],{"class":83,"line":84},[81,1596,705],{"class":614},[81,1598,618],{"class":617},[81,1600,1601,1603,1605,1607],{"class":83,"line":90},[81,1602,705],{"class":614},[81,1604,647],{"class":617},[81,1606,651],{"class":650},[81,1608,618],{"class":617},[10,1610,156],{},[72,1612,1615],{"className":1613,"code":1614,"language":162,"meta":77},[160],"Python 3.14.x\npip 版本信息与安装路径\n",[33,1616,1614],{"__ignoreMap":77},[10,1618,167],{},[14,1620,170],{"id":170},[172,1622,1623,1629],{},[44,1624,1625,1628],{},[33,1626,1627],{},"python3 --version"," 只确认解释器能被找到，并报告当前版本。它不代表 pip 一定属于同一个安装。",[44,1630,1631,1633],{},[33,1632,713],{}," 先启动已确认的解释器，再让它加载 pip 模块，因此版本和路径更容易对应。",[14,1635,190],{"id":190},[41,1637,1638,1644],{},[44,1639,1640,1641,1643],{},"看到系统已有 ",[33,1642,705],{}," 就直接假设版本满足课程要求，应先看完整版本号。",[44,1645,1646,1647,1649],{},"为了缩短命令覆盖 macOS 系统命令。课程统一保留 ",[33,1648,705],{},"，不修改系统自带工具。",[14,1651,207],{"id":207},[172,1653,1654,1660],{},[44,1655,952,1656,1659],{},[33,1657,1658],{},"which python3","，记录当前解释器路径。",[44,1661,1662],{},"关闭终端并重新打开，再次检查版本，确认配置持续有效。",[10,1664,218],{},[14,1666,221],{"id":221},[10,1668,1669],{},"本篇目标是在 macOS 中确认 Python 3.14 和 pip 是否可用。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,1671,1672],{},"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":77,"searchDepth":90,"depth":90,"links":1674},[1675,1676,1677,1678,1679,1680,1681,1682],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F02-python-macos-installation",{"title":1542,"description":1547},"python-macos-installation","posts\u002F20260817\u002F02-python-macos-installation","面向按顺序学习 Python 的初学者，本篇在第 01 篇知识上，帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。",[239,1690,1066],"macOS","iV0gYKoqqUnobrXy524WUOpgfZG5WmUzlY_rO62WQ-o",{"id":1693,"title":1694,"body":1695,"category":239,"cover":240,"description":1860,"extension":241,"meta":1861,"navigation":93,"path":1862,"pinned":244,"publishedAt":245,"seo":1863,"slug":1864,"stem":1865,"summary":1866,"tags":1867,"updatedAt":245,"visible":93,"__hash__":1870},"posts\u002Fposts\u002F20260817\u002F03-python-repl-and-script.md","03｜交互式解释器和 Python 脚本怎么选择",{"type":7,"value":1696,"toc":1850},[1697,1703,1705,1708,1710,1716,1719,1721,1745,1747,1749,1776,1778,1784,1786,1788,1806,1808,1822,1824,1838,1840,1842,1848],[10,1698,1699,1700,1702],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 ",[33,1701,1185],{}," 脚本。",[14,1704,16],{"id":16},[10,1706,1707],{},"本篇只处理“交互式解释器和 Python 脚本怎么选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1709,22],{"id":22},[10,1711,1712],{},[26,1713],{"alt":1714,"src":1715},"REPL 与脚本的执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F03-repl-vs-script.svg",[10,1717,1718],{},"REPL 每输入一条完整语句就立即执行；脚本先保存多行代码，再从文件开头依次执行。前者适合短验证，后者适合保存和重复运行。",[14,1720,39],{"id":39},[41,1722,1723,1732,1739],{},[44,1724,1725,1726,1728,1729,376],{},"在终端输入 ",[33,1727,705],{}," 进入 REPL，提示符通常是 ",[33,1730,1731],{},">>>",[44,1733,1734,1735,1738],{},"输入 ",[33,1736,1737],{},"exit()"," 或按 Control-D 退出 REPL。",[44,1740,1741,1742,1744],{},"需要保存、复查或多次运行的代码应写入 ",[33,1743,1185],{}," 文件。",[14,1746,67],{"id":67},[10,1748,70],{},[72,1750,1754],{"className":1751,"code":1752,"language":1753,"meta":77,"style":77},"language-pycon shiki shiki-themes github-dark",">>> 2 + 3\n5\n>>> \"python\".upper()\n'PYTHON'\n","pycon",[33,1755,1756,1761,1766,1771],{"__ignoreMap":77},[81,1757,1758],{"class":83,"line":84},[81,1759,1760],{},">>> 2 + 3\n",[81,1762,1763],{"class":83,"line":90},[81,1764,1765],{},"5\n",[81,1767,1768],{"class":83,"line":97},[81,1769,1770],{},">>> \"python\".upper()\n",[81,1772,1773],{"class":83,"line":103},[81,1774,1775],{},"'PYTHON'\n",[10,1777,156],{},[72,1779,1782],{"className":1780,"code":1781,"language":162,"meta":77},[160],"REPL 会直接显示表达式结果\n",[33,1783,1781],{"__ignoreMap":77},[10,1785,167],{},[14,1787,170],{"id":170},[172,1789,1790,1800],{},[44,1791,1792,1793,1796,1797,376],{},"REPL 中输入表达式后，解释器会自动显示表达式的表示形式，所以 ",[33,1794,1795],{},"2 + 3"," 能直接看到 ",[33,1798,1799],{},"5",[44,1801,1802,1803,1805],{},"脚本执行表达式但不会自动显示其结果；需要显式调用 ",[33,1804,1487],{}," 才会写到标准输出。",[14,1807,190],{"id":190},[41,1809,1810,1819],{},[44,1811,1812,1813,1815,1816,1818],{},"把提示符 ",[33,1814,1731],{}," 复制进 ",[33,1817,1185],{}," 文件。它属于 REPL 界面，不是 Python 代码。",[44,1820,1821],{},"在 REPL 中积累很长的实验后无法复现。超过几行并需要保存时就转成脚本。",[14,1823,207],{"id":207},[172,1825,1826,1832],{},[44,1827,1828,1829,376],{},"在 REPL 计算 ",[33,1830,1831],{},"12 * 8",[44,1833,1834,1835,1837],{},"把同一表达式写入脚本；观察脚本中不调用 ",[33,1836,1487],{}," 时是否显示结果。",[10,1839,218],{},[14,1841,221],{"id":221},[10,1843,1844,1845,1847],{},"本篇目标是根据任务选择 REPL 或 ",[33,1846,1185],{}," 脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,1849,228],{},{"title":77,"searchDepth":90,"depth":90,"links":1851},[1852,1853,1854,1855,1856,1857,1858,1859],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},"这套课程按知识依赖排列。本篇的前置知识是：第 02 篇。学完后，你应该能够根据任务选择 REPL 或 .py 脚本。",{},"\u002Fposts\u002F20260817\u002F03-python-repl-and-script",{"title":1694,"description":1860},"python-repl-and-script","posts\u002F20260817\u002F03-python-repl-and-script","面向按顺序学习 Python 的初学者，本篇在第 02 篇知识上，帮助读者根据任务选择 REPL 或 `.py` 脚本。",[239,1868,1869],"REPL","脚本","hvoRAY0WVJOApv5-MWpgMy8uKaL2SGdg99qKexj8ug8",{"id":1872,"title":1873,"body":1874,"category":239,"cover":240,"description":1878,"extension":241,"meta":2049,"navigation":93,"path":2050,"pinned":244,"publishedAt":245,"seo":2051,"slug":2052,"stem":2053,"summary":2054,"tags":2055,"updatedAt":245,"visible":93,"__hash__":2058},"posts\u002Fposts\u002F20260817\u002F04-python-first-project-directory.md","04｜建立第一个 Python 项目目录",{"type":7,"value":1875,"toc":2039},[1876,1879,1881,1884,1886,1892,1898,1900,1918,1920,1922,1967,1969,1975,1977,1979,2001,2003,2015,2017,2029,2031,2033,2036],[10,1877,1878],{},"这套课程按知识依赖排列。本篇的前置知识是：第 03 篇。学完后，你应该能够理解当前目录并正确运行项目脚本。",[14,1880,16],{"id":16},[10,1882,1883],{},"本篇只处理“建立第一个 Python 项目目录”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,1885,22],{"id":22},[10,1887,1888],{},[26,1889],{"alt":1890,"src":1891},"当前目录决定脚本位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F04-working-directory.svg",[10,1893,1894,1897],{},[33,1895,1896],{},"python3 hello.py"," 中的相对路径从终端当前目录开始查找。脚本明明存在却提示找不到时，先检查当前目录，而不是反复安装 Python。",[14,1899,39],{"id":39},[41,1901,1902,1905,1915],{},[44,1903,1904],{},"一个学习项目使用一个独立目录，代码和数据更容易管理。",[44,1906,1907,1910,1911,1914],{},[33,1908,1909],{},"pwd"," 显示当前目录，",[33,1912,1913],{},"ls"," 显示目录里的文件。",[44,1916,1917],{},"命令中的文件名必须与实际文件名一致，macOS 文件系统可能区分大小写。",[14,1919,67],{"id":67},[10,1921,1588],{},[72,1923,1925],{"className":605,"code":1924,"language":607,"meta":77,"style":77},"mkdir python-study\ncd python-study\npwd\nprintf 'print(\"项目已经运行\")\\n' > hello.py\npython3 hello.py\n",[33,1926,1927,1935,1942,1947,1961],{"__ignoreMap":77},[81,1928,1929,1932],{"class":83,"line":84},[81,1930,1931],{"class":614},"mkdir",[81,1933,1934],{"class":650}," python-study\n",[81,1936,1937,1940],{"class":83,"line":90},[81,1938,1939],{"class":617},"cd",[81,1941,1934],{"class":650},[81,1943,1944],{"class":83,"line":97},[81,1945,1946],{"class":617},"pwd\n",[81,1948,1949,1952,1955,1959],{"class":83,"line":103},[81,1950,1951],{"class":617},"printf",[81,1953,1954],{"class":650}," 'print(\"项目已经运行\")\\n'",[81,1956,1958],{"class":1957},"snl16"," >",[81,1960,1229],{"class":650},[81,1962,1963,1965],{"class":83,"line":109},[81,1964,705],{"class":614},[81,1966,1229],{"class":650},[10,1968,156],{},[72,1970,1973],{"className":1971,"code":1972,"language":162,"meta":77},[160],"项目已经运行\n",[33,1974,1972],{"__ignoreMap":77},[10,1976,167],{},[14,1978,170],{"id":170},[172,1980,1981,1992],{},[44,1982,1983,1985,1986,1988,1989,1991],{},[33,1984,1931],{}," 创建目录，",[33,1987,1939],{}," 改变终端当前目录，",[33,1990,1909],{}," 用来确认位置；这三步决定相对路径从哪里开始。",[44,1993,1994,1996,1997,2000],{},[33,1995,1896],{}," 会在当前目录寻找 ",[33,1998,1999],{},"hello.py","。若文件在别处，需要先切换目录或提供正确路径。",[14,2002,190],{"id":190},[41,2004,2005,2012],{},[44,2006,2007,2008,1171,2010,376],{},"脚本存在却报找不到文件时反复安装 Python。此类问题通常先检查 ",[33,2009,1909],{},[33,2011,1913],{},[44,2013,2014],{},"项目目录和文件名混用空格、中文标点或不同大小写，导致复制命令时路径不一致。",[14,2016,207],{"id":207},[172,2018,2019,2026],{},[44,2020,2021,2022,2025],{},"新建 ",[33,2023,2024],{},"lesson01.py"," 并输出课程编号。",[44,2027,2028],{},"先切换到上一级目录运行脚本，观察路径错误，再回到项目目录修正。",[10,2030,218],{},[14,2032,221],{"id":221},[10,2034,2035],{},"本篇目标是理解当前目录并正确运行项目脚本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2037,2038],{},"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":77,"searchDepth":90,"depth":90,"links":2040},[2041,2042,2043,2044,2045,2046,2047,2048],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F04-python-first-project-directory",{"title":1873,"description":1878},"python-first-project-directory","posts\u002F20260817\u002F04-python-first-project-directory","面向按顺序学习 Python 的初学者，本篇在第 03 篇知识上，帮助读者理解当前目录并正确运行项目脚本。",[239,2056,2057],"项目目录","终端","UsxyR6BgLFF1JbTTJr53MSSSg9lVd6wEKT8DR6PnJUY",{"id":2060,"title":2061,"body":2062,"category":239,"cover":240,"description":2066,"extension":241,"meta":2214,"navigation":93,"path":2215,"pinned":244,"publishedAt":245,"seo":2216,"slug":2217,"stem":2218,"summary":2219,"tags":2220,"updatedAt":245,"visible":93,"__hash__":2223},"posts\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print.md","05｜字面量、表达式与 print 输出",{"type":7,"value":2063,"toc":2204},[2064,2067,2069,2072,2074,2080,2091,2093,2113,2115,2117,2137,2139,2145,2147,2149,2168,2170,2178,2180,2195,2197,2199,2202],[10,2065,2066],{},"这套课程按知识依赖排列。本篇的前置知识是：第 04 篇。学完后，你应该能够读懂最小 Python 表达式并显示求值结果。",[14,2068,16],{"id":16},[10,2070,2071],{},"本篇只处理“字面量、表达式与 print 输出”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2073,22],{"id":22},[10,2075,2076],{},[26,2077],{"alt":2078,"src":2079},"表达式先求值再输出","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F05-expression-evaluation.svg",[10,2081,2082,2083,376,2085,2088,2089,376],{},"Python 先计算表达式，再把得到的对象交给 ",[33,2084,1487],{},[33,2086,2087],{},"print(2 + 3)"," 显示的是加法结果，不是原样显示字符 ",[33,2090,1795],{},[14,2092,39],{"id":39},[41,2094,2095,2101,2110],{},[44,2096,2097,2100],{},[33,2098,2099],{},"42"," 和字符串都是字面量，代码直接写出了它们的值。",[44,2102,2103,2106,2107,376],{},[33,2104,2105],{},"7 + 5"," 是表达式，运行时先求值得到 ",[33,2108,2109],{},"12",[44,2111,2112],{},"字符串文字必须使用配对的引号；中文符号不能替代代码引号。",[14,2114,67],{"id":67},[10,2116,70],{},[72,2118,2120],{"className":74,"code":2119,"language":76,"meta":77,"style":77},"print(42)\nprint(7 + 5)\nprint(\"Python 基础课\")\n",[33,2121,2122,2127,2132],{"__ignoreMap":77},[81,2123,2124],{"class":83,"line":84},[81,2125,2126],{},"print(42)\n",[81,2128,2129],{"class":83,"line":90},[81,2130,2131],{},"print(7 + 5)\n",[81,2133,2134],{"class":83,"line":97},[81,2135,2136],{},"print(\"Python 基础课\")\n",[10,2138,156],{},[72,2140,2143],{"className":2141,"code":2142,"language":162,"meta":77},[160],"42\n12\nPython 基础课\n",[33,2144,2142],{"__ignoreMap":77},[10,2146,167],{},[14,2148,170],{"id":170},[172,2150,2151,2159],{},[44,2152,2153,2156,2157,376],{},[33,2154,2155],{},"print(7 + 5)"," 先计算括号内的加法表达式，得到整数对象 ",[33,2158,2109],{},[44,2160,2161,2163,2164,2167],{},[33,2162,1487],{}," 再把对象转换为适合显示的文本并写出；带引号的 ",[33,2165,2166],{},"\"2 + 3\""," 则只是字符串，不会执行加法。",[14,2169,190],{"id":190},[41,2171,2172,2175],{},[44,2173,2174],{},"混用中文引号、中文括号。Python 源码中的语法符号应使用英文半角字符。",[44,2176,2177],{},"把“表达式结果”和“屏幕上看到的文字”混为一谈；显示是执行链路的最后一步。",[14,2179,207],{"id":207},[172,2181,2182,2185],{},[44,2183,2184],{},"分别输出一个整数、一个小数和一段文本。",[44,2186,2187,2188,2190,2191,2194],{},"比较 ",[33,2189,2087],{}," 与 ",[33,2192,2193],{},"print(\"2 + 3\")"," 的结果。",[10,2196,218],{},[14,2198,221],{"id":221},[10,2200,2201],{},"本篇目标是读懂最小 Python 表达式并显示求值结果。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2203,228],{},{"title":77,"searchDepth":90,"depth":90,"links":2205},[2206,2207,2208,2209,2210,2211,2212,2213],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F05-python-literals-expressions-print",{"title":2061,"description":2066},"python-literals-expressions-print","posts\u002F20260817\u002F05-python-literals-expressions-print","面向按顺序学习 Python 的初学者，本篇在第 04 篇知识上，帮助读者读懂最小 Python 表达式并显示求值结果。",[239,2221,2222],"表达式","print","OUDW6PIRenWK3d3uKcucAiDuyM3W4kSgTMBeqqTPIaU",{"id":2225,"title":2226,"body":2227,"category":239,"cover":240,"description":2231,"extension":241,"meta":2397,"navigation":93,"path":2398,"pinned":244,"publishedAt":245,"seo":2399,"slug":2400,"stem":2401,"summary":2402,"tags":2403,"updatedAt":245,"visible":93,"__hash__":2406},"posts\u002Fposts\u002F20260817\u002F06-python-variable-references.md","06｜Python 变量保存的到底是什么",{"type":7,"value":2228,"toc":2387},[2229,2232,2234,2237,2239,2245,2248,2250,2276,2278,2280,2308,2310,2316,2318,2320,2344,2346,2361,2363,2378,2380,2382,2385],[10,2230,2231],{},"这套课程按知识依赖排列。本篇的前置知识是：第 05 篇。学完后，你应该能够正确理解赋值、重新赋值和变量命名。",[14,2233,16],{"id":16},[10,2235,2236],{},"本篇只处理“Python 变量保存的到底是什么”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2238,22],{"id":22},[10,2240,2241],{},[26,2242],{"alt":2243,"src":2244},"变量名可以改为引用另一个对象","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F06-variable-reference.svg",[10,2246,2247],{},"赋值让变量名引用一个对象。再次赋值时，变量名改为引用另一个对象；它不是把旧整数对象原地改成新数值。",[14,2249,39],{"id":39},[41,2251,2252,2255,2265],{},[44,2253,2254],{},"赋值语句右侧先求值，左侧名字再绑定到结果对象。",[44,2256,2257,2258,2190,2261,2264],{},"变量名区分大小写，",[33,2259,2260],{},"score",[33,2262,2263],{},"Score"," 是两个名字。",[44,2266,2267,2268,2271,2272,2275],{},"使用能表达含义的名称；不要用 ",[33,2269,2270],{},"list","、",[33,2273,2274],{},"str"," 等内置名称作为普通变量名。",[14,2277,67],{"id":67},[10,2279,70],{},[72,2281,2283],{"className":74,"code":2282,"language":76,"meta":77,"style":77},"score = 90\nprint(score)\n\nscore = 95\nprint(score)\n",[33,2284,2285,2290,2295,2299,2304],{"__ignoreMap":77},[81,2286,2287],{"class":83,"line":84},[81,2288,2289],{},"score = 90\n",[81,2291,2292],{"class":83,"line":90},[81,2293,2294],{},"print(score)\n",[81,2296,2297],{"class":83,"line":97},[81,2298,94],{"emptyLinePlaceholder":93},[81,2300,2301],{"class":83,"line":103},[81,2302,2303],{},"score = 95\n",[81,2305,2306],{"class":83,"line":109},[81,2307,2294],{},[10,2309,156],{},[72,2311,2314],{"className":2312,"code":2313,"language":162,"meta":77},[160],"90\n95\n",[33,2315,2313],{"__ignoreMap":77},[10,2317,167],{},[14,2319,170],{"id":170},[172,2321,2322,2331],{},[44,2323,952,2324,2327,2328,2330],{},[33,2325,2326],{},"score = 90"," 时，右侧整数对象先准备好，名字 ",[33,2329,2260],{}," 再绑定到它。",[44,2332,952,2333,2336,2337,2340,2341,376],{},[33,2334,2335],{},"score = 95"," 后，名字改为绑定到另一个整数对象；先前的 ",[33,2338,2339],{},"90"," 没有被改造成 ",[33,2342,2343],{},"95",[14,2345,190],{"id":190},[41,2347,2348,2351],{},[44,2349,2350],{},"把变量理解成只能装一种类型的固定盒子。Python 名字可以在不同时间绑定不同类型的对象。",[44,2352,46,2353,2271,2355,2271,2357,2360],{},[33,2354,2270],{},[33,2356,2274],{},[33,2358,2359],{},"input"," 等内置名称作为变量，导致后面无法正常调用对应内置功能。",[14,2362,207],{"id":207},[172,2364,2365,2375],{},[44,2366,2367,2368,1171,2371,2374],{},"创建 ",[33,2369,2370],{},"course_name",[33,2372,2373],{},"lesson_count"," 两个变量并输出。",[44,2376,2377],{},"让一个变量先引用文本，再重新引用整数，观察 Python 是否允许。",[10,2379,218],{},[14,2381,221],{"id":221},[10,2383,2384],{},"本篇目标是正确理解赋值、重新赋值和变量命名。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2386,228],{},{"title":77,"searchDepth":90,"depth":90,"links":2388},[2389,2390,2391,2392,2393,2394,2395,2396],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F06-python-variable-references",{"title":2226,"description":2231},"python-variable-references","posts\u002F20260817\u002F06-python-variable-references","面向按顺序学习 Python 的初学者，本篇在第 05 篇知识上，帮助读者正确理解赋值、重新赋值和变量命名。",[239,2404,2405],"变量","对象","4PI2TqJY0YJbxzy-pjkdkbIe4HMCJtPWyVMS9V7wWTM",{"id":2408,"title":2409,"body":2410,"category":239,"cover":240,"description":2414,"extension":241,"meta":2578,"navigation":93,"path":2579,"pinned":244,"publishedAt":245,"seo":2580,"slug":2581,"stem":2582,"summary":2583,"tags":2584,"updatedAt":245,"visible":93,"__hash__":2587},"posts\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic.md","07｜整数、浮点数与算术运算",{"type":7,"value":2411,"toc":2568},[2412,2415,2417,2420,2422,2428,2431,2433,2462,2464,2466,2510,2512,2518,2520,2522,2536,2538,2549,2551,2559,2561,2563,2566],[10,2413,2414],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够完成常见数值计算并理解运算顺序。",[14,2416,16],{"id":16},[10,2418,2419],{},"本篇只处理“整数、浮点数与算术运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2421,22],{"id":22},[10,2423,2424],{},[26,2425],{"alt":2426,"src":2427},"算术表达式的求值顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F07-operator-precedence.svg",[10,2429,2430],{},"同一表达式中，括号优先，然后计算乘除，最后计算加减。读不准顺序时主动加括号，通常比背复杂规则更可靠。",[14,2432,39],{"id":39},[41,2434,2435,2445,2459],{},[44,2436,2437,2440,2441,2444],{},[33,2438,2439],{},"int"," 表示整数，",[33,2442,2443],{},"float"," 表示浮点数。",[44,2446,2447,2450,2451,2454,2455,2458],{},[33,2448,2449],{},"\u002F"," 总是进行真除法；",[33,2452,2453],{},"\u002F\u002F"," 是向下取整除法，",[33,2456,2457],{},"%"," 得到余数。",[44,2460,2461],{},"浮点数采用二进制近似表示，不适合直接承担要求精确小数的财务计算。",[14,2463,67],{"id":67},[10,2465,70],{},[72,2467,2469],{"className":74,"code":2468,"language":76,"meta":77,"style":77},"price = 25\ncount = 4\ndiscount = 0.9\n\ntotal = price * count * discount\naverage = total \u002F count\nprint(total)\nprint(average)\n",[33,2470,2471,2476,2481,2486,2490,2495,2500,2505],{"__ignoreMap":77},[81,2472,2473],{"class":83,"line":84},[81,2474,2475],{},"price = 25\n",[81,2477,2478],{"class":83,"line":90},[81,2479,2480],{},"count = 4\n",[81,2482,2483],{"class":83,"line":97},[81,2484,2485],{},"discount = 0.9\n",[81,2487,2488],{"class":83,"line":103},[81,2489,94],{"emptyLinePlaceholder":93},[81,2491,2492],{"class":83,"line":109},[81,2493,2494],{},"total = price * count * discount\n",[81,2496,2497],{"class":83,"line":115},[81,2498,2499],{},"average = total \u002F count\n",[81,2501,2502],{"class":83,"line":121},[81,2503,2504],{},"print(total)\n",[81,2506,2507],{"class":83,"line":127},[81,2508,2509],{},"print(average)\n",[10,2511,156],{},[72,2513,2516],{"className":2514,"code":2515,"language":162,"meta":77},[160],"90.0\n22.5\n",[33,2517,2515],{"__ignoreMap":77},[10,2519,167],{},[14,2521,170],{"id":170},[172,2523,2524,2530],{},[44,2525,2526,2529],{},[33,2527,2528],{},"price * count * discount"," 中两个乘法优先级相同，按从左到右结合，最终因为包含浮点数得到浮点结果。",[44,2531,2532,2535],{},[33,2533,2534],{},"total \u002F count"," 使用真除法，即使能整除也返回浮点数；商、余数或向下取整需要使用不同运算符。",[14,2537,190],{"id":190},[41,2539,2540,2546],{},[44,2541,2542,2543,376],{},"用二进制浮点数直接表示必须精确到分的金额。真实财务场景应评估整数分或 ",[33,2544,2545],{},"decimal.Decimal",[44,2547,2548],{},"依赖记忆判断长表达式的优先级。含义稍复杂时用括号明确顺序。",[14,2550,207],{"id":207},[172,2552,2553,2556],{},[44,2554,2555],{},"计算 137 除以 10 的商和余数。",[44,2557,2558],{},"给总价表达式加括号，验证结果是否保持一致。",[10,2560,218],{},[14,2562,221],{"id":221},[10,2564,2565],{},"本篇目标是完成常见数值计算并理解运算顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2567,228],{},{"title":77,"searchDepth":90,"depth":90,"links":2569},[2570,2571,2572,2573,2574,2575,2576,2577],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F07-python-numbers-and-arithmetic",{"title":2409,"description":2414},"python-numbers-and-arithmetic","posts\u002F20260817\u002F07-python-numbers-and-arithmetic","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者完成常见数值计算并理解运算顺序。",[239,2585,2586],"数字","运算符","4z7kRr-EtnqIumEmMgfasJz4tDK-uFbEE6kpQ8ncEzI",{"id":2589,"title":2590,"body":2591,"category":239,"cover":240,"description":2595,"extension":241,"meta":2771,"navigation":93,"path":2772,"pinned":244,"publishedAt":245,"seo":2773,"slug":2774,"stem":2775,"summary":2776,"tags":2777,"updatedAt":245,"visible":93,"__hash__":2780},"posts\u002Fposts\u002F20260817\u002F08-python-string-index-slice.md","08｜字符串的创建、索引与切片",{"type":7,"value":2592,"toc":2759},[2593,2596,2598,2601,2603,2609,2619,2621,2632,2634,2636,2666,2668,2674,2676,2678,2708,2711,2714,2720,2723,2725,2733,2735,2750,2752,2754,2757],[10,2594,2595],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06 篇。学完后，你应该能够读取、截取和组合字符串。",[14,2597,16],{"id":16},[10,2599,2600],{},"本篇只处理“字符串的创建、索引与切片”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2602,22],{"id":22},[10,2604,2605],{},[26,2606],{"alt":2607,"src":2608},"切片使用半开区间","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-string-slice.svg",[10,2610,2611,2612,2615,2616,376],{},"切片 ",[33,2613,2614],{},"[start:stop]"," 包含起点，不包含终点。这个半开区间规则让切片长度容易计算：在步长为 1 时，长度通常是 ",[33,2617,2618],{},"stop - start",[14,2620,39],{"id":39},[41,2622,2623,2626,2629],{},[44,2624,2625],{},"字符串是不可变的字符序列，不能直接替换某个索引位置。",[44,2627,2628],{},"正索引从 0 开始，负索引从 -1 开始反向定位。",[44,2630,2631],{},"切片会创建新的字符串，不会修改原字符串。",[14,2633,67],{"id":67},[10,2635,70],{},[72,2637,2639],{"className":74,"code":2638,"language":76,"meta":77,"style":77},"language = \"Python\"\nprint(language[0])\nprint(language[-1])\nprint(language[0:3])\nprint(language + \" 3.14\")\n",[33,2640,2641,2646,2651,2656,2661],{"__ignoreMap":77},[81,2642,2643],{"class":83,"line":84},[81,2644,2645],{},"language = \"Python\"\n",[81,2647,2648],{"class":83,"line":90},[81,2649,2650],{},"print(language[0])\n",[81,2652,2653],{"class":83,"line":97},[81,2654,2655],{},"print(language[-1])\n",[81,2657,2658],{"class":83,"line":103},[81,2659,2660],{},"print(language[0:3])\n",[81,2662,2663],{"class":83,"line":109},[81,2664,2665],{},"print(language + \" 3.14\")\n",[10,2667,156],{},[72,2669,2672],{"className":2670,"code":2671,"language":162,"meta":77},[160],"P\nn\nPyt\nPython 3.14\n",[33,2673,2671],{"__ignoreMap":77},[10,2675,167],{},[14,2677,170],{"id":170},[172,2679,2680,2694],{},[44,2681,2682,2683,2685,2686,2689,2690,2693],{},"字符串 ",[33,2684,239],{}," 的正索引从 ",[33,2687,2688],{},"P"," 的 0 开始，负索引从末尾 ",[33,2691,2692],{},"n"," 的 -1 开始。",[44,2695,2696,2699,2700,2703,2704,2707],{},[33,2697,2698],{},"language[0:3]"," 依次取得索引 0、1、2，对应 ",[33,2701,2702],{},"Pyt","；索引 3 的 ",[33,2705,2706],{},"h"," 不在结果中。",[342,2709,2710],{"id":2710},"再看一个具体细节",[10,2712,2713],{},"索引和切片的返回结果也容易混淆，可以把两种操作并排看。",[10,2715,2716],{},[26,2717],{"alt":2718,"src":2719},"索引与切片得到不同结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F08-index-vs-slice.svg",[10,2721,2722],{},"索引只取得一个字符；切片按照范围取得新字符串。两者都不会修改原字符串。",[14,2724,190],{"id":190},[41,2726,2727,2730],{},[44,2728,2729],{},"把第一个字符写成索引 1，造成整体偏移一位。",[44,2731,2732],{},"认为切片会修改原字符串。字符串不可变，切片得到的是新字符串对象。",[14,2734,207],{"id":207},[172,2736,2737,2747],{},[44,2738,2739,2740,2743,2744,376],{},"从 ",[33,2741,2742],{},"\"programming\""," 中切出 ",[33,2745,2746],{},"\"gram\"",[44,2748,2749],{},"使用负索引取得字符串倒数第二个字符。",[10,2751,218],{},[14,2753,221],{"id":221},[10,2755,2756],{},"本篇目标是读取、截取和组合字符串。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2758,228],{},{"title":77,"searchDepth":90,"depth":90,"links":2760},[2761,2762,2763,2764,2765,2768,2769,2770],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":2766},[2767],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F08-python-string-index-slice",{"title":2590,"description":2595},"python-string-index-slice","posts\u002F20260817\u002F08-python-string-index-slice","面向按顺序学习 Python 的初学者，本篇在第 06 篇知识上，帮助读者读取、截取和组合字符串。",[239,2778,2779],"字符串","切片","QhddGVQ3zNhtZD2AUoFwgf2YvN2aLunxHbEeUM-Egsk",{"id":2782,"title":2783,"body":2784,"category":239,"cover":240,"description":2788,"extension":241,"meta":3002,"navigation":93,"path":3003,"pinned":244,"publishedAt":245,"seo":3004,"slug":3005,"stem":3006,"summary":3007,"tags":3008,"updatedAt":245,"visible":93,"__hash__":3011},"posts\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic.md","09｜布尔值、比较运算与逻辑运算",{"type":7,"value":2785,"toc":2990},[2786,2789,2791,2794,2796,2802,2812,2814,2847,2849,2851,2895,2897,2903,2905,2907,2928,2930,2933,2939,2947,2949,2963,2965,2981,2983,2985,2988],[10,2787,2788],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07、08 篇。学完后，你应该能够组合能够得到 True 或 False 的条件。",[14,2790,16],{"id":16},[10,2792,2793],{},"本篇只处理“布尔值、比较运算与逻辑运算”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,2795,22],{"id":22},[10,2797,2798],{},[26,2799],{"alt":2800,"src":2801},"条件如何得到布尔结果","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-boolean-logic.svg",[10,2803,2804,2805,1023,2808,2811],{},"比较表达式先产生 ",[33,2806,2807],{},"True",[33,2809,2810],{},"False","，逻辑运算符再组合这些布尔结果。此时只观察条件本身，还没有进入分支执行。",[14,2813,39],{"id":39},[41,2815,2816,2830,2844],{},[44,2817,2818,2821,2822,2825,2826,2829],{},[33,2819,2820],{},"=="," 判断是否相等，",[33,2823,2824],{},"!="," 判断是否不等；单个 ",[33,2827,2828],{},"="," 是赋值。",[44,2831,2832,2835,2836,2839,2840,2843],{},[33,2833,2834],{},"and"," 要求两侧都为真，",[33,2837,2838],{},"or"," 只需一侧为真，",[33,2841,2842],{},"not"," 取反。",[44,2845,2846],{},"复杂条件用有含义的中间变量拆开，通常比一行堆叠多个运算符更易读。",[14,2848,67],{"id":67},[10,2850,70],{},[72,2852,2854],{"className":74,"code":2853,"language":76,"meta":77,"style":77},"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,2855,2856,2861,2866,2870,2875,2880,2885,2890],{"__ignoreMap":77},[81,2857,2858],{"class":83,"line":84},[81,2859,2860],{},"age = 20\n",[81,2862,2863],{"class":83,"line":90},[81,2864,2865],{},"has_ticket = True\n",[81,2867,2868],{"class":83,"line":97},[81,2869,94],{"emptyLinePlaceholder":93},[81,2871,2872],{"class":83,"line":103},[81,2873,2874],{},"is_adult = age >= 18\n",[81,2876,2877],{"class":83,"line":109},[81,2878,2879],{},"can_enter = is_adult and has_ticket\n",[81,2881,2882],{"class":83,"line":115},[81,2883,2884],{},"print(is_adult)\n",[81,2886,2887],{"class":83,"line":121},[81,2888,2889],{},"print(can_enter)\n",[81,2891,2892],{"class":83,"line":127},[81,2893,2894],{},"print(not has_ticket)\n",[10,2896,156],{},[72,2898,2901],{"className":2899,"code":2900,"language":162,"meta":77},[160],"True\nTrue\nFalse\n",[33,2902,2900],{"__ignoreMap":77},[10,2904,167],{},[14,2906,170],{"id":170},[172,2908,2909,2919],{},[44,2910,2911,2914,2915,2918],{},[33,2912,2913],{},"age >= 18"," 先产生布尔值并绑定给 ",[33,2916,2917],{},"is_adult","，这一步没有任何分支跳转。",[44,2920,2921,2924,2925,2927],{},[33,2922,2923],{},"is_adult and has_ticket"," 只有两侧都为真才得到真；",[33,2926,2842],{}," 只对紧随其后的值取反。",[342,2929,2710],{"id":2710},[10,2931,2932],{},"两个布尔条件组合时，直接看真值表比凭语感判断更可靠。",[10,2934,2935],{},[26,2936],{"alt":2937,"src":2938},"and 与 or 的关键真假组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F09-and-or-table.svg",[10,2940,2941,2943,2944,2946],{},[33,2942,2834],{}," 只有“真、真”得到真；",[33,2945,2838],{}," 只有“假、假”得到假。先计算比较条件，再查对应组合。",[14,2948,190],{"id":190},[41,2950,2951,2960],{},[44,2952,2953,2954,2956,2957,2959],{},"用单个等号判断相等。",[33,2955,2828],{}," 是赋值，",[33,2958,2820],{}," 才是相等比较。",[44,2961,2962],{},"在同一行混合过多比较和逻辑运算，导致读者难以判断组合顺序；先拆成命名清楚的中间条件。",[14,2964,207],{"id":207},[172,2966,2967,2974],{},[44,2968,2969,2970,2973],{},"判断数字 ",[33,2971,2972],{},"15"," 是否同时大于 10 且小于 20。",[44,2975,2976,2977,2980],{},"分别修改年龄和票据状态，记录 ",[33,2978,2979],{},"can_enter"," 的四种组合结果。",[10,2982,218],{},[14,2984,221],{"id":221},[10,2986,2987],{},"本篇目标是组合能够得到 True 或 False 的条件。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,2989,228],{},{"title":77,"searchDepth":90,"depth":90,"links":2991},[2992,2993,2994,2995,2996,2999,3000,3001],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":2997},[2998],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F09-python-booleans-comparisons-logic",{"title":2783,"description":2788},"python-booleans-comparisons-logic","posts\u002F20260817\u002F09-python-booleans-comparisons-logic","面向按顺序学习 Python 的初学者，本篇在第 07、08 篇知识上，帮助读者组合能够得到 True 或 False 的条件。",[239,3009,3010],"布尔值","逻辑运算","gN0aUhPMb8GvEi6Ws2f85mGLqOOuGxgDpd9nbry4DBo",{"id":3013,"title":3014,"body":3015,"category":239,"cover":240,"description":3019,"extension":241,"meta":3187,"navigation":93,"path":3188,"pinned":244,"publishedAt":245,"seo":3189,"slug":3190,"stem":3191,"summary":3192,"tags":3193,"updatedAt":245,"visible":93,"__hash__":3195},"posts\u002Fposts\u002F20260817\u002F10-python-input-and-conversion.md","10｜使用 input 接收输入并转换类型",{"type":7,"value":3016,"toc":3177},[3017,3020,3022,3025,3027,3033,3051,3053,3066,3068,3070,3104,3106,3112,3114,3116,3138,3140,3152,3154,3168,3170,3172,3175],[10,3018,3019],{},"这套课程按知识依赖排列。本篇的前置知识是：第 07～09 篇。学完后，你应该能够接收用户文本并转换为数值。",[14,3021,16],{"id":16},[10,3023,3024],{},"本篇只处理“使用 input 接收输入并转换类型”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3026,22],{"id":22},[10,3028,3029],{},[26,3030],{"alt":3031,"src":3032},"input 得到文本后再转换","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F10-input-conversion.svg",[10,3034,3035,3038,3039,3042,3043,3046,3047,3050],{},[33,3036,3037],{},"input()"," 的结果始终是字符串。即使键盘输入 ",[33,3040,3041],{},"18","，程序首先得到的也是 ",[33,3044,3045],{},"\"18\"","，需要 ",[33,3048,3049],{},"int()"," 后才能按整数参与计算。",[14,3052,39],{"id":39},[41,3054,3055,3058,3063],{},[44,3056,3057],{},"提示文字应告诉用户需要输入什么。",[44,3059,3060,3062],{},[33,3061,3049],{}," 只能转换符合整数格式的文本；输入其他内容会产生异常，异常处理将在第 33 篇系统讲解。",[44,3064,3065],{},"输入转换和业务计算分开写，定位问题更直接。",[14,3067,67],{"id":67},[10,3069,70],{},[72,3071,3073],{"className":74,"code":3072,"language":76,"meta":77,"style":77},"name = input(\"请输入姓名：\")\nage_text = input(\"请输入年龄：\")\nage = int(age_text)\n\nprint(\"你好，\" + name)\nprint(age + 1)\n",[33,3074,3075,3080,3085,3090,3094,3099],{"__ignoreMap":77},[81,3076,3077],{"class":83,"line":84},[81,3078,3079],{},"name = input(\"请输入姓名：\")\n",[81,3081,3082],{"class":83,"line":90},[81,3083,3084],{},"age_text = input(\"请输入年龄：\")\n",[81,3086,3087],{"class":83,"line":97},[81,3088,3089],{},"age = int(age_text)\n",[81,3091,3092],{"class":83,"line":103},[81,3093,94],{"emptyLinePlaceholder":93},[81,3095,3096],{"class":83,"line":109},[81,3097,3098],{},"print(\"你好，\" + name)\n",[81,3100,3101],{"class":83,"line":115},[81,3102,3103],{},"print(age + 1)\n",[10,3105,156],{},[72,3107,3110],{"className":3108,"code":3109,"language":162,"meta":77},[160],"根据输入显示姓名，并输出下一年的年龄\n",[33,3111,3109],{"__ignoreMap":77},[10,3113,167],{},[14,3115,170],{"id":170},[172,3117,3118,3128],{},[44,3119,3120,3121,3123,3124,3127],{},"两次 ",[33,3122,3037],{}," 都暂停等待输入，并分别返回字符串。变量名 ",[33,3125,3126],{},"age_text"," 用来提醒这仍是文本。",[44,3129,3130,3133,3134,3137],{},[33,3131,3132],{},"int(age_text)"," 创建整数对象，后面的 ",[33,3135,3136],{},"age + 1"," 才执行数值加法；字符串直接加整数会产生类型错误。",[14,3139,190],{"id":190},[41,3141,3142,3149],{},[44,3143,3144,3145,3148],{},"直接计算 ",[33,3146,3147],{},"input(...) + 1","，忽略输入结果是字符串。",[44,3150,3151],{},"假设任何输入都能转换为整数。异常处理在后续课程讲解，本篇先使用符合提示的输入。",[14,3153,207],{"id":207},[172,3155,3156,3159],{},[44,3157,3158],{},"接收两个整数并输出它们的和。",[44,3160,1734,3161,3164,3165,3167],{},[33,3162,3163],{},"18.5"," 给 ",[33,3166,3049],{},"，记录错误类型，但暂时不要尝试忽略错误。",[10,3169,218],{},[14,3171,221],{"id":221},[10,3173,3174],{},"本篇目标是接收用户文本并转换为数值。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,3176,228],{},{"title":77,"searchDepth":90,"depth":90,"links":3178},[3179,3180,3181,3182,3183,3184,3185,3186],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F10-python-input-and-conversion",{"title":3014,"description":3019},"python-input-and-conversion","posts\u002F20260817\u002F10-python-input-and-conversion","面向按顺序学习 Python 的初学者，本篇在第 07～09 篇知识上，帮助读者接收用户文本并转换为数值。",[239,2359,3194],"类型转换","Sjfw0fjJeHUqUCbt442mOTmjSmeY7-8lNol5xlOOFJk",{"id":3197,"title":3198,"body":3199,"category":239,"cover":240,"description":3203,"extension":241,"meta":3363,"navigation":93,"path":3364,"pinned":244,"publishedAt":245,"seo":3365,"slug":3366,"stem":3367,"summary":3368,"tags":3369,"updatedAt":245,"visible":93,"__hash__":3372},"posts\u002Fposts\u002F20260817\u002F11-python-list-basics.md","11｜列表：按顺序保存一组可变数据",{"type":7,"value":3200,"toc":3353},[3201,3204,3206,3209,3211,3217,3224,3226,3240,3242,3244,3283,3285,3291,3293,3295,3314,3316,3331,3333,3344,3346,3348,3351],[10,3202,3203],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、08 篇。学完后，你应该能够创建、读取、修改和追加列表元素。",[14,3205,16],{"id":16},[10,3207,3208],{},"本篇只处理“列表：按顺序保存一组可变数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3210,22],{"id":22},[10,3212,3213],{},[26,3214],{"alt":3215,"src":3216},"列表索引定位元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F11-list-index.svg",[10,3218,3219,3220,3223],{},"列表为元素维护从 0 开始的位置索引。修改 ",[33,3221,3222],{},"scores[1]"," 只把第二个位置改为引用新对象，其他位置保持不变。",[14,3225,39],{"id":39},[41,3227,3228,3231,3234],{},[44,3229,3230],{},"列表使用方括号，元素之间用逗号分隔。",[44,3232,3233],{},"列表可变，可以替换、追加和删除元素。",[44,3235,3236,3237,376],{},"访问不存在的索引会产生 ",[33,3238,3239],{},"IndexError",[14,3241,67],{"id":67},[10,3243,70],{},[72,3245,3247],{"className":74,"code":3246,"language":76,"meta":77,"style":77},"scores = [82, 90, 76]\nprint(scores[0])\n\nscores[1] = 95\nscores.append(88)\nprint(scores)\nprint(len(scores))\n",[33,3248,3249,3254,3259,3263,3268,3273,3278],{"__ignoreMap":77},[81,3250,3251],{"class":83,"line":84},[81,3252,3253],{},"scores = [82, 90, 76]\n",[81,3255,3256],{"class":83,"line":90},[81,3257,3258],{},"print(scores[0])\n",[81,3260,3261],{"class":83,"line":97},[81,3262,94],{"emptyLinePlaceholder":93},[81,3264,3265],{"class":83,"line":103},[81,3266,3267],{},"scores[1] = 95\n",[81,3269,3270],{"class":83,"line":109},[81,3271,3272],{},"scores.append(88)\n",[81,3274,3275],{"class":83,"line":115},[81,3276,3277],{},"print(scores)\n",[81,3279,3280],{"class":83,"line":121},[81,3281,3282],{},"print(len(scores))\n",[10,3284,156],{},[72,3286,3289],{"className":3287,"code":3288,"language":162,"meta":77},[160],"82\n[82, 95, 76, 88]\n4\n",[33,3290,3288],{"__ignoreMap":77},[10,3292,167],{},[14,3294,170],{"id":170},[172,3296,3297,3300],{},[44,3298,3299],{},"列表创建后，每个位置保存对元素对象的引用，索引 0 对应第一项。",[44,3301,3302,3305,3306,3309,3310,3313],{},[33,3303,3304],{},"scores[1] = 95"," 替换第二个位置，",[33,3307,3308],{},"append(88)"," 在末尾增加新位置，",[33,3311,3312],{},"len()"," 因而从 3 变为 4。",[14,3315,190],{"id":190},[41,3317,3318,3328],{},[44,3319,3320,3321,3324,3325,376],{},"访问 ",[33,3322,3323],{},"scores[len(scores)]","。最后一个合法正索引是 ",[33,3326,3327],{},"len(scores) - 1",[44,3329,3330],{},"调用会修改列表的方法后还期待原列表保持不变；修改前先确认是否需要副本。",[14,3332,207],{"id":207},[172,3334,3335,3338],{},[44,3336,3337],{},"建立三项学习任务列表，再追加第四项。",[44,3339,3340,3341,3343],{},"修改第二项，并用 ",[33,3342,3312],{}," 检查元素数量。",[10,3345,218],{},[14,3347,221],{"id":221},[10,3349,3350],{},"本篇目标是创建、读取、修改和追加列表元素。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,3352,228],{},{"title":77,"searchDepth":90,"depth":90,"links":3354},[3355,3356,3357,3358,3359,3360,3361,3362],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F11-python-list-basics",{"title":3198,"description":3203},"python-list-basics","posts\u002F20260817\u002F11-python-list-basics","面向按顺序学习 Python 的初学者，本篇在第 06、08 篇知识上，帮助读者创建、读取、修改和追加列表元素。",[239,3370,3371],"列表","数据结构","DbC8cJb2leXMJkJQ8dEgmDukP94ifvXYDhcWOuDqMg8",{"id":3374,"title":3375,"body":3376,"category":239,"cover":240,"description":3380,"extension":241,"meta":3521,"navigation":93,"path":3522,"pinned":244,"publishedAt":245,"seo":3523,"slug":3524,"stem":3525,"summary":3526,"tags":3527,"updatedAt":245,"visible":93,"__hash__":3529},"posts\u002Fposts\u002F20260817\u002F12-python-tuple-basics.md","12｜元组：保存不应被修改的有序数据",{"type":7,"value":3377,"toc":3511},[3378,3381,3383,3386,3388,3394,3397,3399,3410,3412,3414,3448,3450,3456,3458,3460,3474,3476,3488,3490,3502,3504,3506,3509],[10,3379,3380],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够理解元组与列表的使用边界。",[14,3382,16],{"id":16},[10,3384,3385],{},"本篇只处理“元组：保存不应被修改的有序数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3387,22],{"id":22},[10,3389,3390],{},[26,3391],{"alt":3392,"src":3393},"列表与元组的可变性","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F12-list-tuple.svg",[10,3395,3396],{},"列表和元组都按顺序保存元素，但元组创建后不能替换其中的位置。不可变表示元组结构不变，不代表元组内部引用的每个对象都一定不可变。",[14,3398,39],{"id":39},[41,3400,3401,3404,3407],{},[44,3402,3403],{},"元组常用来表达固定数量、固定含义的一组值。",[44,3405,3406],{},"只有一个元素的元组必须保留尾随逗号。",[44,3408,3409],{},"需要频繁增删元素时使用列表，不要为了“更高级”而选择元组。",[14,3411,67],{"id":67},[10,3413,70],{},[72,3415,3417],{"className":74,"code":3416,"language":76,"meta":77,"style":77},"point = (120, 80)\nprint(point[0])\nprint(point[1])\n\nsingle = (5,)\nprint(single)\n",[33,3418,3419,3424,3429,3434,3438,3443],{"__ignoreMap":77},[81,3420,3421],{"class":83,"line":84},[81,3422,3423],{},"point = (120, 80)\n",[81,3425,3426],{"class":83,"line":90},[81,3427,3428],{},"print(point[0])\n",[81,3430,3431],{"class":83,"line":97},[81,3432,3433],{},"print(point[1])\n",[81,3435,3436],{"class":83,"line":103},[81,3437,94],{"emptyLinePlaceholder":93},[81,3439,3440],{"class":83,"line":109},[81,3441,3442],{},"single = (5,)\n",[81,3444,3445],{"class":83,"line":115},[81,3446,3447],{},"print(single)\n",[10,3449,156],{},[72,3451,3454],{"className":3452,"code":3453,"language":162,"meta":77},[160],"120\n80\n(5,)\n",[33,3455,3453],{"__ignoreMap":77},[10,3457,167],{},[14,3459,170],{"id":170},[172,3461,3462,3468],{},[44,3463,3464,3467],{},[33,3465,3466],{},"point"," 的两个位置在创建后不能被重新赋值，因此适合表达固定结构的坐标。",[44,3469,3470,3473],{},[33,3471,3472],{},"(5,)"," 的逗号决定它是单元素元组；括号本身只起分组作用。",[14,3475,190],{"id":190},[41,3477,3478,3485],{},[44,3479,3480,3481,3484],{},"把 ",[33,3482,3483],{},"(5)"," 当作元组，实际它仍是整数。",[44,3486,3487],{},"把不可变误解为内部一切都不可变；元组中如果引用列表，列表内容仍可能变化。",[14,3489,207],{"id":207},[172,3491,3492,3495],{},[44,3493,3494],{},"用元组表示宽度和高度。",[44,3496,2187,3497,2190,3499,3501],{},[33,3498,3483],{},[33,3500,3472],{}," 的类型。",[10,3503,218],{},[14,3505,221],{"id":221},[10,3507,3508],{},"本篇目标是理解元组与列表的使用边界。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,3510,228],{},{"title":77,"searchDepth":90,"depth":90,"links":3512},[3513,3514,3515,3516,3517,3518,3519,3520],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F12-python-tuple-basics",{"title":3375,"description":3380},"python-tuple-basics","posts\u002F20260817\u002F12-python-tuple-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者理解元组与列表的使用边界。",[239,3528,3371],"元组","09U1IgIHcdYMvacWQvXgZYFo_kxDSR_c4lgdQgqKL08",{"id":3531,"title":3532,"body":3533,"category":239,"cover":240,"description":3537,"extension":241,"meta":3692,"navigation":93,"path":3693,"pinned":244,"publishedAt":245,"seo":3694,"slug":3695,"stem":3696,"summary":3697,"tags":3698,"updatedAt":245,"visible":93,"__hash__":3700},"posts\u002Fposts\u002F20260817\u002F13-python-dictionary-basics.md","13｜字典：用键快速找到对应的值",{"type":7,"value":3534,"toc":3682},[3535,3538,3540,3543,3545,3551,3561,3563,3577,3579,3581,3615,3617,3623,3625,3627,3642,3644,3663,3665,3673,3675,3677,3680],[10,3536,3537],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11 篇。学完后，你应该能够创建并增删改查键值对。",[14,3539,16],{"id":16},[10,3541,3542],{},"本篇只处理“字典：用键快速找到对应的值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3544,22],{"id":22},[10,3546,3547],{},[26,3548],{"alt":3549,"src":3550},"字典用键定位值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F13-dict-mapping.svg",[10,3552,3553,3554,3557,3558,3560],{},"字典通过键定位值，不使用连续位置表达含义。",[33,3555,3556],{},"student[\"score\"]"," 读取的是键 ",[33,3559,2260],{}," 对应的值，而不是“第几个元素”。",[14,3562,39],{"id":39},[41,3564,3565,3568,3574],{},[44,3566,3567],{},"字典键必须唯一；再次给同一个键赋值会更新原值。",[44,3569,46,3570,3573],{},[33,3571,3572],{},"in"," 可以检查键是否存在，但条件分支将在第 16 篇使用。",[44,3575,3576],{},"键应稳定且可哈希，基础场景优先使用字符串、整数或元组。",[14,3578,67],{"id":67},[10,3580,70],{},[72,3582,3584],{"className":74,"code":3583,"language":76,"meta":77,"style":77},"student = {\"name\": \"小郑\", \"score\": 90}\nprint(student[\"name\"])\n\nstudent[\"score\"] = 95\nstudent[\"city\"] = \"郑州\"\nprint(student)\n",[33,3585,3586,3591,3596,3600,3605,3610],{"__ignoreMap":77},[81,3587,3588],{"class":83,"line":84},[81,3589,3590],{},"student = {\"name\": \"小郑\", \"score\": 90}\n",[81,3592,3593],{"class":83,"line":90},[81,3594,3595],{},"print(student[\"name\"])\n",[81,3597,3598],{"class":83,"line":97},[81,3599,94],{"emptyLinePlaceholder":93},[81,3601,3602],{"class":83,"line":103},[81,3603,3604],{},"student[\"score\"] = 95\n",[81,3606,3607],{"class":83,"line":109},[81,3608,3609],{},"student[\"city\"] = \"郑州\"\n",[81,3611,3612],{"class":83,"line":115},[81,3613,3614],{},"print(student)\n",[10,3616,156],{},[72,3618,3621],{"className":3619,"code":3620,"language":162,"meta":77},[160],"小郑\n{'name': '小郑', 'score': 95, 'city': '郑州'}\n",[33,3622,3620],{"__ignoreMap":77},[10,3624,167],{},[14,3626,170],{"id":170},[172,3628,3629,3632],{},[44,3630,3631],{},"字典字面量同时建立两个键值映射；读取时提供键，字典返回对应值。",[44,3633,3634,3635,3637,3638,3641],{},"给已有键 ",[33,3636,2260],{}," 赋值会更新映射，给新键 ",[33,3639,3640],{},"city"," 赋值会增加映射。",[14,3643,190],{"id":190},[41,3645,3646,3653],{},[44,3647,3648,3649,3652],{},"按位置理解字典并尝试 ",[33,3650,3651],{},"student[0]","，而实际键是字符串。",[44,3654,3655,3656,3659,3660,376],{},"直接读取不确定存在的键并忽略 ",[33,3657,3658],{},"KeyError","；后续可根据场景使用成员检查或 ",[33,3661,3662],{},"get()",[14,3664,207],{"id":207},[172,3666,3667,3670],{},[44,3668,3669],{},"建立一本书的标题、作者和页数字典。",[44,3671,3672],{},"添加分类键，再修改页数。",[10,3674,218],{},[14,3676,221],{"id":221},[10,3678,3679],{},"本篇目标是创建并增删改查键值对。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,3681,228],{},{"title":77,"searchDepth":90,"depth":90,"links":3683},[3684,3685,3686,3687,3688,3689,3690,3691],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F13-python-dictionary-basics",{"title":3532,"description":3537},"python-dictionary-basics","posts\u002F20260817\u002F13-python-dictionary-basics","面向按顺序学习 Python 的初学者，本篇在第 06、11 篇知识上，帮助读者创建并增删改查键值对。",[239,3699,3371],"字典","p-xgRkGf2z471a10QJLlKltBVWJ1x_ljUe5U0thqW3Y",{"id":3702,"title":3703,"body":3704,"category":239,"cover":240,"description":3708,"extension":241,"meta":3857,"navigation":93,"path":3858,"pinned":244,"publishedAt":245,"seo":3859,"slug":3860,"stem":3861,"summary":3862,"tags":3863,"updatedAt":245,"visible":93,"__hash__":3865},"posts\u002Fposts\u002F20260817\u002F14-python-set-basics.md","14｜集合：去重并判断成员关系",{"type":7,"value":3705,"toc":3847},[3706,3709,3711,3714,3716,3722,3725,3727,3746,3748,3750,3784,3786,3792,3794,3796,3811,3813,3825,3827,3838,3840,3842,3845],[10,3707,3708],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11 篇。学完后，你应该能够使用集合去重并完成基础集合运算。",[14,3710,16],{"id":16},[10,3712,3713],{},"本篇只处理“集合：去重并判断成员关系”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3715,22],{"id":22},[10,3717,3718],{},[26,3719],{"alt":3720,"src":3721},"集合运算保留哪些元素","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F14-set-operations.svg",[10,3723,3724],{},"交集只保留两边都有的元素，并集收集两边全部不同元素，差集只保留左侧独有元素。集合不靠位置组织数据。",[14,3726,39],{"id":39},[41,3728,3729,3732,3735],{},[44,3730,3731],{},"集合中的元素不重复。",[44,3733,3734],{},"集合是无序容器，不要依赖打印顺序或索引。",[44,3736,3737,3738,3741,3742,3745],{},"创建空集合必须写 ",[33,3739,3740],{},"set()","；",[33,3743,3744],{},"{}"," 创建的是空字典。",[14,3747,67],{"id":67},[10,3749,70],{},[72,3751,3753],{"className":74,"code":3752,"language":76,"meta":77,"style":77},"left = {\"Python\", \"Git\", \"Linux\"}\nright = {\"Python\", \"Docker\"}\n\nprint(left & right)\nprint(left | right)\nprint(\"Git\" in left)\n",[33,3754,3755,3760,3765,3769,3774,3779],{"__ignoreMap":77},[81,3756,3757],{"class":83,"line":84},[81,3758,3759],{},"left = {\"Python\", \"Git\", \"Linux\"}\n",[81,3761,3762],{"class":83,"line":90},[81,3763,3764],{},"right = {\"Python\", \"Docker\"}\n",[81,3766,3767],{"class":83,"line":97},[81,3768,94],{"emptyLinePlaceholder":93},[81,3770,3771],{"class":83,"line":103},[81,3772,3773],{},"print(left & right)\n",[81,3775,3776],{"class":83,"line":109},[81,3777,3778],{},"print(left | right)\n",[81,3780,3781],{"class":83,"line":115},[81,3782,3783],{},"print(\"Git\" in left)\n",[10,3785,156],{},[72,3787,3790],{"className":3788,"code":3789,"language":162,"meta":77},[160],"{'Python'}\n集合包含 Python、Git、Linux、Docker（显示顺序不保证）\nTrue\n",[33,3791,3789],{"__ignoreMap":77},[10,3793,167],{},[14,3795,170],{"id":170},[172,3797,3798,3801],{},[44,3799,3800],{},"集合字面量自动保证元素唯一，成员测试通常只关心“在不在”。",[44,3802,3803,3806,3807,3810],{},[33,3804,3805],{},"&"," 计算交集，",[33,3808,3809],{},"|"," 计算并集；结果显示顺序不应作为程序逻辑的一部分。",[14,3812,190],{"id":190},[41,3814,3815,3822],{},[44,3816,46,3817,3819,3820,376],{},[33,3818,3744],{}," 创建空集合，实际得到空字典；空集合应写 ",[33,3821,3740],{},[44,3823,3824],{},"依赖集合的显示顺序或尝试通过索引读取元素。",[14,3826,207],{"id":207},[172,3828,3829,3835],{},[44,3830,3831,3832,3834],{},"把包含重复标签的列表交给 ",[33,3833,3740],{}," 去重。",[44,3836,3837],{},"计算两组课程标签的交集和差集。",[10,3839,218],{},[14,3841,221],{"id":221},[10,3843,3844],{},"本篇目标是使用集合去重并完成基础集合运算。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,3846,228],{},{"title":77,"searchDepth":90,"depth":90,"links":3848},[3849,3850,3851,3852,3853,3854,3855,3856],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F14-python-set-basics",{"title":3703,"description":3708},"python-set-basics","posts\u002F20260817\u002F14-python-set-basics","面向按顺序学习 Python 的初学者，本篇在第 11 篇知识上，帮助读者使用集合去重并完成基础集合运算。",[239,3864,3371],"集合","KXOj6NoWOOrTpxvBH_a2NRpI_gZBrOFknr0TFAxKVR0",{"id":3867,"title":3868,"body":3869,"category":239,"cover":240,"description":3873,"extension":241,"meta":4070,"navigation":93,"path":4071,"pinned":244,"publishedAt":245,"seo":4072,"slug":4073,"stem":4074,"summary":4075,"tags":4076,"updatedAt":245,"visible":93,"__hash__":4079},"posts\u002Fposts\u002F20260817\u002F15-python-mutable-copy.md","15｜可变对象、共享引用与浅拷贝",{"type":7,"value":3870,"toc":4058},[3871,3874,3876,3879,3881,3887,3897,3899,3916,3918,3920,3969,3971,3977,3979,3981,4003,4005,4008,4014,4017,4019,4032,4034,4049,4051,4053,4056],[10,3872,3873],{},"这套课程按知识依赖排列。本篇的前置知识是：第 06、11、13 篇。学完后，你应该能够识别共享引用并创建基础浅拷贝。",[14,3875,16],{"id":16},[10,3877,3878],{},"本篇只处理“可变对象、共享引用与浅拷贝”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,3880,22],{"id":22},[10,3882,3883],{},[26,3884],{"alt":3885,"src":3886},"共享引用与浅拷贝","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shared-reference.svg",[10,3888,3889,3892,3893,3896],{},[33,3890,3891],{},"backup = tasks"," 只增加一个指向同一列表的变量名；",[33,3894,3895],{},"tasks.copy()"," 才创建外层新列表。浅拷贝不会递归复制内部嵌套对象。",[14,3898,39],{"id":39},[41,3900,3901,3910,3913],{},[44,3902,3903,3905,3906,3909],{},[33,3904,2820],{}," 比较内容是否相等，",[33,3907,3908],{},"is"," 比较是否为同一个对象。",[44,3911,3912],{},"列表和字典是常见可变对象，修改操作可能通过共享引用被其他变量观察到。",[44,3914,3915],{},"处理嵌套结构时需要明确浅拷贝边界，不要默认所有层级都已独立。",[14,3917,67],{"id":67},[10,3919,70],{},[72,3921,3923],{"className":74,"code":3922,"language":76,"meta":77,"style":77},"tasks = [\"变量\", \"字符串\"]\nshared = tasks\nbackup = tasks.copy()\n\ntasks.append(\"列表\")\nprint(shared)\nprint(backup)\nprint(tasks is shared)\nprint(tasks is backup)\n",[33,3924,3925,3930,3935,3940,3944,3949,3954,3959,3964],{"__ignoreMap":77},[81,3926,3927],{"class":83,"line":84},[81,3928,3929],{},"tasks = [\"变量\", \"字符串\"]\n",[81,3931,3932],{"class":83,"line":90},[81,3933,3934],{},"shared = tasks\n",[81,3936,3937],{"class":83,"line":97},[81,3938,3939],{},"backup = tasks.copy()\n",[81,3941,3942],{"class":83,"line":103},[81,3943,94],{"emptyLinePlaceholder":93},[81,3945,3946],{"class":83,"line":109},[81,3947,3948],{},"tasks.append(\"列表\")\n",[81,3950,3951],{"class":83,"line":115},[81,3952,3953],{},"print(shared)\n",[81,3955,3956],{"class":83,"line":121},[81,3957,3958],{},"print(backup)\n",[81,3960,3961],{"class":83,"line":127},[81,3962,3963],{},"print(tasks is shared)\n",[81,3965,3966],{"class":83,"line":132},[81,3967,3968],{},"print(tasks is backup)\n",[10,3970,156],{},[72,3972,3975],{"className":3973,"code":3974,"language":162,"meta":77},[160],"['变量', '字符串', '列表']\n['变量', '字符串']\nTrue\nFalse\n",[33,3976,3974],{"__ignoreMap":77},[10,3978,167],{},[14,3980,170],{"id":170},[172,3982,3983,3989],{},[44,3984,3985,3988],{},[33,3986,3987],{},"shared = tasks"," 没有创建列表，只让两个名字指向同一个列表对象。",[44,3990,3991,3994,3995,3998,3999,4002],{},[33,3992,3993],{},"backup = tasks.copy()"," 创建新的外层列表；随后向原列表追加元素，",[33,3996,3997],{},"shared"," 能观察到变化，",[33,4000,4001],{},"backup"," 不会。",[342,4004,2710],{"id":2710},[10,4006,4007],{},"浅拷贝遇到嵌套列表时，外层虽然分开，内部对象仍可能共享。",[10,4009,4010],{},[26,4011],{"alt":4012,"src":4013},"浅拷贝只分离外层列表","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F15-shallow-copy-nested.svg",[10,4015,4016],{},"两边拥有不同的外层列表，但内部课程列表仍是同一个对象。修改内部列表时，两边都能观察到变化。",[14,4018,190],{"id":190},[41,4020,4021,4029],{},[44,4022,4023,4024,4026,4027,376],{},"用 ",[33,4025,2820],{}," 判断是否同一对象。内容相等不代表身份相同，身份比较使用 ",[33,4028,3908],{},[44,4030,4031],{},"把浅拷贝当作递归复制；嵌套列表中的内部对象仍可能被两边共享。",[14,4033,207],{"id":207},[172,4035,4036,4039],{},[44,4037,4038],{},"让两个变量引用同一个字典并修改其中一个。",[44,4040,46,4041,4044,4045,1171,4047,376],{},[33,4042,4043],{},"copy()"," 创建外层副本，再比较 ",[33,4046,3908],{},[33,4048,2820],{},[10,4050,218],{},[14,4052,221],{"id":221},[10,4054,4055],{},"本篇目标是识别共享引用并创建基础浅拷贝。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,4057,228],{},{"title":77,"searchDepth":90,"depth":90,"links":4059},[4060,4061,4062,4063,4064,4067,4068,4069],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":4065},[4066],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F15-python-mutable-copy",{"title":3868,"description":3873},"python-mutable-copy","posts\u002F20260817\u002F15-python-mutable-copy","面向按顺序学习 Python 的初学者，本篇在第 06、11、13 篇知识上，帮助读者识别共享引用并创建基础浅拷贝。",[239,4077,4078],"可变对象","浅拷贝","vdOQb2defrPnPNgAJhS4q0sbEptSjwNTiVl9Dfnao7Q",{"id":4081,"title":4082,"body":4083,"category":239,"cover":240,"description":4087,"extension":241,"meta":4299,"navigation":93,"path":4300,"pinned":244,"publishedAt":245,"seo":4301,"slug":4302,"stem":4303,"summary":4304,"tags":4305,"updatedAt":245,"visible":93,"__hash__":4307},"posts\u002Fposts\u002F20260817\u002F16-python-if-branches.md","16｜if 条件判断与多分支选择",{"type":7,"value":4084,"toc":4286},[4085,4088,4090,4093,4095,4101,4111,4113,4124,4126,4128,4180,4182,4188,4190,4192,4210,4212,4215,4221,4229,4232,4235,4241,4247,4249,4267,4269,4277,4279,4281,4284],[10,4086,4087],{},"这套课程按知识依赖排列。本篇的前置知识是：第 09、10 篇。学完后，你应该能够根据互斥条件选择一条执行路径。",[14,4089,16],{"id":16},[10,4091,4092],{},"本篇只处理“if 条件判断与多分支选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4094,22],{"id":22},[10,4096,4097],{},[26,4098],{"alt":4099,"src":4100},"if 只选择一条分支","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-if-branch.svg",[10,4102,4103,2271,4105,2271,4108,4110],{},[33,4104,1170],{},[33,4106,4107],{},"elif",[33,4109,1174],{}," 从上到下判断，一旦某个条件成立，就执行对应分支并跳过后面的同级分支。",[14,4112,39],{"id":39},[41,4114,4115,4118,4121],{},[44,4116,4117],{},"冒号表示接下来开始一个代码块。",[44,4119,4120],{},"同一代码块必须保持一致缩进，通常使用四个空格。",[44,4122,4123],{},"多分支条件要从更严格的范围向更宽的范围排列。",[14,4125,67],{"id":67},[10,4127,70],{},[72,4129,4131],{"className":74,"code":4130,"language":76,"meta":77,"style":77},"score = int(input(\"请输入分数：\"))\n\nif score >= 90:\n    level = \"优秀\"\nelif score >= 60:\n    level = \"合格\"\nelse:\n    level = \"需要继续学习\"\n\nprint(level)\n",[33,4132,4133,4138,4142,4147,4152,4157,4162,4166,4171,4175],{"__ignoreMap":77},[81,4134,4135],{"class":83,"line":84},[81,4136,4137],{},"score = int(input(\"请输入分数：\"))\n",[81,4139,4140],{"class":83,"line":90},[81,4141,94],{"emptyLinePlaceholder":93},[81,4143,4144],{"class":83,"line":97},[81,4145,4146],{},"if score >= 90:\n",[81,4148,4149],{"class":83,"line":103},[81,4150,4151],{},"    level = \"优秀\"\n",[81,4153,4154],{"class":83,"line":109},[81,4155,4156],{},"elif score >= 60:\n",[81,4158,4159],{"class":83,"line":115},[81,4160,4161],{},"    level = \"合格\"\n",[81,4163,4164],{"class":83,"line":121},[81,4165,1160],{},[81,4167,4168],{"class":83,"line":127},[81,4169,4170],{},"    level = \"需要继续学习\"\n",[81,4172,4173],{"class":83,"line":132},[81,4174,94],{"emptyLinePlaceholder":93},[81,4176,4177],{"class":83,"line":138},[81,4178,4179],{},"print(level)\n",[10,4181,156],{},[72,4183,4186],{"className":4184,"code":4185,"language":162,"meta":77},[160],"输入 85 时输出：合格\n",[33,4187,4185],{"__ignoreMap":77},[10,4189,167],{},[14,4191,170],{"id":170},[172,4193,4194,4201],{},[44,4195,4196,4197,4200],{},"输入先转换为整数，程序从 ",[33,4198,4199],{},"score >= 90"," 开始判断。输入 85 时第一项为假，继续检查下一项。",[44,4202,4203,4206,4207,4209],{},[33,4204,4205],{},"score >= 60"," 为真后执行“合格”分支，同级的 ",[33,4208,1174],{}," 被跳过；最终三个分支只会选择一个。",[342,4211,2710],{"id":2710},[10,4213,4214],{},"多分支判断的顺序会改变结果，尤其是范围互相包含时。",[10,4216,4217],{},[26,4218],{"alt":4219,"src":4220},"多分支要先判断更严格范围","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-branch-order.svg",[10,4222,4223,4225,4226,4228],{},[33,4224,4199],{}," 必须放在 ",[33,4227,4205],{}," 前面。更宽的条件如果先成立，后面更严格的分支就没有机会执行。",[342,4230,2710],{"id":4231},"再看一个具体细节-1",[10,4233,4234],{},"分支属于哪个条件由缩进决定，不由代码在视觉上的远近决定。",[10,4236,4237],{},[26,4238],{"alt":4239,"src":4240},"缩进决定代码块归属","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F16-indentation-block.svg",[10,4242,4243,4244,4246],{},"同一缩进层级属于同一个代码块；回到 ",[33,4245,1170],{}," 之前的缩进后，语句就位于整条分支结构之外。",[14,4248,190],{"id":190},[41,4250,4251,4257],{},[44,4252,4253,4254,4256],{},"先写 ",[33,4255,4205],{},"，导致 95 也在这一项提前匹配，永远到不了“优秀”。",[44,4258,4259,4260,4262,4263,4266],{},"混用多个独立 ",[33,4261,1170],{}," 表达互斥等级，可能同时执行多个代码块；互斥选择使用同一条 ",[33,4264,4265],{},"if\u002Felif\u002Felse"," 链。",[14,4268,207],{"id":207},[172,4270,4271,4274],{},[44,4272,4273],{},"根据温度输出“冷、适中、热”三个等级。",[44,4275,4276],{},"交换示例中两个条件的顺序，解释为什么结果可能错误。",[10,4278,218],{},[14,4280,221],{"id":221},[10,4282,4283],{},"本篇目标是根据互斥条件选择一条执行路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,4285,228],{},{"title":77,"searchDepth":90,"depth":90,"links":4287},[4288,4289,4290,4291,4292,4296,4297,4298],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":4293},[4294,4295],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F16-python-if-branches",{"title":4082,"description":4087},"python-if-branches","posts\u002F20260817\u002F16-python-if-branches","面向按顺序学习 Python 的初学者，本篇在第 09、10 篇知识上，帮助读者根据互斥条件选择一条执行路径。",[239,1170,4306],"条件判断","bebSP1lcnhhyU-BLVawQhLx9aQej9SKKJKVw_DdO60c",{"id":4309,"title":4310,"body":4311,"category":239,"cover":240,"description":4315,"extension":241,"meta":4481,"navigation":93,"path":4482,"pinned":244,"publishedAt":245,"seo":4483,"slug":4484,"stem":4485,"summary":4486,"tags":4487,"updatedAt":245,"visible":93,"__hash__":4489},"posts\u002Fposts\u002F20260817\u002F17-python-while-loop.md","17｜while 循环与状态更新",{"type":7,"value":4312,"toc":4469},[4313,4316,4318,4321,4323,4329,4335,4337,4352,4354,4356,4394,4396,4402,4404,4406,4421,4423,4426,4432,4438,4440,4448,4450,4460,4462,4464,4467],[10,4314,4315],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16 篇。学完后，你应该能够在条件成立时重复执行并保证循环结束。",[14,4317,16],{"id":16},[10,4319,4320],{},"本篇只处理“while 循环与状态更新”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4322,22],{"id":22},[10,4324,4325],{},[26,4326],{"alt":4327,"src":4328},"while 的条件检查与状态更新循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-while-loop.svg",[10,4330,4331,4334],{},[33,4332,4333],{},"while"," 每轮都经历“检查条件—执行循环体—更新状态—再次检查”。缺少状态更新时，条件可能永远成立，形成无限循环。",[14,4336,39],{"id":39},[41,4338,4339,4342,4345],{},[44,4340,4341],{},"进入循环前先准备参与条件判断的状态。",[44,4343,4344],{},"循环体中必须有机会让条件变为假。",[44,4346,4347,4348,4351],{},"能够预先确定遍历对象时，后续介绍的 ",[33,4349,4350],{},"for"," 通常更直接。",[14,4353,67],{"id":67},[10,4355,70],{},[72,4357,4359],{"className":74,"code":4358,"language":76,"meta":77,"style":77},"count = 1\n\nwhile count \u003C= 3:\n    print(\"第\", count, \"次练习\")\n    count = count + 1\n\nprint(\"练习结束\")\n",[33,4360,4361,4366,4370,4375,4380,4385,4389],{"__ignoreMap":77},[81,4362,4363],{"class":83,"line":84},[81,4364,4365],{},"count = 1\n",[81,4367,4368],{"class":83,"line":90},[81,4369,94],{"emptyLinePlaceholder":93},[81,4371,4372],{"class":83,"line":97},[81,4373,4374],{},"while count \u003C= 3:\n",[81,4376,4377],{"class":83,"line":103},[81,4378,4379],{},"    print(\"第\", count, \"次练习\")\n",[81,4381,4382],{"class":83,"line":109},[81,4383,4384],{},"    count = count + 1\n",[81,4386,4387],{"class":83,"line":115},[81,4388,94],{"emptyLinePlaceholder":93},[81,4390,4391],{"class":83,"line":121},[81,4392,4393],{},"print(\"练习结束\")\n",[10,4395,156],{},[72,4397,4400],{"className":4398,"code":4399,"language":162,"meta":77},[160],"第 1 次练习\n第 2 次练习\n第 3 次练习\n练习结束\n",[33,4401,4399],{"__ignoreMap":77},[10,4403,167],{},[14,4405,170],{"id":170},[172,4407,4408,4415],{},[44,4409,4410,4411,4414],{},"进入循环前 ",[33,4412,4413],{},"count"," 为 1，每轮开头判断它是否仍小于等于 3。",[44,4416,4417,4418,4420],{},"循环体末尾把 ",[33,4419,4413],{}," 增加 1；当它变成 4 时条件为假，解释器跳到循环后的语句。",[342,4422,2710],{"id":2710},[10,4424,4425],{},"追踪循环时，可以把每轮开始值、判断结果和更新后值写成表格。",[10,4427,4428],{},[26,4429],{"alt":4430,"src":4431},"count 在每轮怎样变化","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F17-loop-trace-table.svg",[10,4433,4434,4435,4437],{},"第4次检查时 ",[33,4436,4413],{}," 已经是4，条件为假，因此不会产生“第4次练习”的输出。",[14,4439,190],{"id":190},[41,4441,4442,4445],{},[44,4443,4444],{},"漏掉状态更新，条件永远为真，只能手动中断程序。",[44,4446,4447],{},"更新方向写反，例如条件要求递增退出却不断递减。设计循环时先写出状态如何接近结束条件。",[14,4449,207],{"id":207},[172,4451,4452,4457],{},[44,4453,46,4454,4456],{},[33,4455,4333],{}," 输出 1 到 5。",[44,4458,4459],{},"计算 1 到 10 的累加和。",[10,4461,218],{},[14,4463,221],{"id":221},[10,4465,4466],{},"本篇目标是在条件成立时重复执行并保证循环结束。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,4468,228],{},{"title":77,"searchDepth":90,"depth":90,"links":4470},[4471,4472,4473,4474,4475,4478,4479,4480],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":4476},[4477],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F17-python-while-loop",{"title":4310,"description":4315},"python-while-loop","posts\u002F20260817\u002F17-python-while-loop","面向按顺序学习 Python 的初学者，本篇在第 16 篇知识上，帮助读者在条件成立时重复执行并保证循环结束。",[239,4333,4488],"循环","-TrC6KNTG7XCCoQkCsjj0a8RonXSt5TA61HAFQFujg0",{"id":4491,"title":4492,"body":4493,"category":239,"cover":240,"description":4497,"extension":241,"meta":4645,"navigation":93,"path":4646,"pinned":244,"publishedAt":245,"seo":4647,"slug":4648,"stem":4649,"summary":4650,"tags":4651,"updatedAt":245,"visible":93,"__hash__":4653},"posts\u002Fposts\u002F20260817\u002F18-python-for-range.md","18｜for 循环、range 与逐项处理",{"type":7,"value":4494,"toc":4635},[4495,4498,4500,4503,4505,4511,4516,4518,4532,4534,4536,4574,4576,4582,4584,4586,4603,4605,4613,4615,4626,4628,4630,4633],[10,4496,4497],{},"这套课程按知识依赖排列。本篇的前置知识是：第 11、17 篇。学完后，你应该能够遍历列表、字符串和整数范围。",[14,4499,16],{"id":16},[10,4501,4502],{},"本篇只处理“for 循环、range 与逐项处理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4504,22],{"id":22},[10,4506,4507],{},[26,4508],{"alt":4509,"src":4510},"for 逐项取得数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F18-for-iteration.svg",[10,4512,4513,4515],{},[33,4514,4350],{}," 每轮从可迭代对象取得一个元素，绑定到循环变量，再执行循环体。循环变量表示当前元素，不是固定的容器索引。",[14,4517,39],{"id":39},[41,4519,4520,4526,4529],{},[44,4521,4522,4525],{},[33,4523,4524],{},"range(1, 4)"," 包含 1，不包含 4。",[44,4527,4528],{},"只需要元素时直接遍历元素，不必手工维护索引。",[44,4530,4531],{},"循环变量应使用单数名称，容器使用复数名称。",[14,4533,67],{"id":67},[10,4535,70],{},[72,4537,4539],{"className":74,"code":4538,"language":76,"meta":77,"style":77},"courses = [\"变量\", \"字符串\", \"列表\"]\n\nfor course in courses:\n    print(course)\n\nfor number in range(1, 4):\n    print(number)\n",[33,4540,4541,4546,4550,4555,4560,4564,4569],{"__ignoreMap":77},[81,4542,4543],{"class":83,"line":84},[81,4544,4545],{},"courses = [\"变量\", \"字符串\", \"列表\"]\n",[81,4547,4548],{"class":83,"line":90},[81,4549,94],{"emptyLinePlaceholder":93},[81,4551,4552],{"class":83,"line":97},[81,4553,4554],{},"for course in courses:\n",[81,4556,4557],{"class":83,"line":103},[81,4558,4559],{},"    print(course)\n",[81,4561,4562],{"class":83,"line":109},[81,4563,94],{"emptyLinePlaceholder":93},[81,4565,4566],{"class":83,"line":115},[81,4567,4568],{},"for number in range(1, 4):\n",[81,4570,4571],{"class":83,"line":121},[81,4572,4573],{},"    print(number)\n",[10,4575,156],{},[72,4577,4580],{"className":4578,"code":4579,"language":162,"meta":77},[160],"变量\n字符串\n列表\n1\n2\n3\n",[33,4581,4579],{"__ignoreMap":77},[10,4583,167],{},[14,4585,170],{"id":170},[172,4587,4588,4598],{},[44,4589,4590,4591,4593,4594,4597],{},"第一个 ",[33,4592,4350],{}," 依次从列表取得字符串，循环变量 ",[33,4595,4596],{},"course"," 每轮重新绑定。",[44,4599,4600,4602],{},[33,4601,4524],{}," 产生 1、2、3，不包含终点 4，符合半开区间习惯。",[14,4604,190],{"id":190},[41,4606,4607,4610],{},[44,4608,4609],{},"只需要元素却手工维护索引，增加越界风险。",[44,4611,4612],{},"误以为循环结束后容器被消耗或删除；列表仍然存在，变化只取决于循环体是否修改它。",[14,4614,207],{"id":207},[172,4616,4617,4620],{},[44,4618,4619],{},"逐项输出一个字符串中的字符。",[44,4621,46,4622,4625],{},[33,4623,4624],{},"range()"," 输出 2、4、6、8。",[10,4627,218],{},[14,4629,221],{"id":221},[10,4631,4632],{},"本篇目标是遍历列表、字符串和整数范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,4634,228],{},{"title":77,"searchDepth":90,"depth":90,"links":4636},[4637,4638,4639,4640,4641,4642,4643,4644],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F18-python-for-range",{"title":4492,"description":4497},"python-for-range","posts\u002F20260817\u002F18-python-for-range","面向按顺序学习 Python 的初学者，本篇在第 11、17 篇知识上，帮助读者遍历列表、字符串和整数范围。",[239,4350,4652],"range","ui6q6MZ6cKqxzP4rBtGhogEk5BpvltDxO-0zl4y8kxE",{"id":4655,"title":4656,"body":4657,"category":239,"cover":240,"description":4661,"extension":241,"meta":4835,"navigation":93,"path":4836,"pinned":244,"publishedAt":245,"seo":4837,"slug":4838,"stem":4839,"summary":4840,"tags":4841,"updatedAt":245,"visible":93,"__hash__":4842},"posts\u002Fposts\u002F20260817\u002F19-python-break-continue.md","19｜break、continue 与循环结束条件",{"type":7,"value":4658,"toc":4825},[4659,4662,4664,4667,4669,4675,4685,4687,4706,4708,4710,4762,4764,4770,4772,4774,4788,4790,4806,4808,4816,4818,4820,4823],[10,4660,4661],{},"这套课程按知识依赖排列。本篇的前置知识是：第 17、18 篇。学完后，你应该能够跳过本次迭代或提前结束整个循环。",[14,4663,16],{"id":16},[10,4665,4666],{},"本篇只处理“break、continue 与循环结束条件”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4668,22],{"id":22},[10,4670,4671],{},[26,4672],{"alt":4673,"src":4674},"continue 与 break 的路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F19-loop-control.svg",[10,4676,4677,4680,4681,4684],{},[33,4678,4679],{},"continue"," 只结束当前这一轮，程序回到下一轮判断；",[33,4682,4683],{},"break"," 立即结束整个循环，执行循环后面的代码。",[14,4686,39],{"id":39},[41,4688,4689,4692,4700],{},[44,4690,4691],{},"先写普通循环，再在确有需要时加入流程控制语句。",[44,4693,4694,4696,4697,4699],{},[33,4695,4679],{}," 前要确认不会跳过 ",[33,4698,4333],{}," 循环中的状态更新。",[44,4701,4702,4703,4705],{},"多层嵌套中 ",[33,4704,4683],{}," 只结束它所在的最内层循环。",[14,4707,67],{"id":67},[10,4709,70],{},[72,4711,4713],{"className":74,"code":4712,"language":76,"meta":77,"style":77},"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,4714,4715,4720,4724,4729,4734,4739,4744,4749,4753,4757],{"__ignoreMap":77},[81,4716,4717],{"class":83,"line":84},[81,4718,4719],{},"numbers = [3, -1, 0, 8, 12]\n",[81,4721,4722],{"class":83,"line":90},[81,4723,94],{"emptyLinePlaceholder":93},[81,4725,4726],{"class":83,"line":97},[81,4727,4728],{},"for number in numbers:\n",[81,4730,4731],{"class":83,"line":103},[81,4732,4733],{},"    if number \u003C 0:\n",[81,4735,4736],{"class":83,"line":109},[81,4737,4738],{},"        continue\n",[81,4740,4741],{"class":83,"line":115},[81,4742,4743],{},"    if number == 0:\n",[81,4745,4746],{"class":83,"line":121},[81,4747,4748],{},"        break\n",[81,4750,4751],{"class":83,"line":127},[81,4752,4573],{},[81,4754,4755],{"class":83,"line":132},[81,4756,94],{"emptyLinePlaceholder":93},[81,4758,4759],{"class":83,"line":138},[81,4760,4761],{},"print(\"循环结束\")\n",[10,4763,156],{},[72,4765,4768],{"className":4766,"code":4767,"language":162,"meta":77},[160],"3\n循环结束\n",[33,4769,4767],{"__ignoreMap":77},[10,4771,167],{},[14,4773,170],{"id":170},[172,4775,4776,4782],{},[44,4777,4778,4779,4781],{},"遇到 -1 时 ",[33,4780,4679],{}," 立即结束本轮，后面的判断和输出都不执行。",[44,4783,4784,4785,4787],{},"遇到 0 时 ",[33,4786,4683],{}," 结束整个循环，因此列表后面的 8 和 12 不再处理。",[14,4789,190],{"id":190},[41,4791,4792,4797],{},[44,4793,3480,4794,4796],{},[33,4795,4679],{}," 当作结束循环，实际它只跳到下一轮。",[44,4798,4799,4800,4802,4803,4805],{},"在 ",[33,4801,4333],{}," 中把状态更新放在可能被 ",[33,4804,4679],{}," 跳过的位置，造成无限循环。",[14,4807,207],{"id":207},[172,4809,4810,4813],{},[44,4811,4812],{},"跳过列表中的空字符串并输出其他内容。",[44,4814,4815],{},"在 1 到 100 中找到第一个能被 17 整除的数后结束循环。",[10,4817,218],{},[14,4819,221],{"id":221},[10,4821,4822],{},"本篇目标是跳过本次迭代或提前结束整个循环。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,4824,228],{},{"title":77,"searchDepth":90,"depth":90,"links":4826},[4827,4828,4829,4830,4831,4832,4833,4834],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F19-python-break-continue",{"title":4656,"description":4661},"python-break-continue","posts\u002F20260817\u002F19-python-break-continue","面向按顺序学习 Python 的初学者，本篇在第 17、18 篇知识上，帮助读者跳过本次迭代或提前结束整个循环。",[239,4683,4679],"uEg9Dj4M2Euj0iyjUlLQVeyvcIFHi9IgH2Gz7czOs18",{"id":4844,"title":4845,"body":4846,"category":239,"cover":240,"description":4850,"extension":241,"meta":5021,"navigation":93,"path":5022,"pinned":244,"publishedAt":245,"seo":5023,"slug":5024,"stem":5025,"summary":5026,"tags":5027,"updatedAt":245,"visible":93,"__hash__":5030},"posts\u002Fposts\u002F20260817\u002F20-python-nested-control-flow.md","20｜嵌套判断与嵌套循环怎样保持清晰",{"type":7,"value":4847,"toc":5009},[4848,4851,4853,4856,4858,4864,4867,4869,4893,4895,4897,4931,4933,4939,4941,4943,4960,4962,4965,4971,4974,4976,4990,4992,5000,5002,5004,5007],[10,4849,4850],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够读取二维数据并控制嵌套层级。",[14,4852,16],{"id":16},[10,4854,4855],{},"本篇只处理“嵌套判断与嵌套循环怎样保持清晰”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,4857,22],{"id":22},[10,4859,4860],{},[26,4861],{"alt":4862,"src":4863},"外层一步包含完整内层循环","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-loop.svg",[10,4865,4866],{},"外层循环取得一行后，内层循环会完整处理这一行的各列；内层结束后，外层才取得下一行。",[14,4868,39],{"id":39},[41,4870,4871,4874,4877],{},[44,4872,4873],{},"每增加一层嵌套，阅读成本都会上升。",[44,4875,4876],{},"内层逻辑较长时，学习完函数后应考虑提取函数。",[44,4878,4879,4880,2271,4883,4886,4887,2271,4890,376],{},"变量名使用 ",[33,4881,4882],{},"row",[33,4884,4885],{},"cell"," 等层级含义，避免全部写成 ",[33,4888,4889],{},"i",[33,4891,4892],{},"j",[14,4894,67],{"id":67},[10,4896,70],{},[72,4898,4900],{"className":74,"code":4899,"language":76,"meta":77,"style":77},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n\nfor row in table:\n    for cell in row:\n        print(cell)\n    print(\"一行结束\")\n",[33,4901,4902,4907,4911,4916,4921,4926],{"__ignoreMap":77},[81,4903,4904],{"class":83,"line":84},[81,4905,4906],{},"table = [[\"A1\", \"A2\"], [\"B1\", \"B2\"]]\n",[81,4908,4909],{"class":83,"line":90},[81,4910,94],{"emptyLinePlaceholder":93},[81,4912,4913],{"class":83,"line":97},[81,4914,4915],{},"for row in table:\n",[81,4917,4918],{"class":83,"line":103},[81,4919,4920],{},"    for cell in row:\n",[81,4922,4923],{"class":83,"line":109},[81,4924,4925],{},"        print(cell)\n",[81,4927,4928],{"class":83,"line":115},[81,4929,4930],{},"    print(\"一行结束\")\n",[10,4932,156],{},[72,4934,4937],{"className":4935,"code":4936,"language":162,"meta":77},[160],"A1\nA2\n一行结束\nB1\nB2\n一行结束\n",[33,4938,4936],{"__ignoreMap":77},[10,4940,167],{},[14,4942,170],{"id":170},[172,4944,4945,4957],{},[44,4946,4947,4948,4950,4951,1171,4954,376],{},"外层变量 ",[33,4949,4882],{}," 先引用第一行列表，内层才依次处理 ",[33,4952,4953],{},"A1",[33,4955,4956],{},"A2",[44,4958,4959],{},"内层结束后输出“一行结束”，外层再进入第二行；这解释了输出中的分组顺序。",[342,4961,2710],{"id":2710},[10,4963,4964],{},"二维列表的输出顺序可以展开成一条时间线。",[10,4966,4967],{},[26,4968],{"alt":4969,"src":4970},"二维列表的实际处理顺序","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F20-nested-iteration-order.svg",[10,4972,4973],{},"内层必须走完当前行，外层才移动到下一行；这就是嵌套循环的执行顺序。",[14,4975,190],{"id":190},[41,4977,4978,4987],{},[44,4979,4980,4981,1023,4984,4986],{},"把两层循环变量都叫 ",[33,4982,4983],{},"item",[33,4985,4889],{},"，难以确认当前层级。",[44,4988,4989],{},"无限增加嵌套层数。逻辑变长后应在第 22 篇函数知识基础上提取职责。",[14,4991,207],{"id":207},[172,4993,4994,4997],{},[44,4995,4996],{},"打印一个 2×3 数字表。",[44,4998,4999],{},"在内层增加条件，只输出大于 3 的元素。",[10,5001,218],{},[14,5003,221],{"id":221},[10,5005,5006],{},"本篇目标是读取二维数据并控制嵌套层级。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5008,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5010},[5011,5012,5013,5014,5015,5018,5019,5020],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":5016},[5017],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F20-python-nested-control-flow",{"title":4845,"description":4850},"python-nested-control-flow","posts\u002F20260817\u002F20-python-nested-control-flow","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者读取二维数据并控制嵌套层级。",[239,5028,5029],"嵌套循环","控制流","S3olPw7eJ8RmHBhiIb2q0QDklbEB8Mm298qnPCSXcHI",{"id":5032,"title":5033,"body":5034,"category":239,"cover":240,"description":5038,"extension":241,"meta":5176,"navigation":93,"path":5177,"pinned":244,"publishedAt":245,"seo":5178,"slug":5179,"stem":5180,"summary":5181,"tags":5182,"updatedAt":245,"visible":93,"__hash__":5185},"posts\u002Fposts\u002F20260817\u002F21-python-list-comprehension.md","21｜列表推导式：把简单循环写成数据变换",{"type":7,"value":5035,"toc":5166},[5036,5039,5041,5044,5046,5052,5055,5057,5068,5070,5072,5110,5112,5118,5120,5122,5134,5136,5147,5149,5157,5159,5161,5164],[10,5037,5038],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够阅读和编写单层列表推导式。",[14,5040,16],{"id":16},[10,5042,5043],{},"本篇只处理“列表推导式：把简单循环写成数据变换”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5045,22],{"id":22},[10,5047,5048],{},[26,5049],{"alt":5050,"src":5051},"推导式的数据变换管道","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F21-comprehension.svg",[10,5053,5054],{},"推导式从右侧输入序列逐项取值，可选地过滤，再计算左侧表达式，最终形成一个新列表。",[14,5056,39],{"id":39},[41,5058,5059,5062,5065],{},[44,5060,5061],{},"推导式适合“遍历—可选过滤—产生一个新值”的简单流程。",[44,5063,5064],{},"包含多层嵌套或复杂判断时，普通循环通常更清楚。",[44,5066,5067],{},"推导式创建新列表，不修改输入列表。",[14,5069,67],{"id":67},[10,5071,70],{},[72,5073,5075],{"className":74,"code":5074,"language":76,"meta":77,"style":77},"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,5076,5077,5082,5086,5091,5096,5100,5105],{"__ignoreMap":77},[81,5078,5079],{"class":83,"line":84},[81,5080,5081],{},"numbers = [1, 2, 3, 4, 5]\n",[81,5083,5084],{"class":83,"line":90},[81,5085,94],{"emptyLinePlaceholder":93},[81,5087,5088],{"class":83,"line":97},[81,5089,5090],{},"squares = [number * number for number in numbers]\n",[81,5092,5093],{"class":83,"line":103},[81,5094,5095],{},"even_squares = [number * number for number in numbers if number % 2 == 0]\n",[81,5097,5098],{"class":83,"line":109},[81,5099,94],{"emptyLinePlaceholder":93},[81,5101,5102],{"class":83,"line":115},[81,5103,5104],{},"print(squares)\n",[81,5106,5107],{"class":83,"line":121},[81,5108,5109],{},"print(even_squares)\n",[10,5111,156],{},[72,5113,5116],{"className":5114,"code":5115,"language":162,"meta":77},[160],"[1, 4, 9, 16, 25]\n[4, 16]\n",[33,5117,5115],{"__ignoreMap":77},[10,5119,167],{},[14,5121,170],{"id":170},[172,5123,5124,5127],{},[44,5125,5126],{},"第一条推导式对每个数字计算平方，结果按输入顺序放进新列表。",[44,5128,5129,5130,5133],{},"第二条先用 ",[33,5131,5132],{},"number % 2 == 0"," 过滤偶数，只有通过过滤的数字才计算平方。",[14,5135,190],{"id":190},[41,5137,5138,5144],{},[44,5139,5140,5141,5143],{},"把表达式、循环和过滤条件的书写顺序误当作执行顺序；阅读时从 ",[33,5142,4350],{}," 开始找输入。",[44,5145,5146],{},"在推导式中堆叠多层循环和复杂分支，使代码比普通循环更难读。",[14,5148,207],{"id":207},[172,5150,5151,5154],{},[44,5152,5153],{},"把字符串列表转换为长度列表。",[44,5155,5156],{},"筛选 1 到 20 中能被 3 整除的数。",[10,5158,218],{},[14,5160,221],{"id":221},[10,5162,5163],{},"本篇目标是阅读和编写单层列表推导式。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5165,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5167},[5168,5169,5170,5171,5172,5173,5174,5175],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F21-python-list-comprehension",{"title":5033,"description":5038},"python-list-comprehension","posts\u002F20260817\u002F21-python-list-comprehension","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者阅读和编写单层列表推导式。",[239,5183,5184],"列表推导式","数据变换","DYwY-g7opVkSD48BGebht_TQcw8OOAuqViUZ7Ibzd6Q",{"id":5187,"title":5188,"body":5189,"category":239,"cover":240,"description":5193,"extension":241,"meta":5336,"navigation":93,"path":5337,"pinned":244,"publishedAt":245,"seo":5338,"slug":5339,"stem":5340,"summary":5341,"tags":5342,"updatedAt":245,"visible":93,"__hash__":5345},"posts\u002Fposts\u002F20260817\u002F22-python-function-basics.md","22｜定义并调用第一个函数",{"type":7,"value":5190,"toc":5326},[5191,5194,5196,5199,5201,5207,5210,5212,5223,5225,5227,5266,5268,5274,5276,5278,5293,5295,5303,5305,5317,5319,5321,5324],[10,5192,5193],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、18 篇。学完后，你应该能够把可复用逻辑封装为函数。",[14,5195,16],{"id":16},[10,5197,5198],{},"本篇只处理“定义并调用第一个函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5200,22],{"id":22},[10,5202,5203],{},[26,5204],{"alt":5205,"src":5206},"函数调用后回到原位置","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F22-function-call.svg",[10,5208,5209],{},"程序执行到函数调用时跳入函数体；函数体完成后回到原调用位置，继续执行后面的语句。定义函数本身不会自动运行函数体。",[14,5211,39],{"id":39},[41,5213,5214,5217,5220],{},[44,5215,5216],{},"函数名描述动作，使用小写字母和下划线。",[44,5218,5219],{},"函数定义要先执行，之后才能调用。",[44,5221,5222],{},"函数应围绕一个明确职责，不要把无关步骤塞进同一个函数。",[14,5224,67],{"id":67},[10,5226,70],{},[72,5228,5230],{"className":74,"code":5229,"language":76,"meta":77,"style":77},"def show_progress():\n    print(\"正在学习函数\")\n    print(\"本节完成 50%\")\n\nprint(\"调用前\")\nshow_progress()\nprint(\"调用后\")\n",[33,5231,5232,5237,5242,5247,5251,5256,5261],{"__ignoreMap":77},[81,5233,5234],{"class":83,"line":84},[81,5235,5236],{},"def show_progress():\n",[81,5238,5239],{"class":83,"line":90},[81,5240,5241],{},"    print(\"正在学习函数\")\n",[81,5243,5244],{"class":83,"line":97},[81,5245,5246],{},"    print(\"本节完成 50%\")\n",[81,5248,5249],{"class":83,"line":103},[81,5250,94],{"emptyLinePlaceholder":93},[81,5252,5253],{"class":83,"line":109},[81,5254,5255],{},"print(\"调用前\")\n",[81,5257,5258],{"class":83,"line":115},[81,5259,5260],{},"show_progress()\n",[81,5262,5263],{"class":83,"line":121},[81,5264,5265],{},"print(\"调用后\")\n",[10,5267,156],{},[72,5269,5272],{"className":5270,"code":5271,"language":162,"meta":77},[160],"调用前\n正在学习函数\n本节完成 50%\n调用后\n",[33,5273,5271],{"__ignoreMap":77},[10,5275,167],{},[14,5277,170],{"id":170},[172,5279,5280,5286],{},[44,5281,952,5282,5285],{},[33,5283,5284],{},"def"," 时创建函数对象并绑定名字，函数体此刻不会输出。",[44,5287,5288,5289,5292],{},"运行到 ",[33,5290,5291],{},"show_progress()"," 才进入函数体，执行两次输出，然后回到调用点继续“调用后”。",[14,5294,190],{"id":190},[41,5296,5297,5300],{},[44,5298,5299],{},"定义函数后忘记加括号调用，程序只保存函数而没有执行。",[44,5301,5302],{},"在函数定义之前调用同一名字；脚本按从上到下执行，调用时名字必须已经绑定。",[14,5304,207],{"id":207},[172,5306,5307,5314],{},[44,5308,5309,5310,5313],{},"定义 ",[33,5311,5312],{},"show_plan()"," 输出两行学习计划。",[44,5315,5316],{},"连续调用同一个函数两次，观察执行顺序。",[10,5318,218],{},[14,5320,221],{"id":221},[10,5322,5323],{},"本篇目标是把可复用逻辑封装为函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5325,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5327},[5328,5329,5330,5331,5332,5333,5334,5335],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F22-python-function-basics",{"title":5188,"description":5193},"python-function-basics","posts\u002F20260817\u002F22-python-function-basics","面向按顺序学习 Python 的初学者，本篇在第 16、18 篇知识上，帮助读者把可复用逻辑封装为函数。",[239,5343,5344],"函数","代码组织","2_F_bE82awC7citzv6RoL0IX_NS-H7QdS7UaGcD_c0g",{"id":5347,"title":5348,"body":5349,"category":239,"cover":240,"description":5353,"extension":241,"meta":5533,"navigation":93,"path":5534,"pinned":244,"publishedAt":245,"seo":5535,"slug":5536,"stem":5537,"summary":5538,"tags":5539,"updatedAt":245,"visible":93,"__hash__":5542},"posts\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope.md","23｜参数、返回值与局部变量",{"type":7,"value":5350,"toc":5521},[5351,5354,5356,5359,5361,5367,5374,5376,5393,5395,5397,5431,5433,5439,5441,5443,5464,5466,5469,5475,5485,5487,5502,5504,5512,5514,5516,5519],[10,5352,5353],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22 篇。学完后，你应该能够设计有输入和输出的函数。",[14,5355,16],{"id":16},[10,5357,5358],{},"本篇只处理“参数、返回值与局部变量”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5360,22],{"id":22},[10,5362,5363],{},[26,5364],{"alt":5365,"src":5366},"参数进入，返回值出来","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-parameter-return.svg",[10,5368,5369,5370,5373],{},"调用时实参绑定到形参，函数在自己的局部范围内计算，",[33,5371,5372],{},"return"," 把结果交还给调用方。打印和返回承担不同职责。",[14,5375,39],{"id":39},[41,5377,5378,5381,5384],{},[44,5379,5380],{},"形参出现在函数定义中，实参出现在函数调用中。",[44,5382,5383],{},"局部变量默认只在函数内部可见。",[44,5385,5386,5387,5389,5390,376],{},"没有显式 ",[33,5388,5372],{}," 的函数会返回 ",[33,5391,5392],{},"None",[14,5394,67],{"id":67},[10,5396,70],{},[72,5398,5400],{"className":74,"code":5399,"language":76,"meta":77,"style":77},"def calculate_total(price, count):\n    total = price * count\n    return total\n\nresult = calculate_total(25, 4)\nprint(result)\n",[33,5401,5402,5407,5412,5417,5421,5426],{"__ignoreMap":77},[81,5403,5404],{"class":83,"line":84},[81,5405,5406],{},"def calculate_total(price, count):\n",[81,5408,5409],{"class":83,"line":90},[81,5410,5411],{},"    total = price * count\n",[81,5413,5414],{"class":83,"line":97},[81,5415,5416],{},"    return total\n",[81,5418,5419],{"class":83,"line":103},[81,5420,94],{"emptyLinePlaceholder":93},[81,5422,5423],{"class":83,"line":109},[81,5424,5425],{},"result = calculate_total(25, 4)\n",[81,5427,5428],{"class":83,"line":115},[81,5429,5430],{},"print(result)\n",[10,5432,156],{},[72,5434,5437],{"className":5435,"code":5436,"language":162,"meta":77},[160],"100\n",[33,5438,5436],{"__ignoreMap":77},[10,5440,167],{},[14,5442,170],{"id":170},[172,5444,5445,5454],{},[44,5446,5447,5448,2271,5451,5453],{},"调用时 25 和 4 分别绑定到 ",[33,5449,5450],{},"price",[33,5452,4413],{},"，它们只在本次函数调用的局部范围中使用。",[44,5455,5456,5459,5460,5463],{},[33,5457,5458],{},"return total"," 把整数 100 交给调用表达式，调用方再把它绑定给 ",[33,5461,5462],{},"result"," 并输出。",[342,5465,2710],{"id":2710},[10,5467,5468],{},"局部变量只在本次函数调用期间存在，可以用调用范围图理解。",[10,5470,5471],{},[26,5472],{"alt":5473,"src":5474},"局部变量随一次调用存在","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F23-call-frame-lifetime.svg",[10,5476,5477,2271,5479,1171,5481,5484],{},[33,5478,5450],{},[33,5480,4413],{},[33,5482,5483],{},"total"," 属于这次调用的局部范围；返回后，调用方只接收到返回值。",[14,5486,190],{"id":190},[41,5488,5489,5496],{},[44,5490,5491,5492,5495],{},"在函数内部只 ",[33,5493,5494],{},"print(total)","，调用方却期待拿到可继续计算的返回值。",[44,5497,5498,5499,5501],{},"试图在函数外直接访问局部变量 ",[33,5500,5483],{},"，它的名字只在调用期间的局部作用域存在。",[14,5503,207],{"id":207},[172,5505,5506,5509],{},[44,5507,5508],{},"编写计算长方形面积的函数。",[44,5510,5511],{},"让函数返回结果后在调用方加上单位再输出。",[10,5513,218],{},[14,5515,221],{"id":221},[10,5517,5518],{},"本篇目标是设计有输入和输出的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5520,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5522},[5523,5524,5525,5526,5527,5530,5531,5532],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":5528},[5529],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F23-python-parameters-return-scope",{"title":5348,"description":5353},"python-parameters-return-scope","posts\u002F20260817\u002F23-python-parameters-return-scope","面向按顺序学习 Python 的初学者，本篇在第 22 篇知识上，帮助读者设计有输入和输出的函数。",[239,5540,5541],"参数","返回值","fnkrGFHavlLiT3OqjuGAupN8a6J5QMSFpvHuUCS2smM",{"id":5544,"title":5545,"body":5546,"category":239,"cover":240,"description":5550,"extension":241,"meta":5730,"navigation":93,"path":5731,"pinned":244,"publishedAt":245,"seo":5732,"slug":5733,"stem":5734,"summary":5735,"tags":5736,"updatedAt":245,"visible":93,"__hash__":5739},"posts\u002Fposts\u002F20260817\u002F24-python-function-arguments.md","24｜默认参数、关键字参数与可变参数",{"type":7,"value":5547,"toc":5718},[5548,5551,5553,5556,5558,5564,5567,5569,5586,5588,5590,5642,5644,5650,5652,5654,5672,5674,5677,5683,5686,5688,5699,5701,5709,5711,5713,5716],[10,5549,5550],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23、11、13 篇。学完后，你应该能够理解调用参数与函数签名的绑定规则。",[14,5552,16],{"id":16},[10,5554,5555],{},"本篇只处理“默认参数、关键字参数与可变参数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5557,22],{"id":22},[10,5559,5560],{},[26,5561],{"alt":5562,"src":5563},"调用参数如何绑定签名","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-argument-binding.svg",[10,5565,5566],{},"调用产生的实参需要绑定到函数签名中的形参。位置参数按顺序绑定，关键字参数按名称绑定，缺省位置才使用默认值。",[14,5568,39],{"id":39},[41,5570,5571,5574,5580],{},[44,5572,5573],{},"必需参数应放在有默认值的参数之前。",[44,5575,5576,5579],{},[33,5577,5578],{},"*args"," 在函数内部是元组，适合数量可变的位置参数。",[44,5581,5582,5585],{},[33,5583,5584],{},"**kwargs"," 在函数内部是字典；只在确实需要开放关键字集合时使用。",[14,5587,67],{"id":67},[10,5589,70],{},[72,5591,5593],{"className":74,"code":5592,"language":76,"meta":77,"style":77},"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,5594,5595,5600,5605,5609,5614,5619,5623,5628,5633,5637],{"__ignoreMap":77},[81,5596,5597],{"class":83,"line":84},[81,5598,5599],{},"def build_title(name, level=\"基础\"):\n",[81,5601,5602],{"class":83,"line":90},[81,5603,5604],{},"    return name + \"｜\" + level\n",[81,5606,5607],{"class":83,"line":97},[81,5608,94],{"emptyLinePlaceholder":93},[81,5610,5611],{"class":83,"line":103},[81,5612,5613],{},"print(build_title(\"Python\"))\n",[81,5615,5616],{"class":83,"line":109},[81,5617,5618],{},"print(build_title(name=\"异常处理\", level=\"进阶\"))\n",[81,5620,5621],{"class":83,"line":115},[81,5622,94],{"emptyLinePlaceholder":93},[81,5624,5625],{"class":83,"line":121},[81,5626,5627],{},"def total(*numbers):\n",[81,5629,5630],{"class":83,"line":127},[81,5631,5632],{},"    return sum(numbers)\n",[81,5634,5635],{"class":83,"line":132},[81,5636,94],{"emptyLinePlaceholder":93},[81,5638,5639],{"class":83,"line":138},[81,5640,5641],{},"print(total(10, 20, 30))\n",[10,5643,156],{},[72,5645,5648],{"className":5646,"code":5647,"language":162,"meta":77},[160],"Python｜基础\n异常处理｜进阶\n60\n",[33,5649,5647],{"__ignoreMap":77},[10,5651,167],{},[14,5653,170],{"id":170},[172,5655,5656,5663],{},[44,5657,5658,5659,5662],{},"第一次调用只提供必需参数，",[33,5660,5661],{},"level"," 使用默认值；第二次按参数名绑定两个实参。",[44,5664,5665,5668,5669,376],{},[33,5666,5667],{},"*numbers"," 把多个位置实参收集为元组，函数再将元组交给 ",[33,5670,5671],{},"sum()",[342,5673,2710],{"id":2710},[10,5675,5676],{},"位置参数、关键字参数和默认值的绑定优先级可以拆成三个步骤。",[10,5678,5679],{},[26,5680],{"alt":5681,"src":5682},"实参与形参的绑定步骤","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F24-binding-cases.svg",[10,5684,5685],{},"先绑定调用方明确提供的实参，再检查是否重复或缺失，最后为未绑定的可选参数填入默认值。",[14,5687,190],{"id":190},[41,5689,5690,5696],{},[44,5691,5692,5693,5695],{},"把可变列表直接作为默认参数，导致不同调用共享同一个对象。基础写法优先使用 ",[33,5694,5392],{}," 再在函数内创建。",[44,5697,5698],{},"同时用位置和关键字给同一形参传值，解释器会报告重复绑定。",[14,5700,207],{"id":207},[172,5702,5703,5706],{},[44,5704,5705],{},"给问候函数增加默认称呼。",[44,5707,5708],{},"编写接收任意数量分数并返回总分的函数。",[10,5710,218],{},[14,5712,221],{"id":221},[10,5714,5715],{},"本篇目标是理解调用参数与函数签名的绑定规则。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5717,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5719},[5720,5721,5722,5723,5724,5727,5728,5729],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":5725},[5726],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F24-python-function-arguments",{"title":5545,"description":5550},"python-function-arguments","posts\u002F20260817\u002F24-python-function-arguments","面向按顺序学习 Python 的初学者，本篇在第 23、11、13 篇知识上，帮助读者理解调用参数与函数签名的绑定规则。",[239,5737,5738],"函数参数","函数签名","abpuuiOuHwpbMIdqL0XMsPQ9EEunRTyOQ594TxtB6N8",{"id":5741,"title":5742,"body":5743,"category":239,"cover":240,"description":5747,"extension":241,"meta":5942,"navigation":93,"path":5943,"pinned":244,"publishedAt":245,"seo":5944,"slug":5945,"stem":5946,"summary":5947,"tags":5948,"updatedAt":245,"visible":93,"__hash__":5951},"posts\u002Fposts\u002F20260817\u002F25-python-scope-lookup.md","25｜作用域与变量查找顺序",{"type":7,"value":5744,"toc":5930},[5745,5748,5750,5753,5755,5761,5764,5766,5783,5785,5787,5848,5850,5856,5858,5860,5887,5889,5892,5898,5901,5903,5911,5913,5921,5923,5925,5928],[10,5746,5747],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够判断变量在函数内外的可见范围。",[14,5749,16],{"id":16},[10,5751,5752],{},"本篇只处理“作用域与变量查找顺序”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5754,22],{"id":22},[10,5756,5757],{},[26,5758],{"alt":5759,"src":5760},"变量按照作用域逐层查找","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-scope-lookup.svg",[10,5762,5763],{},"Python 查找名字时按局部、外层函数、全局、内置的顺序逐层寻找，找到后停止。这个顺序常简称 LEGB。",[14,5765,39],{"id":39},[41,5767,5768,5771,5774],{},[44,5769,5770],{},"函数内部赋值默认创建局部变量。",[44,5772,5773],{},"尽量通过参数和返回值传递数据，少依赖可修改的全局状态。",[44,5775,5776,2190,5779,5782],{},[33,5777,5778],{},"global",[33,5780,5781],{},"nonlocal"," 会改变赋值目标，基础代码中应谨慎使用。",[14,5784,67],{"id":67},[10,5786,70],{},[72,5788,5790],{"className":74,"code":5789,"language":76,"meta":77,"style":77},"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,5791,5792,5797,5801,5806,5811,5815,5820,5825,5830,5834,5839,5843],{"__ignoreMap":77},[81,5793,5794],{"class":83,"line":84},[81,5795,5796],{},"course = \"Python\"\n",[81,5798,5799],{"class":83,"line":90},[81,5800,94],{"emptyLinePlaceholder":93},[81,5802,5803],{"class":83,"line":97},[81,5804,5805],{},"def outer():\n",[81,5807,5808],{"class":83,"line":103},[81,5809,5810],{},"    level = \"基础\"\n",[81,5812,5813],{"class":83,"line":109},[81,5814,94],{"emptyLinePlaceholder":93},[81,5816,5817],{"class":83,"line":115},[81,5818,5819],{},"    def show():\n",[81,5821,5822],{"class":83,"line":121},[81,5823,5824],{},"        lesson = \"作用域\"\n",[81,5826,5827],{"class":83,"line":127},[81,5828,5829],{},"        print(course, level, lesson)\n",[81,5831,5832],{"class":83,"line":132},[81,5833,94],{"emptyLinePlaceholder":93},[81,5835,5836],{"class":83,"line":138},[81,5837,5838],{},"    show()\n",[81,5840,5841],{"class":83,"line":144},[81,5842,94],{"emptyLinePlaceholder":93},[81,5844,5845],{"class":83,"line":150},[81,5846,5847],{},"outer()\n",[10,5849,156],{},[72,5851,5854],{"className":5852,"code":5853,"language":162,"meta":77},[160],"Python 基础 作用域\n",[33,5855,5853],{"__ignoreMap":77},[10,5857,167],{},[14,5859,170],{"id":170},[172,5861,5862,5879],{},[44,5863,5864,5867,5868,5871,5872,5874,5875,5878],{},[33,5865,5866],{},"show()"," 中查找 ",[33,5869,5870],{},"lesson"," 时先在局部找到，查找 ",[33,5873,5661],{}," 时到外层 ",[33,5876,5877],{},"outer()"," 找到。",[44,5880,5881,5883,5884,5886],{},[33,5882,4596],{}," 在局部和外层都不存在，继续到模块全局找到；",[33,5885,2222],{}," 最后在内置作用域找到。",[342,5888,2710],{"id":2710},[10,5890,5891],{},"内层重新使用同一个变量名时，会遮蔽外层名字。",[10,5893,5894],{},[26,5895],{"alt":5896,"src":5897},"内层同名变量遮蔽外层名字","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F25-shadowing-name.svg",[10,5899,5900],{},"查找在最近作用域已经找到结果后就停止；外层同名变量仍存在，只是当前表达式没有继续查找它。",[14,5902,190],{"id":190},[41,5904,5905,5908],{},[44,5906,5907],{},"在函数内部赋值同名变量后仍期待修改全局变量；默认会创建局部绑定。",[44,5909,5910],{},"大量使用全局可变状态，让函数结果依赖隐含环境，难以测试和复用。",[14,5912,207],{"id":207},[172,5914,5915,5918],{},[44,5916,5917],{},"在内外层定义同名变量，观察最近作用域优先。",[44,5919,5920],{},"尝试在函数外访问局部变量，记录异常类型。",[10,5922,218],{},[14,5924,221],{"id":221},[10,5926,5927],{},"本篇目标是判断变量在函数内外的可见范围。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,5929,228],{},{"title":77,"searchDepth":90,"depth":90,"links":5931},[5932,5933,5934,5935,5936,5939,5940,5941],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":5937},[5938],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F25-python-scope-lookup",{"title":5742,"description":5747},"python-scope-lookup","posts\u002F20260817\u002F25-python-scope-lookup","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者判断变量在函数内外的可见范围。",[239,5949,5950],"作用域","LEGB","2KgHWcjvCENV4uVEdQA4-7UCJ9rIaz5CNRkEU3NeaxI",{"id":5953,"title":5954,"body":5955,"category":239,"cover":240,"description":5959,"extension":241,"meta":6109,"navigation":93,"path":6110,"pinned":244,"publishedAt":245,"seo":6111,"slug":6112,"stem":6113,"summary":6114,"tags":6115,"updatedAt":245,"visible":93,"__hash__":6118},"posts\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints.md","26｜文档字符串与类型注解",{"type":7,"value":5956,"toc":6099},[5957,5960,5962,5965,5967,5973,5976,5978,5997,5999,6001,6035,6037,6043,6045,6047,6062,6064,6076,6078,6090,6092,6094,6097],[10,5958,5959],{},"这套课程按知识依赖排列。本篇的前置知识是：第 23 篇。学完后，你应该能够给函数写清输入、输出和用途。",[14,5961,16],{"id":16},[10,5963,5964],{},"本篇只处理“文档字符串与类型注解”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,5966,22],{"id":22},[10,5968,5969],{},[26,5970],{"alt":5971,"src":5972},"类型注解描述但不强制","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F26-type-hints.svg",[10,5974,5975],{},"类型注解为读者和工具描述预期类型，但 Python 默认不会仅凭注解阻止不同类型的实参进入函数。",[14,5977,39],{"id":39},[41,5979,5980,5983,5986],{},[44,5981,5982],{},"文档字符串紧跟在函数定义后的第一条语句。",[44,5984,5985],{},"注解表达接口意图，不代替输入校验和测试。",[44,5987,5988,5989,2271,5991,2271,5993,5996],{},"基础注解优先使用 ",[33,5990,2274],{},[33,5992,2439],{},[33,5994,5995],{},"list[str]"," 等直接写法。",[14,5998,67],{"id":67},[10,6000,70],{},[72,6002,6004],{"className":74,"code":6003,"language":76,"meta":77,"style":77},"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,6005,6006,6011,6016,6021,6025,6030],{"__ignoreMap":77},[81,6007,6008],{"class":83,"line":84},[81,6009,6010],{},"def format_score(name: str, score: int) -> str:\n",[81,6012,6013],{"class":83,"line":90},[81,6014,6015],{},"    \"\"\"返回带姓名的分数文本。\"\"\"\n",[81,6017,6018],{"class":83,"line":97},[81,6019,6020],{},"    return name + \"：\" + str(score)\n",[81,6022,6023],{"class":83,"line":103},[81,6024,94],{"emptyLinePlaceholder":93},[81,6026,6027],{"class":83,"line":109},[81,6028,6029],{},"print(format_score(\"小郑\", 95))\n",[81,6031,6032],{"class":83,"line":115},[81,6033,6034],{},"print(format_score.__doc__)\n",[10,6036,156],{},[72,6038,6041],{"className":6039,"code":6040,"language":162,"meta":77},[160],"小郑：95\n返回带姓名的分数文本。\n",[33,6042,6040],{"__ignoreMap":77},[10,6044,167],{},[14,6046,170],{"id":170},[172,6048,6049,6059],{},[44,6050,6051,6052,6055,6056,6058],{},"函数签名说明 ",[33,6053,6054],{},"name"," 预期为字符串、",[33,6057,2260],{}," 预期为整数，返回值预期为字符串。",[44,6060,6061],{},"运行时仍按函数体实际表达式执行；注解主要服务读者、编辑器和静态检查工具。",[14,6063,190],{"id":190},[41,6065,6066,6073],{},[44,6067,6068,6069,6072],{},"认为加了 ",[33,6070,6071],{},"score: int"," 后，Python 会自动拒绝字符串。默认运行时不会这样校验。",[44,6074,6075],{},"注解写得比接口本身更复杂，反而增加初学者负担；先准确表达基础容器和可选值。",[14,6077,207],{"id":207},[172,6079,6080,6083],{},[44,6081,6082],{},"为面积函数补充参数和返回值注解。",[44,6084,6085,6086,6089],{},"通过 ",[33,6087,6088],{},"函数名.__doc__"," 查看文档字符串。",[10,6091,218],{},[14,6093,221],{"id":221},[10,6095,6096],{},"本篇目标是给函数写清输入、输出和用途。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,6098,228],{},{"title":77,"searchDepth":90,"depth":90,"links":6100},[6101,6102,6103,6104,6105,6106,6107,6108],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F26-python-docstrings-type-hints",{"title":5954,"description":5959},"python-docstrings-type-hints","posts\u002F20260817\u002F26-python-docstrings-type-hints","面向按顺序学习 Python 的初学者，本篇在第 23 篇知识上，帮助读者给函数写清输入、输出和用途。",[239,6116,6117],"类型注解","文档字符串","EX5IfPAdDzGtNwFnrXw0U7ZKckNBAPGVagcv7YFcPGA",{"id":6120,"title":6121,"body":6122,"category":239,"cover":240,"description":6126,"extension":241,"meta":6353,"navigation":93,"path":6354,"pinned":244,"publishedAt":245,"seo":6355,"slug":6356,"stem":6357,"summary":6358,"tags":6359,"updatedAt":245,"visible":93,"__hash__":6362},"posts\u002Fposts\u002F20260817\u002F27-python-modules-import-name.md","27｜模块、import 与 __name__",{"type":7,"value":6123,"toc":6341},[6124,6127,6129,6135,6137,6143,6154,6156,6174,6176,6183,6212,6219,6238,6247,6249,6255,6257,6259,6282,6284,6287,6293,6299,6301,6317,6319,6332,6334,6336,6339],[10,6125,6126],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、25 篇。学完后，你应该能够把函数拆到不同文件并控制脚本入口。",[14,6128,16],{"id":16},[10,6130,6131,6132,6134],{},"本篇只处理“模块、import 与 ",[308,6133,6054],{},"”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6136,22],{"id":22},[10,6138,6139],{},[26,6140],{"alt":6141,"src":6142},"name 决定入口代码","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-module-name.svg",[10,6144,6145,6146,6149,6150,6153],{},"同一个文件直接运行时 ",[33,6147,6148],{},"__name__"," 等于 ",[33,6151,6152],{},"\"__main__\"","；被其他文件导入时，它等于模块名。入口判断可以避免导入时自动执行演示代码。",[14,6155,39],{"id":39},[41,6157,6158,6164,6167],{},[44,6159,6160,6161,6163],{},"一个 ",[33,6162,1185],{}," 文件就是一个模块。",[44,6165,6166],{},"导入时模块顶层代码会执行一次，因此顶层应以定义和常量为主。",[44,6168,6169,6170,6173],{},"避免使用 ",[33,6171,6172],{},"from module import *","，它会让名字来源不清楚。",[14,6175,67],{"id":67},[10,6177,6178,6179,6182],{},"先在同一个目录中创建两个文件。把函数放进 ",[33,6180,6181],{},"calculator.py","：",[72,6184,6186],{"className":74,"code":6185,"language":76,"meta":77,"style":77},"def add(left, right):\n    return left + right\n\nif __name__ == \"__main__\":\n    print(add(2, 3))\n",[33,6187,6188,6193,6198,6202,6207],{"__ignoreMap":77},[81,6189,6190],{"class":83,"line":84},[81,6191,6192],{},"def add(left, right):\n",[81,6194,6195],{"class":83,"line":90},[81,6196,6197],{},"    return left + right\n",[81,6199,6200],{"class":83,"line":97},[81,6201,94],{"emptyLinePlaceholder":93},[81,6203,6204],{"class":83,"line":103},[81,6205,6206],{},"if __name__ == \"__main__\":\n",[81,6208,6209],{"class":83,"line":109},[81,6210,6211],{},"    print(add(2, 3))\n",[10,6213,6214,6215,6218],{},"再创建 ",[33,6216,6217],{},"app.py","，从模块中导入函数：",[72,6220,6222],{"className":74,"code":6221,"language":76,"meta":77,"style":77},"from calculator import add\n\nprint(add(10, 20))\n",[33,6223,6224,6229,6233],{"__ignoreMap":77},[81,6225,6226],{"class":83,"line":84},[81,6227,6228],{},"from calculator import add\n",[81,6230,6231],{"class":83,"line":90},[81,6232,94],{"emptyLinePlaceholder":93},[81,6234,6235],{"class":83,"line":97},[81,6236,6237],{},"print(add(10, 20))\n",[10,6239,6240,6241,1171,6244,376],{},"分别执行 ",[33,6242,6243],{},"python3 calculator.py",[33,6245,6246],{},"python3 app.py",[10,6248,156],{},[72,6250,6253],{"className":6251,"code":6252,"language":162,"meta":77},[160],"直接运行 calculator.py 输出 5；运行 app.py 输出 30\n",[33,6254,6252],{"__ignoreMap":77},[10,6256,167],{},[14,6258,170],{"id":170},[172,6260,6261,6271],{},[44,6262,6263,6264,6266,6267,6270],{},"直接运行 ",[33,6265,6181],{}," 时，模块名是 ",[33,6268,6269],{},"__main__","，入口代码输出 5。",[44,6272,6273,6275,6276,6278,6279,6281],{},[33,6274,6217],{}," 导入模块时，",[33,6277,6181],{}," 的函数定义会执行，但入口判断为假；随后 ",[33,6280,6217],{}," 调用函数输出 30。",[342,6283,2710],{"id":2710},[10,6285,6286],{},"同一个模块在“直接运行”和“被导入”两种方式下，入口判断结果不同。",[10,6288,6289],{},[26,6290],{"alt":6291,"src":6292},"直接运行与导入的入口差异","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F27-direct-vs-import.svg",[10,6294,6295,6296,6298],{},"两条路径都会建立函数定义；只有直接运行时才执行 ",[33,6297,6269],{}," 保护下的演示代码。",[14,6300,190],{"id":190},[41,6302,6303,6310],{},[44,6304,6305,6306,1171,6308,376],{},"把两个示例文件粘成一个文件运行。应按注释分别保存为 ",[33,6307,6181],{},[33,6309,6217],{},[44,6311,6312,6313,6316],{},"模块名与标准库或项目其他文件重名，例如命名为 ",[33,6314,6315],{},"json.py","，导致导入目标被遮蔽。",[14,6318,207],{"id":207},[172,6320,6321,6327],{},[44,6322,2367,6323,6326],{},[33,6324,6325],{},"text_tools.py"," 并导出一个格式化函数。",[44,6328,6329,6330,376],{},"分别直接运行模块和从另一个脚本导入，输出 ",[33,6331,6148],{},[10,6333,218],{},[14,6335,221],{"id":221},[10,6337,6338],{},"本篇目标是把函数拆到不同文件并控制脚本入口。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,6340,228],{},{"title":77,"searchDepth":90,"depth":90,"links":6342},[6343,6344,6345,6346,6347,6350,6351,6352],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":6348},[6349],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F27-python-modules-import-name",{"title":6121,"description":6126},"python-modules-import-name","posts\u002F20260817\u002F27-python-modules-import-name","面向按顺序学习 Python 的初学者，本篇在第 22、25 篇知识上，帮助读者把函数拆到不同文件并控制脚本入口。",[239,6360,6361],"模块","import","bhFSv9OJ-GA6ww_aKkbpy7eWz_aFbSkk-d9KegnkiuE",{"id":6364,"title":6365,"body":6366,"category":239,"cover":240,"description":6370,"extension":241,"meta":6535,"navigation":93,"path":6536,"pinned":244,"publishedAt":245,"seo":6537,"slug":6538,"stem":6539,"summary":6540,"tags":6541,"updatedAt":245,"visible":93,"__hash__":6543},"posts\u002Fposts\u002F20260817\u002F28-python-package-venv-pip.md","28｜包、虚拟环境与 pip 依赖管理",{"type":7,"value":6367,"toc":6525},[6368,6371,6373,6376,6378,6384,6387,6389,6403,6405,6407,6453,6455,6461,6463,6465,6491,6493,6503,6505,6516,6518,6520,6523],[10,6369,6370],{},"这套课程按知识依赖排列。本篇的前置知识是：第 02、27 篇。学完后，你应该能够隔离项目解释器和第三方依赖。",[14,6372,16],{"id":16},[10,6374,6375],{},"本篇只处理“包、虚拟环境与 pip 依赖管理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6377,22],{"id":22},[10,6379,6380],{},[26,6381],{"alt":6382,"src":6383},"虚拟环境隔离项目依赖","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F28-venv-boundary.svg",[10,6385,6386],{},"虚拟环境在项目边界内提供独立解释器入口和包目录。激活只是在当前终端调整命令查找顺序，不会改变 Python 语言本身。",[14,6388,39],{"id":39},[41,6390,6391,6397,6400],{},[44,6392,6393,6396],{},[33,6394,6395],{},".venv"," 是常见目录名，不应提交到 Git。",[44,6398,6399],{},"安装包前先确认当前解释器路径，避免装进另一个环境。",[44,6401,6402],{},"本基础系列示例优先使用标准库，不要求安装第三方包。",[14,6404,67],{"id":67},[10,6406,1588],{},[72,6408,6410],{"className":605,"code":6409,"language":607,"meta":77,"style":77},"python3 -m venv .venv\nsource .venv\u002Fbin\u002Factivate\npython --version\npython -m pip --version\ndeactivate\n",[33,6411,6412,6424,6432,6438,6448],{"__ignoreMap":77},[81,6413,6414,6416,6418,6421],{"class":83,"line":84},[81,6415,705],{"class":614},[81,6417,647],{"class":617},[81,6419,6420],{"class":650}," venv",[81,6422,6423],{"class":650}," .venv\n",[81,6425,6426,6429],{"class":83,"line":90},[81,6427,6428],{"class":617},"source",[81,6430,6431],{"class":650}," .venv\u002Fbin\u002Factivate\n",[81,6433,6434,6436],{"class":83,"line":97},[81,6435,76],{"class":614},[81,6437,618],{"class":617},[81,6439,6440,6442,6444,6446],{"class":83,"line":103},[81,6441,76],{"class":614},[81,6443,647],{"class":617},[81,6445,651],{"class":650},[81,6447,618],{"class":617},[81,6449,6450],{"class":83,"line":109},[81,6451,6452],{"class":614},"deactivate\n",[10,6454,156],{},[72,6456,6459],{"className":6457,"code":6458,"language":162,"meta":77},[160],"Python 和 pip 的路径应指向当前项目的 .venv\n",[33,6460,6458],{"__ignoreMap":77},[10,6462,167],{},[14,6464,170],{"id":170},[172,6466,6467,6476],{},[44,6468,6469,6472,6473,6475],{},[33,6470,6471],{},"venv"," 根据当前 ",[33,6474,705],{}," 创建项目自己的环境目录，包含解释器入口和包安装位置。",[44,6477,6478,6479,2190,6481,6484,6485,3741,6487,6490],{},"激活后 ",[33,6480,76],{},[33,6482,6483],{},"python -m pip"," 优先指向 ",[33,6486,6395],{},[33,6488,6489],{},"deactivate"," 只恢复当前终端的命令查找。",[14,6492,190],{"id":190},[41,6494,6495,6498],{},[44,6496,6497],{},"创建环境后忘记激活，依赖被安装到全局或另一个环境。",[44,6499,3480,6500,6502],{},[33,6501,6395],{}," 提交到 Git。环境应通过依赖清单重建，不应跨机器复制。",[14,6504,207],{"id":207},[172,6506,6507,6513],{},[44,6508,6509,6510,376],{},"创建虚拟环境并记录激活前后的 ",[33,6511,6512],{},"which python",[44,6514,6515],{},"退出后重新激活，确认项目环境可以重复使用。",[10,6517,218],{},[14,6519,221],{"id":221},[10,6521,6522],{},"本篇目标是隔离项目解释器和第三方依赖。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,6524,1672],{},{"title":77,"searchDepth":90,"depth":90,"links":6526},[6527,6528,6529,6530,6531,6532,6533,6534],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F28-python-package-venv-pip",{"title":6365,"description":6370},"python-package-venv-pip","posts\u002F20260817\u002F28-python-package-venv-pip","面向按顺序学习 Python 的初学者，本篇在第 02、27 篇知识上，帮助读者隔离项目解释器和第三方依赖。",[239,6542,274],"虚拟环境","MahwlwoikelUZdWjVweR9GWO6Wx1jVlyqHWgC6aTSn0",{"id":6545,"title":6546,"body":6547,"category":239,"cover":240,"description":6551,"extension":241,"meta":6739,"navigation":93,"path":6740,"pinned":244,"publishedAt":245,"seo":6741,"slug":6742,"stem":6743,"summary":6744,"tags":6745,"updatedAt":245,"visible":93,"__hash__":6748},"posts\u002Fposts\u002F20260817\u002F29-python-pathlib-paths.md","29｜使用 pathlib 管理文件路径",{"type":7,"value":6548,"toc":6729},[6549,6552,6554,6557,6559,6565,6574,6576,6600,6602,6604,6657,6659,6665,6667,6669,6685,6687,6706,6708,6720,6722,6724,6727],[10,6550,6551],{},"这套课程按知识依赖排列。本篇的前置知识是：第 27 篇。学完后，你应该能够组合、检查和创建跨平台路径。",[14,6553,16],{"id":16},[10,6555,6556],{},"本篇只处理“使用 pathlib 管理文件路径”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6558,22],{"id":22},[10,6560,6561],{},[26,6562],{"alt":6563,"src":6564},"路径由片段逐级组合","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F29-pathlib-parts.svg",[10,6566,6567,6570,6571,6573],{},[33,6568,6569],{},"Path"," 使用 ",[33,6572,2449],{}," 运算符逐级组合路径片段，得到新的路径对象；此时只是在描述位置，不代表文件已经存在。",[14,6575,39],{"id":39},[41,6577,6578,6581,6593],{},[44,6579,6580],{},"路径对象把字符串拼接和平台分隔符细节封装起来。",[44,6582,6583,2271,6586,2271,6589,6592],{},[33,6584,6585],{},"exists()",[33,6587,6588],{},"is_file()",[33,6590,6591],{},"is_dir()"," 检查真实文件系统状态。",[44,6594,6595,6596,6599],{},"创建目录前明确目标；",[33,6597,6598],{},"mkdir(parents=True, exist_ok=True)"," 可创建必要父目录。",[14,6601,67],{"id":67},[10,6603,70],{},[72,6605,6607],{"className":74,"code":6606,"language":76,"meta":77,"style":77},"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,6608,6609,6614,6618,6623,6628,6633,6637,6642,6647,6652],{"__ignoreMap":77},[81,6610,6611],{"class":83,"line":84},[81,6612,6613],{},"from pathlib import Path\n",[81,6615,6616],{"class":83,"line":90},[81,6617,94],{"emptyLinePlaceholder":93},[81,6619,6620],{"class":83,"line":97},[81,6621,6622],{},"project = Path.cwd()\n",[81,6624,6625],{"class":83,"line":103},[81,6626,6627],{},"data_dir = project \u002F \"data\"\n",[81,6629,6630],{"class":83,"line":109},[81,6631,6632],{},"file_path = data_dir \u002F \"records.json\"\n",[81,6634,6635],{"class":83,"line":115},[81,6636,94],{"emptyLinePlaceholder":93},[81,6638,6639],{"class":83,"line":121},[81,6640,6641],{},"print(project)\n",[81,6643,6644],{"class":83,"line":127},[81,6645,6646],{},"print(file_path.name)\n",[81,6648,6649],{"class":83,"line":132},[81,6650,6651],{},"print(file_path.suffix)\n",[81,6653,6654],{"class":83,"line":138},[81,6655,6656],{},"print(file_path.exists())\n",[10,6658,156],{},[72,6660,6663],{"className":6661,"code":6662,"language":162,"meta":77},[160],"显示当前项目路径、records.json、.json 和存在状态\n",[33,6664,6662],{"__ignoreMap":77},[10,6666,167],{},[14,6668,170],{"id":170},[172,6670,6671,6677],{},[44,6672,6673,6676],{},[33,6674,6675],{},"Path.cwd()"," 读取运行脚本时的当前目录，不一定等于脚本文件所在目录。",[44,6678,46,6679,6681,6682,6684],{},[33,6680,2449],{}," 组合路径片段只创建新的 ",[33,6683,6569],{}," 对象；直到读写或创建操作发生，文件系统才可能变化。",[14,6686,190],{"id":190},[41,6688,6689,6697],{},[44,6690,3480,6691,6693,6694,6696],{},[33,6692,6569],{}," 对象存在当成真实文件存在，仍需调用 ",[33,6695,6585],{}," 等方法确认。",[44,6698,6699,6700,1023,6702,6705],{},"手工拼接 ",[33,6701,2449],{},[33,6703,6704],{},"\\"," 分隔符，降低跨平台可读性。",[14,6707,207],{"id":207},[172,6709,6710,6717],{},[44,6711,6712,6713,6716],{},"组合 ",[33,6714,6715],{},"output\u002Freport.txt"," 路径但先不创建文件。",[44,6718,6719],{},"输出路径的父目录、文件名和扩展名。",[10,6721,218],{},[14,6723,221],{"id":221},[10,6725,6726],{},"本篇目标是组合、检查和创建跨平台路径。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,6728,228],{},{"title":77,"searchDepth":90,"depth":90,"links":6730},[6731,6732,6733,6734,6735,6736,6737,6738],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F29-python-pathlib-paths",{"title":6546,"description":6551},"python-pathlib-paths","posts\u002F20260817\u002F29-python-pathlib-paths","面向按顺序学习 Python 的初学者，本篇在第 27 篇知识上，帮助读者组合、检查和创建跨平台路径。",[239,6746,6747],"pathlib","文件路径","PHuyO5r-joDw7vGk9b5F3e-BXQ5bfH82oSi1nU4RwYM",{"id":6750,"title":6751,"body":6752,"category":239,"cover":240,"description":6756,"extension":241,"meta":6934,"navigation":93,"path":6935,"pinned":244,"publishedAt":245,"seo":6936,"slug":6937,"stem":6938,"summary":6939,"tags":6940,"updatedAt":245,"visible":93,"__hash__":6943},"posts\u002Fposts\u002F20260817\u002F30-python-text-files-encoding.md","30｜文本文件读写与字符编码",{"type":7,"value":6753,"toc":6924},[6754,6757,6759,6762,6764,6770,6773,6775,6803,6805,6807,6864,6866,6872,6874,6876,6887,6889,6902,6904,6915,6917,6919,6922],[10,6755,6756],{},"这套课程按知识依赖排列。本篇的前置知识是：第 29、22 篇。学完后，你应该能够显式使用 UTF-8 安全读写文本。",[14,6758,16],{"id":16},[10,6760,6761],{},"本篇只处理“文本文件读写与字符编码”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6763,22],{"id":22},[10,6765,6766],{},[26,6767],{"alt":6768,"src":6769},"字符通过编码变成文件字节","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F30-text-encoding.svg",[10,6771,6772],{},"Python 字符串写入文件前按 UTF-8 编码成字节，读取时再把字节解码成字符串。读写双方编码不一致会产生乱码或解码错误。",[14,6774,39],{"id":39},[41,6776,6777,6783,6792],{},[44,6778,6779,6782],{},[33,6780,6781],{},"w"," 模式会截断原文件，写入前必须确认目标。",[44,6784,6785,6788,6789,376],{},[33,6786,6787],{},"r"," 模式读取不存在文件会产生 ",[33,6790,6791],{},"FileNotFoundError",[44,6793,6794,6795,6798,6799,6802],{},"本篇显式调用 ",[33,6796,6797],{},"close()","；第 34 篇会用 ",[33,6800,6801],{},"with"," 更可靠地管理关闭动作。",[14,6804,67],{"id":67},[10,6806,70],{},[72,6808,6810],{"className":74,"code":6809,"language":76,"meta":77,"style":77},"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,6811,6812,6816,6820,6825,6830,6835,6840,6844,6849,6854,6859],{"__ignoreMap":77},[81,6813,6814],{"class":83,"line":84},[81,6815,6613],{},[81,6817,6818],{"class":83,"line":90},[81,6819,94],{"emptyLinePlaceholder":93},[81,6821,6822],{"class":83,"line":97},[81,6823,6824],{},"file_path = Path(\"notes.txt\")\n",[81,6826,6827],{"class":83,"line":103},[81,6828,6829],{},"writer = file_path.open(\"w\", encoding=\"utf-8\")\n",[81,6831,6832],{"class":83,"line":109},[81,6833,6834],{},"writer.write(\"变量\\n循环\\n函数\\n\")\n",[81,6836,6837],{"class":83,"line":115},[81,6838,6839],{},"writer.close()\n",[81,6841,6842],{"class":83,"line":121},[81,6843,94],{"emptyLinePlaceholder":93},[81,6845,6846],{"class":83,"line":127},[81,6847,6848],{},"reader = file_path.open(\"r\", encoding=\"utf-8\")\n",[81,6850,6851],{"class":83,"line":132},[81,6852,6853],{},"content = reader.read()\n",[81,6855,6856],{"class":83,"line":138},[81,6857,6858],{},"reader.close()\n",[81,6860,6861],{"class":83,"line":144},[81,6862,6863],{},"print(content)\n",[10,6865,156],{},[72,6867,6870],{"className":6868,"code":6869,"language":162,"meta":77},[160],"变量\n循环\n函数\n",[33,6871,6869],{"__ignoreMap":77},[10,6873,167],{},[14,6875,170],{"id":170},[172,6877,6878,6884],{},[44,6879,6880,6881,6883],{},"写入端以 UTF-8 把三个中文字符串和换行编码为字节，",[33,6882,6797],{}," 确保缓冲内容交给文件系统。",[44,6885,6886],{},"读取端用相同编码把字节还原为字符串；显式关闭后才结束资源占用。",[14,6888,190],{"id":190},[41,6890,6891,6896],{},[44,6892,46,6893,6895],{},[33,6894,6781],{}," 模式打开重要文件却未确认覆盖风险。",[44,6897,6898,6899,376],{},"依赖系统默认编码；跨机器或跨工具交换中文文件时应显式写 ",[33,6900,6901],{},"encoding=\"utf-8\"",[14,6903,207],{"id":207},[172,6905,6906,6909],{},[44,6907,6908],{},"写入三行学习记录并读取。",[44,6910,6911,6912,6914],{},"改用 ",[33,6913,350],{}," 模式追加一行，确认原内容仍保留。",[10,6916,218],{},[14,6918,221],{"id":221},[10,6920,6921],{},"本篇目标是显式使用 UTF-8 安全读写文本。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,6923,228],{},{"title":77,"searchDepth":90,"depth":90,"links":6925},[6926,6927,6928,6929,6930,6931,6932,6933],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F30-python-text-files-encoding",{"title":6751,"description":6756},"python-text-files-encoding","posts\u002F20260817\u002F30-python-text-files-encoding","面向按顺序学习 Python 的初学者，本篇在第 29、22 篇知识上，帮助读者显式使用 UTF-8 安全读写文本。",[239,6941,6942],"文件读写","UTF-8","qWTwAdOJwuDSNmawyrgtgB7vwnPnhvZoMJfWrx_G_co",{"id":6945,"title":6946,"body":6947,"category":239,"cover":240,"description":6951,"extension":241,"meta":7118,"navigation":93,"path":7119,"pinned":244,"publishedAt":245,"seo":7120,"slug":7121,"stem":7122,"summary":7123,"tags":7124,"updatedAt":245,"visible":93,"__hash__":7127},"posts\u002Fposts\u002F20260817\u002F31-python-json-data.md","31｜使用 JSON 保存结构化数据",{"type":7,"value":6948,"toc":7108},[6949,6952,6954,6957,6959,6965,6975,6977,6991,6993,6995,7055,7057,7063,7065,7067,7079,7081,7089,7091,7099,7101,7103,7106],[10,6950,6951],{},"这套课程按知识依赖排列。本篇的前置知识是：第 13、30 篇。学完后，你应该能够在 Python 对象和 JSON 文本之间转换。",[14,6953,16],{"id":16},[10,6955,6956],{},"本篇只处理“使用 JSON 保存结构化数据”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,6958,22],{"id":22},[10,6960,6961],{},[26,6962],{"alt":6963,"src":6964},"Python 对象与 JSON 文本互转","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F31-json-roundtrip.svg",[10,6966,6967,6970,6971,6974],{},[33,6968,6969],{},"json.dump"," 把字典和列表序列化为 JSON 文本，",[33,6972,6973],{},"json.load"," 再把文本解析回 Python 对象。它们不是简单的字符串替换。",[14,6976,39],{"id":39},[41,6978,6979,6982,6988],{},[44,6980,6981],{},"JSON 对象对应 Python 字典，JSON 数组对应列表。",[44,6983,6984,6987],{},[33,6985,6986],{},"ensure_ascii=False"," 让中文以可读字符写入。",[44,6989,6990],{},"JSON 不支持任意 Python 对象；日期和自定义类需要先转换为基础结构。",[14,6992,67],{"id":67},[10,6994,70],{},[72,6996,6998],{"className":74,"code":6997,"language":76,"meta":77,"style":77},"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,6999,7000,7005,7009,7014,7018,7023,7028,7032,7036,7041,7046,7050],{"__ignoreMap":77},[81,7001,7002],{"class":83,"line":84},[81,7003,7004],{},"import json\n",[81,7006,7007],{"class":83,"line":90},[81,7008,94],{"emptyLinePlaceholder":93},[81,7010,7011],{"class":83,"line":97},[81,7012,7013],{},"record = {\"course\": \"Python\", \"progress\": 60, \"done\": False}\n",[81,7015,7016],{"class":83,"line":103},[81,7017,94],{"emptyLinePlaceholder":93},[81,7019,7020],{"class":83,"line":109},[81,7021,7022],{},"writer = open(\"record.json\", \"w\", encoding=\"utf-8\")\n",[81,7024,7025],{"class":83,"line":115},[81,7026,7027],{},"json.dump(record, writer, ensure_ascii=False, indent=2)\n",[81,7029,7030],{"class":83,"line":121},[81,7031,6839],{},[81,7033,7034],{"class":83,"line":127},[81,7035,94],{"emptyLinePlaceholder":93},[81,7037,7038],{"class":83,"line":132},[81,7039,7040],{},"reader = open(\"record.json\", \"r\", encoding=\"utf-8\")\n",[81,7042,7043],{"class":83,"line":138},[81,7044,7045],{},"loaded = json.load(reader)\n",[81,7047,7048],{"class":83,"line":144},[81,7049,6858],{},[81,7051,7052],{"class":83,"line":150},[81,7053,7054],{},"print(loaded[\"course\"], loaded[\"progress\"])\n",[10,7056,156],{},[72,7058,7061],{"className":7059,"code":7060,"language":162,"meta":77},[160],"Python 60\n",[33,7062,7060],{"__ignoreMap":77},[10,7064,167],{},[14,7066,170],{"id":170},[172,7068,7069,7074],{},[44,7070,7071,7073],{},[33,7072,6969],{}," 遍历字典的基础类型，把它们写成符合 JSON 语法的文本。",[44,7075,7076,7078],{},[33,7077,6973],{}," 从文件解析文本，重新创建 Python 字典；读取结果不是原对象本身。",[14,7080,190],{"id":190},[41,7082,7083,7086],{},[44,7084,7085],{},"把 JSON 当作可以保存任意 Python 对象的格式，自定义类和日期需要先转换。",[44,7087,7088],{},"手工字符串拼接 JSON，容易产生转义、逗号和引号错误。",[14,7090,207],{"id":207},[172,7092,7093,7096],{},[44,7094,7095],{},"保存包含两条学习记录的列表。",[44,7097,7098],{},"读取后修改进度，再重新写回文件。",[10,7100,218],{},[14,7102,221],{"id":221},[10,7104,7105],{},"本篇目标是在 Python 对象和 JSON 文本之间转换。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,7107,228],{},{"title":77,"searchDepth":90,"depth":90,"links":7109},[7110,7111,7112,7113,7114,7115,7116,7117],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F31-python-json-data",{"title":6946,"description":6951},"python-json-data","posts\u002F20260817\u002F31-python-json-data","面向按顺序学习 Python 的初学者，本篇在第 13、30 篇知识上，帮助读者在 Python 对象和 JSON 文本之间转换。",[239,7125,7126],"JSON","数据持久化","cItgMs1zYJYeKM7m24IW9h-zqbQx1OyffwsrwNhyhYk",{"id":4,"title":5,"body":7129,"category":239,"cover":240,"description":12,"extension":241,"meta":7280,"navigation":93,"path":243,"pinned":244,"publishedAt":245,"seo":7281,"slug":247,"stem":248,"summary":249,"tags":7282,"updatedAt":245,"visible":93,"__hash__":253},{"type":7,"value":7130,"toc":7270},[7131,7133,7135,7137,7139,7143,7147,7149,7163,7165,7167,7219,7221,7226,7228,7230,7242,7244,7254,7256,7262,7264,7266,7268],[10,7132,12],{},[14,7134,16],{"id":16},[10,7136,19],{},[14,7138,22],{"id":22},[10,7140,7141],{},[26,7142],{"alt":28,"src":29},[10,7144,7145,36],{},[33,7146,35],{},[14,7148,39],{"id":39},[41,7150,7151,7157,7161],{},[44,7152,46,7153,50,7155,54],{},[33,7154,49],{},[33,7156,53],{},[44,7158,57,7159,61],{},[33,7160,60],{},[44,7162,64],{},[14,7164,67],{"id":67},[10,7166,70],{},[72,7168,7169],{"className":74,"code":75,"language":76,"meta":77,"style":77},[33,7170,7171,7175,7179,7183,7187,7191,7195,7199,7203,7207,7211,7215],{"__ignoreMap":77},[81,7172,7173],{"class":83,"line":84},[81,7174,87],{},[81,7176,7177],{"class":83,"line":90},[81,7178,94],{"emptyLinePlaceholder":93},[81,7180,7181],{"class":83,"line":97},[81,7182,100],{},[81,7184,7185],{"class":83,"line":103},[81,7186,106],{},[81,7188,7189],{"class":83,"line":109},[81,7190,112],{},[81,7192,7193],{"class":83,"line":115},[81,7194,118],{},[81,7196,7197],{"class":83,"line":121},[81,7198,124],{},[81,7200,7201],{"class":83,"line":127},[81,7202,94],{"emptyLinePlaceholder":93},[81,7204,7205],{"class":83,"line":132},[81,7206,135],{},[81,7208,7209],{"class":83,"line":138},[81,7210,141],{},[81,7212,7213],{"class":83,"line":144},[81,7214,147],{},[81,7216,7217],{"class":83,"line":150},[81,7218,153],{},[10,7220,156],{},[72,7222,7224],{"className":7223,"code":161,"language":162,"meta":77},[160],[33,7225,161],{"__ignoreMap":77},[10,7227,167],{},[14,7229,170],{"id":170},[172,7231,7232,7238],{},[44,7233,7234,179,7236,182],{},[33,7235,178],{},[33,7237,60],{},[44,7239,7240,187],{},[33,7241,35],{},[14,7243,190],{"id":190},[41,7245,7246,7248],{},[44,7247,195],{},[44,7249,198,7250,201,7252,204],{},[33,7251,49],{},[33,7253,53],{},[14,7255,207],{"id":207},[172,7257,7258,7260],{},[44,7259,212],{},[44,7261,215],{},[10,7263,218],{},[14,7265,221],{"id":221},[10,7267,224],{},[226,7269,228],{},{"title":77,"searchDepth":90,"depth":90,"links":7271},[7272,7273,7274,7275,7276,7277,7278,7279],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5,"description":12},[239,251,252],{"id":7284,"title":7285,"body":7286,"category":239,"cover":240,"description":7290,"extension":241,"meta":7563,"navigation":93,"path":7564,"pinned":244,"publishedAt":245,"seo":7565,"slug":7566,"stem":7567,"summary":7568,"tags":7569,"updatedAt":245,"visible":93,"__hash__":7572},"posts\u002Fposts\u002F20260817\u002F33-python-exceptions.md","33｜异常捕获、抛出与清理",{"type":7,"value":7287,"toc":7550},[7288,7291,7293,7296,7298,7304,7315,7317,7334,7336,7338,7413,7415,7421,7423,7425,7450,7452,7461,7467,7478,7480,7486,7492,7501,7503,7518,7520,7541,7543,7545,7548],[10,7289,7290],{},"这套课程按知识依赖排列。本篇的前置知识是：第 16、22、30 篇。学完后，你应该能够处理可预期错误并保留明确失败信息。",[14,7292,16],{"id":16},[10,7294,7295],{},"本篇只处理“异常捕获、抛出与清理”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7297,22],{"id":22},[10,7299,7300],{},[26,7301],{"alt":7302,"src":7303},"异常改变正常执行路径","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-exception-flow.svg",[10,7305,7306,7307,7310,7311,7314],{},"异常发生后，当前正常路径停止，解释器寻找匹配的 ",[33,7308,7309],{},"except","；无论是否异常，",[33,7312,7313],{},"finally"," 都会在离开结构前执行。",[14,7316,39],{"id":39},[41,7318,7319,7325,7331],{},[44,7320,7321,7322,7324],{},"只捕获能够处理的具体异常，不使用空的 ",[33,7323,7309],{}," 吞掉全部错误。",[44,7326,7327,7330],{},[33,7328,7329],{},"raise"," 用于明确拒绝不符合函数约定的数据。",[44,7332,7333],{},"异常信息应说明失败原因，但不泄露密钥、用户隐私或内部路径。",[14,7335,67],{"id":67},[10,7337,70],{},[72,7339,7341],{"className":74,"code":7340,"language":76,"meta":77,"style":77},"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,7342,7343,7348,7353,7358,7363,7368,7372,7377,7382,7387,7392,7396,7401,7407],{"__ignoreMap":77},[81,7344,7345],{"class":83,"line":84},[81,7346,7347],{},"def parse_age(text):\n",[81,7349,7350],{"class":83,"line":90},[81,7351,7352],{},"    age = int(text)\n",[81,7354,7355],{"class":83,"line":97},[81,7356,7357],{},"    if age \u003C 0:\n",[81,7359,7360],{"class":83,"line":103},[81,7361,7362],{},"        raise ValueError(\"年龄不能为负数\")\n",[81,7364,7365],{"class":83,"line":109},[81,7366,7367],{},"    return age\n",[81,7369,7370],{"class":83,"line":115},[81,7371,94],{"emptyLinePlaceholder":93},[81,7373,7374],{"class":83,"line":121},[81,7375,7376],{},"try:\n",[81,7378,7379],{"class":83,"line":127},[81,7380,7381],{},"    age = parse_age(\"18\")\n",[81,7383,7384],{"class":83,"line":132},[81,7385,7386],{},"except ValueError as error:\n",[81,7388,7389],{"class":83,"line":138},[81,7390,7391],{},"    print(\"输入错误：\", error)\n",[81,7393,7394],{"class":83,"line":144},[81,7395,1160],{},[81,7397,7398],{"class":83,"line":150},[81,7399,7400],{},"    print(\"年龄：\", age)\n",[81,7402,7404],{"class":83,"line":7403},13,[81,7405,7406],{},"finally:\n",[81,7408,7410],{"class":83,"line":7409},14,[81,7411,7412],{},"    print(\"处理结束\")\n",[10,7414,156],{},[72,7416,7419],{"className":7417,"code":7418,"language":162,"meta":77},[160],"年龄： 18\n处理结束\n",[33,7420,7418],{"__ignoreMap":77},[10,7422,167],{},[14,7424,170],{"id":170},[172,7426,7427,7439],{},[44,7428,7429,7431,7432,7434,7435,7438],{},[33,7430,3049],{}," 或主动 ",[33,7433,7329],{}," 都可能产生 ",[33,7436,7437],{},"ValueError","，控制流立即离开当前正常路径。",[44,7440,7441,7442,7444,7445,7447,7448,376],{},"有异常时进入匹配的 ",[33,7443,7309],{},"；没有异常时执行 ",[33,7446,1174],{},"；两种情况最后都会执行 ",[33,7449,7313],{},[342,7451,2710],{"id":2710},[10,7453,7454,2271,7456,1171,7458,7460],{},[33,7455,7309],{},[33,7457,1174],{},[33,7459,7313],{}," 的职责不同，不能只看它们出现的顺序。",[10,7462,7463],{},[26,7464],{"alt":7465,"src":7466},"异常结构的三种职责","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-try-parts.svg",[10,7468,7469,7471,7472,7474,7475,7477],{},[33,7470,7309],{}," 处理匹配异常，",[33,7473,1174],{}," 只在无异常时运行，",[33,7476,7313],{}," 负责两条路径都需要的清理动作。",[342,7479,2710],{"id":4231},[10,7481,7482,7485],{},[33,7483,7484],{},"try"," 范围越大，越难判断究竟允许哪一步失败。",[10,7487,7488],{},[26,7489],{"alt":7490,"src":7491},"缩小 try 才能看清失败边界","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F33-narrow-try.svg",[10,7493,7494,7495,7497,7498,7500],{},"只把可能产生预期异常的操作放进 ",[33,7496,7484],{},"，后续正常业务放进 ",[33,7499,1174],{},"，错误边界会更清楚。",[14,7502,190],{"id":190},[41,7504,7505,7512],{},[44,7506,7507,7508,7511],{},"使用裸 ",[33,7509,7510],{},"except:"," 后什么也不做，真实编程错误也会被隐藏。",[44,7513,7514,7515,7517],{},"把整个程序包在一个巨大 ",[33,7516,7484],{}," 中，无法判断究竟哪一步允许失败。",[14,7519,207],{"id":207},[172,7521,7522,7535],{},[44,7523,7524,7525,7528,7529,1171,7532,376],{},"让 ",[33,7526,7527],{},"parse_age"," 分别处理 ",[33,7530,7531],{},"\"abc\"",[33,7533,7534],{},"\"-1\"",[44,7536,7537,7538,7540],{},"为文件读取捕获 ",[33,7539,6791],{}," 并给出清晰提示。",[10,7542,218],{},[14,7544,221],{"id":221},[10,7546,7547],{},"本篇目标是处理可预期错误并保留明确失败信息。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,7549,228],{},{"title":77,"searchDepth":90,"depth":90,"links":7551},[7552,7553,7554,7555,7556,7560,7561,7562],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":7557},[7558,7559],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F33-python-exceptions",{"title":7285,"description":7290},"python-exceptions","posts\u002F20260817\u002F33-python-exceptions","面向按顺序学习 Python 的初学者，本篇在第 16、22、30 篇知识上，帮助读者处理可预期错误并保留明确失败信息。",[239,7570,7571],"异常处理","错误","0qlq5G_4gAA2CmeWsYEcOlF6y0lQx7FrmSsDzRvhnIo",{"id":7574,"title":7575,"body":7576,"category":239,"cover":240,"description":7580,"extension":241,"meta":7756,"navigation":93,"path":7757,"pinned":244,"publishedAt":245,"seo":7758,"slug":7759,"stem":7760,"summary":7761,"tags":7762,"updatedAt":245,"visible":93,"__hash__":7764},"posts\u002Fposts\u002F20260817\u002F34-python-with-context-manager.md","34｜with 上下文管理器为什么能自动关闭资源",{"type":7,"value":7577,"toc":7746},[7578,7581,7583,7586,7588,7594,7600,7602,7618,7620,7622,7676,7678,7684,7686,7688,7701,7703,7716,7718,7737,7739,7741,7744],[10,7579,7580],{},"这套课程按知识依赖排列。本篇的前置知识是：第 30、33 篇。学完后，你应该能够使用上下文管理器可靠释放文件资源。",[14,7582,16],{"id":16},[10,7584,7585],{},"本篇只处理“with 上下文管理器为什么能自动关闭资源”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7587,22],{"id":22},[10,7589,7590],{},[26,7591],{"alt":7592,"src":7593},"with 管理资源生命周期","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F34-context-manager.svg",[10,7595,7596,7597,7599],{},"进入 ",[33,7598,6801],{}," 时取得资源，代码块结束时执行退出逻辑。即使块内发生异常，文件也会得到关闭机会。",[14,7601,39],{"id":39},[41,7603,7604,7609,7615],{},[44,7605,7606,7608],{},[33,7607,6801],{}," 把资源获取和释放配成一个清晰边界。",[44,7610,7611,7614],{},[33,7612,7613],{},"as file"," 得到的是上下文返回的资源对象。",[44,7616,7617],{},"文件、锁和数据库连接等资源常提供上下文管理协议。",[14,7619,67],{"id":67},[10,7621,70],{},[72,7623,7625],{"className":74,"code":7624,"language":76,"meta":77,"style":77},"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,7626,7627,7631,7635,7639,7643,7648,7653,7657,7662,7667,7671],{"__ignoreMap":77},[81,7628,7629],{"class":83,"line":84},[81,7630,6613],{},[81,7632,7633],{"class":83,"line":90},[81,7634,94],{"emptyLinePlaceholder":93},[81,7636,7637],{"class":83,"line":97},[81,7638,6824],{},[81,7640,7641],{"class":83,"line":103},[81,7642,94],{"emptyLinePlaceholder":93},[81,7644,7645],{"class":83,"line":109},[81,7646,7647],{},"with file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[81,7649,7650],{"class":83,"line":115},[81,7651,7652],{},"    file.write(\"上下文管理器\\n\")\n",[81,7654,7655],{"class":83,"line":121},[81,7656,94],{"emptyLinePlaceholder":93},[81,7658,7659],{"class":83,"line":127},[81,7660,7661],{},"with file_path.open(\"r\", encoding=\"utf-8\") as file:\n",[81,7663,7664],{"class":83,"line":132},[81,7665,7666],{},"    print(file.read())\n",[81,7668,7669],{"class":83,"line":138},[81,7670,94],{"emptyLinePlaceholder":93},[81,7672,7673],{"class":83,"line":144},[81,7674,7675],{},"print(file.closed)\n",[10,7677,156],{},[72,7679,7682],{"className":7680,"code":7681,"language":162,"meta":77},[160],"上下文管理器\n\nTrue\n",[33,7683,7681],{"__ignoreMap":77},[10,7685,167],{},[14,7687,170],{"id":170},[172,7689,7690,7698],{},[44,7691,7596,7692,7694,7695,376],{},[33,7693,6801],{}," 时，文件对象的上下文协议返回可用资源并绑定到 ",[33,7696,7697],{},"file",[44,7699,7700],{},"离开代码块时自动执行退出逻辑；即使块内抛出异常，也会尝试关闭文件。",[14,7702,190],{"id":190},[41,7704,7705,7710],{},[44,7706,4799,7707,7709],{},[33,7708,6801],{}," 代码块外继续读写已经关闭的文件对象。",[44,7711,7712,7713,7715],{},"误以为 ",[33,7714,6801],{}," 会自动处理所有业务异常；它只保证执行资源退出协议。",[14,7717,207],{"id":207},[172,7719,7720,7729],{},[44,7721,7722,7723,7726,7727,376],{},"把第 30 篇的手动 ",[33,7724,7725],{},"open\u002Fclose"," 改写为 ",[33,7728,6801],{},[44,7730,4799,7731,7733,7734,376],{},[33,7732,6801],{}," 块后检查 ",[33,7735,7736],{},"file.closed",[10,7738,218],{},[14,7740,221],{"id":221},[10,7742,7743],{},"本篇目标是使用上下文管理器可靠释放文件资源。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,7745,228],{},{"title":77,"searchDepth":90,"depth":90,"links":7747},[7748,7749,7750,7751,7752,7753,7754,7755],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F34-python-with-context-manager",{"title":7575,"description":7580},"python-with-context-manager","posts\u002F20260817\u002F34-python-with-context-manager","面向按顺序学习 Python 的初学者，本篇在第 30、33 篇知识上，帮助读者使用上下文管理器可靠释放文件资源。",[239,6801,7763],"上下文管理器","S5YJxtf_fX6TJCTMoZjcqE_ozIqVP8ZqfyTUI2beo20",{"id":7766,"title":7767,"body":7768,"category":239,"cover":240,"description":7772,"extension":241,"meta":7984,"navigation":93,"path":7985,"pinned":244,"publishedAt":245,"seo":7986,"slug":7987,"stem":7988,"summary":7989,"tags":7990,"updatedAt":245,"visible":93,"__hash__":7993},"posts\u002Fposts\u002F20260817\u002F35-python-class-object.md","35｜类、对象、属性与方法",{"type":7,"value":7769,"toc":7972},[7770,7773,7775,7778,7780,7786,7789,7791,7808,7810,7812,7880,7882,7888,7890,7892,7917,7919,7922,7928,7937,7939,7950,7952,7963,7965,7967,7970],[10,7771,7772],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、13 篇。学完后，你应该能够使用类组织一组相关状态和行为。",[14,7774,16],{"id":16},[10,7776,7777],{},"本篇只处理“类、对象、属性与方法”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,7779,22],{"id":22},[10,7781,7782],{},[26,7783],{"alt":7784,"src":7785},"类创建对象并组织状态行为","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-instance.svg",[10,7787,7788],{},"类定义对象应具有哪些属性和方法；调用类创建实例后，每个实例保存自己的状态，通过方法读取或更新状态。",[14,7790,39],{"id":39},[41,7792,7793,7799,7805],{},[44,7794,7795,7798],{},[33,7796,7797],{},"self"," 表示当前实例，由方法调用自动传入。",[44,7800,7801,7804],{},[33,7802,7803],{},"__init__"," 在实例创建过程中初始化属性。",[44,7806,7807],{},"只有数据和行为确实属于同一概念时才需要类，简单数据仍可使用字典。",[14,7809,67],{"id":67},[10,7811,70],{},[72,7813,7815],{"className":74,"code":7814,"language":76,"meta":77,"style":77},"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,7816,7817,7822,7827,7832,7837,7841,7846,7851,7856,7861,7865,7870,7875],{"__ignoreMap":77},[81,7818,7819],{"class":83,"line":84},[81,7820,7821],{},"class LearningRecord:\n",[81,7823,7824],{"class":83,"line":90},[81,7825,7826],{},"    def __init__(self, course, progress=0):\n",[81,7828,7829],{"class":83,"line":97},[81,7830,7831],{},"        self.course = course\n",[81,7833,7834],{"class":83,"line":103},[81,7835,7836],{},"        self.progress = progress\n",[81,7838,7839],{"class":83,"line":109},[81,7840,94],{"emptyLinePlaceholder":93},[81,7842,7843],{"class":83,"line":115},[81,7844,7845],{},"    def advance(self, amount):\n",[81,7847,7848],{"class":83,"line":121},[81,7849,7850],{},"        self.progress = self.progress + amount\n",[81,7852,7853],{"class":83,"line":127},[81,7854,7855],{},"        if self.progress > 100:\n",[81,7857,7858],{"class":83,"line":132},[81,7859,7860],{},"            self.progress = 100\n",[81,7862,7863],{"class":83,"line":138},[81,7864,94],{"emptyLinePlaceholder":93},[81,7866,7867],{"class":83,"line":144},[81,7868,7869],{},"record = LearningRecord(\"Python\", 40)\n",[81,7871,7872],{"class":83,"line":150},[81,7873,7874],{},"record.advance(15)\n",[81,7876,7877],{"class":83,"line":7403},[81,7878,7879],{},"print(record.course, record.progress)\n",[10,7881,156],{},[72,7883,7886],{"className":7884,"code":7885,"language":162,"meta":77},[160],"Python 55\n",[33,7887,7885],{"__ignoreMap":77},[10,7889,167],{},[14,7891,170],{"id":170},[172,7893,7894,7904],{},[44,7895,7896,7897,7900,7901,7903],{},"调用 ",[33,7898,7899],{},"LearningRecord(\"Python\", 40)"," 创建实例，",[33,7902,7803],{}," 把课程和进度保存在该实例属性中。",[44,7905,7906,7909,7910,7913,7914,7916],{},[33,7907,7908],{},"record.advance(15)"," 自动把 ",[33,7911,7912],{},"record"," 作为 ",[33,7915,7797],{},"，方法更新同一实例的进度并限制上限。",[342,7918,2710],{"id":2710},[10,7920,7921],{},"类是共同定义，实例则各自保存状态。",[10,7923,7924],{},[26,7925],{"alt":7926,"src":7927},"两个实例各自保存状态","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F35-class-two-instances.svg",[10,7929,7930,7931,1171,7933,7936],{},"两个实例共享同一套方法定义，但 ",[33,7932,4596],{},[33,7934,7935],{},"progress"," 属性分别属于各自实例，修改一边不会自动修改另一边。",[14,7938,190],{"id":190},[41,7940,7941,7947],{},[44,7942,7943,7944,7946],{},"调用实例方法时手工再传一次 ",[33,7945,7797],{},"。通过实例调用时 Python 会自动绑定。",[44,7948,7949],{},"只为了存两三个没有行为的数据就创建复杂类；字典或数据类可能更合适。",[14,7951,207],{"id":207},[172,7953,7954,7960],{},[44,7955,5309,7956,7959],{},[33,7957,7958],{},"Book"," 类，保存标题和阅读页数。",[44,7961,7962],{},"增加方法更新阅读页数，并限制它不超过总页数。",[10,7964,218],{},[14,7966,221],{"id":221},[10,7968,7969],{},"本篇目标是使用类组织一组相关状态和行为。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,7971,228],{},{"title":77,"searchDepth":90,"depth":90,"links":7973},[7974,7975,7976,7977,7978,7981,7982,7983],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":7979},[7980],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F35-python-class-object",{"title":7767,"description":7772},"python-class-object","posts\u002F20260817\u002F35-python-class-object","面向按顺序学习 Python 的初学者，本篇在第 22、23、13 篇知识上，帮助读者使用类组织一组相关状态和行为。",[239,7991,7992],"类","面向对象","YQC-FSgTSA9jUT7E_pT2JpIRPDS_q69fILmYywcvbvU",{"id":7995,"title":7996,"body":7997,"category":239,"cover":240,"description":8001,"extension":241,"meta":8179,"navigation":93,"path":8180,"pinned":244,"publishedAt":245,"seo":8181,"slug":8182,"stem":8183,"summary":8184,"tags":8185,"updatedAt":245,"visible":93,"__hash__":8188},"posts\u002Fposts\u002F20260817\u002F36-python-composition-inheritance.md","36｜封装、组合与继承怎样选择",{"type":7,"value":7998,"toc":8169},[7999,8002,8004,8007,8009,8015,8018,8020,8031,8033,8035,8102,8104,8110,8112,8114,8133,8135,8143,8145,8160,8162,8164,8167],[10,8000,8001],{},"这套课程按知识依赖排列。本篇的前置知识是：第 35 篇。学完后，你应该能够区分拥有关系和属于关系。",[14,8003,16],{"id":16},[10,8005,8006],{},"本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8008,22],{"id":22},[10,8010,8011],{},[26,8012],{"alt":8013,"src":8014},"组合与继承表达不同关系","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F36-composition-inheritance.svg",[10,8016,8017],{},"组合表达“一个对象拥有另一个对象”，继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。",[14,8019,39],{"id":39},[41,8021,8022,8025,8028],{},[44,8023,8024],{},"封装让对象通过方法维护自己的有效状态。",[44,8026,8027],{},"组合通常更灵活：外部对象只依赖协作对象提供的行为。",[44,8029,8030],{},"继承适合稳定的“是一种”关系，并且子类应能替代父类。",[14,8032,67],{"id":67},[10,8034,70],{},[72,8036,8038],{"className":74,"code":8037,"language":76,"meta":77,"style":77},"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,8039,8040,8045,8050,8055,8059,8064,8069,8074,8078,8083,8088,8092,8097],{"__ignoreMap":77},[81,8041,8042],{"class":83,"line":84},[81,8043,8044],{},"class Storage:\n",[81,8046,8047],{"class":83,"line":90},[81,8048,8049],{},"    def save(self, text):\n",[81,8051,8052],{"class":83,"line":97},[81,8053,8054],{},"        print(\"保存：\", text)\n",[81,8056,8057],{"class":83,"line":103},[81,8058,94],{"emptyLinePlaceholder":93},[81,8060,8061],{"class":83,"line":109},[81,8062,8063],{},"class LearningService:\n",[81,8065,8066],{"class":83,"line":115},[81,8067,8068],{},"    def __init__(self, storage):\n",[81,8070,8071],{"class":83,"line":121},[81,8072,8073],{},"        self.storage = storage\n",[81,8075,8076],{"class":83,"line":127},[81,8077,94],{"emptyLinePlaceholder":93},[81,8079,8080],{"class":83,"line":132},[81,8081,8082],{},"    def finish_lesson(self, title):\n",[81,8084,8085],{"class":83,"line":138},[81,8086,8087],{},"        self.storage.save(title)\n",[81,8089,8090],{"class":83,"line":144},[81,8091,94],{"emptyLinePlaceholder":93},[81,8093,8094],{"class":83,"line":150},[81,8095,8096],{},"service = LearningService(Storage())\n",[81,8098,8099],{"class":83,"line":7403},[81,8100,8101],{},"service.finish_lesson(\"异常处理\")\n",[10,8103,156],{},[72,8105,8108],{"className":8106,"code":8107,"language":162,"meta":77},[160],"保存： 异常处理\n",[33,8109,8107],{"__ignoreMap":77},[10,8111,167],{},[14,8113,170],{"id":170},[172,8115,8116,8126],{},[44,8117,8118,8121,8122,8125],{},[33,8119,8120],{},"LearningService"," 不负责具体保存细节，只保存一个实现 ",[33,8123,8124],{},"save()"," 的协作对象。",[44,8127,8128,8129,8132],{},"调用业务方法时，服务把保存动作委托给 ",[33,8130,8131],{},"Storage","；替换存储实现不要求改变课程完成逻辑。",[14,8134,190],{"id":190},[41,8136,8137,8140],{},[44,8138,8139],{},"为了复用一两个方法就建立不符合“是一种”关系的继承层次。",[44,8141,8142],{},"把组合理解为简单嵌套数据；关键在于对象通过清晰接口协作。",[14,8144,207],{"id":207},[172,8146,8147,8157],{},[44,8148,8149,8150,8153,8154,376],{},"用组合让 ",[33,8151,8152],{},"OrderService"," 使用一个 ",[33,8155,8156],{},"Notifier",[44,8158,8159],{},"为“学生属于用户”设计简单继承，再说明它成立的前提。",[10,8161,218],{},[14,8163,221],{"id":221},[10,8165,8166],{},"本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,8168,228],{},{"title":77,"searchDepth":90,"depth":90,"links":8170},[8171,8172,8173,8174,8175,8176,8177,8178],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F36-python-composition-inheritance",{"title":7996,"description":8001},"python-composition-inheritance","posts\u002F20260817\u002F36-python-composition-inheritance","面向按顺序学习 Python 的初学者，本篇在第 35 篇知识上，帮助读者区分拥有关系和属于关系。",[239,8186,8187],"组合","继承","BmuWDyClCSAOvr10btQdH7RJoZUyjSPjRIz5BQygaYI",{"id":8190,"title":8191,"body":8192,"category":239,"cover":240,"description":8196,"extension":241,"meta":8399,"navigation":93,"path":8400,"pinned":244,"publishedAt":245,"seo":8401,"slug":8402,"stem":8403,"summary":8404,"tags":8405,"updatedAt":245,"visible":93,"__hash__":8408},"posts\u002Fposts\u002F20260817\u002F37-python-iterator-generator.md","37｜迭代器与生成器的按需取值",{"type":7,"value":8193,"toc":8387},[8194,8197,8199,8202,8204,8210,8217,8219,8244,8246,8248,8300,8302,8308,8310,8312,8333,8335,8341,8347,8353,8355,8363,8365,8378,8380,8382,8385],[10,8195,8196],{},"这套课程按知识依赖排列。本篇的前置知识是：第 18、22、35 篇。学完后，你应该能够理解 iter、next 和 yield 的执行状态。",[14,8198,16],{"id":16},[10,8200,8201],{},"本篇只处理“迭代器与生成器的按需取值”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8203,22],{"id":22},[10,8205,8206],{},[26,8207],{"alt":8208,"src":8209},"生成器每次只产生一个值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-generator-state.svg",[10,8211,8212,8213,8216],{},"生成器运行到 ",[33,8214,8215],{},"yield"," 产生一个值并暂停，下一次请求时从暂停位置继续，而不是重新从函数第一行开始。",[14,8218,39],{"id":39},[41,8220,8221,8231,8241],{},[44,8222,8223,8226,8227,8230],{},[33,8224,8225],{},"iter()"," 从可迭代对象取得迭代器，",[33,8228,8229],{},"next()"," 请求下一个值。",[44,8232,8233,8234,8237,8238,8240],{},"没有更多值时迭代器抛出 ",[33,8235,8236],{},"StopIteration","，",[33,8239,4350],{}," 会自动处理。",[44,8242,8243],{},"生成器适合按需产生数据，但不是所有列表都需要改成生成器。",[14,8245,67],{"id":67},[10,8247,70],{},[72,8249,8251],{"className":74,"code":8250,"language":76,"meta":77,"style":77},"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,8252,8253,8258,8263,8268,8273,8278,8282,8287,8292,8296],{"__ignoreMap":77},[81,8254,8255],{"class":83,"line":84},[81,8256,8257],{},"def countdown(start):\n",[81,8259,8260],{"class":83,"line":90},[81,8261,8262],{},"    current = start\n",[81,8264,8265],{"class":83,"line":97},[81,8266,8267],{},"    while current > 0:\n",[81,8269,8270],{"class":83,"line":103},[81,8271,8272],{},"        yield current\n",[81,8274,8275],{"class":83,"line":109},[81,8276,8277],{},"        current = current - 1\n",[81,8279,8280],{"class":83,"line":115},[81,8281,94],{"emptyLinePlaceholder":93},[81,8283,8284],{"class":83,"line":121},[81,8285,8286],{},"iterator = countdown(3)\n",[81,8288,8289],{"class":83,"line":127},[81,8290,8291],{},"print(next(iterator))\n",[81,8293,8294],{"class":83,"line":132},[81,8295,8291],{},[81,8297,8298],{"class":83,"line":138},[81,8299,8291],{},[10,8301,156],{},[72,8303,8306],{"className":8304,"code":8305,"language":162,"meta":77},[160],"3\n2\n1\n",[33,8307,8305],{"__ignoreMap":77},[10,8309,167],{},[14,8311,170],{"id":170},[172,8313,8314,8320],{},[44,8315,7896,8316,8319],{},[33,8317,8318],{},"countdown(3)"," 返回生成器对象，函数体还未运行。",[44,8321,8322,8323,8325,8326,8328,8329,8332],{},"每次 ",[33,8324,8229],{}," 运行到下一个 ",[33,8327,8215],{}," 并暂停，局部变量 ",[33,8330,8331],{},"current"," 和执行位置被保留。",[342,8334,2710],{"id":2710},[10,8336,8337,8338,8340],{},"生成器的暂停位置可以展开成多次 ",[33,8339,8229],{}," 的时间线。",[10,8342,8343],{},[26,8344],{"alt":8345,"src":8346},"多次 next 推进同一个生成器","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F37-yield-timeline.svg",[10,8348,8349,8350,8352],{},"每次请求只推进到下一个 ",[33,8351,8215],{},"；局部变量保留，代码不会从函数开头重新运行。",[14,8354,190],{"id":190},[41,8356,8357,8360],{},[44,8358,8359],{},"把生成器当列表重复遍历；多数生成器消耗后不能自动回到开头。",[44,8361,8362],{},"在需要随机访问和多次读取的小数据上强行使用生成器，增加理解成本。",[14,8364,207],{"id":207},[172,8366,8367,8370],{},[44,8368,8369],{},"编写产生 1 到指定上限偶数的生成器。",[44,8371,4023,8372,8374,8375,8377],{},[33,8373,4350],{}," 遍历生成器，比较手动 ",[33,8376,8229],{}," 的差异。",[10,8379,218],{},[14,8381,221],{"id":221},[10,8383,8384],{},"本篇目标是理解 iter、next 和 yield 的执行状态。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,8386,228],{},{"title":77,"searchDepth":90,"depth":90,"links":8388},[8389,8390,8391,8392,8393,8396,8397,8398],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":8394},[8395],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F37-python-iterator-generator",{"title":8191,"description":8196},"python-iterator-generator","posts\u002F20260817\u002F37-python-iterator-generator","面向按顺序学习 Python 的初学者，本篇在第 18、22、35 篇知识上，帮助读者理解 iter、next 和 yield 的执行状态。",[239,8406,8407],"迭代器","生成器","PLaXEzD8SCCu_elhZ--26uGzVf5BTC7EahT6HztcvIc",{"id":8410,"title":8411,"body":8412,"category":239,"cover":240,"description":8416,"extension":241,"meta":8640,"navigation":93,"path":8641,"pinned":244,"publishedAt":245,"seo":8642,"slug":8643,"stem":8644,"summary":8645,"tags":8646,"updatedAt":245,"visible":93,"__hash__":8648},"posts\u002Fposts\u002F20260817\u002F38-python-decorator-basics.md","38｜装饰器如何包装函数",{"type":7,"value":8413,"toc":8628},[8414,8417,8419,8422,8424,8430,8433,8435,8455,8457,8459,8541,8543,8549,8551,8553,8575,8577,8580,8586,8593,8595,8605,8607,8619,8621,8623,8626],[10,8415,8416],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、23、27 篇。学完后，你应该能够理解函数被包装后的调用顺序。",[14,8418,16],{"id":16},[10,8420,8421],{},"本篇只处理“装饰器如何包装函数”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8423,22],{"id":22},[10,8425,8426],{},[26,8427],{"alt":8428,"src":8429},"装饰器把函数包在外层","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-wrap.svg",[10,8431,8432],{},"装饰器接收原函数并返回包装函数。名称重新绑定后，调用看似仍是原函数名，实际会先进入包装层，再决定何时调用原函数。",[14,8434,39],{"id":39},[41,8436,8437,8446,8449],{},[44,8438,8439,8442,8443,376],{},[33,8440,8441],{},"@trace"," 等价于 ",[33,8444,8445],{},"add = trace(add)",[44,8447,8448],{},"包装函数必须返回原函数结果，否则调用语义会被改变。",[44,8450,8451,8454],{},[33,8452,8453],{},"functools.wraps"," 保留原函数名称和文档信息。",[14,8456,67],{"id":67},[10,8458,70],{},[72,8460,8462],{"className":74,"code":8461,"language":76,"meta":77,"style":77},"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,8463,8464,8469,8473,8478,8483,8488,8493,8498,8503,8508,8513,8517,8522,8526,8530,8535],{"__ignoreMap":77},[81,8465,8466],{"class":83,"line":84},[81,8467,8468],{},"from functools import wraps\n",[81,8470,8471],{"class":83,"line":90},[81,8472,94],{"emptyLinePlaceholder":93},[81,8474,8475],{"class":83,"line":97},[81,8476,8477],{},"def trace(function):\n",[81,8479,8480],{"class":83,"line":103},[81,8481,8482],{},"    @wraps(function)\n",[81,8484,8485],{"class":83,"line":109},[81,8486,8487],{},"    def wrapper(*args, **kwargs):\n",[81,8489,8490],{"class":83,"line":115},[81,8491,8492],{},"        print(\"开始：\", function.__name__)\n",[81,8494,8495],{"class":83,"line":121},[81,8496,8497],{},"        result = function(*args, **kwargs)\n",[81,8499,8500],{"class":83,"line":127},[81,8501,8502],{},"        print(\"结束：\", function.__name__)\n",[81,8504,8505],{"class":83,"line":132},[81,8506,8507],{},"        return result\n",[81,8509,8510],{"class":83,"line":138},[81,8511,8512],{},"    return wrapper\n",[81,8514,8515],{"class":83,"line":144},[81,8516,94],{"emptyLinePlaceholder":93},[81,8518,8519],{"class":83,"line":150},[81,8520,8521],{},"@trace\n",[81,8523,8524],{"class":83,"line":7403},[81,8525,6192],{},[81,8527,8528],{"class":83,"line":7409},[81,8529,6197],{},[81,8531,8533],{"class":83,"line":8532},15,[81,8534,94],{"emptyLinePlaceholder":93},[81,8536,8538],{"class":83,"line":8537},16,[81,8539,8540],{},"print(add(2, 3))\n",[10,8542,156],{},[72,8544,8547],{"className":8545,"code":8546,"language":162,"meta":77},[160],"开始： add\n结束： add\n5\n",[33,8548,8546],{"__ignoreMap":77},[10,8550,167],{},[14,8552,170],{"id":170},[172,8554,8555,8572],{},[44,8556,8557,8558,8561,8562,8565,8566,8569,8570,376],{},"解释器执行定义时，把原 ",[33,8559,8560],{},"add"," 函数交给 ",[33,8563,8564],{},"trace","，返回的 ",[33,8567,8568],{},"wrapper"," 重新绑定到名字 ",[33,8571,8560],{},[44,8573,8574],{},"调用时先进入包装函数，包装函数再调用原函数、取得结果并原样返回。",[342,8576,2710],{"id":2710},[10,8578,8579],{},"装饰器语法看起来特殊，但可以还原成普通赋值。",[10,8581,8582],{},[26,8583],{"alt":8584,"src":8585},"装饰器语法可以还原成赋值","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F38-decorator-equivalence.svg",[10,8587,8588,8590,8591,376],{},[33,8589,8441],{}," 位于函数定义上方，效果等价于定义结束后执行 ",[33,8592,8445],{},[14,8594,190],{"id":190},[41,8596,8597,8602],{},[44,8598,8599,8600,376],{},"包装函数忘记返回原函数结果，调用方得到 ",[33,8601,5392],{},[44,8603,8604],{},"装饰器叠加过多且修改隐藏行为，使调用路径难以追踪；基础项目优先保持层数少。",[14,8606,207],{"id":207},[172,8608,8609,8612],{},[44,8610,8611],{},"编写只记录调用次数的简单装饰器。",[44,8613,8614,8615,8618],{},"删除包装函数的 ",[33,8616,8617],{},"return result","，观察调用方得到什么。",[10,8620,218],{},[14,8622,221],{"id":221},[10,8624,8625],{},"本篇目标是理解函数被包装后的调用顺序。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,8627,228],{},{"title":77,"searchDepth":90,"depth":90,"links":8629},[8630,8631,8632,8633,8634,8637,8638,8639],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":8635},[8636],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F38-python-decorator-basics",{"title":8411,"description":8416},"python-decorator-basics","posts\u002F20260817\u002F38-python-decorator-basics","面向按顺序学习 Python 的初学者，本篇在第 22、23、27 篇知识上，帮助读者理解函数被包装后的调用顺序。",[239,8647,5343],"装饰器","BW4I6sQnQvDdRxzTQmwH4CiSFSOJoPrLpl7Z_3OF_KY",{"id":8650,"title":8651,"body":8652,"category":239,"cover":240,"description":8656,"extension":241,"meta":8843,"navigation":93,"path":8844,"pinned":244,"publishedAt":245,"seo":8845,"slug":8846,"stem":8847,"summary":8848,"tags":8849,"updatedAt":245,"visible":93,"__hash__":8852},"posts\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing.md","39｜调试、日志与自动化测试入门",{"type":7,"value":8653,"toc":8831},[8654,8657,8659,8662,8664,8670,8673,8675,8686,8688,8690,8765,8767,8773,8775,8777,8788,8790,8793,8799,8802,8804,8812,8814,8822,8824,8826,8829],[10,8655,8656],{},"这套课程按知识依赖排列。本篇的前置知识是：第 22、27、33 篇。学完后，你应该能够把失败缩小到可重复验证的函数。",[14,8658,16],{"id":16},[10,8660,8661],{},"本篇只处理“调试、日志与自动化测试入门”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8663,22],{"id":22},[10,8665,8666],{},[26,8667],{"alt":8668,"src":8669},"从失败现象缩小到可测试单元","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-debug-test.svg",[10,8671,8672],{},"先稳定复现失败，再通过日志或断点确定出错范围，最后把问题缩小为有明确输入输出的函数，用测试固定正确行为。",[14,8674,39],{"id":39},[41,8676,8677,8680,8683],{},[44,8678,8679],{},"调试先追求稳定复现，不要同时修改多个无关位置。",[44,8681,8682],{},"日志记录运行状态，测试判断结果是否符合约定。",[44,8684,8685],{},"测试名称描述场景；边界值通常比只测普通值更有价值。",[14,8687,67],{"id":67},[10,8689,70],{},[72,8691,8693],{"className":74,"code":8692,"language":76,"meta":77,"style":77},"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,8694,8695,8700,8705,8709,8714,8718,8723,8728,8733,8737,8742,8747,8752,8756,8760],{"__ignoreMap":77},[81,8696,8697],{"class":83,"line":84},[81,8698,8699],{},"import logging\n",[81,8701,8702],{"class":83,"line":90},[81,8703,8704],{},"import unittest\n",[81,8706,8707],{"class":83,"line":97},[81,8708,94],{"emptyLinePlaceholder":93},[81,8710,8711],{"class":83,"line":103},[81,8712,8713],{},"logging.basicConfig(level=logging.INFO)\n",[81,8715,8716],{"class":83,"line":109},[81,8717,94],{"emptyLinePlaceholder":93},[81,8719,8720],{"class":83,"line":115},[81,8721,8722],{},"def clamp_progress(value):\n",[81,8724,8725],{"class":83,"line":121},[81,8726,8727],{},"    logging.info(\"检查进度：%s\", value)\n",[81,8729,8730],{"class":83,"line":127},[81,8731,8732],{},"    return max(0, min(100, value))\n",[81,8734,8735],{"class":83,"line":132},[81,8736,94],{"emptyLinePlaceholder":93},[81,8738,8739],{"class":83,"line":138},[81,8740,8741],{},"class ProgressTest(unittest.TestCase):\n",[81,8743,8744],{"class":83,"line":144},[81,8745,8746],{},"    def test_upper_limit(self):\n",[81,8748,8749],{"class":83,"line":150},[81,8750,8751],{},"        self.assertEqual(clamp_progress(120), 100)\n",[81,8753,8754],{"class":83,"line":7403},[81,8755,94],{"emptyLinePlaceholder":93},[81,8757,8758],{"class":83,"line":7409},[81,8759,6206],{},[81,8761,8762],{"class":83,"line":8532},[81,8763,8764],{},"    unittest.main()\n",[10,8766,156],{},[72,8768,8771],{"className":8769,"code":8770,"language":162,"meta":77},[160],"测试通过时显示 Ran 1 test 和 OK；日志格式可能包含级别与模块名\n",[33,8772,8770],{"__ignoreMap":77},[10,8774,167],{},[14,8776,170],{"id":170},[172,8778,8779,8785],{},[44,8780,8781,8784],{},[33,8782,8783],{},"clamp_progress"," 把输入限制在 0 到 100，并用日志记录本次检查值。",[44,8786,8787],{},"测试直接给出边界外输入 120，断言返回值必须是 100；实现变化后可以重复运行同一约定。",[342,8789,2710],{"id":2710},[10,8791,8792],{},"一个小测试可以拆成准备、执行和断言三个部分。",[10,8794,8795],{},[26,8796],{"alt":8797,"src":8798},"测试的准备、执行与断言","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F39-test-arrange-act-assert.svg",[10,8800,8801],{},"准备输入，调用被测函数，再比较实际值与期望值；失败信息才能明确指出哪项约定被破坏。",[14,8803,190],{"id":190},[41,8805,8806,8809],{},[44,8807,8808],{},"只看日志里“没有报错”就认为结果正确；测试需要明确比较期望值。",[44,8810,8811],{},"测试依赖真实网络、当前时间或共享文件却不隔离，造成结果不稳定。",[14,8813,207],{"id":207},[172,8815,8816,8819],{},[44,8817,8818],{},"为负数进度增加测试。",[44,8820,8821],{},"故意把上限改成 90，观察失败信息如何定位差异。",[10,8823,218],{},[14,8825,221],{"id":221},[10,8827,8828],{},"本篇目标是把失败缩小到可重复验证的函数。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,8830,228],{},{"title":77,"searchDepth":90,"depth":90,"links":8832},[8833,8834,8835,8836,8837,8840,8841,8842],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":8838},[8839],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F39-python-debug-logging-testing",{"title":8651,"description":8656},"python-debug-logging-testing","posts\u002F20260817\u002F39-python-debug-logging-testing","面向按顺序学习 Python 的初学者，本篇在第 22、27、33 篇知识上，帮助读者把失败缩小到可重复验证的函数。",[239,8850,8851],"调试","测试","1q4QSFr3NdSaLRU8qXqBZXNVD8NnlzWFL-avknhvr98",{"id":8854,"title":8855,"body":8856,"category":239,"cover":240,"description":8860,"extension":241,"meta":9160,"navigation":93,"path":9161,"pinned":244,"publishedAt":245,"seo":9162,"slug":9163,"stem":9164,"summary":9165,"tags":9166,"updatedAt":245,"visible":93,"__hash__":9169},"posts\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project.md","40｜综合项目：命令行学习记录管理器",{"type":7,"value":8857,"toc":9147},[8858,8861,8863,8866,8868,8874,8877,8879,8894,8896,8898,9045,9047,9053,9055,9057,9070,9072,9075,9081,9084,9086,9089,9095,9102,9104,9115,9117,9138,9140,9142,9145],[10,8859,8860],{},"这套课程按知识依赖排列。本篇的前置知识是：第 01～39 篇。学完后，你应该能够综合函数、类、JSON、异常和文件路径完成小项目。",[14,8862,16],{"id":16},[10,8864,8865],{},"本篇只处理“综合项目：命令行学习记录管理器”这一件事。示例基于 Python 3.14.6，在 macOS 环境核验；除明确标注的终端命令外，代码本身只使用 Python 标准能力。",[14,8867,22],{"id":22},[10,8869,8870],{},[26,8871],{"alt":8872,"src":8873},"命令行项目的一次完整请求","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-project-flow.svg",[10,8875,8876],{},"一次命令从用户输入开始，先解析和校验，再交给业务对象处理，随后持久化为 JSON，最后向用户显示结果。每一层只承担一种职责。",[14,8878,39],{"id":39},[41,8880,8881,8884,8887],{},[44,8882,8883],{},"输入层负责接收文本，业务层负责校验与状态，存储层负责 JSON 文件。",[44,8885,8886],{},"综合项目先完成最小可运行主流程，再增加读取、列表展示和完成状态。",[44,8888,8889,8890,8893],{},"实际扩展前先为 ",[33,8891,8892],{},"add()"," 和存储边界补充测试。",[14,8895,67],{"id":67},[10,8897,70],{},[72,8899,8901],{"className":74,"code":8900,"language":76,"meta":77,"style":77},"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,8902,8903,8907,8911,8915,8920,8925,8930,8935,8939,8944,8949,8954,8959,8964,8968,8973,8978,8984,8989,8995,9000,9005,9011,9017,9023,9028,9034,9039],{"__ignoreMap":77},[81,8904,8905],{"class":83,"line":84},[81,8906,7004],{},[81,8908,8909],{"class":83,"line":90},[81,8910,6613],{},[81,8912,8913],{"class":83,"line":97},[81,8914,94],{"emptyLinePlaceholder":93},[81,8916,8917],{"class":83,"line":103},[81,8918,8919],{},"class LearningRecords:\n",[81,8921,8922],{"class":83,"line":109},[81,8923,8924],{},"    def __init__(self, file_path):\n",[81,8926,8927],{"class":83,"line":115},[81,8928,8929],{},"        self.file_path = Path(file_path)\n",[81,8931,8932],{"class":83,"line":121},[81,8933,8934],{},"        self.items = []\n",[81,8936,8937],{"class":83,"line":127},[81,8938,94],{"emptyLinePlaceholder":93},[81,8940,8941],{"class":83,"line":132},[81,8942,8943],{},"    def add(self, title):\n",[81,8945,8946],{"class":83,"line":138},[81,8947,8948],{},"        title = title.strip()\n",[81,8950,8951],{"class":83,"line":144},[81,8952,8953],{},"        if not title:\n",[81,8955,8956],{"class":83,"line":150},[81,8957,8958],{},"            raise ValueError(\"课程名称不能为空\")\n",[81,8960,8961],{"class":83,"line":7403},[81,8962,8963],{},"        self.items.append({\"title\": title, \"done\": False})\n",[81,8965,8966],{"class":83,"line":7409},[81,8967,94],{"emptyLinePlaceholder":93},[81,8969,8970],{"class":83,"line":8532},[81,8971,8972],{},"    def save(self):\n",[81,8974,8975],{"class":83,"line":8537},[81,8976,8977],{},"        with self.file_path.open(\"w\", encoding=\"utf-8\") as file:\n",[81,8979,8981],{"class":83,"line":8980},17,[81,8982,8983],{},"            json.dump(self.items, file, ensure_ascii=False, indent=2)\n",[81,8985,8987],{"class":83,"line":8986},18,[81,8988,94],{"emptyLinePlaceholder":93},[81,8990,8992],{"class":83,"line":8991},19,[81,8993,8994],{},"records = LearningRecords(\"learning-records.json\")\n",[81,8996,8998],{"class":83,"line":8997},20,[81,8999,94],{"emptyLinePlaceholder":93},[81,9001,9003],{"class":83,"line":9002},21,[81,9004,7376],{},[81,9006,9008],{"class":83,"line":9007},22,[81,9009,9010],{},"    title = input(\"输入已学习课程：\")\n",[81,9012,9014],{"class":83,"line":9013},23,[81,9015,9016],{},"    records.add(title)\n",[81,9018,9020],{"class":83,"line":9019},24,[81,9021,9022],{},"    records.save()\n",[81,9024,9026],{"class":83,"line":9025},25,[81,9027,7386],{},[81,9029,9031],{"class":83,"line":9030},26,[81,9032,9033],{},"    print(\"无法保存：\", error)\n",[81,9035,9037],{"class":83,"line":9036},27,[81,9038,1160],{},[81,9040,9042],{"class":83,"line":9041},28,[81,9043,9044],{},"    print(\"已保存 1 条学习记录\")\n",[10,9046,156],{},[72,9048,9051],{"className":9049,"code":9050,"language":162,"meta":77},[160],"输入有效课程名后创建 learning-records.json，并显示已保存 1 条记录\n",[33,9052,9050],{"__ignoreMap":77},[10,9054,167],{},[14,9056,170],{"id":170},[172,9058,9059,9065],{},[44,9060,9061,9062,9064],{},"输入层取得课程名后，",[33,9063,8892],{}," 去除两端空白并验证非空，再把基础字典加入内存列表。",[44,9066,9067,9069],{},[33,9068,8124],{}," 只负责把当前列表写入 JSON；异常路径显示原因，成功路径确认保存结果。",[342,9071,2710],{"id":2710},[10,9073,9074],{},"综合项目先把职责拆开，避免所有代码堆进输入循环。",[10,9076,9077],{},[26,9078],{"alt":9079,"src":9080},"项目按职责传递数据","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-layer-responsibilities.svg",[10,9082,9083],{},"输入层只接收命令，业务层维护有效状态，存储层读写 JSON；层与层之间通过明确数据交接。",[342,9085,2710],{"id":4231},[10,9087,9088],{},"内存列表和 JSON 文件是两个不同时间点的状态。",[10,9090,9091],{},[26,9092],{"alt":9093,"src":9094},"内存状态与文件状态需要同步","https:\u002F\u002Fimg.zhengzaihun.com\u002Fzhengzaihun\u002Fblog\u002Fimage\u002Fposts\u002F20260817\u002Fpython-course\u002F40-memory-file-state.svg",[10,9096,9097,9098,9101],{},"业务操作先修改内存，保存后文件才同步；程序重新启动时还需要 ",[33,9099,9100],{},"load()"," 把文件状态恢复到内存。",[14,9103,190],{"id":190},[41,9105,9106,9109],{},[44,9107,9108],{},"把输入、校验、业务处理和文件写入全塞进一个长循环，后续难以测试。",[44,9110,9111,9112,9114],{},"每次启动都用空列表覆盖旧文件。本示例是最小版本，练习中的 ",[33,9113,9100],{}," 是下一项必要扩展。",[14,9116,207],{"id":207},[172,9118,9119,9125,9128],{},[44,9120,9121,9122,9124],{},"增加 ",[33,9123,9100],{},"，文件不存在时从空列表开始。",[44,9126,9127],{},"增加按序号标记完成的功能，并校验序号范围。",[44,9129,9130,9131,9134,9135,9137],{},"把输入循环放进 ",[33,9132,9133],{},"main()","，通过 ",[33,9136,6148],{}," 控制程序入口。",[10,9139,218],{},[14,9141,221],{"id":221},[10,9143,9144],{},"本篇目标是综合函数、类、JSON、异常和文件路径完成小项目。没有展开的高级机制会放到后续课程；先确保能够解释示例中每一行代码，再进入下一篇。",[226,9146,228],{},{"title":77,"searchDepth":90,"depth":90,"links":9148},[9149,9150,9151,9152,9153,9157,9158,9159],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":9154},[9155,9156],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},"\u002Fposts\u002F20260817\u002F40-python-learning-record-cli-project",{"title":8855,"description":8860},"python-learning-record-cli-project","posts\u002F20260817\u002F40-python-learning-record-cli-project","面向按顺序学习 Python 的初学者，本篇在第 01～39 篇知识上，帮助读者综合函数、类、JSON、异常和文件路径完成小项目。",[239,9167,9168],"项目实战","命令行","lraO40z6BM-5T--hiXBLKXtq1ZhERUKJqy8X1LOlpP4",[9171,9274,9393,9524,9667,9792,9929,10066,10207,10376,10513,10646,10769,10898,11025,11188,11364,11505,11634,11783,11926,12047,12170,12319,12472,12637,12764,12945,13088,13245,13396,13543,13698,13916,14071,14246,14397,14564,14751,14914,15156,15396],{"id":1407,"title":1408,"body":9172,"category":239,"cover":240,"description":1413,"extension":241,"meta":9271,"navigation":93,"path":1532,"pinned":244,"publishedAt":245,"seo":9272,"slug":1534,"stem":1535,"summary":1536,"tags":9273,"updatedAt":245,"visible":93,"__hash__":1539},{"type":7,"value":9173,"toc":9261},[9174,9176,9178,9180,9182,9186,9190,9192,9202,9204,9206,9214,9216,9221,9223,9225,9235,9237,9245,9247,9253,9255,9257,9259],[10,9175,1413],{},[14,9177,16],{"id":16},[10,9179,1418],{},[14,9181,22],{"id":22},[10,9183,9184],{},[26,9185],{"alt":1425,"src":1426},[10,9187,9188,1431],{},[33,9189,1185],{},[14,9191,39],{"id":39},[41,9193,9194,9198,9200],{},[44,9195,1438,9196,1441],{},[33,9197,1185],{},[44,9199,1444],{},[44,9201,1447],{},[14,9203,67],{"id":67},[10,9205,70],{},[72,9207,9208],{"className":74,"code":1454,"language":76,"meta":77,"style":77},[33,9209,9210],{"__ignoreMap":77},[81,9211,9212],{"class":83,"line":84},[81,9213,1454],{},[10,9215,156],{},[72,9217,9219],{"className":9218,"code":1466,"language":162,"meta":77},[160],[33,9220,1466],{"__ignoreMap":77},[10,9222,167],{},[14,9224,170],{"id":170},[172,9226,9227,9231],{},[44,9228,1477,9229,1481],{},[33,9230,1480],{},[44,9232,1484,9233,1488],{},[33,9234,1487],{},[14,9236,190],{"id":190},[41,9238,9239,9241],{},[44,9240,1495],{},[44,9242,1498,9243,1501],{},[33,9244,1185],{},[14,9246,207],{"id":207},[172,9248,9249,9251],{},[44,9250,1508],{},[44,9252,1511],{},[10,9254,218],{},[14,9256,221],{"id":221},[10,9258,1518],{},[226,9260,228],{},{"title":77,"searchDepth":90,"depth":90,"links":9262},[9263,9264,9265,9266,9267,9268,9269,9270],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":1408,"description":1413},[239,1403,1538],{"id":1541,"title":1542,"body":9275,"category":239,"cover":240,"description":1547,"extension":241,"meta":9390,"navigation":93,"path":1684,"pinned":244,"publishedAt":245,"seo":9391,"slug":1686,"stem":1687,"summary":1688,"tags":9392,"updatedAt":245,"visible":93,"__hash__":1691},{"type":7,"value":9276,"toc":9380},[9277,9279,9281,9283,9285,9289,9293,9295,9305,9307,9309,9329,9331,9336,9338,9340,9350,9352,9362,9364,9372,9374,9376,9378],[10,9278,1547],{},[14,9280,16],{"id":16},[10,9282,1552],{},[14,9284,22],{"id":22},[10,9286,9287],{},[26,9288],{"alt":1559,"src":1560},[10,9290,1563,9291,1566],{},[33,9292,705],{},[14,9294,39],{"id":39},[41,9296,9297,9299,9301],{},[44,9298,1573],{},[44,9300,1576],{},[44,9302,1579,9303,1583],{},[33,9304,1582],{},[14,9306,67],{"id":67},[10,9308,1588],{},[72,9310,9311],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,9312,9313,9319],{"__ignoreMap":77},[81,9314,9315,9317],{"class":83,"line":84},[81,9316,705],{"class":614},[81,9318,618],{"class":617},[81,9320,9321,9323,9325,9327],{"class":83,"line":90},[81,9322,705],{"class":614},[81,9324,647],{"class":617},[81,9326,651],{"class":650},[81,9328,618],{"class":617},[10,9330,156],{},[72,9332,9334],{"className":9333,"code":1614,"language":162,"meta":77},[160],[33,9335,1614],{"__ignoreMap":77},[10,9337,167],{},[14,9339,170],{"id":170},[172,9341,9342,9346],{},[44,9343,9344,1628],{},[33,9345,1627],{},[44,9347,9348,1633],{},[33,9349,713],{},[14,9351,190],{"id":190},[41,9353,9354,9358],{},[44,9355,1640,9356,1643],{},[33,9357,705],{},[44,9359,1646,9360,1649],{},[33,9361,705],{},[14,9363,207],{"id":207},[172,9365,9366,9370],{},[44,9367,952,9368,1659],{},[33,9369,1658],{},[44,9371,1662],{},[10,9373,218],{},[14,9375,221],{"id":221},[10,9377,1669],{},[226,9379,1672],{},{"title":77,"searchDepth":90,"depth":90,"links":9381},[9382,9383,9384,9385,9386,9387,9388,9389],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":1542,"description":1547},[239,1690,1066],{"id":1693,"title":1694,"body":9394,"category":239,"cover":240,"description":1860,"extension":241,"meta":9521,"navigation":93,"path":1862,"pinned":244,"publishedAt":245,"seo":9522,"slug":1864,"stem":1865,"summary":1866,"tags":9523,"updatedAt":245,"visible":93,"__hash__":1870},{"type":7,"value":9395,"toc":9511},[9396,9400,9402,9404,9406,9410,9412,9414,9430,9432,9434,9454,9456,9461,9463,9465,9477,9479,9489,9491,9501,9503,9505,9509],[10,9397,1699,9398,1702],{},[33,9399,1185],{},[14,9401,16],{"id":16},[10,9403,1707],{},[14,9405,22],{"id":22},[10,9407,9408],{},[26,9409],{"alt":1714,"src":1715},[10,9411,1718],{},[14,9413,39],{"id":39},[41,9415,9416,9422,9426],{},[44,9417,1725,9418,1728,9420,376],{},[33,9419,705],{},[33,9421,1731],{},[44,9423,1734,9424,1738],{},[33,9425,1737],{},[44,9427,1741,9428,1744],{},[33,9429,1185],{},[14,9431,67],{"id":67},[10,9433,70],{},[72,9435,9436],{"className":1751,"code":1752,"language":1753,"meta":77,"style":77},[33,9437,9438,9442,9446,9450],{"__ignoreMap":77},[81,9439,9440],{"class":83,"line":84},[81,9441,1760],{},[81,9443,9444],{"class":83,"line":90},[81,9445,1765],{},[81,9447,9448],{"class":83,"line":97},[81,9449,1770],{},[81,9451,9452],{"class":83,"line":103},[81,9453,1775],{},[10,9455,156],{},[72,9457,9459],{"className":9458,"code":1781,"language":162,"meta":77},[160],[33,9460,1781],{"__ignoreMap":77},[10,9462,167],{},[14,9464,170],{"id":170},[172,9466,9467,9473],{},[44,9468,1792,9469,1796,9471,376],{},[33,9470,1795],{},[33,9472,1799],{},[44,9474,1802,9475,1805],{},[33,9476,1487],{},[14,9478,190],{"id":190},[41,9480,9481,9487],{},[44,9482,1812,9483,1815,9485,1818],{},[33,9484,1731],{},[33,9486,1185],{},[44,9488,1821],{},[14,9490,207],{"id":207},[172,9492,9493,9497],{},[44,9494,1828,9495,376],{},[33,9496,1831],{},[44,9498,1834,9499,1837],{},[33,9500,1487],{},[10,9502,218],{},[14,9504,221],{"id":221},[10,9506,1844,9507,1847],{},[33,9508,1185],{},[226,9510,228],{},{"title":77,"searchDepth":90,"depth":90,"links":9512},[9513,9514,9515,9516,9517,9518,9519,9520],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":1694,"description":1860},[239,1868,1869],{"id":1872,"title":1873,"body":9525,"category":239,"cover":240,"description":1878,"extension":241,"meta":9664,"navigation":93,"path":2050,"pinned":244,"publishedAt":245,"seo":9665,"slug":2052,"stem":2053,"summary":2054,"tags":9666,"updatedAt":245,"visible":93,"__hash__":2058},{"type":7,"value":9526,"toc":9654},[9527,9529,9531,9533,9535,9539,9543,9545,9557,9559,9561,9597,9599,9604,9606,9608,9624,9626,9636,9638,9646,9648,9650,9652],[10,9528,1878],{},[14,9530,16],{"id":16},[10,9532,1883],{},[14,9534,22],{"id":22},[10,9536,9537],{},[26,9538],{"alt":1890,"src":1891},[10,9540,9541,1897],{},[33,9542,1896],{},[14,9544,39],{"id":39},[41,9546,9547,9549,9555],{},[44,9548,1904],{},[44,9550,9551,1910,9553,1914],{},[33,9552,1909],{},[33,9554,1913],{},[44,9556,1917],{},[14,9558,67],{"id":67},[10,9560,1588],{},[72,9562,9563],{"className":605,"code":1924,"language":607,"meta":77,"style":77},[33,9564,9565,9571,9577,9581,9591],{"__ignoreMap":77},[81,9566,9567,9569],{"class":83,"line":84},[81,9568,1931],{"class":614},[81,9570,1934],{"class":650},[81,9572,9573,9575],{"class":83,"line":90},[81,9574,1939],{"class":617},[81,9576,1934],{"class":650},[81,9578,9579],{"class":83,"line":97},[81,9580,1946],{"class":617},[81,9582,9583,9585,9587,9589],{"class":83,"line":103},[81,9584,1951],{"class":617},[81,9586,1954],{"class":650},[81,9588,1958],{"class":1957},[81,9590,1229],{"class":650},[81,9592,9593,9595],{"class":83,"line":109},[81,9594,705],{"class":614},[81,9596,1229],{"class":650},[10,9598,156],{},[72,9600,9602],{"className":9601,"code":1972,"language":162,"meta":77},[160],[33,9603,1972],{"__ignoreMap":77},[10,9605,167],{},[14,9607,170],{"id":170},[172,9609,9610,9618],{},[44,9611,9612,1985,9614,1988,9616,1991],{},[33,9613,1931],{},[33,9615,1939],{},[33,9617,1909],{},[44,9619,9620,1996,9622,2000],{},[33,9621,1896],{},[33,9623,1999],{},[14,9625,190],{"id":190},[41,9627,9628,9634],{},[44,9629,2007,9630,1171,9632,376],{},[33,9631,1909],{},[33,9633,1913],{},[44,9635,2014],{},[14,9637,207],{"id":207},[172,9639,9640,9644],{},[44,9641,2021,9642,2025],{},[33,9643,2024],{},[44,9645,2028],{},[10,9647,218],{},[14,9649,221],{"id":221},[10,9651,2035],{},[226,9653,2038],{},{"title":77,"searchDepth":90,"depth":90,"links":9655},[9656,9657,9658,9659,9660,9661,9662,9663],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":1873,"description":1878},[239,2056,2057],{"id":2060,"title":2061,"body":9668,"category":239,"cover":240,"description":2066,"extension":241,"meta":9789,"navigation":93,"path":2215,"pinned":244,"publishedAt":245,"seo":9790,"slug":2217,"stem":2218,"summary":2219,"tags":9791,"updatedAt":245,"visible":93,"__hash__":2223},{"type":7,"value":9669,"toc":9779},[9670,9672,9674,9676,9678,9682,9690,9692,9706,9708,9710,9726,9728,9733,9735,9737,9751,9753,9759,9761,9771,9773,9775,9777],[10,9671,2066],{},[14,9673,16],{"id":16},[10,9675,2071],{},[14,9677,22],{"id":22},[10,9679,9680],{},[26,9681],{"alt":2078,"src":2079},[10,9683,2082,9684,376,9686,2088,9688,376],{},[33,9685,1487],{},[33,9687,2087],{},[33,9689,1795],{},[14,9691,39],{"id":39},[41,9693,9694,9698,9704],{},[44,9695,9696,2100],{},[33,9697,2099],{},[44,9699,9700,2106,9702,376],{},[33,9701,2105],{},[33,9703,2109],{},[44,9705,2112],{},[14,9707,67],{"id":67},[10,9709,70],{},[72,9711,9712],{"className":74,"code":2119,"language":76,"meta":77,"style":77},[33,9713,9714,9718,9722],{"__ignoreMap":77},[81,9715,9716],{"class":83,"line":84},[81,9717,2126],{},[81,9719,9720],{"class":83,"line":90},[81,9721,2131],{},[81,9723,9724],{"class":83,"line":97},[81,9725,2136],{},[10,9727,156],{},[72,9729,9731],{"className":9730,"code":2142,"language":162,"meta":77},[160],[33,9732,2142],{"__ignoreMap":77},[10,9734,167],{},[14,9736,170],{"id":170},[172,9738,9739,9745],{},[44,9740,9741,2156,9743,376],{},[33,9742,2155],{},[33,9744,2109],{},[44,9746,9747,2163,9749,2167],{},[33,9748,1487],{},[33,9750,2166],{},[14,9752,190],{"id":190},[41,9754,9755,9757],{},[44,9756,2174],{},[44,9758,2177],{},[14,9760,207],{"id":207},[172,9762,9763,9765],{},[44,9764,2184],{},[44,9766,2187,9767,2190,9769,2194],{},[33,9768,2087],{},[33,9770,2193],{},[10,9772,218],{},[14,9774,221],{"id":221},[10,9776,2201],{},[226,9778,228],{},{"title":77,"searchDepth":90,"depth":90,"links":9780},[9781,9782,9783,9784,9785,9786,9787,9788],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":2061,"description":2066},[239,2221,2222],{"id":2225,"title":2226,"body":9793,"category":239,"cover":240,"description":2231,"extension":241,"meta":9926,"navigation":93,"path":2398,"pinned":244,"publishedAt":245,"seo":9927,"slug":2400,"stem":2401,"summary":2402,"tags":9928,"updatedAt":245,"visible":93,"__hash__":2406},{"type":7,"value":9794,"toc":9916},[9795,9797,9799,9801,9803,9807,9809,9811,9827,9829,9831,9855,9857,9862,9864,9866,9882,9884,9896,9898,9908,9910,9912,9914],[10,9796,2231],{},[14,9798,16],{"id":16},[10,9800,2236],{},[14,9802,22],{"id":22},[10,9804,9805],{},[26,9806],{"alt":2243,"src":2244},[10,9808,2247],{},[14,9810,39],{"id":39},[41,9812,9813,9815,9821],{},[44,9814,2254],{},[44,9816,2257,9817,2190,9819,2264],{},[33,9818,2260],{},[33,9820,2263],{},[44,9822,2267,9823,2271,9825,2275],{},[33,9824,2270],{},[33,9826,2274],{},[14,9828,67],{"id":67},[10,9830,70],{},[72,9832,9833],{"className":74,"code":2282,"language":76,"meta":77,"style":77},[33,9834,9835,9839,9843,9847,9851],{"__ignoreMap":77},[81,9836,9837],{"class":83,"line":84},[81,9838,2289],{},[81,9840,9841],{"class":83,"line":90},[81,9842,2294],{},[81,9844,9845],{"class":83,"line":97},[81,9846,94],{"emptyLinePlaceholder":93},[81,9848,9849],{"class":83,"line":103},[81,9850,2303],{},[81,9852,9853],{"class":83,"line":109},[81,9854,2294],{},[10,9856,156],{},[72,9858,9860],{"className":9859,"code":2313,"language":162,"meta":77},[160],[33,9861,2313],{"__ignoreMap":77},[10,9863,167],{},[14,9865,170],{"id":170},[172,9867,9868,9874],{},[44,9869,952,9870,2327,9872,2330],{},[33,9871,2326],{},[33,9873,2260],{},[44,9875,952,9876,2336,9878,2340,9880,376],{},[33,9877,2335],{},[33,9879,2339],{},[33,9881,2343],{},[14,9883,190],{"id":190},[41,9885,9886,9888],{},[44,9887,2350],{},[44,9889,46,9890,2271,9892,2271,9894,2360],{},[33,9891,2270],{},[33,9893,2274],{},[33,9895,2359],{},[14,9897,207],{"id":207},[172,9899,9900,9906],{},[44,9901,2367,9902,1171,9904,2374],{},[33,9903,2370],{},[33,9905,2373],{},[44,9907,2377],{},[10,9909,218],{},[14,9911,221],{"id":221},[10,9913,2384],{},[226,9915,228],{},{"title":77,"searchDepth":90,"depth":90,"links":9917},[9918,9919,9920,9921,9922,9923,9924,9925],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":2226,"description":2231},[239,2404,2405],{"id":2408,"title":2409,"body":9930,"category":239,"cover":240,"description":2414,"extension":241,"meta":10063,"navigation":93,"path":2579,"pinned":244,"publishedAt":245,"seo":10064,"slug":2581,"stem":2582,"summary":2583,"tags":10065,"updatedAt":245,"visible":93,"__hash__":2587},{"type":7,"value":9931,"toc":10053},[9932,9934,9936,9938,9940,9944,9946,9948,9966,9968,9970,10006,10008,10013,10015,10017,10027,10029,10037,10039,10045,10047,10049,10051],[10,9933,2414],{},[14,9935,16],{"id":16},[10,9937,2419],{},[14,9939,22],{"id":22},[10,9941,9942],{},[26,9943],{"alt":2426,"src":2427},[10,9945,2430],{},[14,9947,39],{"id":39},[41,9949,9950,9956,9964],{},[44,9951,9952,2440,9954,2444],{},[33,9953,2439],{},[33,9955,2443],{},[44,9957,9958,2450,9960,2454,9962,2458],{},[33,9959,2449],{},[33,9961,2453],{},[33,9963,2457],{},[44,9965,2461],{},[14,9967,67],{"id":67},[10,9969,70],{},[72,9971,9972],{"className":74,"code":2468,"language":76,"meta":77,"style":77},[33,9973,9974,9978,9982,9986,9990,9994,9998,10002],{"__ignoreMap":77},[81,9975,9976],{"class":83,"line":84},[81,9977,2475],{},[81,9979,9980],{"class":83,"line":90},[81,9981,2480],{},[81,9983,9984],{"class":83,"line":97},[81,9985,2485],{},[81,9987,9988],{"class":83,"line":103},[81,9989,94],{"emptyLinePlaceholder":93},[81,9991,9992],{"class":83,"line":109},[81,9993,2494],{},[81,9995,9996],{"class":83,"line":115},[81,9997,2499],{},[81,9999,10000],{"class":83,"line":121},[81,10001,2504],{},[81,10003,10004],{"class":83,"line":127},[81,10005,2509],{},[10,10007,156],{},[72,10009,10011],{"className":10010,"code":2515,"language":162,"meta":77},[160],[33,10012,2515],{"__ignoreMap":77},[10,10014,167],{},[14,10016,170],{"id":170},[172,10018,10019,10023],{},[44,10020,10021,2529],{},[33,10022,2528],{},[44,10024,10025,2535],{},[33,10026,2534],{},[14,10028,190],{"id":190},[41,10030,10031,10035],{},[44,10032,2542,10033,376],{},[33,10034,2545],{},[44,10036,2548],{},[14,10038,207],{"id":207},[172,10040,10041,10043],{},[44,10042,2555],{},[44,10044,2558],{},[10,10046,218],{},[14,10048,221],{"id":221},[10,10050,2565],{},[226,10052,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10054},[10055,10056,10057,10058,10059,10060,10061,10062],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":2409,"description":2414},[239,2585,2586],{"id":2589,"title":2590,"body":10067,"category":239,"cover":240,"description":2595,"extension":241,"meta":10204,"navigation":93,"path":2772,"pinned":244,"publishedAt":245,"seo":10205,"slug":2774,"stem":2775,"summary":2776,"tags":10206,"updatedAt":245,"visible":93,"__hash__":2780},{"type":7,"value":10068,"toc":10192},[10069,10071,10073,10075,10077,10081,10087,10089,10097,10099,10101,10125,10127,10132,10134,10136,10154,10156,10158,10162,10164,10166,10172,10174,10184,10186,10188,10190],[10,10070,2595],{},[14,10072,16],{"id":16},[10,10074,2600],{},[14,10076,22],{"id":22},[10,10078,10079],{},[26,10080],{"alt":2607,"src":2608},[10,10082,2611,10083,2615,10085,376],{},[33,10084,2614],{},[33,10086,2618],{},[14,10088,39],{"id":39},[41,10090,10091,10093,10095],{},[44,10092,2625],{},[44,10094,2628],{},[44,10096,2631],{},[14,10098,67],{"id":67},[10,10100,70],{},[72,10102,10103],{"className":74,"code":2638,"language":76,"meta":77,"style":77},[33,10104,10105,10109,10113,10117,10121],{"__ignoreMap":77},[81,10106,10107],{"class":83,"line":84},[81,10108,2645],{},[81,10110,10111],{"class":83,"line":90},[81,10112,2650],{},[81,10114,10115],{"class":83,"line":97},[81,10116,2655],{},[81,10118,10119],{"class":83,"line":103},[81,10120,2660],{},[81,10122,10123],{"class":83,"line":109},[81,10124,2665],{},[10,10126,156],{},[72,10128,10130],{"className":10129,"code":2671,"language":162,"meta":77},[160],[33,10131,2671],{"__ignoreMap":77},[10,10133,167],{},[14,10135,170],{"id":170},[172,10137,10138,10146],{},[44,10139,2682,10140,2685,10142,2689,10144,2693],{},[33,10141,239],{},[33,10143,2688],{},[33,10145,2692],{},[44,10147,10148,2699,10150,2703,10152,2707],{},[33,10149,2698],{},[33,10151,2702],{},[33,10153,2706],{},[342,10155,2710],{"id":2710},[10,10157,2713],{},[10,10159,10160],{},[26,10161],{"alt":2718,"src":2719},[10,10163,2722],{},[14,10165,190],{"id":190},[41,10167,10168,10170],{},[44,10169,2729],{},[44,10171,2732],{},[14,10173,207],{"id":207},[172,10175,10176,10182],{},[44,10177,2739,10178,2743,10180,376],{},[33,10179,2742],{},[33,10181,2746],{},[44,10183,2749],{},[10,10185,218],{},[14,10187,221],{"id":221},[10,10189,2756],{},[226,10191,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10193},[10194,10195,10196,10197,10198,10201,10202,10203],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":10199},[10200],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":2590,"description":2595},[239,2778,2779],{"id":2782,"title":2783,"body":10208,"category":239,"cover":240,"description":2788,"extension":241,"meta":10373,"navigation":93,"path":3003,"pinned":244,"publishedAt":245,"seo":10374,"slug":3005,"stem":3006,"summary":3007,"tags":10375,"updatedAt":245,"visible":93,"__hash__":3011},{"type":7,"value":10209,"toc":10361},[10210,10212,10214,10216,10218,10222,10228,10230,10250,10252,10254,10290,10292,10297,10299,10301,10315,10317,10319,10323,10329,10331,10341,10343,10353,10355,10357,10359],[10,10211,2788],{},[14,10213,16],{"id":16},[10,10215,2793],{},[14,10217,22],{"id":22},[10,10219,10220],{},[26,10221],{"alt":2800,"src":2801},[10,10223,2804,10224,1023,10226,2811],{},[33,10225,2807],{},[33,10227,2810],{},[14,10229,39],{"id":39},[41,10231,10232,10240,10248],{},[44,10233,10234,2821,10236,2825,10238,2829],{},[33,10235,2820],{},[33,10237,2824],{},[33,10239,2828],{},[44,10241,10242,2835,10244,2839,10246,2843],{},[33,10243,2834],{},[33,10245,2838],{},[33,10247,2842],{},[44,10249,2846],{},[14,10251,67],{"id":67},[10,10253,70],{},[72,10255,10256],{"className":74,"code":2853,"language":76,"meta":77,"style":77},[33,10257,10258,10262,10266,10270,10274,10278,10282,10286],{"__ignoreMap":77},[81,10259,10260],{"class":83,"line":84},[81,10261,2860],{},[81,10263,10264],{"class":83,"line":90},[81,10265,2865],{},[81,10267,10268],{"class":83,"line":97},[81,10269,94],{"emptyLinePlaceholder":93},[81,10271,10272],{"class":83,"line":103},[81,10273,2874],{},[81,10275,10276],{"class":83,"line":109},[81,10277,2879],{},[81,10279,10280],{"class":83,"line":115},[81,10281,2884],{},[81,10283,10284],{"class":83,"line":121},[81,10285,2889],{},[81,10287,10288],{"class":83,"line":127},[81,10289,2894],{},[10,10291,156],{},[72,10293,10295],{"className":10294,"code":2900,"language":162,"meta":77},[160],[33,10296,2900],{"__ignoreMap":77},[10,10298,167],{},[14,10300,170],{"id":170},[172,10302,10303,10309],{},[44,10304,10305,2914,10307,2918],{},[33,10306,2913],{},[33,10308,2917],{},[44,10310,10311,2924,10313,2927],{},[33,10312,2923],{},[33,10314,2842],{},[342,10316,2710],{"id":2710},[10,10318,2932],{},[10,10320,10321],{},[26,10322],{"alt":2937,"src":2938},[10,10324,10325,2943,10327,2946],{},[33,10326,2834],{},[33,10328,2838],{},[14,10330,190],{"id":190},[41,10332,10333,10339],{},[44,10334,2953,10335,2956,10337,2959],{},[33,10336,2828],{},[33,10338,2820],{},[44,10340,2962],{},[14,10342,207],{"id":207},[172,10344,10345,10349],{},[44,10346,2969,10347,2973],{},[33,10348,2972],{},[44,10350,2976,10351,2980],{},[33,10352,2979],{},[10,10354,218],{},[14,10356,221],{"id":221},[10,10358,2987],{},[226,10360,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10362},[10363,10364,10365,10366,10367,10370,10371,10372],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":10368},[10369],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":2783,"description":2788},[239,3009,3010],{"id":3013,"title":3014,"body":10377,"category":239,"cover":240,"description":3019,"extension":241,"meta":10510,"navigation":93,"path":3188,"pinned":244,"publishedAt":245,"seo":10511,"slug":3190,"stem":3191,"summary":3192,"tags":10512,"updatedAt":245,"visible":93,"__hash__":3195},{"type":7,"value":10378,"toc":10500},[10379,10381,10383,10385,10387,10391,10401,10403,10413,10415,10417,10445,10447,10452,10454,10456,10470,10472,10480,10482,10492,10494,10496,10498],[10,10380,3019],{},[14,10382,16],{"id":16},[10,10384,3024],{},[14,10386,22],{"id":22},[10,10388,10389],{},[26,10390],{"alt":3031,"src":3032},[10,10392,10393,3038,10395,3042,10397,3046,10399,3050],{},[33,10394,3037],{},[33,10396,3041],{},[33,10398,3045],{},[33,10400,3049],{},[14,10402,39],{"id":39},[41,10404,10405,10407,10411],{},[44,10406,3057],{},[44,10408,10409,3062],{},[33,10410,3049],{},[44,10412,3065],{},[14,10414,67],{"id":67},[10,10416,70],{},[72,10418,10419],{"className":74,"code":3072,"language":76,"meta":77,"style":77},[33,10420,10421,10425,10429,10433,10437,10441],{"__ignoreMap":77},[81,10422,10423],{"class":83,"line":84},[81,10424,3079],{},[81,10426,10427],{"class":83,"line":90},[81,10428,3084],{},[81,10430,10431],{"class":83,"line":97},[81,10432,3089],{},[81,10434,10435],{"class":83,"line":103},[81,10436,94],{"emptyLinePlaceholder":93},[81,10438,10439],{"class":83,"line":109},[81,10440,3098],{},[81,10442,10443],{"class":83,"line":115},[81,10444,3103],{},[10,10446,156],{},[72,10448,10450],{"className":10449,"code":3109,"language":162,"meta":77},[160],[33,10451,3109],{"__ignoreMap":77},[10,10453,167],{},[14,10455,170],{"id":170},[172,10457,10458,10464],{},[44,10459,3120,10460,3123,10462,3127],{},[33,10461,3037],{},[33,10463,3126],{},[44,10465,10466,3133,10468,3137],{},[33,10467,3132],{},[33,10469,3136],{},[14,10471,190],{"id":190},[41,10473,10474,10478],{},[44,10475,3144,10476,3148],{},[33,10477,3147],{},[44,10479,3151],{},[14,10481,207],{"id":207},[172,10483,10484,10486],{},[44,10485,3158],{},[44,10487,1734,10488,3164,10490,3167],{},[33,10489,3163],{},[33,10491,3049],{},[10,10493,218],{},[14,10495,221],{"id":221},[10,10497,3174],{},[226,10499,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10501},[10502,10503,10504,10505,10506,10507,10508,10509],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3014,"description":3019},[239,2359,3194],{"id":3197,"title":3198,"body":10514,"category":239,"cover":240,"description":3203,"extension":241,"meta":10643,"navigation":93,"path":3364,"pinned":244,"publishedAt":245,"seo":10644,"slug":3366,"stem":3367,"summary":3368,"tags":10645,"updatedAt":245,"visible":93,"__hash__":3372},{"type":7,"value":10515,"toc":10633},[10516,10518,10520,10522,10524,10528,10532,10534,10544,10546,10548,10580,10582,10587,10589,10591,10603,10605,10615,10617,10625,10627,10629,10631],[10,10517,3203],{},[14,10519,16],{"id":16},[10,10521,3208],{},[14,10523,22],{"id":22},[10,10525,10526],{},[26,10527],{"alt":3215,"src":3216},[10,10529,3219,10530,3223],{},[33,10531,3222],{},[14,10533,39],{"id":39},[41,10535,10536,10538,10540],{},[44,10537,3230],{},[44,10539,3233],{},[44,10541,3236,10542,376],{},[33,10543,3239],{},[14,10545,67],{"id":67},[10,10547,70],{},[72,10549,10550],{"className":74,"code":3246,"language":76,"meta":77,"style":77},[33,10551,10552,10556,10560,10564,10568,10572,10576],{"__ignoreMap":77},[81,10553,10554],{"class":83,"line":84},[81,10555,3253],{},[81,10557,10558],{"class":83,"line":90},[81,10559,3258],{},[81,10561,10562],{"class":83,"line":97},[81,10563,94],{"emptyLinePlaceholder":93},[81,10565,10566],{"class":83,"line":103},[81,10567,3267],{},[81,10569,10570],{"class":83,"line":109},[81,10571,3272],{},[81,10573,10574],{"class":83,"line":115},[81,10575,3277],{},[81,10577,10578],{"class":83,"line":121},[81,10579,3282],{},[10,10581,156],{},[72,10583,10585],{"className":10584,"code":3288,"language":162,"meta":77},[160],[33,10586,3288],{"__ignoreMap":77},[10,10588,167],{},[14,10590,170],{"id":170},[172,10592,10593,10595],{},[44,10594,3299],{},[44,10596,10597,3305,10599,3309,10601,3313],{},[33,10598,3304],{},[33,10600,3308],{},[33,10602,3312],{},[14,10604,190],{"id":190},[41,10606,10607,10613],{},[44,10608,3320,10609,3324,10611,376],{},[33,10610,3323],{},[33,10612,3327],{},[44,10614,3330],{},[14,10616,207],{"id":207},[172,10618,10619,10621],{},[44,10620,3337],{},[44,10622,3340,10623,3343],{},[33,10624,3312],{},[10,10626,218],{},[14,10628,221],{"id":221},[10,10630,3350],{},[226,10632,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10634},[10635,10636,10637,10638,10639,10640,10641,10642],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3198,"description":3203},[239,3370,3371],{"id":3374,"title":3375,"body":10647,"category":239,"cover":240,"description":3380,"extension":241,"meta":10766,"navigation":93,"path":3522,"pinned":244,"publishedAt":245,"seo":10767,"slug":3524,"stem":3525,"summary":3526,"tags":10768,"updatedAt":245,"visible":93,"__hash__":3529},{"type":7,"value":10648,"toc":10756},[10649,10651,10653,10655,10657,10661,10663,10665,10673,10675,10677,10705,10707,10712,10714,10716,10726,10728,10736,10738,10748,10750,10752,10754],[10,10650,3380],{},[14,10652,16],{"id":16},[10,10654,3385],{},[14,10656,22],{"id":22},[10,10658,10659],{},[26,10660],{"alt":3392,"src":3393},[10,10662,3396],{},[14,10664,39],{"id":39},[41,10666,10667,10669,10671],{},[44,10668,3403],{},[44,10670,3406],{},[44,10672,3409],{},[14,10674,67],{"id":67},[10,10676,70],{},[72,10678,10679],{"className":74,"code":3416,"language":76,"meta":77,"style":77},[33,10680,10681,10685,10689,10693,10697,10701],{"__ignoreMap":77},[81,10682,10683],{"class":83,"line":84},[81,10684,3423],{},[81,10686,10687],{"class":83,"line":90},[81,10688,3428],{},[81,10690,10691],{"class":83,"line":97},[81,10692,3433],{},[81,10694,10695],{"class":83,"line":103},[81,10696,94],{"emptyLinePlaceholder":93},[81,10698,10699],{"class":83,"line":109},[81,10700,3442],{},[81,10702,10703],{"class":83,"line":115},[81,10704,3447],{},[10,10706,156],{},[72,10708,10710],{"className":10709,"code":3453,"language":162,"meta":77},[160],[33,10711,3453],{"__ignoreMap":77},[10,10713,167],{},[14,10715,170],{"id":170},[172,10717,10718,10722],{},[44,10719,10720,3467],{},[33,10721,3466],{},[44,10723,10724,3473],{},[33,10725,3472],{},[14,10727,190],{"id":190},[41,10729,10730,10734],{},[44,10731,3480,10732,3484],{},[33,10733,3483],{},[44,10735,3487],{},[14,10737,207],{"id":207},[172,10739,10740,10742],{},[44,10741,3494],{},[44,10743,2187,10744,2190,10746,3501],{},[33,10745,3483],{},[33,10747,3472],{},[10,10749,218],{},[14,10751,221],{"id":221},[10,10753,3508],{},[226,10755,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10757},[10758,10759,10760,10761,10762,10763,10764,10765],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3375,"description":3380},[239,3528,3371],{"id":3531,"title":3532,"body":10770,"category":239,"cover":240,"description":3537,"extension":241,"meta":10895,"navigation":93,"path":3693,"pinned":244,"publishedAt":245,"seo":10896,"slug":3695,"stem":3696,"summary":3697,"tags":10897,"updatedAt":245,"visible":93,"__hash__":3700},{"type":7,"value":10771,"toc":10885},[10772,10774,10776,10778,10780,10784,10790,10792,10802,10804,10806,10834,10836,10841,10843,10845,10855,10857,10869,10871,10877,10879,10881,10883],[10,10773,3537],{},[14,10775,16],{"id":16},[10,10777,3542],{},[14,10779,22],{"id":22},[10,10781,10782],{},[26,10783],{"alt":3549,"src":3550},[10,10785,3553,10786,3557,10788,3560],{},[33,10787,3556],{},[33,10789,2260],{},[14,10791,39],{"id":39},[41,10793,10794,10796,10800],{},[44,10795,3567],{},[44,10797,46,10798,3573],{},[33,10799,3572],{},[44,10801,3576],{},[14,10803,67],{"id":67},[10,10805,70],{},[72,10807,10808],{"className":74,"code":3583,"language":76,"meta":77,"style":77},[33,10809,10810,10814,10818,10822,10826,10830],{"__ignoreMap":77},[81,10811,10812],{"class":83,"line":84},[81,10813,3590],{},[81,10815,10816],{"class":83,"line":90},[81,10817,3595],{},[81,10819,10820],{"class":83,"line":97},[81,10821,94],{"emptyLinePlaceholder":93},[81,10823,10824],{"class":83,"line":103},[81,10825,3604],{},[81,10827,10828],{"class":83,"line":109},[81,10829,3609],{},[81,10831,10832],{"class":83,"line":115},[81,10833,3614],{},[10,10835,156],{},[72,10837,10839],{"className":10838,"code":3620,"language":162,"meta":77},[160],[33,10840,3620],{"__ignoreMap":77},[10,10842,167],{},[14,10844,170],{"id":170},[172,10846,10847,10849],{},[44,10848,3631],{},[44,10850,3634,10851,3637,10853,3641],{},[33,10852,2260],{},[33,10854,3640],{},[14,10856,190],{"id":190},[41,10858,10859,10863],{},[44,10860,3648,10861,3652],{},[33,10862,3651],{},[44,10864,3655,10865,3659,10867,376],{},[33,10866,3658],{},[33,10868,3662],{},[14,10870,207],{"id":207},[172,10872,10873,10875],{},[44,10874,3669],{},[44,10876,3672],{},[10,10878,218],{},[14,10880,221],{"id":221},[10,10882,3679],{},[226,10884,228],{},{"title":77,"searchDepth":90,"depth":90,"links":10886},[10887,10888,10889,10890,10891,10892,10893,10894],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3532,"description":3537},[239,3699,3371],{"id":3702,"title":3703,"body":10899,"category":239,"cover":240,"description":3708,"extension":241,"meta":11022,"navigation":93,"path":3858,"pinned":244,"publishedAt":245,"seo":11023,"slug":3860,"stem":3861,"summary":3862,"tags":11024,"updatedAt":245,"visible":93,"__hash__":3865},{"type":7,"value":10900,"toc":11012},[10901,10903,10905,10907,10909,10913,10915,10917,10929,10931,10933,10961,10963,10968,10970,10972,10982,10984,10994,10996,11004,11006,11008,11010],[10,10902,3708],{},[14,10904,16],{"id":16},[10,10906,3713],{},[14,10908,22],{"id":22},[10,10910,10911],{},[26,10912],{"alt":3720,"src":3721},[10,10914,3724],{},[14,10916,39],{"id":39},[41,10918,10919,10921,10923],{},[44,10920,3731],{},[44,10922,3734],{},[44,10924,3737,10925,3741,10927,3745],{},[33,10926,3740],{},[33,10928,3744],{},[14,10930,67],{"id":67},[10,10932,70],{},[72,10934,10935],{"className":74,"code":3752,"language":76,"meta":77,"style":77},[33,10936,10937,10941,10945,10949,10953,10957],{"__ignoreMap":77},[81,10938,10939],{"class":83,"line":84},[81,10940,3759],{},[81,10942,10943],{"class":83,"line":90},[81,10944,3764],{},[81,10946,10947],{"class":83,"line":97},[81,10948,94],{"emptyLinePlaceholder":93},[81,10950,10951],{"class":83,"line":103},[81,10952,3773],{},[81,10954,10955],{"class":83,"line":109},[81,10956,3778],{},[81,10958,10959],{"class":83,"line":115},[81,10960,3783],{},[10,10962,156],{},[72,10964,10966],{"className":10965,"code":3789,"language":162,"meta":77},[160],[33,10967,3789],{"__ignoreMap":77},[10,10969,167],{},[14,10971,170],{"id":170},[172,10973,10974,10976],{},[44,10975,3800],{},[44,10977,10978,3806,10980,3810],{},[33,10979,3805],{},[33,10981,3809],{},[14,10983,190],{"id":190},[41,10985,10986,10992],{},[44,10987,46,10988,3819,10990,376],{},[33,10989,3744],{},[33,10991,3740],{},[44,10993,3824],{},[14,10995,207],{"id":207},[172,10997,10998,11002],{},[44,10999,3831,11000,3834],{},[33,11001,3740],{},[44,11003,3837],{},[10,11005,218],{},[14,11007,221],{"id":221},[10,11009,3844],{},[226,11011,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11013},[11014,11015,11016,11017,11018,11019,11020,11021],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3703,"description":3708},[239,3864,3371],{"id":3867,"title":3868,"body":11026,"category":239,"cover":240,"description":3873,"extension":241,"meta":11185,"navigation":93,"path":4071,"pinned":244,"publishedAt":245,"seo":11186,"slug":4073,"stem":4074,"summary":4075,"tags":11187,"updatedAt":245,"visible":93,"__hash__":4079},{"type":7,"value":11027,"toc":11173},[11028,11030,11032,11034,11036,11040,11046,11048,11060,11062,11064,11104,11106,11111,11113,11115,11129,11131,11133,11137,11139,11141,11151,11153,11165,11167,11169,11171],[10,11029,3873],{},[14,11031,16],{"id":16},[10,11033,3878],{},[14,11035,22],{"id":22},[10,11037,11038],{},[26,11039],{"alt":3885,"src":3886},[10,11041,11042,3892,11044,3896],{},[33,11043,3891],{},[33,11045,3895],{},[14,11047,39],{"id":39},[41,11049,11050,11056,11058],{},[44,11051,11052,3905,11054,3909],{},[33,11053,2820],{},[33,11055,3908],{},[44,11057,3912],{},[44,11059,3915],{},[14,11061,67],{"id":67},[10,11063,70],{},[72,11065,11066],{"className":74,"code":3922,"language":76,"meta":77,"style":77},[33,11067,11068,11072,11076,11080,11084,11088,11092,11096,11100],{"__ignoreMap":77},[81,11069,11070],{"class":83,"line":84},[81,11071,3929],{},[81,11073,11074],{"class":83,"line":90},[81,11075,3934],{},[81,11077,11078],{"class":83,"line":97},[81,11079,3939],{},[81,11081,11082],{"class":83,"line":103},[81,11083,94],{"emptyLinePlaceholder":93},[81,11085,11086],{"class":83,"line":109},[81,11087,3948],{},[81,11089,11090],{"class":83,"line":115},[81,11091,3953],{},[81,11093,11094],{"class":83,"line":121},[81,11095,3958],{},[81,11097,11098],{"class":83,"line":127},[81,11099,3963],{},[81,11101,11102],{"class":83,"line":132},[81,11103,3968],{},[10,11105,156],{},[72,11107,11109],{"className":11108,"code":3974,"language":162,"meta":77},[160],[33,11110,3974],{"__ignoreMap":77},[10,11112,167],{},[14,11114,170],{"id":170},[172,11116,11117,11121],{},[44,11118,11119,3988],{},[33,11120,3987],{},[44,11122,11123,3994,11125,3998,11127,4002],{},[33,11124,3993],{},[33,11126,3997],{},[33,11128,4001],{},[342,11130,2710],{"id":2710},[10,11132,4007],{},[10,11134,11135],{},[26,11136],{"alt":4012,"src":4013},[10,11138,4016],{},[14,11140,190],{"id":190},[41,11142,11143,11149],{},[44,11144,4023,11145,4026,11147,376],{},[33,11146,2820],{},[33,11148,3908],{},[44,11150,4031],{},[14,11152,207],{"id":207},[172,11154,11155,11157],{},[44,11156,4038],{},[44,11158,46,11159,4044,11161,1171,11163,376],{},[33,11160,4043],{},[33,11162,3908],{},[33,11164,2820],{},[10,11166,218],{},[14,11168,221],{"id":221},[10,11170,4055],{},[226,11172,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11174},[11175,11176,11177,11178,11179,11182,11183,11184],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":11180},[11181],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":3868,"description":3873},[239,4077,4078],{"id":4081,"title":4082,"body":11189,"category":239,"cover":240,"description":4087,"extension":241,"meta":11361,"navigation":93,"path":4300,"pinned":244,"publishedAt":245,"seo":11362,"slug":4302,"stem":4303,"summary":4304,"tags":11363,"updatedAt":245,"visible":93,"__hash__":4307},{"type":7,"value":11190,"toc":11348},[11191,11193,11195,11197,11199,11203,11211,11213,11221,11223,11225,11269,11271,11276,11278,11280,11292,11294,11296,11300,11306,11308,11310,11314,11318,11320,11332,11334,11340,11342,11344,11346],[10,11192,4087],{},[14,11194,16],{"id":16},[10,11196,4092],{},[14,11198,22],{"id":22},[10,11200,11201],{},[26,11202],{"alt":4099,"src":4100},[10,11204,11205,2271,11207,2271,11209,4110],{},[33,11206,1170],{},[33,11208,4107],{},[33,11210,1174],{},[14,11212,39],{"id":39},[41,11214,11215,11217,11219],{},[44,11216,4117],{},[44,11218,4120],{},[44,11220,4123],{},[14,11222,67],{"id":67},[10,11224,70],{},[72,11226,11227],{"className":74,"code":4130,"language":76,"meta":77,"style":77},[33,11228,11229,11233,11237,11241,11245,11249,11253,11257,11261,11265],{"__ignoreMap":77},[81,11230,11231],{"class":83,"line":84},[81,11232,4137],{},[81,11234,11235],{"class":83,"line":90},[81,11236,94],{"emptyLinePlaceholder":93},[81,11238,11239],{"class":83,"line":97},[81,11240,4146],{},[81,11242,11243],{"class":83,"line":103},[81,11244,4151],{},[81,11246,11247],{"class":83,"line":109},[81,11248,4156],{},[81,11250,11251],{"class":83,"line":115},[81,11252,4161],{},[81,11254,11255],{"class":83,"line":121},[81,11256,1160],{},[81,11258,11259],{"class":83,"line":127},[81,11260,4170],{},[81,11262,11263],{"class":83,"line":132},[81,11264,94],{"emptyLinePlaceholder":93},[81,11266,11267],{"class":83,"line":138},[81,11268,4179],{},[10,11270,156],{},[72,11272,11274],{"className":11273,"code":4185,"language":162,"meta":77},[160],[33,11275,4185],{"__ignoreMap":77},[10,11277,167],{},[14,11279,170],{"id":170},[172,11281,11282,11286],{},[44,11283,4196,11284,4200],{},[33,11285,4199],{},[44,11287,11288,4206,11290,4209],{},[33,11289,4205],{},[33,11291,1174],{},[342,11293,2710],{"id":2710},[10,11295,4214],{},[10,11297,11298],{},[26,11299],{"alt":4219,"src":4220},[10,11301,11302,4225,11304,4228],{},[33,11303,4199],{},[33,11305,4205],{},[342,11307,2710],{"id":4231},[10,11309,4234],{},[10,11311,11312],{},[26,11313],{"alt":4239,"src":4240},[10,11315,4243,11316,4246],{},[33,11317,1170],{},[14,11319,190],{"id":190},[41,11321,11322,11326],{},[44,11323,4253,11324,4256],{},[33,11325,4205],{},[44,11327,4259,11328,4262,11330,4266],{},[33,11329,1170],{},[33,11331,4265],{},[14,11333,207],{"id":207},[172,11335,11336,11338],{},[44,11337,4273],{},[44,11339,4276],{},[10,11341,218],{},[14,11343,221],{"id":221},[10,11345,4283],{},[226,11347,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11349},[11350,11351,11352,11353,11354,11358,11359,11360],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":11355},[11356,11357],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":4082,"description":4087},[239,1170,4306],{"id":4309,"title":4310,"body":11365,"category":239,"cover":240,"description":4315,"extension":241,"meta":11502,"navigation":93,"path":4482,"pinned":244,"publishedAt":245,"seo":11503,"slug":4484,"stem":4485,"summary":4486,"tags":11504,"updatedAt":245,"visible":93,"__hash__":4489},{"type":7,"value":11366,"toc":11490},[11367,11369,11371,11373,11375,11379,11383,11385,11395,11397,11399,11431,11433,11438,11440,11442,11452,11454,11456,11460,11464,11466,11472,11474,11482,11484,11486,11488],[10,11368,4315],{},[14,11370,16],{"id":16},[10,11372,4320],{},[14,11374,22],{"id":22},[10,11376,11377],{},[26,11378],{"alt":4327,"src":4328},[10,11380,11381,4334],{},[33,11382,4333],{},[14,11384,39],{"id":39},[41,11386,11387,11389,11391],{},[44,11388,4341],{},[44,11390,4344],{},[44,11392,4347,11393,4351],{},[33,11394,4350],{},[14,11396,67],{"id":67},[10,11398,70],{},[72,11400,11401],{"className":74,"code":4358,"language":76,"meta":77,"style":77},[33,11402,11403,11407,11411,11415,11419,11423,11427],{"__ignoreMap":77},[81,11404,11405],{"class":83,"line":84},[81,11406,4365],{},[81,11408,11409],{"class":83,"line":90},[81,11410,94],{"emptyLinePlaceholder":93},[81,11412,11413],{"class":83,"line":97},[81,11414,4374],{},[81,11416,11417],{"class":83,"line":103},[81,11418,4379],{},[81,11420,11421],{"class":83,"line":109},[81,11422,4384],{},[81,11424,11425],{"class":83,"line":115},[81,11426,94],{"emptyLinePlaceholder":93},[81,11428,11429],{"class":83,"line":121},[81,11430,4393],{},[10,11432,156],{},[72,11434,11436],{"className":11435,"code":4399,"language":162,"meta":77},[160],[33,11437,4399],{"__ignoreMap":77},[10,11439,167],{},[14,11441,170],{"id":170},[172,11443,11444,11448],{},[44,11445,4410,11446,4414],{},[33,11447,4413],{},[44,11449,4417,11450,4420],{},[33,11451,4413],{},[342,11453,2710],{"id":2710},[10,11455,4425],{},[10,11457,11458],{},[26,11459],{"alt":4430,"src":4431},[10,11461,4434,11462,4437],{},[33,11463,4413],{},[14,11465,190],{"id":190},[41,11467,11468,11470],{},[44,11469,4444],{},[44,11471,4447],{},[14,11473,207],{"id":207},[172,11475,11476,11480],{},[44,11477,46,11478,4456],{},[33,11479,4333],{},[44,11481,4459],{},[10,11483,218],{},[14,11485,221],{"id":221},[10,11487,4466],{},[226,11489,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11491},[11492,11493,11494,11495,11496,11499,11500,11501],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":11497},[11498],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":4310,"description":4315},[239,4333,4488],{"id":4491,"title":4492,"body":11506,"category":239,"cover":240,"description":4497,"extension":241,"meta":11631,"navigation":93,"path":4646,"pinned":244,"publishedAt":245,"seo":11632,"slug":4648,"stem":4649,"summary":4650,"tags":11633,"updatedAt":245,"visible":93,"__hash__":4653},{"type":7,"value":11507,"toc":11621},[11508,11510,11512,11514,11516,11520,11524,11526,11536,11538,11540,11572,11574,11579,11581,11583,11595,11597,11603,11605,11613,11615,11617,11619],[10,11509,4497],{},[14,11511,16],{"id":16},[10,11513,4502],{},[14,11515,22],{"id":22},[10,11517,11518],{},[26,11519],{"alt":4509,"src":4510},[10,11521,11522,4515],{},[33,11523,4350],{},[14,11525,39],{"id":39},[41,11527,11528,11532,11534],{},[44,11529,11530,4525],{},[33,11531,4524],{},[44,11533,4528],{},[44,11535,4531],{},[14,11537,67],{"id":67},[10,11539,70],{},[72,11541,11542],{"className":74,"code":4538,"language":76,"meta":77,"style":77},[33,11543,11544,11548,11552,11556,11560,11564,11568],{"__ignoreMap":77},[81,11545,11546],{"class":83,"line":84},[81,11547,4545],{},[81,11549,11550],{"class":83,"line":90},[81,11551,94],{"emptyLinePlaceholder":93},[81,11553,11554],{"class":83,"line":97},[81,11555,4554],{},[81,11557,11558],{"class":83,"line":103},[81,11559,4559],{},[81,11561,11562],{"class":83,"line":109},[81,11563,94],{"emptyLinePlaceholder":93},[81,11565,11566],{"class":83,"line":115},[81,11567,4568],{},[81,11569,11570],{"class":83,"line":121},[81,11571,4573],{},[10,11573,156],{},[72,11575,11577],{"className":11576,"code":4579,"language":162,"meta":77},[160],[33,11578,4579],{"__ignoreMap":77},[10,11580,167],{},[14,11582,170],{"id":170},[172,11584,11585,11591],{},[44,11586,4590,11587,4593,11589,4597],{},[33,11588,4350],{},[33,11590,4596],{},[44,11592,11593,4602],{},[33,11594,4524],{},[14,11596,190],{"id":190},[41,11598,11599,11601],{},[44,11600,4609],{},[44,11602,4612],{},[14,11604,207],{"id":207},[172,11606,11607,11609],{},[44,11608,4619],{},[44,11610,46,11611,4625],{},[33,11612,4624],{},[10,11614,218],{},[14,11616,221],{"id":221},[10,11618,4632],{},[226,11620,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11622},[11623,11624,11625,11626,11627,11628,11629,11630],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":4492,"description":4497},[239,4350,4652],{"id":4655,"title":4656,"body":11635,"category":239,"cover":240,"description":4661,"extension":241,"meta":11780,"navigation":93,"path":4836,"pinned":244,"publishedAt":245,"seo":11781,"slug":4838,"stem":4839,"summary":4840,"tags":11782,"updatedAt":245,"visible":93,"__hash__":4842},{"type":7,"value":11636,"toc":11770},[11637,11639,11641,11643,11645,11649,11655,11657,11671,11673,11675,11719,11721,11726,11728,11730,11740,11742,11754,11756,11762,11764,11766,11768],[10,11638,4661],{},[14,11640,16],{"id":16},[10,11642,4666],{},[14,11644,22],{"id":22},[10,11646,11647],{},[26,11648],{"alt":4673,"src":4674},[10,11650,11651,4680,11653,4684],{},[33,11652,4679],{},[33,11654,4683],{},[14,11656,39],{"id":39},[41,11658,11659,11661,11667],{},[44,11660,4691],{},[44,11662,11663,4696,11665,4699],{},[33,11664,4679],{},[33,11666,4333],{},[44,11668,4702,11669,4705],{},[33,11670,4683],{},[14,11672,67],{"id":67},[10,11674,70],{},[72,11676,11677],{"className":74,"code":4712,"language":76,"meta":77,"style":77},[33,11678,11679,11683,11687,11691,11695,11699,11703,11707,11711,11715],{"__ignoreMap":77},[81,11680,11681],{"class":83,"line":84},[81,11682,4719],{},[81,11684,11685],{"class":83,"line":90},[81,11686,94],{"emptyLinePlaceholder":93},[81,11688,11689],{"class":83,"line":97},[81,11690,4728],{},[81,11692,11693],{"class":83,"line":103},[81,11694,4733],{},[81,11696,11697],{"class":83,"line":109},[81,11698,4738],{},[81,11700,11701],{"class":83,"line":115},[81,11702,4743],{},[81,11704,11705],{"class":83,"line":121},[81,11706,4748],{},[81,11708,11709],{"class":83,"line":127},[81,11710,4573],{},[81,11712,11713],{"class":83,"line":132},[81,11714,94],{"emptyLinePlaceholder":93},[81,11716,11717],{"class":83,"line":138},[81,11718,4761],{},[10,11720,156],{},[72,11722,11724],{"className":11723,"code":4767,"language":162,"meta":77},[160],[33,11725,4767],{"__ignoreMap":77},[10,11727,167],{},[14,11729,170],{"id":170},[172,11731,11732,11736],{},[44,11733,4778,11734,4781],{},[33,11735,4679],{},[44,11737,4784,11738,4787],{},[33,11739,4683],{},[14,11741,190],{"id":190},[41,11743,11744,11748],{},[44,11745,3480,11746,4796],{},[33,11747,4679],{},[44,11749,4799,11750,4802,11752,4805],{},[33,11751,4333],{},[33,11753,4679],{},[14,11755,207],{"id":207},[172,11757,11758,11760],{},[44,11759,4812],{},[44,11761,4815],{},[10,11763,218],{},[14,11765,221],{"id":221},[10,11767,4822],{},[226,11769,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11771},[11772,11773,11774,11775,11776,11777,11778,11779],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":4656,"description":4661},[239,4683,4679],{"id":4844,"title":4845,"body":11784,"category":239,"cover":240,"description":4850,"extension":241,"meta":11923,"navigation":93,"path":5022,"pinned":244,"publishedAt":245,"seo":11924,"slug":5024,"stem":5025,"summary":5026,"tags":11925,"updatedAt":245,"visible":93,"__hash__":5030},{"type":7,"value":11785,"toc":11911},[11786,11788,11790,11792,11794,11798,11800,11802,11818,11820,11822,11850,11852,11857,11859,11861,11873,11875,11877,11881,11883,11885,11895,11897,11903,11905,11907,11909],[10,11787,4850],{},[14,11789,16],{"id":16},[10,11791,4855],{},[14,11793,22],{"id":22},[10,11795,11796],{},[26,11797],{"alt":4862,"src":4863},[10,11799,4866],{},[14,11801,39],{"id":39},[41,11803,11804,11806,11808],{},[44,11805,4873],{},[44,11807,4876],{},[44,11809,4879,11810,2271,11812,4886,11814,2271,11816,376],{},[33,11811,4882],{},[33,11813,4885],{},[33,11815,4889],{},[33,11817,4892],{},[14,11819,67],{"id":67},[10,11821,70],{},[72,11823,11824],{"className":74,"code":4899,"language":76,"meta":77,"style":77},[33,11825,11826,11830,11834,11838,11842,11846],{"__ignoreMap":77},[81,11827,11828],{"class":83,"line":84},[81,11829,4906],{},[81,11831,11832],{"class":83,"line":90},[81,11833,94],{"emptyLinePlaceholder":93},[81,11835,11836],{"class":83,"line":97},[81,11837,4915],{},[81,11839,11840],{"class":83,"line":103},[81,11841,4920],{},[81,11843,11844],{"class":83,"line":109},[81,11845,4925],{},[81,11847,11848],{"class":83,"line":115},[81,11849,4930],{},[10,11851,156],{},[72,11853,11855],{"className":11854,"code":4936,"language":162,"meta":77},[160],[33,11856,4936],{"__ignoreMap":77},[10,11858,167],{},[14,11860,170],{"id":170},[172,11862,11863,11871],{},[44,11864,4947,11865,4950,11867,1171,11869,376],{},[33,11866,4882],{},[33,11868,4953],{},[33,11870,4956],{},[44,11872,4959],{},[342,11874,2710],{"id":2710},[10,11876,4964],{},[10,11878,11879],{},[26,11880],{"alt":4969,"src":4970},[10,11882,4973],{},[14,11884,190],{"id":190},[41,11886,11887,11893],{},[44,11888,4980,11889,1023,11891,4986],{},[33,11890,4983],{},[33,11892,4889],{},[44,11894,4989],{},[14,11896,207],{"id":207},[172,11898,11899,11901],{},[44,11900,4996],{},[44,11902,4999],{},[10,11904,218],{},[14,11906,221],{"id":221},[10,11908,5006],{},[226,11910,228],{},{"title":77,"searchDepth":90,"depth":90,"links":11912},[11913,11914,11915,11916,11917,11920,11921,11922],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":11918},[11919],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":4845,"description":4850},[239,5028,5029],{"id":5032,"title":5033,"body":11927,"category":239,"cover":240,"description":5038,"extension":241,"meta":12044,"navigation":93,"path":5177,"pinned":244,"publishedAt":245,"seo":12045,"slug":5179,"stem":5180,"summary":5181,"tags":12046,"updatedAt":245,"visible":93,"__hash__":5185},{"type":7,"value":11928,"toc":12034},[11929,11931,11933,11935,11937,11941,11943,11945,11953,11955,11957,11989,11991,11996,11998,12000,12008,12010,12018,12020,12026,12028,12030,12032],[10,11930,5038],{},[14,11932,16],{"id":16},[10,11934,5043],{},[14,11936,22],{"id":22},[10,11938,11939],{},[26,11940],{"alt":5050,"src":5051},[10,11942,5054],{},[14,11944,39],{"id":39},[41,11946,11947,11949,11951],{},[44,11948,5061],{},[44,11950,5064],{},[44,11952,5067],{},[14,11954,67],{"id":67},[10,11956,70],{},[72,11958,11959],{"className":74,"code":5074,"language":76,"meta":77,"style":77},[33,11960,11961,11965,11969,11973,11977,11981,11985],{"__ignoreMap":77},[81,11962,11963],{"class":83,"line":84},[81,11964,5081],{},[81,11966,11967],{"class":83,"line":90},[81,11968,94],{"emptyLinePlaceholder":93},[81,11970,11971],{"class":83,"line":97},[81,11972,5090],{},[81,11974,11975],{"class":83,"line":103},[81,11976,5095],{},[81,11978,11979],{"class":83,"line":109},[81,11980,94],{"emptyLinePlaceholder":93},[81,11982,11983],{"class":83,"line":115},[81,11984,5104],{},[81,11986,11987],{"class":83,"line":121},[81,11988,5109],{},[10,11990,156],{},[72,11992,11994],{"className":11993,"code":5115,"language":162,"meta":77},[160],[33,11995,5115],{"__ignoreMap":77},[10,11997,167],{},[14,11999,170],{"id":170},[172,12001,12002,12004],{},[44,12003,5126],{},[44,12005,5129,12006,5133],{},[33,12007,5132],{},[14,12009,190],{"id":190},[41,12011,12012,12016],{},[44,12013,5140,12014,5143],{},[33,12015,4350],{},[44,12017,5146],{},[14,12019,207],{"id":207},[172,12021,12022,12024],{},[44,12023,5153],{},[44,12025,5156],{},[10,12027,218],{},[14,12029,221],{"id":221},[10,12031,5163],{},[226,12033,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12035},[12036,12037,12038,12039,12040,12041,12042,12043],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5033,"description":5038},[239,5183,5184],{"id":5187,"title":5188,"body":12048,"category":239,"cover":240,"description":5193,"extension":241,"meta":12167,"navigation":93,"path":5337,"pinned":244,"publishedAt":245,"seo":12168,"slug":5339,"stem":5340,"summary":5341,"tags":12169,"updatedAt":245,"visible":93,"__hash__":5345},{"type":7,"value":12049,"toc":12157},[12050,12052,12054,12056,12058,12062,12064,12066,12074,12076,12078,12110,12112,12117,12119,12121,12131,12133,12139,12141,12149,12151,12153,12155],[10,12051,5193],{},[14,12053,16],{"id":16},[10,12055,5198],{},[14,12057,22],{"id":22},[10,12059,12060],{},[26,12061],{"alt":5205,"src":5206},[10,12063,5209],{},[14,12065,39],{"id":39},[41,12067,12068,12070,12072],{},[44,12069,5216],{},[44,12071,5219],{},[44,12073,5222],{},[14,12075,67],{"id":67},[10,12077,70],{},[72,12079,12080],{"className":74,"code":5229,"language":76,"meta":77,"style":77},[33,12081,12082,12086,12090,12094,12098,12102,12106],{"__ignoreMap":77},[81,12083,12084],{"class":83,"line":84},[81,12085,5236],{},[81,12087,12088],{"class":83,"line":90},[81,12089,5241],{},[81,12091,12092],{"class":83,"line":97},[81,12093,5246],{},[81,12095,12096],{"class":83,"line":103},[81,12097,94],{"emptyLinePlaceholder":93},[81,12099,12100],{"class":83,"line":109},[81,12101,5255],{},[81,12103,12104],{"class":83,"line":115},[81,12105,5260],{},[81,12107,12108],{"class":83,"line":121},[81,12109,5265],{},[10,12111,156],{},[72,12113,12115],{"className":12114,"code":5271,"language":162,"meta":77},[160],[33,12116,5271],{"__ignoreMap":77},[10,12118,167],{},[14,12120,170],{"id":170},[172,12122,12123,12127],{},[44,12124,952,12125,5285],{},[33,12126,5284],{},[44,12128,5288,12129,5292],{},[33,12130,5291],{},[14,12132,190],{"id":190},[41,12134,12135,12137],{},[44,12136,5299],{},[44,12138,5302],{},[14,12140,207],{"id":207},[172,12142,12143,12147],{},[44,12144,5309,12145,5313],{},[33,12146,5312],{},[44,12148,5316],{},[10,12150,218],{},[14,12152,221],{"id":221},[10,12154,5323],{},[226,12156,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12158},[12159,12160,12161,12162,12163,12164,12165,12166],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5188,"description":5193},[239,5343,5344],{"id":5347,"title":5348,"body":12171,"category":239,"cover":240,"description":5353,"extension":241,"meta":12316,"navigation":93,"path":5534,"pinned":244,"publishedAt":245,"seo":12317,"slug":5536,"stem":5537,"summary":5538,"tags":12318,"updatedAt":245,"visible":93,"__hash__":5542},{"type":7,"value":12172,"toc":12304},[12173,12175,12177,12179,12181,12185,12189,12191,12203,12205,12207,12235,12237,12242,12244,12246,12260,12262,12264,12268,12276,12278,12288,12290,12296,12298,12300,12302],[10,12174,5353],{},[14,12176,16],{"id":16},[10,12178,5358],{},[14,12180,22],{"id":22},[10,12182,12183],{},[26,12184],{"alt":5365,"src":5366},[10,12186,5369,12187,5373],{},[33,12188,5372],{},[14,12190,39],{"id":39},[41,12192,12193,12195,12197],{},[44,12194,5380],{},[44,12196,5383],{},[44,12198,5386,12199,5389,12201,376],{},[33,12200,5372],{},[33,12202,5392],{},[14,12204,67],{"id":67},[10,12206,70],{},[72,12208,12209],{"className":74,"code":5399,"language":76,"meta":77,"style":77},[33,12210,12211,12215,12219,12223,12227,12231],{"__ignoreMap":77},[81,12212,12213],{"class":83,"line":84},[81,12214,5406],{},[81,12216,12217],{"class":83,"line":90},[81,12218,5411],{},[81,12220,12221],{"class":83,"line":97},[81,12222,5416],{},[81,12224,12225],{"class":83,"line":103},[81,12226,94],{"emptyLinePlaceholder":93},[81,12228,12229],{"class":83,"line":109},[81,12230,5425],{},[81,12232,12233],{"class":83,"line":115},[81,12234,5430],{},[10,12236,156],{},[72,12238,12240],{"className":12239,"code":5436,"language":162,"meta":77},[160],[33,12241,5436],{"__ignoreMap":77},[10,12243,167],{},[14,12245,170],{"id":170},[172,12247,12248,12254],{},[44,12249,5447,12250,2271,12252,5453],{},[33,12251,5450],{},[33,12253,4413],{},[44,12255,12256,5459,12258,5463],{},[33,12257,5458],{},[33,12259,5462],{},[342,12261,2710],{"id":2710},[10,12263,5468],{},[10,12265,12266],{},[26,12267],{"alt":5473,"src":5474},[10,12269,12270,2271,12272,1171,12274,5484],{},[33,12271,5450],{},[33,12273,4413],{},[33,12275,5483],{},[14,12277,190],{"id":190},[41,12279,12280,12284],{},[44,12281,5491,12282,5495],{},[33,12283,5494],{},[44,12285,5498,12286,5501],{},[33,12287,5483],{},[14,12289,207],{"id":207},[172,12291,12292,12294],{},[44,12293,5508],{},[44,12295,5511],{},[10,12297,218],{},[14,12299,221],{"id":221},[10,12301,5518],{},[226,12303,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12305},[12306,12307,12308,12309,12310,12313,12314,12315],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":12311},[12312],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5348,"description":5353},[239,5540,5541],{"id":5544,"title":5545,"body":12320,"category":239,"cover":240,"description":5550,"extension":241,"meta":12469,"navigation":93,"path":5731,"pinned":244,"publishedAt":245,"seo":12470,"slug":5733,"stem":5734,"summary":5735,"tags":12471,"updatedAt":245,"visible":93,"__hash__":5739},{"type":7,"value":12321,"toc":12457},[12322,12324,12326,12328,12330,12334,12336,12338,12350,12352,12354,12398,12400,12405,12407,12409,12421,12423,12425,12429,12431,12433,12441,12443,12449,12451,12453,12455],[10,12323,5550],{},[14,12325,16],{"id":16},[10,12327,5555],{},[14,12329,22],{"id":22},[10,12331,12332],{},[26,12333],{"alt":5562,"src":5563},[10,12335,5566],{},[14,12337,39],{"id":39},[41,12339,12340,12342,12346],{},[44,12341,5573],{},[44,12343,12344,5579],{},[33,12345,5578],{},[44,12347,12348,5585],{},[33,12349,5584],{},[14,12351,67],{"id":67},[10,12353,70],{},[72,12355,12356],{"className":74,"code":5592,"language":76,"meta":77,"style":77},[33,12357,12358,12362,12366,12370,12374,12378,12382,12386,12390,12394],{"__ignoreMap":77},[81,12359,12360],{"class":83,"line":84},[81,12361,5599],{},[81,12363,12364],{"class":83,"line":90},[81,12365,5604],{},[81,12367,12368],{"class":83,"line":97},[81,12369,94],{"emptyLinePlaceholder":93},[81,12371,12372],{"class":83,"line":103},[81,12373,5613],{},[81,12375,12376],{"class":83,"line":109},[81,12377,5618],{},[81,12379,12380],{"class":83,"line":115},[81,12381,94],{"emptyLinePlaceholder":93},[81,12383,12384],{"class":83,"line":121},[81,12385,5627],{},[81,12387,12388],{"class":83,"line":127},[81,12389,5632],{},[81,12391,12392],{"class":83,"line":132},[81,12393,94],{"emptyLinePlaceholder":93},[81,12395,12396],{"class":83,"line":138},[81,12397,5641],{},[10,12399,156],{},[72,12401,12403],{"className":12402,"code":5647,"language":162,"meta":77},[160],[33,12404,5647],{"__ignoreMap":77},[10,12406,167],{},[14,12408,170],{"id":170},[172,12410,12411,12415],{},[44,12412,5658,12413,5662],{},[33,12414,5661],{},[44,12416,12417,5668,12419,376],{},[33,12418,5667],{},[33,12420,5671],{},[342,12422,2710],{"id":2710},[10,12424,5676],{},[10,12426,12427],{},[26,12428],{"alt":5681,"src":5682},[10,12430,5685],{},[14,12432,190],{"id":190},[41,12434,12435,12439],{},[44,12436,5692,12437,5695],{},[33,12438,5392],{},[44,12440,5698],{},[14,12442,207],{"id":207},[172,12444,12445,12447],{},[44,12446,5705],{},[44,12448,5708],{},[10,12450,218],{},[14,12452,221],{"id":221},[10,12454,5715],{},[226,12456,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12458},[12459,12460,12461,12462,12463,12466,12467,12468],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":12464},[12465],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5545,"description":5550},[239,5737,5738],{"id":5741,"title":5742,"body":12473,"category":239,"cover":240,"description":5747,"extension":241,"meta":12634,"navigation":93,"path":5943,"pinned":244,"publishedAt":245,"seo":12635,"slug":5945,"stem":5946,"summary":5947,"tags":12636,"updatedAt":245,"visible":93,"__hash__":5951},{"type":7,"value":12474,"toc":12622},[12475,12477,12479,12481,12483,12487,12489,12491,12503,12505,12507,12559,12561,12566,12568,12570,12588,12590,12592,12596,12598,12600,12606,12608,12614,12616,12618,12620],[10,12476,5747],{},[14,12478,16],{"id":16},[10,12480,5752],{},[14,12482,22],{"id":22},[10,12484,12485],{},[26,12486],{"alt":5759,"src":5760},[10,12488,5763],{},[14,12490,39],{"id":39},[41,12492,12493,12495,12497],{},[44,12494,5770],{},[44,12496,5773],{},[44,12498,12499,2190,12501,5782],{},[33,12500,5778],{},[33,12502,5781],{},[14,12504,67],{"id":67},[10,12506,70],{},[72,12508,12509],{"className":74,"code":5789,"language":76,"meta":77,"style":77},[33,12510,12511,12515,12519,12523,12527,12531,12535,12539,12543,12547,12551,12555],{"__ignoreMap":77},[81,12512,12513],{"class":83,"line":84},[81,12514,5796],{},[81,12516,12517],{"class":83,"line":90},[81,12518,94],{"emptyLinePlaceholder":93},[81,12520,12521],{"class":83,"line":97},[81,12522,5805],{},[81,12524,12525],{"class":83,"line":103},[81,12526,5810],{},[81,12528,12529],{"class":83,"line":109},[81,12530,94],{"emptyLinePlaceholder":93},[81,12532,12533],{"class":83,"line":115},[81,12534,5819],{},[81,12536,12537],{"class":83,"line":121},[81,12538,5824],{},[81,12540,12541],{"class":83,"line":127},[81,12542,5829],{},[81,12544,12545],{"class":83,"line":132},[81,12546,94],{"emptyLinePlaceholder":93},[81,12548,12549],{"class":83,"line":138},[81,12550,5838],{},[81,12552,12553],{"class":83,"line":144},[81,12554,94],{"emptyLinePlaceholder":93},[81,12556,12557],{"class":83,"line":150},[81,12558,5847],{},[10,12560,156],{},[72,12562,12564],{"className":12563,"code":5853,"language":162,"meta":77},[160],[33,12565,5853],{"__ignoreMap":77},[10,12567,167],{},[14,12569,170],{"id":170},[172,12571,12572,12582],{},[44,12573,12574,5867,12576,5871,12578,5874,12580,5878],{},[33,12575,5866],{},[33,12577,5870],{},[33,12579,5661],{},[33,12581,5877],{},[44,12583,12584,5883,12586,5886],{},[33,12585,4596],{},[33,12587,2222],{},[342,12589,2710],{"id":2710},[10,12591,5891],{},[10,12593,12594],{},[26,12595],{"alt":5896,"src":5897},[10,12597,5900],{},[14,12599,190],{"id":190},[41,12601,12602,12604],{},[44,12603,5907],{},[44,12605,5910],{},[14,12607,207],{"id":207},[172,12609,12610,12612],{},[44,12611,5917],{},[44,12613,5920],{},[10,12615,218],{},[14,12617,221],{"id":221},[10,12619,5927],{},[226,12621,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12623},[12624,12625,12626,12627,12628,12631,12632,12633],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":12629},[12630],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5742,"description":5747},[239,5949,5950],{"id":5953,"title":5954,"body":12638,"category":239,"cover":240,"description":5959,"extension":241,"meta":12761,"navigation":93,"path":6110,"pinned":244,"publishedAt":245,"seo":12762,"slug":6112,"stem":6113,"summary":6114,"tags":12763,"updatedAt":245,"visible":93,"__hash__":6118},{"type":7,"value":12639,"toc":12751},[12640,12642,12644,12646,12648,12652,12654,12656,12670,12672,12674,12702,12704,12709,12711,12713,12723,12725,12733,12735,12743,12745,12747,12749],[10,12641,5959],{},[14,12643,16],{"id":16},[10,12645,5964],{},[14,12647,22],{"id":22},[10,12649,12650],{},[26,12651],{"alt":5971,"src":5972},[10,12653,5975],{},[14,12655,39],{"id":39},[41,12657,12658,12660,12662],{},[44,12659,5982],{},[44,12661,5985],{},[44,12663,5988,12664,2271,12666,2271,12668,5996],{},[33,12665,2274],{},[33,12667,2439],{},[33,12669,5995],{},[14,12671,67],{"id":67},[10,12673,70],{},[72,12675,12676],{"className":74,"code":6003,"language":76,"meta":77,"style":77},[33,12677,12678,12682,12686,12690,12694,12698],{"__ignoreMap":77},[81,12679,12680],{"class":83,"line":84},[81,12681,6010],{},[81,12683,12684],{"class":83,"line":90},[81,12685,6015],{},[81,12687,12688],{"class":83,"line":97},[81,12689,6020],{},[81,12691,12692],{"class":83,"line":103},[81,12693,94],{"emptyLinePlaceholder":93},[81,12695,12696],{"class":83,"line":109},[81,12697,6029],{},[81,12699,12700],{"class":83,"line":115},[81,12701,6034],{},[10,12703,156],{},[72,12705,12707],{"className":12706,"code":6040,"language":162,"meta":77},[160],[33,12708,6040],{"__ignoreMap":77},[10,12710,167],{},[14,12712,170],{"id":170},[172,12714,12715,12721],{},[44,12716,6051,12717,6055,12719,6058],{},[33,12718,6054],{},[33,12720,2260],{},[44,12722,6061],{},[14,12724,190],{"id":190},[41,12726,12727,12731],{},[44,12728,6068,12729,6072],{},[33,12730,6071],{},[44,12732,6075],{},[14,12734,207],{"id":207},[172,12736,12737,12739],{},[44,12738,6082],{},[44,12740,6085,12741,6089],{},[33,12742,6088],{},[10,12744,218],{},[14,12746,221],{"id":221},[10,12748,6096],{},[226,12750,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12752},[12753,12754,12755,12756,12757,12758,12759,12760],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5954,"description":5959},[239,6116,6117],{"id":6120,"title":6121,"body":12765,"category":239,"cover":240,"description":6126,"extension":241,"meta":12942,"navigation":93,"path":6354,"pinned":244,"publishedAt":245,"seo":12943,"slug":6356,"stem":6357,"summary":6358,"tags":12944,"updatedAt":245,"visible":93,"__hash__":6362},{"type":7,"value":12766,"toc":12930},[12767,12769,12771,12775,12777,12781,12787,12789,12801,12803,12807,12831,12835,12851,12857,12859,12864,12866,12868,12884,12886,12888,12892,12896,12898,12910,12912,12922,12924,12926,12928],[10,12768,6126],{},[14,12770,16],{"id":16},[10,12772,6131,12773,6134],{},[308,12774,6054],{},[14,12776,22],{"id":22},[10,12778,12779],{},[26,12780],{"alt":6141,"src":6142},[10,12782,6145,12783,6149,12785,6153],{},[33,12784,6148],{},[33,12786,6152],{},[14,12788,39],{"id":39},[41,12790,12791,12795,12797],{},[44,12792,6160,12793,6163],{},[33,12794,1185],{},[44,12796,6166],{},[44,12798,6169,12799,6173],{},[33,12800,6172],{},[14,12802,67],{"id":67},[10,12804,6178,12805,6182],{},[33,12806,6181],{},[72,12808,12809],{"className":74,"code":6185,"language":76,"meta":77,"style":77},[33,12810,12811,12815,12819,12823,12827],{"__ignoreMap":77},[81,12812,12813],{"class":83,"line":84},[81,12814,6192],{},[81,12816,12817],{"class":83,"line":90},[81,12818,6197],{},[81,12820,12821],{"class":83,"line":97},[81,12822,94],{"emptyLinePlaceholder":93},[81,12824,12825],{"class":83,"line":103},[81,12826,6206],{},[81,12828,12829],{"class":83,"line":109},[81,12830,6211],{},[10,12832,6214,12833,6218],{},[33,12834,6217],{},[72,12836,12837],{"className":74,"code":6221,"language":76,"meta":77,"style":77},[33,12838,12839,12843,12847],{"__ignoreMap":77},[81,12840,12841],{"class":83,"line":84},[81,12842,6228],{},[81,12844,12845],{"class":83,"line":90},[81,12846,94],{"emptyLinePlaceholder":93},[81,12848,12849],{"class":83,"line":97},[81,12850,6237],{},[10,12852,6240,12853,1171,12855,376],{},[33,12854,6243],{},[33,12856,6246],{},[10,12858,156],{},[72,12860,12862],{"className":12861,"code":6252,"language":162,"meta":77},[160],[33,12863,6252],{"__ignoreMap":77},[10,12865,167],{},[14,12867,170],{"id":170},[172,12869,12870,12876],{},[44,12871,6263,12872,6266,12874,6270],{},[33,12873,6181],{},[33,12875,6269],{},[44,12877,12878,6275,12880,6278,12882,6281],{},[33,12879,6217],{},[33,12881,6181],{},[33,12883,6217],{},[342,12885,2710],{"id":2710},[10,12887,6286],{},[10,12889,12890],{},[26,12891],{"alt":6291,"src":6292},[10,12893,6295,12894,6298],{},[33,12895,6269],{},[14,12897,190],{"id":190},[41,12899,12900,12906],{},[44,12901,6305,12902,1171,12904,376],{},[33,12903,6181],{},[33,12905,6217],{},[44,12907,6312,12908,6316],{},[33,12909,6315],{},[14,12911,207],{"id":207},[172,12913,12914,12918],{},[44,12915,2367,12916,6326],{},[33,12917,6325],{},[44,12919,6329,12920,376],{},[33,12921,6148],{},[10,12923,218],{},[14,12925,221],{"id":221},[10,12927,6338],{},[226,12929,228],{},{"title":77,"searchDepth":90,"depth":90,"links":12931},[12932,12933,12934,12935,12936,12939,12940,12941],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":12937},[12938],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":6121,"description":6126},[239,6360,6361],{"id":6364,"title":6365,"body":12946,"category":239,"cover":240,"description":6370,"extension":241,"meta":13085,"navigation":93,"path":6536,"pinned":244,"publishedAt":245,"seo":13086,"slug":6538,"stem":6539,"summary":6540,"tags":13087,"updatedAt":245,"visible":93,"__hash__":6543},{"type":7,"value":12947,"toc":13075},[12948,12950,12952,12954,12956,12960,12962,12964,12974,12976,12978,13018,13020,13025,13027,13029,13047,13049,13057,13059,13067,13069,13071,13073],[10,12949,6370],{},[14,12951,16],{"id":16},[10,12953,6375],{},[14,12955,22],{"id":22},[10,12957,12958],{},[26,12959],{"alt":6382,"src":6383},[10,12961,6386],{},[14,12963,39],{"id":39},[41,12965,12966,12970,12972],{},[44,12967,12968,6396],{},[33,12969,6395],{},[44,12971,6399],{},[44,12973,6402],{},[14,12975,67],{"id":67},[10,12977,1588],{},[72,12979,12980],{"className":605,"code":6409,"language":607,"meta":77,"style":77},[33,12981,12982,12992,12998,13004,13014],{"__ignoreMap":77},[81,12983,12984,12986,12988,12990],{"class":83,"line":84},[81,12985,705],{"class":614},[81,12987,647],{"class":617},[81,12989,6420],{"class":650},[81,12991,6423],{"class":650},[81,12993,12994,12996],{"class":83,"line":90},[81,12995,6428],{"class":617},[81,12997,6431],{"class":650},[81,12999,13000,13002],{"class":83,"line":97},[81,13001,76],{"class":614},[81,13003,618],{"class":617},[81,13005,13006,13008,13010,13012],{"class":83,"line":103},[81,13007,76],{"class":614},[81,13009,647],{"class":617},[81,13011,651],{"class":650},[81,13013,618],{"class":617},[81,13015,13016],{"class":83,"line":109},[81,13017,6452],{"class":614},[10,13019,156],{},[72,13021,13023],{"className":13022,"code":6458,"language":162,"meta":77},[160],[33,13024,6458],{"__ignoreMap":77},[10,13026,167],{},[14,13028,170],{"id":170},[172,13030,13031,13037],{},[44,13032,13033,6472,13035,6475],{},[33,13034,6471],{},[33,13036,705],{},[44,13038,6478,13039,2190,13041,6484,13043,3741,13045,6490],{},[33,13040,76],{},[33,13042,6483],{},[33,13044,6395],{},[33,13046,6489],{},[14,13048,190],{"id":190},[41,13050,13051,13053],{},[44,13052,6497],{},[44,13054,3480,13055,6502],{},[33,13056,6395],{},[14,13058,207],{"id":207},[172,13060,13061,13065],{},[44,13062,6509,13063,376],{},[33,13064,6512],{},[44,13066,6515],{},[10,13068,218],{},[14,13070,221],{"id":221},[10,13072,6522],{},[226,13074,1672],{},{"title":77,"searchDepth":90,"depth":90,"links":13076},[13077,13078,13079,13080,13081,13082,13083,13084],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":6365,"description":6370},[239,6542,274],{"id":6545,"title":6546,"body":13089,"category":239,"cover":240,"description":6551,"extension":241,"meta":13242,"navigation":93,"path":6740,"pinned":244,"publishedAt":245,"seo":13243,"slug":6742,"stem":6743,"summary":6744,"tags":13244,"updatedAt":245,"visible":93,"__hash__":6748},{"type":7,"value":13090,"toc":13232},[13091,13093,13095,13097,13099,13103,13109,13111,13127,13129,13131,13175,13177,13182,13184,13186,13198,13200,13214,13216,13224,13226,13228,13230],[10,13092,6551],{},[14,13094,16],{"id":16},[10,13096,6556],{},[14,13098,22],{"id":22},[10,13100,13101],{},[26,13102],{"alt":6563,"src":6564},[10,13104,13105,6570,13107,6573],{},[33,13106,6569],{},[33,13108,2449],{},[14,13110,39],{"id":39},[41,13112,13113,13115,13123],{},[44,13114,6580],{},[44,13116,13117,2271,13119,2271,13121,6592],{},[33,13118,6585],{},[33,13120,6588],{},[33,13122,6591],{},[44,13124,6595,13125,6599],{},[33,13126,6598],{},[14,13128,67],{"id":67},[10,13130,70],{},[72,13132,13133],{"className":74,"code":6606,"language":76,"meta":77,"style":77},[33,13134,13135,13139,13143,13147,13151,13155,13159,13163,13167,13171],{"__ignoreMap":77},[81,13136,13137],{"class":83,"line":84},[81,13138,6613],{},[81,13140,13141],{"class":83,"line":90},[81,13142,94],{"emptyLinePlaceholder":93},[81,13144,13145],{"class":83,"line":97},[81,13146,6622],{},[81,13148,13149],{"class":83,"line":103},[81,13150,6627],{},[81,13152,13153],{"class":83,"line":109},[81,13154,6632],{},[81,13156,13157],{"class":83,"line":115},[81,13158,94],{"emptyLinePlaceholder":93},[81,13160,13161],{"class":83,"line":121},[81,13162,6641],{},[81,13164,13165],{"class":83,"line":127},[81,13166,6646],{},[81,13168,13169],{"class":83,"line":132},[81,13170,6651],{},[81,13172,13173],{"class":83,"line":138},[81,13174,6656],{},[10,13176,156],{},[72,13178,13180],{"className":13179,"code":6662,"language":162,"meta":77},[160],[33,13181,6662],{"__ignoreMap":77},[10,13183,167],{},[14,13185,170],{"id":170},[172,13187,13188,13192],{},[44,13189,13190,6676],{},[33,13191,6675],{},[44,13193,46,13194,6681,13196,6684],{},[33,13195,2449],{},[33,13197,6569],{},[14,13199,190],{"id":190},[41,13201,13202,13208],{},[44,13203,3480,13204,6693,13206,6696],{},[33,13205,6569],{},[33,13207,6585],{},[44,13209,6699,13210,1023,13212,6705],{},[33,13211,2449],{},[33,13213,6704],{},[14,13215,207],{"id":207},[172,13217,13218,13222],{},[44,13219,6712,13220,6716],{},[33,13221,6715],{},[44,13223,6719],{},[10,13225,218],{},[14,13227,221],{"id":221},[10,13229,6726],{},[226,13231,228],{},{"title":77,"searchDepth":90,"depth":90,"links":13233},[13234,13235,13236,13237,13238,13239,13240,13241],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":6546,"description":6551},[239,6746,6747],{"id":6750,"title":6751,"body":13246,"category":239,"cover":240,"description":6756,"extension":241,"meta":13393,"navigation":93,"path":6935,"pinned":244,"publishedAt":245,"seo":13394,"slug":6937,"stem":6938,"summary":6939,"tags":13395,"updatedAt":245,"visible":93,"__hash__":6943},{"type":7,"value":13247,"toc":13383},[13248,13250,13252,13254,13256,13260,13262,13264,13282,13284,13286,13334,13336,13341,13343,13345,13353,13355,13365,13367,13375,13377,13379,13381],[10,13249,6756],{},[14,13251,16],{"id":16},[10,13253,6761],{},[14,13255,22],{"id":22},[10,13257,13258],{},[26,13259],{"alt":6768,"src":6769},[10,13261,6772],{},[14,13263,39],{"id":39},[41,13265,13266,13270,13276],{},[44,13267,13268,6782],{},[33,13269,6781],{},[44,13271,13272,6788,13274,376],{},[33,13273,6787],{},[33,13275,6791],{},[44,13277,6794,13278,6798,13280,6802],{},[33,13279,6797],{},[33,13281,6801],{},[14,13283,67],{"id":67},[10,13285,70],{},[72,13287,13288],{"className":74,"code":6809,"language":76,"meta":77,"style":77},[33,13289,13290,13294,13298,13302,13306,13310,13314,13318,13322,13326,13330],{"__ignoreMap":77},[81,13291,13292],{"class":83,"line":84},[81,13293,6613],{},[81,13295,13296],{"class":83,"line":90},[81,13297,94],{"emptyLinePlaceholder":93},[81,13299,13300],{"class":83,"line":97},[81,13301,6824],{},[81,13303,13304],{"class":83,"line":103},[81,13305,6829],{},[81,13307,13308],{"class":83,"line":109},[81,13309,6834],{},[81,13311,13312],{"class":83,"line":115},[81,13313,6839],{},[81,13315,13316],{"class":83,"line":121},[81,13317,94],{"emptyLinePlaceholder":93},[81,13319,13320],{"class":83,"line":127},[81,13321,6848],{},[81,13323,13324],{"class":83,"line":132},[81,13325,6853],{},[81,13327,13328],{"class":83,"line":138},[81,13329,6858],{},[81,13331,13332],{"class":83,"line":144},[81,13333,6863],{},[10,13335,156],{},[72,13337,13339],{"className":13338,"code":6869,"language":162,"meta":77},[160],[33,13340,6869],{"__ignoreMap":77},[10,13342,167],{},[14,13344,170],{"id":170},[172,13346,13347,13351],{},[44,13348,6880,13349,6883],{},[33,13350,6797],{},[44,13352,6886],{},[14,13354,190],{"id":190},[41,13356,13357,13361],{},[44,13358,46,13359,6895],{},[33,13360,6781],{},[44,13362,6898,13363,376],{},[33,13364,6901],{},[14,13366,207],{"id":207},[172,13368,13369,13371],{},[44,13370,6908],{},[44,13372,6911,13373,6914],{},[33,13374,350],{},[10,13376,218],{},[14,13378,221],{"id":221},[10,13380,6921],{},[226,13382,228],{},{"title":77,"searchDepth":90,"depth":90,"links":13384},[13385,13386,13387,13388,13389,13390,13391,13392],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":6751,"description":6756},[239,6941,6942],{"id":6945,"title":6946,"body":13397,"category":239,"cover":240,"description":6951,"extension":241,"meta":13540,"navigation":93,"path":7119,"pinned":244,"publishedAt":245,"seo":13541,"slug":7121,"stem":7122,"summary":7123,"tags":13542,"updatedAt":245,"visible":93,"__hash__":7127},{"type":7,"value":13398,"toc":13530},[13399,13401,13403,13405,13407,13411,13417,13419,13429,13431,13433,13485,13487,13492,13494,13496,13506,13508,13514,13516,13522,13524,13526,13528],[10,13400,6951],{},[14,13402,16],{"id":16},[10,13404,6956],{},[14,13406,22],{"id":22},[10,13408,13409],{},[26,13410],{"alt":6963,"src":6964},[10,13412,13413,6970,13415,6974],{},[33,13414,6969],{},[33,13416,6973],{},[14,13418,39],{"id":39},[41,13420,13421,13423,13427],{},[44,13422,6981],{},[44,13424,13425,6987],{},[33,13426,6986],{},[44,13428,6990],{},[14,13430,67],{"id":67},[10,13432,70],{},[72,13434,13435],{"className":74,"code":6997,"language":76,"meta":77,"style":77},[33,13436,13437,13441,13445,13449,13453,13457,13461,13465,13469,13473,13477,13481],{"__ignoreMap":77},[81,13438,13439],{"class":83,"line":84},[81,13440,7004],{},[81,13442,13443],{"class":83,"line":90},[81,13444,94],{"emptyLinePlaceholder":93},[81,13446,13447],{"class":83,"line":97},[81,13448,7013],{},[81,13450,13451],{"class":83,"line":103},[81,13452,94],{"emptyLinePlaceholder":93},[81,13454,13455],{"class":83,"line":109},[81,13456,7022],{},[81,13458,13459],{"class":83,"line":115},[81,13460,7027],{},[81,13462,13463],{"class":83,"line":121},[81,13464,6839],{},[81,13466,13467],{"class":83,"line":127},[81,13468,94],{"emptyLinePlaceholder":93},[81,13470,13471],{"class":83,"line":132},[81,13472,7040],{},[81,13474,13475],{"class":83,"line":138},[81,13476,7045],{},[81,13478,13479],{"class":83,"line":144},[81,13480,6858],{},[81,13482,13483],{"class":83,"line":150},[81,13484,7054],{},[10,13486,156],{},[72,13488,13490],{"className":13489,"code":7060,"language":162,"meta":77},[160],[33,13491,7060],{"__ignoreMap":77},[10,13493,167],{},[14,13495,170],{"id":170},[172,13497,13498,13502],{},[44,13499,13500,7073],{},[33,13501,6969],{},[44,13503,13504,7078],{},[33,13505,6973],{},[14,13507,190],{"id":190},[41,13509,13510,13512],{},[44,13511,7085],{},[44,13513,7088],{},[14,13515,207],{"id":207},[172,13517,13518,13520],{},[44,13519,7095],{},[44,13521,7098],{},[10,13523,218],{},[14,13525,221],{"id":221},[10,13527,7105],{},[226,13529,228],{},{"title":77,"searchDepth":90,"depth":90,"links":13531},[13532,13533,13534,13535,13536,13537,13538,13539],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":6946,"description":6951},[239,7125,7126],{"id":4,"title":5,"body":13544,"category":239,"cover":240,"description":12,"extension":241,"meta":13695,"navigation":93,"path":243,"pinned":244,"publishedAt":245,"seo":13696,"slug":247,"stem":248,"summary":249,"tags":13697,"updatedAt":245,"visible":93,"__hash__":253},{"type":7,"value":13545,"toc":13685},[13546,13548,13550,13552,13554,13558,13562,13564,13578,13580,13582,13634,13636,13641,13643,13645,13657,13659,13669,13671,13677,13679,13681,13683],[10,13547,12],{},[14,13549,16],{"id":16},[10,13551,19],{},[14,13553,22],{"id":22},[10,13555,13556],{},[26,13557],{"alt":28,"src":29},[10,13559,13560,36],{},[33,13561,35],{},[14,13563,39],{"id":39},[41,13565,13566,13572,13576],{},[44,13567,46,13568,50,13570,54],{},[33,13569,49],{},[33,13571,53],{},[44,13573,57,13574,61],{},[33,13575,60],{},[44,13577,64],{},[14,13579,67],{"id":67},[10,13581,70],{},[72,13583,13584],{"className":74,"code":75,"language":76,"meta":77,"style":77},[33,13585,13586,13590,13594,13598,13602,13606,13610,13614,13618,13622,13626,13630],{"__ignoreMap":77},[81,13587,13588],{"class":83,"line":84},[81,13589,87],{},[81,13591,13592],{"class":83,"line":90},[81,13593,94],{"emptyLinePlaceholder":93},[81,13595,13596],{"class":83,"line":97},[81,13597,100],{},[81,13599,13600],{"class":83,"line":103},[81,13601,106],{},[81,13603,13604],{"class":83,"line":109},[81,13605,112],{},[81,13607,13608],{"class":83,"line":115},[81,13609,118],{},[81,13611,13612],{"class":83,"line":121},[81,13613,124],{},[81,13615,13616],{"class":83,"line":127},[81,13617,94],{"emptyLinePlaceholder":93},[81,13619,13620],{"class":83,"line":132},[81,13621,135],{},[81,13623,13624],{"class":83,"line":138},[81,13625,141],{},[81,13627,13628],{"class":83,"line":144},[81,13629,147],{},[81,13631,13632],{"class":83,"line":150},[81,13633,153],{},[10,13635,156],{},[72,13637,13639],{"className":13638,"code":161,"language":162,"meta":77},[160],[33,13640,161],{"__ignoreMap":77},[10,13642,167],{},[14,13644,170],{"id":170},[172,13646,13647,13653],{},[44,13648,13649,179,13651,182],{},[33,13650,178],{},[33,13652,60],{},[44,13654,13655,187],{},[33,13656,35],{},[14,13658,190],{"id":190},[41,13660,13661,13663],{},[44,13662,195],{},[44,13664,198,13665,201,13667,204],{},[33,13666,49],{},[33,13668,53],{},[14,13670,207],{"id":207},[172,13672,13673,13675],{},[44,13674,212],{},[44,13676,215],{},[10,13678,218],{},[14,13680,221],{"id":221},[10,13682,224],{},[226,13684,228],{},{"title":77,"searchDepth":90,"depth":90,"links":13686},[13687,13688,13689,13690,13691,13692,13693,13694],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":5,"description":12},[239,251,252],{"id":7284,"title":7285,"body":13699,"category":239,"cover":240,"description":7290,"extension":241,"meta":13913,"navigation":93,"path":7564,"pinned":244,"publishedAt":245,"seo":13914,"slug":7566,"stem":7567,"summary":7568,"tags":13915,"updatedAt":245,"visible":93,"__hash__":7572},{"type":7,"value":13700,"toc":13900},[13701,13703,13705,13707,13709,13713,13719,13721,13733,13735,13737,13797,13799,13804,13806,13808,13826,13828,13836,13840,13848,13850,13854,13858,13864,13866,13876,13878,13892,13894,13896,13898],[10,13702,7290],{},[14,13704,16],{"id":16},[10,13706,7295],{},[14,13708,22],{"id":22},[10,13710,13711],{},[26,13712],{"alt":7302,"src":7303},[10,13714,7306,13715,7310,13717,7314],{},[33,13716,7309],{},[33,13718,7313],{},[14,13720,39],{"id":39},[41,13722,13723,13727,13731],{},[44,13724,7321,13725,7324],{},[33,13726,7309],{},[44,13728,13729,7330],{},[33,13730,7329],{},[44,13732,7333],{},[14,13734,67],{"id":67},[10,13736,70],{},[72,13738,13739],{"className":74,"code":7340,"language":76,"meta":77,"style":77},[33,13740,13741,13745,13749,13753,13757,13761,13765,13769,13773,13777,13781,13785,13789,13793],{"__ignoreMap":77},[81,13742,13743],{"class":83,"line":84},[81,13744,7347],{},[81,13746,13747],{"class":83,"line":90},[81,13748,7352],{},[81,13750,13751],{"class":83,"line":97},[81,13752,7357],{},[81,13754,13755],{"class":83,"line":103},[81,13756,7362],{},[81,13758,13759],{"class":83,"line":109},[81,13760,7367],{},[81,13762,13763],{"class":83,"line":115},[81,13764,94],{"emptyLinePlaceholder":93},[81,13766,13767],{"class":83,"line":121},[81,13768,7376],{},[81,13770,13771],{"class":83,"line":127},[81,13772,7381],{},[81,13774,13775],{"class":83,"line":132},[81,13776,7386],{},[81,13778,13779],{"class":83,"line":138},[81,13780,7391],{},[81,13782,13783],{"class":83,"line":144},[81,13784,1160],{},[81,13786,13787],{"class":83,"line":150},[81,13788,7400],{},[81,13790,13791],{"class":83,"line":7403},[81,13792,7406],{},[81,13794,13795],{"class":83,"line":7409},[81,13796,7412],{},[10,13798,156],{},[72,13800,13802],{"className":13801,"code":7418,"language":162,"meta":77},[160],[33,13803,7418],{"__ignoreMap":77},[10,13805,167],{},[14,13807,170],{"id":170},[172,13809,13810,13818],{},[44,13811,13812,7431,13814,7434,13816,7438],{},[33,13813,3049],{},[33,13815,7329],{},[33,13817,7437],{},[44,13819,7441,13820,7444,13822,7447,13824,376],{},[33,13821,7309],{},[33,13823,1174],{},[33,13825,7313],{},[342,13827,2710],{"id":2710},[10,13829,13830,2271,13832,1171,13834,7460],{},[33,13831,7309],{},[33,13833,1174],{},[33,13835,7313],{},[10,13837,13838],{},[26,13839],{"alt":7465,"src":7466},[10,13841,13842,7471,13844,7474,13846,7477],{},[33,13843,7309],{},[33,13845,1174],{},[33,13847,7313],{},[342,13849,2710],{"id":4231},[10,13851,13852,7485],{},[33,13853,7484],{},[10,13855,13856],{},[26,13857],{"alt":7490,"src":7491},[10,13859,7494,13860,7497,13862,7500],{},[33,13861,7484],{},[33,13863,1174],{},[14,13865,190],{"id":190},[41,13867,13868,13872],{},[44,13869,7507,13870,7511],{},[33,13871,7510],{},[44,13873,7514,13874,7517],{},[33,13875,7484],{},[14,13877,207],{"id":207},[172,13879,13880,13888],{},[44,13881,7524,13882,7528,13884,1171,13886,376],{},[33,13883,7527],{},[33,13885,7531],{},[33,13887,7534],{},[44,13889,7537,13890,7540],{},[33,13891,6791],{},[10,13893,218],{},[14,13895,221],{"id":221},[10,13897,7547],{},[226,13899,228],{},{"title":77,"searchDepth":90,"depth":90,"links":13901},[13902,13903,13904,13905,13906,13910,13911,13912],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":13907},[13908,13909],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":7285,"description":7290},[239,7570,7571],{"id":7574,"title":7575,"body":13917,"category":239,"cover":240,"description":7580,"extension":241,"meta":14068,"navigation":93,"path":7757,"pinned":244,"publishedAt":245,"seo":14069,"slug":7759,"stem":7760,"summary":7761,"tags":14070,"updatedAt":245,"visible":93,"__hash__":7764},{"type":7,"value":13918,"toc":14058},[13919,13921,13923,13925,13927,13931,13935,13937,13949,13951,13953,14001,14003,14008,14010,14012,14022,14024,14034,14036,14050,14052,14054,14056],[10,13920,7580],{},[14,13922,16],{"id":16},[10,13924,7585],{},[14,13926,22],{"id":22},[10,13928,13929],{},[26,13930],{"alt":7592,"src":7593},[10,13932,7596,13933,7599],{},[33,13934,6801],{},[14,13936,39],{"id":39},[41,13938,13939,13943,13947],{},[44,13940,13941,7608],{},[33,13942,6801],{},[44,13944,13945,7614],{},[33,13946,7613],{},[44,13948,7617],{},[14,13950,67],{"id":67},[10,13952,70],{},[72,13954,13955],{"className":74,"code":7624,"language":76,"meta":77,"style":77},[33,13956,13957,13961,13965,13969,13973,13977,13981,13985,13989,13993,13997],{"__ignoreMap":77},[81,13958,13959],{"class":83,"line":84},[81,13960,6613],{},[81,13962,13963],{"class":83,"line":90},[81,13964,94],{"emptyLinePlaceholder":93},[81,13966,13967],{"class":83,"line":97},[81,13968,6824],{},[81,13970,13971],{"class":83,"line":103},[81,13972,94],{"emptyLinePlaceholder":93},[81,13974,13975],{"class":83,"line":109},[81,13976,7647],{},[81,13978,13979],{"class":83,"line":115},[81,13980,7652],{},[81,13982,13983],{"class":83,"line":121},[81,13984,94],{"emptyLinePlaceholder":93},[81,13986,13987],{"class":83,"line":127},[81,13988,7661],{},[81,13990,13991],{"class":83,"line":132},[81,13992,7666],{},[81,13994,13995],{"class":83,"line":138},[81,13996,94],{"emptyLinePlaceholder":93},[81,13998,13999],{"class":83,"line":144},[81,14000,7675],{},[10,14002,156],{},[72,14004,14006],{"className":14005,"code":7681,"language":162,"meta":77},[160],[33,14007,7681],{"__ignoreMap":77},[10,14009,167],{},[14,14011,170],{"id":170},[172,14013,14014,14020],{},[44,14015,7596,14016,7694,14018,376],{},[33,14017,6801],{},[33,14019,7697],{},[44,14021,7700],{},[14,14023,190],{"id":190},[41,14025,14026,14030],{},[44,14027,4799,14028,7709],{},[33,14029,6801],{},[44,14031,7712,14032,7715],{},[33,14033,6801],{},[14,14035,207],{"id":207},[172,14037,14038,14044],{},[44,14039,7722,14040,7726,14042,376],{},[33,14041,7725],{},[33,14043,6801],{},[44,14045,4799,14046,7733,14048,376],{},[33,14047,6801],{},[33,14049,7736],{},[10,14051,218],{},[14,14053,221],{"id":221},[10,14055,7743],{},[226,14057,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14059},[14060,14061,14062,14063,14064,14065,14066,14067],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":7575,"description":7580},[239,6801,7763],{"id":7766,"title":7767,"body":14072,"category":239,"cover":240,"description":7772,"extension":241,"meta":14243,"navigation":93,"path":7985,"pinned":244,"publishedAt":245,"seo":14244,"slug":7987,"stem":7988,"summary":7989,"tags":14245,"updatedAt":245,"visible":93,"__hash__":7993},{"type":7,"value":14073,"toc":14231},[14074,14076,14078,14080,14082,14086,14088,14090,14102,14104,14106,14162,14164,14169,14171,14173,14189,14191,14193,14197,14203,14205,14213,14215,14223,14225,14227,14229],[10,14075,7772],{},[14,14077,16],{"id":16},[10,14079,7777],{},[14,14081,22],{"id":22},[10,14083,14084],{},[26,14085],{"alt":7784,"src":7785},[10,14087,7788],{},[14,14089,39],{"id":39},[41,14091,14092,14096,14100],{},[44,14093,14094,7798],{},[33,14095,7797],{},[44,14097,14098,7804],{},[33,14099,7803],{},[44,14101,7807],{},[14,14103,67],{"id":67},[10,14105,70],{},[72,14107,14108],{"className":74,"code":7814,"language":76,"meta":77,"style":77},[33,14109,14110,14114,14118,14122,14126,14130,14134,14138,14142,14146,14150,14154,14158],{"__ignoreMap":77},[81,14111,14112],{"class":83,"line":84},[81,14113,7821],{},[81,14115,14116],{"class":83,"line":90},[81,14117,7826],{},[81,14119,14120],{"class":83,"line":97},[81,14121,7831],{},[81,14123,14124],{"class":83,"line":103},[81,14125,7836],{},[81,14127,14128],{"class":83,"line":109},[81,14129,94],{"emptyLinePlaceholder":93},[81,14131,14132],{"class":83,"line":115},[81,14133,7845],{},[81,14135,14136],{"class":83,"line":121},[81,14137,7850],{},[81,14139,14140],{"class":83,"line":127},[81,14141,7855],{},[81,14143,14144],{"class":83,"line":132},[81,14145,7860],{},[81,14147,14148],{"class":83,"line":138},[81,14149,94],{"emptyLinePlaceholder":93},[81,14151,14152],{"class":83,"line":144},[81,14153,7869],{},[81,14155,14156],{"class":83,"line":150},[81,14157,7874],{},[81,14159,14160],{"class":83,"line":7403},[81,14161,7879],{},[10,14163,156],{},[72,14165,14167],{"className":14166,"code":7885,"language":162,"meta":77},[160],[33,14168,7885],{"__ignoreMap":77},[10,14170,167],{},[14,14172,170],{"id":170},[172,14174,14175,14181],{},[44,14176,7896,14177,7900,14179,7903],{},[33,14178,7899],{},[33,14180,7803],{},[44,14182,14183,7909,14185,7913,14187,7916],{},[33,14184,7908],{},[33,14186,7912],{},[33,14188,7797],{},[342,14190,2710],{"id":2710},[10,14192,7921],{},[10,14194,14195],{},[26,14196],{"alt":7926,"src":7927},[10,14198,7930,14199,1171,14201,7936],{},[33,14200,4596],{},[33,14202,7935],{},[14,14204,190],{"id":190},[41,14206,14207,14211],{},[44,14208,7943,14209,7946],{},[33,14210,7797],{},[44,14212,7949],{},[14,14214,207],{"id":207},[172,14216,14217,14221],{},[44,14218,5309,14219,7959],{},[33,14220,7958],{},[44,14222,7962],{},[10,14224,218],{},[14,14226,221],{"id":221},[10,14228,7969],{},[226,14230,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14232},[14233,14234,14235,14236,14237,14240,14241,14242],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":14238},[14239],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":7767,"description":7772},[239,7991,7992],{"id":7995,"title":7996,"body":14247,"category":239,"cover":240,"description":8001,"extension":241,"meta":14394,"navigation":93,"path":8180,"pinned":244,"publishedAt":245,"seo":14395,"slug":8182,"stem":8183,"summary":8184,"tags":14396,"updatedAt":245,"visible":93,"__hash__":8188},{"type":7,"value":14248,"toc":14384},[14249,14251,14253,14255,14257,14261,14263,14265,14273,14275,14277,14333,14335,14340,14342,14344,14356,14358,14364,14366,14376,14378,14380,14382],[10,14250,8001],{},[14,14252,16],{"id":16},[10,14254,8006],{},[14,14256,22],{"id":22},[10,14258,14259],{},[26,14260],{"alt":8013,"src":8014},[10,14262,8017],{},[14,14264,39],{"id":39},[41,14266,14267,14269,14271],{},[44,14268,8024],{},[44,14270,8027],{},[44,14272,8030],{},[14,14274,67],{"id":67},[10,14276,70],{},[72,14278,14279],{"className":74,"code":8037,"language":76,"meta":77,"style":77},[33,14280,14281,14285,14289,14293,14297,14301,14305,14309,14313,14317,14321,14325,14329],{"__ignoreMap":77},[81,14282,14283],{"class":83,"line":84},[81,14284,8044],{},[81,14286,14287],{"class":83,"line":90},[81,14288,8049],{},[81,14290,14291],{"class":83,"line":97},[81,14292,8054],{},[81,14294,14295],{"class":83,"line":103},[81,14296,94],{"emptyLinePlaceholder":93},[81,14298,14299],{"class":83,"line":109},[81,14300,8063],{},[81,14302,14303],{"class":83,"line":115},[81,14304,8068],{},[81,14306,14307],{"class":83,"line":121},[81,14308,8073],{},[81,14310,14311],{"class":83,"line":127},[81,14312,94],{"emptyLinePlaceholder":93},[81,14314,14315],{"class":83,"line":132},[81,14316,8082],{},[81,14318,14319],{"class":83,"line":138},[81,14320,8087],{},[81,14322,14323],{"class":83,"line":144},[81,14324,94],{"emptyLinePlaceholder":93},[81,14326,14327],{"class":83,"line":150},[81,14328,8096],{},[81,14330,14331],{"class":83,"line":7403},[81,14332,8101],{},[10,14334,156],{},[72,14336,14338],{"className":14337,"code":8107,"language":162,"meta":77},[160],[33,14339,8107],{"__ignoreMap":77},[10,14341,167],{},[14,14343,170],{"id":170},[172,14345,14346,14352],{},[44,14347,14348,8121,14350,8125],{},[33,14349,8120],{},[33,14351,8124],{},[44,14353,8128,14354,8132],{},[33,14355,8131],{},[14,14357,190],{"id":190},[41,14359,14360,14362],{},[44,14361,8139],{},[44,14363,8142],{},[14,14365,207],{"id":207},[172,14367,14368,14374],{},[44,14369,8149,14370,8153,14372,376],{},[33,14371,8152],{},[33,14373,8156],{},[44,14375,8159],{},[10,14377,218],{},[14,14379,221],{"id":221},[10,14381,8166],{},[226,14383,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14385},[14386,14387,14388,14389,14390,14391,14392,14393],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":7996,"description":8001},[239,8186,8187],{"id":8190,"title":8191,"body":14398,"category":239,"cover":240,"description":8196,"extension":241,"meta":14561,"navigation":93,"path":8400,"pinned":244,"publishedAt":245,"seo":14562,"slug":8402,"stem":8403,"summary":8404,"tags":14563,"updatedAt":245,"visible":93,"__hash__":8408},{"type":7,"value":14399,"toc":14549},[14400,14402,14404,14406,14408,14412,14416,14418,14434,14436,14438,14482,14484,14489,14491,14493,14507,14509,14513,14517,14521,14523,14529,14531,14541,14543,14545,14547],[10,14401,8196],{},[14,14403,16],{"id":16},[10,14405,8201],{},[14,14407,22],{"id":22},[10,14409,14410],{},[26,14411],{"alt":8208,"src":8209},[10,14413,8212,14414,8216],{},[33,14415,8215],{},[14,14417,39],{"id":39},[41,14419,14420,14426,14432],{},[44,14421,14422,8226,14424,8230],{},[33,14423,8225],{},[33,14425,8229],{},[44,14427,8233,14428,8237,14430,8240],{},[33,14429,8236],{},[33,14431,4350],{},[44,14433,8243],{},[14,14435,67],{"id":67},[10,14437,70],{},[72,14439,14440],{"className":74,"code":8250,"language":76,"meta":77,"style":77},[33,14441,14442,14446,14450,14454,14458,14462,14466,14470,14474,14478],{"__ignoreMap":77},[81,14443,14444],{"class":83,"line":84},[81,14445,8257],{},[81,14447,14448],{"class":83,"line":90},[81,14449,8262],{},[81,14451,14452],{"class":83,"line":97},[81,14453,8267],{},[81,14455,14456],{"class":83,"line":103},[81,14457,8272],{},[81,14459,14460],{"class":83,"line":109},[81,14461,8277],{},[81,14463,14464],{"class":83,"line":115},[81,14465,94],{"emptyLinePlaceholder":93},[81,14467,14468],{"class":83,"line":121},[81,14469,8286],{},[81,14471,14472],{"class":83,"line":127},[81,14473,8291],{},[81,14475,14476],{"class":83,"line":132},[81,14477,8291],{},[81,14479,14480],{"class":83,"line":138},[81,14481,8291],{},[10,14483,156],{},[72,14485,14487],{"className":14486,"code":8305,"language":162,"meta":77},[160],[33,14488,8305],{"__ignoreMap":77},[10,14490,167],{},[14,14492,170],{"id":170},[172,14494,14495,14499],{},[44,14496,7896,14497,8319],{},[33,14498,8318],{},[44,14500,8322,14501,8325,14503,8328,14505,8332],{},[33,14502,8229],{},[33,14504,8215],{},[33,14506,8331],{},[342,14508,2710],{"id":2710},[10,14510,8337,14511,8340],{},[33,14512,8229],{},[10,14514,14515],{},[26,14516],{"alt":8345,"src":8346},[10,14518,8349,14519,8352],{},[33,14520,8215],{},[14,14522,190],{"id":190},[41,14524,14525,14527],{},[44,14526,8359],{},[44,14528,8362],{},[14,14530,207],{"id":207},[172,14532,14533,14535],{},[44,14534,8369],{},[44,14536,4023,14537,8374,14539,8377],{},[33,14538,4350],{},[33,14540,8229],{},[10,14542,218],{},[14,14544,221],{"id":221},[10,14546,8384],{},[226,14548,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14550},[14551,14552,14553,14554,14555,14558,14559,14560],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":14556},[14557],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":8191,"description":8196},[239,8406,8407],{"id":8410,"title":8411,"body":14565,"category":239,"cover":240,"description":8416,"extension":241,"meta":14748,"navigation":93,"path":8641,"pinned":244,"publishedAt":245,"seo":14749,"slug":8643,"stem":8644,"summary":8645,"tags":14750,"updatedAt":245,"visible":93,"__hash__":8648},{"type":7,"value":14566,"toc":14736},[14567,14569,14571,14573,14575,14579,14581,14583,14597,14599,14601,14669,14671,14676,14678,14680,14694,14696,14698,14702,14708,14710,14718,14720,14728,14730,14732,14734],[10,14568,8416],{},[14,14570,16],{"id":16},[10,14572,8421],{},[14,14574,22],{"id":22},[10,14576,14577],{},[26,14578],{"alt":8428,"src":8429},[10,14580,8432],{},[14,14582,39],{"id":39},[41,14584,14585,14591,14593],{},[44,14586,14587,8442,14589,376],{},[33,14588,8441],{},[33,14590,8445],{},[44,14592,8448],{},[44,14594,14595,8454],{},[33,14596,8453],{},[14,14598,67],{"id":67},[10,14600,70],{},[72,14602,14603],{"className":74,"code":8461,"language":76,"meta":77,"style":77},[33,14604,14605,14609,14613,14617,14621,14625,14629,14633,14637,14641,14645,14649,14653,14657,14661,14665],{"__ignoreMap":77},[81,14606,14607],{"class":83,"line":84},[81,14608,8468],{},[81,14610,14611],{"class":83,"line":90},[81,14612,94],{"emptyLinePlaceholder":93},[81,14614,14615],{"class":83,"line":97},[81,14616,8477],{},[81,14618,14619],{"class":83,"line":103},[81,14620,8482],{},[81,14622,14623],{"class":83,"line":109},[81,14624,8487],{},[81,14626,14627],{"class":83,"line":115},[81,14628,8492],{},[81,14630,14631],{"class":83,"line":121},[81,14632,8497],{},[81,14634,14635],{"class":83,"line":127},[81,14636,8502],{},[81,14638,14639],{"class":83,"line":132},[81,14640,8507],{},[81,14642,14643],{"class":83,"line":138},[81,14644,8512],{},[81,14646,14647],{"class":83,"line":144},[81,14648,94],{"emptyLinePlaceholder":93},[81,14650,14651],{"class":83,"line":150},[81,14652,8521],{},[81,14654,14655],{"class":83,"line":7403},[81,14656,6192],{},[81,14658,14659],{"class":83,"line":7409},[81,14660,6197],{},[81,14662,14663],{"class":83,"line":8532},[81,14664,94],{"emptyLinePlaceholder":93},[81,14666,14667],{"class":83,"line":8537},[81,14668,8540],{},[10,14670,156],{},[72,14672,14674],{"className":14673,"code":8546,"language":162,"meta":77},[160],[33,14675,8546],{"__ignoreMap":77},[10,14677,167],{},[14,14679,170],{"id":170},[172,14681,14682,14692],{},[44,14683,8557,14684,8561,14686,8565,14688,8569,14690,376],{},[33,14685,8560],{},[33,14687,8564],{},[33,14689,8568],{},[33,14691,8560],{},[44,14693,8574],{},[342,14695,2710],{"id":2710},[10,14697,8579],{},[10,14699,14700],{},[26,14701],{"alt":8584,"src":8585},[10,14703,14704,8590,14706,376],{},[33,14705,8441],{},[33,14707,8445],{},[14,14709,190],{"id":190},[41,14711,14712,14716],{},[44,14713,8599,14714,376],{},[33,14715,5392],{},[44,14717,8604],{},[14,14719,207],{"id":207},[172,14721,14722,14724],{},[44,14723,8611],{},[44,14725,8614,14726,8618],{},[33,14727,8617],{},[10,14729,218],{},[14,14731,221],{"id":221},[10,14733,8625],{},[226,14735,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14737},[14738,14739,14740,14741,14742,14745,14746,14747],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":14743},[14744],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":8411,"description":8416},[239,8647,5343],{"id":8650,"title":8651,"body":14752,"category":239,"cover":240,"description":8656,"extension":241,"meta":14911,"navigation":93,"path":8844,"pinned":244,"publishedAt":245,"seo":14912,"slug":8846,"stem":8847,"summary":8848,"tags":14913,"updatedAt":245,"visible":93,"__hash__":8852},{"type":7,"value":14753,"toc":14899},[14754,14756,14758,14760,14762,14766,14768,14770,14778,14780,14782,14846,14848,14853,14855,14857,14865,14867,14869,14873,14875,14877,14883,14885,14891,14893,14895,14897],[10,14755,8656],{},[14,14757,16],{"id":16},[10,14759,8661],{},[14,14761,22],{"id":22},[10,14763,14764],{},[26,14765],{"alt":8668,"src":8669},[10,14767,8672],{},[14,14769,39],{"id":39},[41,14771,14772,14774,14776],{},[44,14773,8679],{},[44,14775,8682],{},[44,14777,8685],{},[14,14779,67],{"id":67},[10,14781,70],{},[72,14783,14784],{"className":74,"code":8692,"language":76,"meta":77,"style":77},[33,14785,14786,14790,14794,14798,14802,14806,14810,14814,14818,14822,14826,14830,14834,14838,14842],{"__ignoreMap":77},[81,14787,14788],{"class":83,"line":84},[81,14789,8699],{},[81,14791,14792],{"class":83,"line":90},[81,14793,8704],{},[81,14795,14796],{"class":83,"line":97},[81,14797,94],{"emptyLinePlaceholder":93},[81,14799,14800],{"class":83,"line":103},[81,14801,8713],{},[81,14803,14804],{"class":83,"line":109},[81,14805,94],{"emptyLinePlaceholder":93},[81,14807,14808],{"class":83,"line":115},[81,14809,8722],{},[81,14811,14812],{"class":83,"line":121},[81,14813,8727],{},[81,14815,14816],{"class":83,"line":127},[81,14817,8732],{},[81,14819,14820],{"class":83,"line":132},[81,14821,94],{"emptyLinePlaceholder":93},[81,14823,14824],{"class":83,"line":138},[81,14825,8741],{},[81,14827,14828],{"class":83,"line":144},[81,14829,8746],{},[81,14831,14832],{"class":83,"line":150},[81,14833,8751],{},[81,14835,14836],{"class":83,"line":7403},[81,14837,94],{"emptyLinePlaceholder":93},[81,14839,14840],{"class":83,"line":7409},[81,14841,6206],{},[81,14843,14844],{"class":83,"line":8532},[81,14845,8764],{},[10,14847,156],{},[72,14849,14851],{"className":14850,"code":8770,"language":162,"meta":77},[160],[33,14852,8770],{"__ignoreMap":77},[10,14854,167],{},[14,14856,170],{"id":170},[172,14858,14859,14863],{},[44,14860,14861,8784],{},[33,14862,8783],{},[44,14864,8787],{},[342,14866,2710],{"id":2710},[10,14868,8792],{},[10,14870,14871],{},[26,14872],{"alt":8797,"src":8798},[10,14874,8801],{},[14,14876,190],{"id":190},[41,14878,14879,14881],{},[44,14880,8808],{},[44,14882,8811],{},[14,14884,207],{"id":207},[172,14886,14887,14889],{},[44,14888,8818],{},[44,14890,8821],{},[10,14892,218],{},[14,14894,221],{"id":221},[10,14896,8828],{},[226,14898,228],{},{"title":77,"searchDepth":90,"depth":90,"links":14900},[14901,14902,14903,14904,14905,14908,14909,14910],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":14906},[14907],{"id":2710,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":8651,"description":8656},[239,8850,8851],{"id":8854,"title":8855,"body":14915,"category":239,"cover":240,"description":8860,"extension":241,"meta":15153,"navigation":93,"path":9161,"pinned":244,"publishedAt":245,"seo":15154,"slug":9163,"stem":9164,"summary":9165,"tags":15155,"updatedAt":245,"visible":93,"__hash__":9169},{"type":7,"value":14916,"toc":15140},[14917,14919,14921,14923,14925,14929,14931,14933,14943,14945,14947,15063,15065,15070,15072,15074,15084,15086,15088,15092,15094,15096,15098,15102,15106,15108,15116,15118,15132,15134,15136,15138],[10,14918,8860],{},[14,14920,16],{"id":16},[10,14922,8865],{},[14,14924,22],{"id":22},[10,14926,14927],{},[26,14928],{"alt":8872,"src":8873},[10,14930,8876],{},[14,14932,39],{"id":39},[41,14934,14935,14937,14939],{},[44,14936,8883],{},[44,14938,8886],{},[44,14940,8889,14941,8893],{},[33,14942,8892],{},[14,14944,67],{"id":67},[10,14946,70],{},[72,14948,14949],{"className":74,"code":8900,"language":76,"meta":77,"style":77},[33,14950,14951,14955,14959,14963,14967,14971,14975,14979,14983,14987,14991,14995,14999,15003,15007,15011,15015,15019,15023,15027,15031,15035,15039,15043,15047,15051,15055,15059],{"__ignoreMap":77},[81,14952,14953],{"class":83,"line":84},[81,14954,7004],{},[81,14956,14957],{"class":83,"line":90},[81,14958,6613],{},[81,14960,14961],{"class":83,"line":97},[81,14962,94],{"emptyLinePlaceholder":93},[81,14964,14965],{"class":83,"line":103},[81,14966,8919],{},[81,14968,14969],{"class":83,"line":109},[81,14970,8924],{},[81,14972,14973],{"class":83,"line":115},[81,14974,8929],{},[81,14976,14977],{"class":83,"line":121},[81,14978,8934],{},[81,14980,14981],{"class":83,"line":127},[81,14982,94],{"emptyLinePlaceholder":93},[81,14984,14985],{"class":83,"line":132},[81,14986,8943],{},[81,14988,14989],{"class":83,"line":138},[81,14990,8948],{},[81,14992,14993],{"class":83,"line":144},[81,14994,8953],{},[81,14996,14997],{"class":83,"line":150},[81,14998,8958],{},[81,15000,15001],{"class":83,"line":7403},[81,15002,8963],{},[81,15004,15005],{"class":83,"line":7409},[81,15006,94],{"emptyLinePlaceholder":93},[81,15008,15009],{"class":83,"line":8532},[81,15010,8972],{},[81,15012,15013],{"class":83,"line":8537},[81,15014,8977],{},[81,15016,15017],{"class":83,"line":8980},[81,15018,8983],{},[81,15020,15021],{"class":83,"line":8986},[81,15022,94],{"emptyLinePlaceholder":93},[81,15024,15025],{"class":83,"line":8991},[81,15026,8994],{},[81,15028,15029],{"class":83,"line":8997},[81,15030,94],{"emptyLinePlaceholder":93},[81,15032,15033],{"class":83,"line":9002},[81,15034,7376],{},[81,15036,15037],{"class":83,"line":9007},[81,15038,9010],{},[81,15040,15041],{"class":83,"line":9013},[81,15042,9016],{},[81,15044,15045],{"class":83,"line":9019},[81,15046,9022],{},[81,15048,15049],{"class":83,"line":9025},[81,15050,7386],{},[81,15052,15053],{"class":83,"line":9030},[81,15054,9033],{},[81,15056,15057],{"class":83,"line":9036},[81,15058,1160],{},[81,15060,15061],{"class":83,"line":9041},[81,15062,9044],{},[10,15064,156],{},[72,15066,15068],{"className":15067,"code":9050,"language":162,"meta":77},[160],[33,15069,9050],{"__ignoreMap":77},[10,15071,167],{},[14,15073,170],{"id":170},[172,15075,15076,15080],{},[44,15077,9061,15078,9064],{},[33,15079,8892],{},[44,15081,15082,9069],{},[33,15083,8124],{},[342,15085,2710],{"id":2710},[10,15087,9074],{},[10,15089,15090],{},[26,15091],{"alt":9079,"src":9080},[10,15093,9083],{},[342,15095,2710],{"id":4231},[10,15097,9088],{},[10,15099,15100],{},[26,15101],{"alt":9093,"src":9094},[10,15103,9097,15104,9101],{},[33,15105,9100],{},[14,15107,190],{"id":190},[41,15109,15110,15112],{},[44,15111,9108],{},[44,15113,9111,15114,9114],{},[33,15115,9100],{},[14,15117,207],{"id":207},[172,15119,15120,15124,15126],{},[44,15121,9121,15122,9124],{},[33,15123,9100],{},[44,15125,9127],{},[44,15127,9130,15128,9134,15130,9137],{},[33,15129,9133],{},[33,15131,6148],{},[10,15133,218],{},[14,15135,221],{"id":221},[10,15137,9144],{},[226,15139,228],{},{"title":77,"searchDepth":90,"depth":90,"links":15141},[15142,15143,15144,15145,15146,15150,15151,15152],{"id":16,"depth":90,"text":16},{"id":22,"depth":90,"text":22},{"id":39,"depth":90,"text":39},{"id":67,"depth":90,"text":67},{"id":170,"depth":90,"text":170,"children":15147},[15148,15149],{"id":2710,"depth":97,"text":2710},{"id":4231,"depth":97,"text":2710},{"id":190,"depth":90,"text":190},{"id":207,"depth":90,"text":207},{"id":221,"depth":90,"text":221},{},{"title":8855,"description":8860},[239,9167,9168],{"id":1070,"title":1071,"body":15157,"category":239,"cover":1079,"description":77,"extension":241,"meta":15393,"navigation":93,"path":1396,"pinned":244,"publishedAt":1397,"seo":15394,"slug":1399,"stem":1400,"summary":1401,"tags":15395,"updatedAt":1397,"visible":93,"__hash__":1405},{"type":7,"value":15158,"toc":15378},[15159,15163,15165,15167,15169,15171,15191,15193,15198,15200,15202,15230,15236,15238,15242,15244,15264,15266,15276,15278,15280,15282,15284,15286,15288,15290,15292,15294,15314,15316,15318,15322,15324,15326,15328,15330,15334,15336,15354,15356,15358,15360,15362,15364,15366,15368,15370,15372,15374,15376],[10,15160,15161],{},[26,15162],{"alt":1078,"src":1079},[10,15164,1082],{},[10,15166,1085],{},[14,15168,1089],{"id":1088},[10,15170,1092],{},[72,15172,15173],{"className":74,"code":1095,"language":76,"meta":77,"style":77},[33,15174,15175,15179,15183,15187],{"__ignoreMap":77},[81,15176,15177],{"class":83,"line":84},[81,15178,1102],{},[81,15180,15181],{"class":83,"line":90},[81,15182,1107],{},[81,15184,15185],{"class":83,"line":97},[81,15186,94],{"emptyLinePlaceholder":93},[81,15188,15189],{"class":83,"line":103},[81,15190,1116],{},[10,15192,1119],{},[72,15194,15196],{"className":15195,"code":1123,"language":162,"meta":77},[160],[33,15197,1123],{"__ignoreMap":77},[10,15199,1128],{},[10,15201,1131],{},[72,15203,15204],{"className":74,"code":1134,"language":76,"meta":77,"style":77},[33,15205,15206,15210,15214,15218,15222,15226],{"__ignoreMap":77},[81,15207,15208],{"class":83,"line":84},[81,15209,1141],{},[81,15211,15212],{"class":83,"line":90},[81,15213,94],{"emptyLinePlaceholder":93},[81,15215,15216],{"class":83,"line":97},[81,15217,1150],{},[81,15219,15220],{"class":83,"line":103},[81,15221,1155],{},[81,15223,15224],{"class":83,"line":109},[81,15225,1160],{},[81,15227,15228],{"class":83,"line":115},[81,15229,1165],{},[10,15231,15232,1171,15234,1175],{},[33,15233,1170],{},[33,15235,1174],{},[14,15237,1179],{"id":1178},[10,15239,1182,15240,1186],{},[33,15241,1185],{},[10,15243,1189],{},[72,15245,15246],{"className":74,"code":1192,"language":76,"meta":77,"style":77},[33,15247,15248,15252,15256,15260],{"__ignoreMap":77},[81,15249,15250],{"class":83,"line":84},[81,15251,1199],{},[81,15253,15254],{"class":83,"line":90},[81,15255,1204],{},[81,15257,15258],{"class":83,"line":97},[81,15259,1209],{},[81,15261,15262],{"class":83,"line":103},[81,15263,1214],{},[10,15265,1217],{},[72,15267,15268],{"className":605,"code":1220,"language":607,"meta":77,"style":77},[33,15269,15270],{"__ignoreMap":77},[81,15271,15272,15274],{"class":83,"line":84},[81,15273,705],{"class":614},[81,15275,1229],{"class":650},[10,15277,1232],{},[14,15279,1236],{"id":1235},[342,15281,1239],{"id":1239},[10,15283,1242],{},[342,15285,1245],{"id":1245},[10,15287,1248],{},[342,15289,1251],{"id":1251},[10,15291,1254],{},[10,15293,1257],{},[72,15295,15296],{"className":74,"code":1260,"language":76,"meta":77,"style":77},[33,15297,15298,15302,15306,15310],{"__ignoreMap":77},[81,15299,15300],{"class":83,"line":84},[81,15301,1267],{},[81,15303,15304],{"class":83,"line":90},[81,15305,94],{"emptyLinePlaceholder":93},[81,15307,15308],{"class":83,"line":97},[81,15309,1276],{},[81,15311,15312],{"class":83,"line":103},[81,15313,1281],{},[10,15315,1284],{},[342,15317,1287],{"id":1287},[10,15319,1290,15320,1293],{},[33,15321,274],{},[10,15323,1296],{},[342,15325,1299],{"id":1299},[10,15327,1302],{},[14,15329,1306],{"id":1305},[10,15331,15332],{},[26,15333],{"alt":1311,"src":1312},[10,15335,1315],{},[41,15337,15338,15340,15342,15344,15346,15348,15350,15352],{},[44,15339,1320],{},[44,15341,1323],{},[44,15343,1326],{},[44,15345,1329],{},[44,15347,1332],{},[44,15349,1335],{},[44,15351,1338],{},[44,15353,1341],{},[10,15355,1344],{},[14,15357,1348],{"id":1347},[10,15359,1351],{},[10,15361,1354],{},[14,15363,1358],{"id":1357},[10,15365,1361],{},[10,15367,1364],{},[10,15369,1367],{},[14,15371,1370],{"id":1370},[10,15373,1373],{},[10,15375,1376],{},[226,15377,1379],{},{"title":77,"searchDepth":90,"depth":90,"links":15379},[15380,15381,15382,15389,15390,15391,15392],{"id":1088,"depth":90,"text":1089},{"id":1178,"depth":90,"text":1179},{"id":1235,"depth":90,"text":1236,"children":15383},[15384,15385,15386,15387,15388],{"id":1239,"depth":97,"text":1239},{"id":1245,"depth":97,"text":1245},{"id":1251,"depth":97,"text":1251},{"id":1287,"depth":97,"text":1287},{"id":1299,"depth":97,"text":1299},{"id":1305,"depth":90,"text":1306},{"id":1347,"depth":90,"text":1348},{"id":1357,"depth":90,"text":1358},{"id":1370,"depth":90,"text":1370},{},{"title":1071,"description":77},[239,1403,1404],{"id":256,"title":257,"body":15397,"category":239,"cover":240,"description":77,"extension":241,"meta":15976,"navigation":93,"path":1059,"pinned":244,"publishedAt":1060,"seo":15977,"slug":1062,"stem":1063,"summary":1064,"tags":15978,"updatedAt":1060,"visible":93,"__hash__":1068},{"type":7,"value":15398,"toc":15952},[15399,15401,15403,15405,15409,15411,15413,15437,15449,15451,15453,15458,15462,15466,15478,15482,15486,15490,15492,15526,15528,15532,15536,15538,15560,15590,15602,15612,15620,15622,15628,15638,15640,15645,15649,15651,15665,15671,15691,15693,15695,15697,15707,15711,15713,15722,15726,15728,15730,15750,15754,15756,15758,15760,15762,15782,15784,15786,15788,15814,15816,15832,15834,15850,15854,15856,15858,15878,15880,15882,15884,15888,15898,15900,15902,15904,15914,15922,15924,15926,15940,15950],[14,15400,262],{"id":262},[10,15402,265],{},[10,15404,268],{},[10,15406,271,15407,275],{},[33,15408,274],{},[14,15410,278],{"id":278},[10,15412,281],{},[283,15414,15415,15417],{},[10,15416,287],{},[283,15418,15419,15425,15427,15431,15433],{},[10,15420,292,15421,296,15423,300],{},[33,15422,295],{},[33,15424,299],{},[10,15426,303],{},[10,15428,306,15429,311],{},[308,15430,310],{},[10,15432,314],{},[10,15434,15435],{},[26,15436],{"alt":319,"src":320},[283,15438,15439,15441],{},[10,15440,325],{},[283,15442,15443,15445],{},[10,15444,330],{},[10,15446,15447],{},[26,15448],{"alt":335,"src":336},[14,15450,340],{"id":339},[342,15452,345],{"id":344},[10,15454,348,15455,356],{},[350,15456,355],{"href":352,"rel":15457},[354],[283,15459,15460],{},[10,15461,361],{},[10,15463,15464],{},[26,15465],{"alt":366,"src":367},[41,15467,15468,15472,15476],{},[44,15469,372,15470,376],{},[308,15471,375],{},[44,15473,379,15474,376],{},[308,15475,382],{},[44,15477,385],{},[10,15479,15480],{},[26,15481],{"alt":390,"src":391},[283,15483,15484],{},[10,15485,396],{},[10,15487,15488],{},[26,15489],{"alt":401,"src":402},[342,15491,406],{"id":405},[283,15493,15494,15498,15502,15522],{},[283,15495,15496],{},[10,15497,413],{},[10,15499,416,15500,420],{},[308,15501,419],{},[72,15503,15504],{"className":74,"code":423,"language":76,"meta":77,"style":77},[33,15505,15506,15510,15514,15518],{"__ignoreMap":77},[81,15507,15508],{"class":83,"line":84},[81,15509,430],{},[81,15511,15512],{"class":83,"line":90},[81,15513,435],{},[81,15515,15516],{"class":83,"line":97},[81,15517,440],{},[81,15519,15520],{"class":83,"line":103},[81,15521,445],{},[10,15523,448,15524,452],{},[308,15525,451],{},[10,15527,455],{},[10,15529,458,15530,461],{},[33,15531,76],{},[10,15533,15534],{},[26,15535],{"alt":466,"src":467},[10,15537,470],{},[283,15539,15540,15542,15546],{},[10,15541,475],{},[10,15543,15544],{},[308,15545,480],{},[283,15547,15548,15552,15556],{},[10,15549,485,15550,488],{},[33,15551,76],{},[10,15553,491,15554,494],{},[33,15555,76],{},[10,15557,497,15558,501],{},[308,15559,500],{},[283,15561,15562,15564,15568],{},[10,15563,506],{},[10,15565,15566],{},[308,15567,511],{},[283,15569,15570,15576,15584,15586],{},[10,15571,15572,519,15574,523],{},[33,15573,518],{},[33,15575,522],{},[10,15577,526,15578,529,15580,533,15582,537],{},[33,15579,518],{},[308,15581,532],{},[308,15583,536],{},[10,15585,540],{},[10,15587,15588,546],{},[308,15589,545],{},[283,15591,15592,15594],{},[10,15593,551],{},[283,15595,15596,15600],{},[10,15597,556,15598,560],{},[308,15599,559],{},[10,15601,563],{},[283,15603,15604,15608],{},[10,15605,568,15606],{},[308,15607,571],{},[10,15609,15610],{},[26,15611],{"alt":576,"src":577},[283,15613,15614,15616],{},[10,15615,582],{},[10,15617,15618],{},[26,15619],{"alt":576,"src":587},[342,15621,591],{"id":590},[10,15623,594,15624,598,15626,602],{},[33,15625,597],{},[33,15627,601],{},[72,15629,15630],{"className":605,"code":606,"language":607,"meta":77,"style":77},[33,15631,15632],{"__ignoreMap":77},[81,15633,15634,15636],{"class":83,"line":84},[81,15635,76],{"class":614},[81,15637,618],{"class":617},[10,15639,621],{},[72,15641,15643],{"className":15642,"code":625,"language":162,"meta":77},[160],[33,15644,625],{"__ignoreMap":77},[10,15646,15647],{},[26,15648],{"alt":576,"src":632},[10,15650,635],{},[72,15652,15653],{"className":605,"code":638,"language":607,"meta":77,"style":77},[33,15654,15655],{"__ignoreMap":77},[81,15656,15657,15659,15661,15663],{"class":83,"line":84},[81,15658,76],{"class":614},[81,15660,647],{"class":617},[81,15662,651],{"class":650},[81,15664,618],{"class":617},[10,15666,656,15667,659,15669,663],{},[33,15668,76],{},[33,15670,662],{},[72,15672,15673],{"className":605,"code":666,"language":607,"meta":77,"style":77},[33,15674,15675,15681],{"__ignoreMap":77},[81,15676,15677,15679],{"class":83,"line":84},[81,15678,522],{"class":614},[81,15680,618],{"class":617},[81,15682,15683,15685,15687,15689],{"class":83,"line":90},[81,15684,522],{"class":614},[81,15686,647],{"class":617},[81,15688,651],{"class":650},[81,15690,618],{"class":617},[14,15692,688],{"id":687},[342,15694,692],{"id":691},[10,15696,695],{},[72,15698,15699],{"className":605,"code":698,"language":607,"meta":77,"style":77},[33,15700,15701],{"__ignoreMap":77},[81,15702,15703,15705],{"class":83,"line":84},[81,15704,705],{"class":614},[81,15706,618],{"class":617},[10,15708,710,15709,714],{},[33,15710,713],{},[342,15712,718],{"id":717},[10,15714,348,15715,726,15718,376,15720,733],{},[350,15716,725],{"href":723,"rel":15717},[354],[308,15719,729],{},[33,15721,732],{},[10,15723,736,15724,740],{},[33,15725,739],{},[342,15727,744],{"id":743},[10,15729,747],{},[72,15731,15732],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,15733,15734,15740],{"__ignoreMap":77},[81,15735,15736,15738],{"class":83,"line":84},[81,15737,705],{"class":614},[81,15739,618],{"class":617},[81,15741,15742,15744,15746,15748],{"class":83,"line":90},[81,15743,705],{"class":614},[81,15745,647],{"class":617},[81,15747,651],{"class":650},[81,15749,618],{"class":617},[10,15751,771,15752,774],{},[33,15753,705],{},[14,15755,778],{"id":777},[10,15757,781],{},[342,15759,785],{"id":784},[10,15761,788],{},[72,15763,15764],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,15765,15766,15772],{"__ignoreMap":77},[81,15767,15768,15770],{"class":83,"line":84},[81,15769,705],{"class":614},[81,15771,618],{"class":617},[81,15773,15774,15776,15778,15780],{"class":83,"line":90},[81,15775,705],{"class":614},[81,15777,647],{"class":617},[81,15779,651],{"class":650},[81,15781,618],{"class":617},[10,15783,811],{},[342,15785,815],{"id":814},[10,15787,818],{},[72,15789,15790],{"className":605,"code":821,"language":607,"meta":77,"style":77},[33,15791,15792,15800],{"__ignoreMap":77},[81,15793,15794,15796,15798],{"class":83,"line":84},[81,15795,828],{"class":614},[81,15797,831],{"class":650},[81,15799,834],{"class":650},[81,15801,15802,15804,15806,15808,15810,15812],{"class":83,"line":90},[81,15803,828],{"class":614},[81,15805,831],{"class":650},[81,15807,843],{"class":650},[81,15809,846],{"class":650},[81,15811,849],{"class":650},[81,15813,852],{"class":650},[10,15815,855],{},[72,15817,15818],{"className":605,"code":858,"language":607,"meta":77,"style":77},[33,15819,15820],{"__ignoreMap":77},[81,15821,15822,15824,15826,15828,15830],{"class":83,"line":84},[81,15823,828],{"class":614},[81,15825,867],{"class":650},[81,15827,843],{"class":650},[81,15829,846],{"class":650},[81,15831,874],{"class":650},[10,15833,877],{},[72,15835,15836],{"className":605,"code":880,"language":607,"meta":77,"style":77},[33,15837,15838],{"__ignoreMap":77},[81,15839,15840,15842,15844,15846,15848],{"class":83,"line":84},[81,15841,828],{"class":614},[81,15843,889],{"class":650},[81,15845,892],{"class":617},[81,15847,895],{"class":650},[81,15849,898],{"class":650},[10,15851,15852,903],{},[33,15853,828],{},[342,15855,907],{"id":906},[10,15857,910],{},[72,15859,15860],{"className":605,"code":750,"language":607,"meta":77,"style":77},[33,15861,15862,15868],{"__ignoreMap":77},[81,15863,15864,15866],{"class":83,"line":84},[81,15865,705],{"class":614},[81,15867,618],{"class":617},[81,15869,15870,15872,15874,15876],{"class":83,"line":90},[81,15871,705],{"class":614},[81,15873,647],{"class":617},[81,15875,651],{"class":650},[81,15877,618],{"class":617},[10,15879,933],{},[14,15881,936],{"id":936},[342,15883,940],{"id":939},[10,15885,943,15886,947],{},[33,15887,946],{},[172,15889,15890,15894,15896],{},[44,15891,952,15892,955],{},[33,15893,662],{},[44,15895,958],{},[44,15897,961],{},[10,15899,964],{},[342,15901,968],{"id":967},[10,15903,971],{},[72,15905,15906],{"className":605,"code":698,"language":607,"meta":77,"style":77},[33,15907,15908],{"__ignoreMap":77},[81,15909,15910,15912],{"class":83,"line":84},[81,15911,705],{"class":614},[81,15913,618],{"class":617},[10,15915,984,15916,987,15918,990,15920,376],{},[33,15917,705],{},[33,15919,76],{},[33,15921,705],{},[342,15923,996],{"id":995},[10,15925,999],{},[72,15927,15928],{"className":605,"code":1002,"language":607,"meta":77,"style":77},[33,15929,15930],{"__ignoreMap":77},[81,15931,15932,15934,15936,15938],{"class":83,"line":84},[81,15933,705],{"class":614},[81,15935,647],{"class":617},[81,15937,651],{"class":650},[81,15939,618],{"class":617},[10,15941,1017,15942,1020,15944,1023,15946,1026,15948,1030],{},[33,15943,705],{},[33,15945,76],{},[33,15947,522],{},[33,15949,1029],{},[226,15951,1033],{},{"title":77,"searchDepth":90,"depth":90,"links":15953},[15954,15955,15956,15961,15966,15971],{"id":262,"depth":90,"text":262},{"id":278,"depth":90,"text":278},{"id":339,"depth":90,"text":340,"children":15957},[15958,15959,15960],{"id":344,"depth":97,"text":345},{"id":405,"depth":97,"text":406},{"id":590,"depth":97,"text":591},{"id":687,"depth":90,"text":688,"children":15962},[15963,15964,15965],{"id":691,"depth":97,"text":692},{"id":717,"depth":97,"text":718},{"id":743,"depth":97,"text":744},{"id":777,"depth":90,"text":778,"children":15967},[15968,15969,15970],{"id":784,"depth":97,"text":785},{"id":814,"depth":97,"text":815},{"id":906,"depth":97,"text":907},{"id":936,"depth":90,"text":936,"children":15972},[15973,15974,15975],{"id":939,"depth":97,"text":940},{"id":967,"depth":97,"text":968},{"id":995,"depth":97,"text":996},{},{"title":257,"description":77},[239,1066,1067],1786973366168]